画像のaltテキスト網羅率を確認
altテキスト網羅率は、指定した画像一覧のうち、属性が存在し、内容を具体的に説明している画像の割合です。このツールは画像やページを取得せずに各レコードを調べ、合格率を計算します。問題のある項目については、位置、参照元、元の値がある場合はその値、判定理由を返します。公開作業、サイト巡回、コンテンツ移行、リリース時のSEOおよびアクセシビリティ確認を、同じ条件で繰り返すためにご利用いただけます。
無料で実行
網羅率から分かること
alt属性の有無だけを数えると、画像ライブラリの状態を実際より良く見せてしまうことがあります。空白だけの値、「画像」のようなラベル、カメラが付けたファイル名は、内容を有用に伝えません。そのため、altが空でなく、限定的な汎用プレースホルダー一覧にも一致しない場合だけ、網羅済みとして数えます。合格した画像数を全画像数で割り、小数第2位までの割合を返します。coveredとtotalも示すため、計算を確認できます。offendersには0から始まる入力位置とsrc値が残り、クローラーの出力、データベース、テンプレートから対象を特定できます。これは文章品質ではなく網羅性の指標です。画像の画素やページ周辺を調べないため、具体的でも誤った説明が合格する可能性はあります。
欠落、空欄、汎用値の分類方法
問題項目には3種類の理由が付きます。missingはaltプロパティ自体がなく、HTML属性も存在しなかった可能性を示します。emptyはプロパティがあっても、前後の空白を除くと文字が残らない状態です。装飾画像では意図的な空のaltが適切な場合もありますが、この説明文網羅率には含めません。genericは「写真」「サムネイル」「画像 2」やIMG_2048.jpgのような、狭く定義したプレースホルダーに一致した状態です。照合時は大文字小文字、連続空白、ハイフン、アンダースコア、該当する末尾記号を吸収します。短いだけで拒否したり、曖昧な意味推測を行ったりはしません。保守的な基準により、商品名や短いアイコン説明を不意に除外せず、再現可能で監査しやすい結果を提供します。
SEO作業で問題一覧を活用する方法
クローラー、CMSの書き出し、コンポーネント一覧、テストデータからレコードをご用意ください。各レコードには空でないsrcが必要で、完全なURL、相対パス、内部キーを使用できます。altは省略可能なので、属性が存在しない状態も正確に表せます。実行後は理由別に修正してください。missingはマークアップや既定値、genericは編集内容、emptyは装飾画像か見落としかの確認につながります。修正後に同じ一覧を再実行し、ビルド報告や監査記録でcovered、total、percentageを比較できます。ネットワーク、画像解析、乱数、現在時刻を使わないため、同じ入力からは必ず同じ結果が得られます。空の画像一覧はエラーです。観測対象のない割合は誤解を招き、クローラー障害を正常な監査に見せるおそれがあるためです。
活用例
クローラー出力を監査
抽出した画像参照元とalt属性から網羅率と具体的な修正一覧を作成します。
サイト公開を判定
説明的なaltの網羅率がチームの基準を下回る場合に公開を停止できます。
CMS移行を確認
移行中に消失、空欄化、プレースホルダー化した属性を検出します。
よくある質問
網羅済みと判定される条件は何ですか?
altが空白以外の文字列を含み、保守的な汎用値ルールに一致しない画像です。
意図的に空にしたaltも網羅済みですか?
いいえ。emptyとして表示します。装飾画像では適切な場合がありますが、この指標は空でない説明を測ります。
画像そのものを検査しますか?
いいえ。指定されたsrcとalt属性だけを評価するため、説明が画像と一致するかは確認できません。
空の画像一覧がエラーになるのはなぜですか?
観測対象がなければ意味のある割合を算出できません。また、抽出処理の失敗や設定不備を発見できます。
APIリクエストの料金はいくらですか?
APIリクエストは1回$0.002です。同じ決定的な処理をブラウザーで無料実行することもできます。
開発者向け — APIアクセス
このページの機能はすべてAPIからも利用できます。自社システムに組み込みたいチーム向けのセクションです。それ以外の方は上のツールをそのままお使いください。
エンドポイント
Bearerトークンで認証し、POST1回でタスクをキューに登録します。結果はWebhookまたは署名付きリンクで受け取れます。
お使いのスタックから呼び出す
curl -X POST https://api.kit.forhosting.com/seo/alt-text-coverage \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"images":[{"src":"/team/alex.jpg","alt":"Alex presenting the quarterly roadmap"},{"src":"/products/blue-mug.jpg","alt":"image"},{"src":"/icons/search.svg","alt":""},{"src":"/charts/revenue.png","alt":"Monthly recurring revenue rose from January to June"}]}'const res = await fetch("https://api.kit.forhosting.com/seo/alt-text-coverage", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"images": [
{
"src": "/team/alex.jpg",
"alt": "Alex presenting the quarterly roadmap"
},
{
"src": "/products/blue-mug.jpg",
"alt": "image"
},
{
"src": "/icons/search.svg",
"alt": ""
},
{
"src": "/charts/revenue.png",
"alt": "Monthly recurring revenue rose from January to June"
}
]
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/seo/alt-text-coverage",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"images": [
{
"src": "/team/alex.jpg",
"alt": "Alex presenting the quarterly roadmap"
},
{
"src": "/products/blue-mug.jpg",
"alt": "image"
},
{
"src": "/icons/search.svg",
"alt": ""
},
{
"src": "/charts/revenue.png",
"alt": "Monthly recurring revenue rose from January to June"
}
]
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/seo/alt-text-coverage", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"images":[{"src":"/team/alex.jpg","alt":"Alex presenting the quarterly roadmap"},{"src":"/products/blue-mug.jpg","alt":"image"},{"src":"/icons/search.svg","alt":""},{"src":"/charts/revenue.png","alt":"Monthly recurring revenue rose from January to June"}]}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"images":[{"src":"/team/alex.jpg","alt":"Alex presenting the quarterly roadmap"},{"src":"/products/blue-mug.jpg","alt":"image"},{"src":"/icons/search.svg","alt":""},{"src":"/charts/revenue.png","alt":"Monthly recurring revenue rose from January to June"}]}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/seo/alt-text-coverage", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)リクエスト例
{
"images": [
{
"src": "/team/alex.jpg",
"alt": "Alex presenting the quarterly roadmap"
},
{
"src": "/products/blue-mug.jpg",
"alt": "image"
},
{
"src": "/icons/search.svg",
"alt": ""
},
{
"src": "/charts/revenue.png",
"alt": "Monthly recurring revenue rose from January to June"
}
]
}レスポンス例
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "seo.alt_text_coverage",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}非同期APIです。task_idは即時に返ります。ポーリングは1秒あたり1リクエストまでです。
料金
単価はすべて公開しています。トークン換算や独自クレジットはありません。失敗したタスクは課金されません。
エラー
| HTTP | コード | 意味 |
|---|---|---|
401 | unauthorized | APIキーが無効か、指定されていません。Authorizationヘッダーを確認してください。 |
402 | insufficient_balance | 残高が不足しています。チャージ後に再度お試しください。 |
404 | unknown_type | 指定されたタスクタイプは存在しません。タイプ名を確認してください。 |
429 | rate_limited | リクエストが多すぎます。しばらく待ってから再度お試しください。 |