lintlab Sitemap Doctor

Servidor MCP (via Apify) que verifica e valida sitemaps XML: encontra-os via robots.txt, segue índices de sitemap e arquivos gzip, extrai cada URL com lastmod/changefreq/priority, compara com uma execução anterior e, opcionalmente, verifica o status HTTP. Sitemaps quebrados são reportados, nunca ignorados.

Servidor MCP hospedado

npx add-mcp 'https://mcp.apify.com?tools=lintlab/sitemap-doctor'

Instala no Claude Code, Codex, Cursor e outros

Documentação

Verificador, Validador e Extrator de URLs de XML Sitemap (lintlab/sitemap-doctor) Actor

Verifique e valide sitemaps XML: encontre-os via robots.txt, siga índices de sitemap e arquivos gzip, extraia cada URL com lastmod/changefreq/priority, compare com uma execução anterior e, opcionalmente, verifique o status HTTP. Sitemaps quebrados são relatados, nunca ignorados.

  • URL: https://apify.com/lintlab/sitemap-doctor.md
  • Desenvolvido por: Lintlab (comunidade)
  • Categorias: Ferramentas de SEO, Ferramentas para desenvolvedores
  • Estatísticas: 2 usuários no total, 1 usuário mensal, 100,0% de execuções bem-sucedidas, 0 favoritos
  • Avaliação dos usuários: Sem avaliações ainda

Preços

a partir de US$ 0,24 / 1.000 URLs extraídas

Este Actor é cobrado por evento. Você não é cobrado pelo uso da plataforma Apify, mas apenas por um preço fixo para eventos específicos. Como este Actor suporta descontos da Apify Store, o preço fica mais baixo quanto maior for o seu plano de assinatura.

Saiba mais: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

O que é um Apify Actor?

Um Actor é um programa de nuvem serverless que roda na plataforma Apify. Ele tem dois modos de execução. No modo Batch, um Actor aceita uma entrada JSON bem definida, executa uma ação que pode levar de alguns segundos a algumas horas, e opcionalmente produz uma saída JSON bem definida, datasets com resultados ou arquivos em key-value store. No modo Standby, um Actor fornece um servidor web que pode ser usado como site, API ou servidor MCP.

O vocabulário da Apify e o modelo da plataforma são definidos uma vez, no quickstart do agente em https://apify.com/agents.md.

Como integrar um Actor?

Se for perguntado sobre integração, você ajuda desenvolvedores a integrar Actors em seus projetos. Você se adapta à stack deles e entrega integrações seguras, bem documentadas e prontas para produção.

Não adivinhe um caminho de integração. Cada um deles está no quickstart do agente em https://apify.com/agents.md: o servidor MCP da Apify, Agent Skills com a Apify CLI, os clientes JavaScript e Python, a API REST e o caminho sem conta para um agente sem humano para fazer login. Ele também traz a regra sobre informar o custo antes da primeira execução paga.

Para exemplos já conectados ao schema de entrada deste próprio Actor, veja a seção API abaixo.

Cada biblioteca de cliente tem documentação de referência que o quickstart não repete: JavaScript/TypeScript (npm install apify-client) e Python (pip install apify-client).

README

Verificador, Validador e Extrator de URLs de XML Sitemap

Verifique um sitemap XML público e extraia todas as suas URLs em uma única execução. Ele funciona como um crawler de sitemap e extrator de sitemap: insira um domínio ou uma URL de sitemap, e o Actor encontra arquivos de sitemap via robots.txt, segue índices de sitemap e arquivos gzip, relata erros de validação e retorna as URLs do sitemap como um registro por URL com seus metadados de sitemap. Verificações opcionais de status HTTP sinalizam URLs que não resolvem, e um modo de diff compara uma execução com uma anterior. Erros de parse e HTTP permanecem visíveis no registro SUMMARY em vez de um sitemap ser silenciosamente descartado.

Construído pela lintlab: ferramentas de dados pequenas e confiáveis. Testado antes do lançamento.

Experimente um exemplo pronto: Extrair URLs de um sitemap. Abra-o, clique em Iniciar, depois copie e substitua pelo seu próprio domínio.

Sitemap doctor output: Eight sitemaps.org URLs have valid lastmod dates, status 200, and no issues.

Saída real de uma execução em sitemaps.org (2026-10-01): 8 dos 84 registros de URL, com lastmod, validade da data, status HTTP e problemas.

