Verifique a cobertura do texto alternativo de imagens
A cobertura de texto alternativo mostra quantas imagens de uma lista têm um atributo alt presente e realmente descritivo.
Executar grátis
Este verificador analisa cada registro sem baixar a imagem ou a página, calcula o percentual aprovado e retorna cada problema com posição, origem, valor original quando disponível e motivo. Ele serve para controles repetíveis de SEO e acessibilidade em publicações, rastreamentos, migrações de conteúdo e etapas de lançamento.
O que o percentual de cobertura revela
Contar apenas atributos alt existentes pode fazer uma biblioteca parecer melhor do que realmente está. Um atributo formado por espaços, um rótulo como “imagem” ou um nome de arquivo de câmera não comunica conteúdo útil. Por isso, o verificador só considera coberta a imagem cujo alt não esteja vazio e não corresponda à lista conservadora de marcadores genéricos. O percentual divide as imagens aprovadas pelo total e arredonda o resultado para duas casas decimais. Os valores covered e total deixam o cálculo transparente. A lista offenders preserva a posição iniciada em zero e o src informado, permitindo que você localize o item em uma exportação, banco de dados ou modelo. Trata-se de um sinal de cobertura, não de qualidade editorial: uma descrição específica, porém incorreta, pode passar porque os pixels e o contexto da página não são analisados.
Como valores ausentes, vazios e genéricos são classificados
Cada problema recebe um de três motivos. Missing indica que o registro não possui a propriedade alt, geralmente porque o atributo HTML não existia. Empty significa que a propriedade existe, mas não sobra nenhum caractere depois da remoção dos espaços externos. Essa distinção importa, pois um alt vazio pode ser adequado para uma imagem decorativa, embora não conte nesta métrica. Generic identifica uma regra limitada de marcador, como “foto”, “miniatura”, “imagem 2” ou IMG_2048.jpg. A comparação desconsidera maiúsculas, espaços repetidos, hífens, sublinhados e pontuação final aplicável. O verificador não reprova um texto só por ser curto nem tenta adivinhar sua semântica. O critério conservador mantém os resultados determinísticos, auditáveis e apropriados para limites automáticos, sem rejeitar inesperadamente nomes de produtos ou descrições curtas de ícones.
Como usar os problemas em um fluxo de SEO
Envie registros de um rastreador, exportação do CMS, inventário de componentes ou teste. Cada registro precisa de um src não vazio, que pode ser URL, caminho relativo ou chave interna. O campo alt é opcional para representar fielmente um atributo ausente. Após a verificação, organize as correções pelo motivo: missing costuma indicar marcação ou padrões de componentes; generic pede revisão editorial; empty precisa de avaliação humana para separar imagens decorativas de conteúdo esquecido. Execute novamente depois das correções e compare covered, total e percentage em relatórios de build ou auditoria. Como não há rede, análise visual, aleatoriedade nem horário atual, entradas idênticas sempre geram saídas idênticas. Uma lista vazia é rejeitada, pois um percentual sem observações seria enganoso e poderia esconder uma falha no rastreador.
Casos de uso
Auditar uma exportação do rastreador
Transforme fontes e atributos extraídos em uma pontuação e uma fila objetiva de correções.
Controlar o lançamento do site
Interrompa a publicação quando a cobertura descritiva ficar abaixo do limite da equipe.
Revisar uma migração do CMS
Encontre atributos perdidos, esvaziados ou substituídos por marcadores na migração.
Perguntas frequentes
O que conta como cobertura?
A imagem é coberta quando alt contém texto além de espaços e não corresponde às regras conservadoras de valores genéricos.
Um atributo alt vazio de propósito conta?
Não. Ele aparece com o motivo empty. Pode estar correto em imagens decorativas, mas esta métrica exige descrição não vazia.
O verificador examina as imagens?
Não. Ele avalia somente os identificadores src e atributos alt enviados, sem confirmar se a descrição corresponde à imagem.
Por que uma lista vazia gera erro?
Não existe percentual significativo sem observações. A rejeição também revela uma extração ausente ou configurada incorretamente.
Quanto custa uma solicitação de API?
Cada solicitação de API custa US$ 0,002. A mesma lógica determinística pode ser executada gratuitamente no navegador.
Para desenvolvedores — acesso via API
Tudo nesta página está disponível via API. Esta seção é para equipes que querem integrar a ferramenta aos próprios sistemas; quem não precisa disso pode simplesmente usar a ferramenta acima.
Endpoint
Autenticação por token Bearer. Um único POST coloca a tarefa na fila; o resultado chega por webhook ou link assinado.
Chame do seu código
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)Exemplo de requisição
{
"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"
}
]
}Exemplo de resposta
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "seo.alt_text_coverage",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}A API é assíncrona: cada chamada devolve um task_id na hora. Se preferir polling, consulte o status a até 1 requisição por segundo.
Preço
Preço publicado, sem tokens nem créditos escondidos. Tarefa que falha não é cobrada.
Erros
| HTTP | Código | O que significa |
|---|---|---|
401 | unauthorized | Token ausente ou inválido. Confira o header Authorization. |
402 | insufficient_balance | Saldo insuficiente para esta tarefa. Faça uma recarga e tente de novo. |
404 | unknown_type | Esse tipo de tarefa não existe. Confira o campo type no catálogo. |
429 | rate_limited | Muitas requisições em pouco tempo. Espere um instante e tente de novo. |