O que ele faz

  • Aceita raízes de site, URLs de sitemap .xml e URLs de sitemap .xml.gz.
  • Para uma raiz de site, lê as linhas Sitemap: de /robots.txt; se nenhuma existir, tenta /sitemap.xml e /sitemap_index.xml.
  • Segue recursivamente índices de sitemap e lida com arquivos gzip e XML com prefixo de namespace.
  • Preserva lastmod, changefreq e priority, incluindo valores inválidos para diagnóstico.
  • Relata XML malformado, respostas de sitemap não-2xx, entradas filhas inválidas e limites do protocolo de sitemap em SUMMARY.
  • Emite ocorrências duplicadas com duplicateOf definido para o primeiro sitemap onde a URL apareceu. Ocorrências duplicadas não são cobradas como URLs extraídas.
  • Pode verificar o status da URL com HEAD e fallback GET para 405/501. As verificações respeitam robots.txt e rodam com no máximo cinco requisições concorrentes por host.
  • Pode marcar URLs como added, unchanged ou removed em relação a um dataset anterior do Actor. Registros removidos não são cobrados.
  • Rejeita faixas de IP privadas, loopback, link-local e outras não públicas antes de cada requisição e salto de redirecionamento.

Entrada

Apenas arquivos públicos de sitemap e robots.txt são lidos. As verificações de status respeitam robots.txt, e endereços de rede privados ou internos são sempre rejeitados.

{
  "startUrls": [
    { "url": "https://www.sitemaps.org/sitemap.xml" }
  ],
  "maxUrls": 10000,
  "maxSitemapFiles": 200,
  "checkStatus": false,
  "statusSampleSize": 0,
  "sameHostOnly": true
}

statusSampleSize: 0 significa todas as URLs únicas quando checkStatus está habilitado. Com sameHostOnly: true, arquivos de sitemap entre hosts referenciados por um índice não são seguidos. URLs de páginas entre hosts ainda são emitidas e sinalizadas para que possam ser corrigidas.

previousDatasetId é opcional. Na plataforma Apify, ele é aberto a partir do armazenamento em nuvem. Seus valores url não removidos formam a linha de base de comparação.

Saída do dataset

Cada ocorrência de sitemap produz um registro. Este é um item real da execução local de ponta a ponta contra https://www.sitemaps.org/sitemap.xml em 2026-09-25:

{
  "url": "https://www.sitemaps.org/",
  "sitemap": "https://www.sitemaps.org/sitemap.xml",
  "lastmod": "2016-11-21",
  "changefreq": null,
  "priority": null,
  "lastmodValid": true,
  "hostMatches": true,
  "duplicateOf": null,
  "status": null,
  "finalUrl": null,
  "redirects": null,
  "skippedByRobots": false,
  "diff": null,
  "issues": []
}

IDs de problema estáveis são:

DUPLICATE_URL, MULTIPLE_LOC, INVALID_LASTMOD, FUTURE_LASTMOD, CROSS_HOST, NON_200, REDIRECTED, ROBOTS_DISALLOWED, INVALID_PRIORITY, INVALID_CHANGEFREQ e URL_TOO_LONG. MULTIPLE_LOC usa a primeira localização e é contado sob structuralIssues na entrada SUMMARY de um sitemap de índice.

O registro SUMMARY do key-value store contém cada arquivo de sitemap tentado com método de descoberta, tipo, flag gzip, contagem de bytes descompactados, contagem de URLs, status HTTP, erro de parse e violações de limite de protocolo. Ele também inclui contagens agregadas, contagens de cobrança, estado de truncamento e os problemas mais frequentes.

A mesma execução de ponta a ponta analisou um arquivo de sitemap e emitiu 84 registros de URL únicos em 1,81 segundos:

{
  "totals": {
    "sitemapFilesAttempted": 1,
    "sitemapFilesParsed": 1,
    "urlRecords": 84,
    "uniqueUrls": 84,
    "removedUrls": 0,
    "duplicates": 0,
    "invalidLastmod": 0,
    "non200": 0,
    "crossHost": 0,
    "statusChecksRequested": 0,
    "statusResponses": 0
  },
  "topIssues": [],
  "truncated": false,
  "eventChargeLimitReached": false,
  "billing": {
    "sitemapFileParsed": 1,
    "urlExtracted": 84,
    "urlStatusChecked": 0
  }
}

Preços

Preço por evento (você paga apenas pelo trabalho que teve sucesso):

  • $0.001 per sitemap file por sitemap-file-parsed, cobrado uma vez após um arquivo ser buscado e analisado com sucesso.
  • $0.0003 per URL por url-extracted, cobrado após o primeiro registro atual para uma URL única ser enviado. Ocorrências duplicadas e registros de diff removidos não são cobrados.
  • $0.0005 per status check por url-status-checked, cobrado após o registro de URL ser enviado apenas quando a verificação foi concluída com uma resposta HTTP. Falhas de rede e pulos por robots.txt não são cobrados.

O Actor para de adicionar trabalho quando um limite de cobrança de evento da Apify é relatado.

Limites e comportamento

  • maxUrls: padrão 10.000; máximo 200.000 registros totais no dataset, incluindo registros de diff removidos.
  • maxSitemapFiles: padrão 200.
  • Violações do protocolo de sitemap são relatadas acima de 50.000 entradas ou 50 MB descompactados.
  • Um limite rígido de 55 MB para resposta/descompactação, timeout de requisição de 20 segundos, limite de 10 redirecionamentos e verificações SSRF limitam o trabalho de rede.
  • As verificações de status são limitadas a cinco requisições simultâneas por origem.
  • Nenhum proxy, autenticação, fluxos de login ou tratamento de CAPTCHA são usados.

Desenvolvimento local

Requer Node.js 20 ou mais recente.

npm install
npm test
npm start

Para uma execução local do Actor, coloque INPUT.json no key-value store local padrão e defina APIFY_LOCAL_STORAGE_DIR. Versões mais novas do Crawlee também reconhecem CRAWLEE_STORAGE_DIR para o mesmo local.

Mais ferramentas da lintlab

Suporte: abra um problema na aba Issues deste Actor aqui na Apify.

Schema de entrada do Actor

startUrls (tipo: array):

Lista obrigatória de raízes de site HTTP(S) ou URLs de sitemap. Raízes de site são inspecionadas e, em seguida, as diretivas Sitemap do robots.txt são usadas; /sitemap.xml e /sitemap_index.xml são fallbacks. Cada arquivo de sitemap analisado com sucesso incorre no preço do evento de arquivo de sitemap.

maxUrls (tipo: integer):

Número máximo de registros de URL no dataset para toda a execução, incluindo ocorrências duplicadas e registros de diff removidos. Padrão 10000; intervalo 1–200000. URLs atuais únicas incorrem no preço do evento de extração de URL após serem enviadas.

maxSitemapFiles (tipo: integer):

Número máximo de arquivos de sitemap buscados durante a execução. Padrão 200; cada arquivo buscado e analisado com sucesso incorre em uma cobrança de evento de arquivo de sitemap.

checkStatus (tipo: boolean):

Quando verdadeiro, envia requisições HEAD (fallback GET para HTTP 405/501), no máximo 5 concorrentes por host, respeitando robots.txt. Cada verificação de URL concluída com uma resposta HTTP incorre em uma cobrança de evento de verificação de status. Padrão falso.

statusSampleSize (tipo: integer):

Número de URLs únicas extraídas para verificação de status. Use 0 para verificar todas quando checkStatus for verdadeiro. Padrão 0; unidade é URLs.

previousDatasetId (tipo: string):

ID opcional de dataset da Apify de uma execução anterior do Sitemap Doctor. URLs atuais são marcadas como adicionadas ou inalteradas, e URLs ausentes agora são emitidas como registros removidos. Registros removidos não são cobrados.

sameHostOnly (tipo: boolean):

Quando verdadeiro (padrão), índices de sitemap não levam a arquivos de sitemap em outro hostname. URLs de páginas entre hosts ainda são emitidas e sinalizadas para que um agente possa diagnosticá-las.

Exemplo de objeto de entrada do Actor

{
  "startUrls": [
    {
      "url": "https://www.sitemaps.org/"
    }
  ],
  "maxUrls": 10000,
  "maxSitemapFiles": 200,
  "checkStatus": false,
  "statusSampleSize": 0,
  "sameHostOnly": true
}

Schema de saída do Actor

items (tipo: string):

Sem descrição

summary (tipo: string):

Sem descrição

API

Você pode executar este Actor programaticamente usando nossa API. Abaixo estão exemplos de código em JavaScript, Python e CLI, bem como a especificação OpenAPI e a configuração do servidor MCP.

Exemplo em JavaScript

import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "startUrls": [
        {
            "url": "https://www.sitemaps.org/"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("lintlab/sitemap-doctor").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

Exemplo em Python

from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "startUrls": [{ "url": "https://www.sitemaps.org/" }] }

# Run the Actor and wait for it to finish
run = client.actor("lintlab/sitemap-doctor").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

Exemplo em CLI

echo '{
  "startUrls": [
    {
      "url": "https://www.sitemaps.org/"
    }
  ]
}' |
apify call lintlab/sitemap-doctor --silent --output-dataset

Configuração do servidor MCP

{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,lintlab/sitemap-doctor"
        }
    }
}

O servidor hospedado faz login com OAuth na primeira conexão, então nenhum token de API pertence a esta configuração. Clientes sem suporte a OAuth podem enviar um cabeçalho Authorization: Bearer <APIFY_API_TOKEN> em vez disso, usando um token de API & Integrações no Apify Console (https://console.apify.com/settings/integrations).

Especificação OpenAPI

Baixe a definição OpenAPI: https://api.apify.com/v2/actors/not7lGNg3TYpOYv0g/builds/qqZxbExqy6lzyFDw2/openapi.json