Sitemap para Imagens e Vídeos: Como Indexar Mídia no Google
Um sitemap tradicional lista apenas páginas. Para indexar imagens e vídeos no Google Imagens e Vídeos, você precisa de sitemaps especializados com tags específicas. Veja namespace XML, tags obrigatórias e opcionais, Schema.org VideoObject e estratégias para sites grandes.
Por Vitor Morais
Fundador do MochaLabz ·
Gere seu sitemap XML
URLs, imagens e metadados prontos para submeter ao Google Search Console.
Gerar sitemap →Um sitemap XML tradicional lista apenas URLs de páginas. Para garantir que suas imagens e vídeos apareçam em Google Imagens e Google Vídeos (que geram tráfego significativo em verticais como moda, receitas, tutoriais, notícias), você precisa de sitemaps especializados com extensões de namespace específicas. Este guia cobre namespace XML, tags obrigatórias e opcionais, regras de indexação, combinação com Schema.org VideoObject e estratégias para sites com muita mídia.
Por que ter sitemap específico de mídia
- Descoberta garantida: imagens/vídeos renderizados via JavaScript podem não ser encontrados pelo crawler — sitemap explícito resolve.
- Metadados ricos: caption, title, license, duração e thumbnail sinalizam relevância e melhoram ranqueamento.
- Priorização: Google indexa primeiro o que está no sitemap de sites com autoridade.
- Diagnóstico: Aprimoramentos no GSC mostra exatamente qual mídia foi detectada, indexada e com erro.
- Tráfego adicional: Google Imagens é a segunda busca mais usada no Brasil — ignorá-la é deixar tráfego na mesa.
Sitemap de imagens: namespace e estrutura
O formato é o mesmo sitemap XML padrão, com a adição do namespace image no elemento raiz e tags image:image dentro de cada url:
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
xmlns:image="http://www.google.com/schemas/sitemap-image/1.1">
<url>
<loc>https://exemplo.com/galeria/verao-2026</loc>
<image:image>
<image:loc>https://exemplo.com/img/verao-01.jpg</image:loc>
<image:caption>Saia midi floral para o verão</image:caption>
<image:title>Saia midi floral azul</image:title>
<image:license>https://creativecommons.org/licenses/by/4.0/</image:license>
</image:image>
<image:image>
<image:loc>https://exemplo.com/img/verao-02.jpg</image:loc>
<image:caption>Segunda foto da coleção</image:caption>
</image:image>
</url>
</urlset>Tags de imagem: obrigatórias e opcionais
| Critério | Obrigatória? | O que descreve |
|---|---|---|
| image:loc | Sim | URL absoluta da imagem (http/https) |
| image:caption | Não (mas recomendada) | Legenda ou descrição contextual |
| image:title | Não | Título da imagem |
| image:geo_location | Não | Localização geográfica (ex: 'Rio de Janeiro, Brasil') |
| image:license | Não | URL da licença (Creative Commons, proprietária) |
Caption e alt text são diferentes
image:caption no sitemap não substitui o alt da tag <img> no HTML. O alt é o sinal principal de relevância para o Google Imagens. Use os dois.
Regras e limites do sitemap de imagens
- Máximo 1.000 imagens por URL — acima disso, o Google ignora o excedente.
- URLs absolutas com HTTPS — caminhos relativos não funcionam.
- Imagens do mesmo domínio (ou subdomínio verificado no GSC) — sem hotlink de sites externos.
- Arquivo único ≤ 50 MB ou 50.000 URLs — para sites maiores, use sitemap-index.
- Encoding UTF-8 sem BOM.
- Caracteres especiais escapados: & vira
&, < vira<, etc.
Sitemap de vídeos: estrutura obrigatória
Para vídeos, o namespace é video e tem mais tags obrigatórias que imagens:
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
xmlns:video="http://www.google.com/schemas/sitemap-video/1.1">
<url>
<loc>https://exemplo.com/videos/tutorial-next-js</loc>
<video:video>
<!-- OBRIGATÓRIAS -->
<video:thumbnail_loc>https://exemplo.com/thumbs/tutorial.jpg</video:thumbnail_loc>
<video:title>Tutorial Completo de Next.js para Iniciantes</video:title>
<video:description>
Aprenda Next.js do zero: instalação, rotas, data fetching,
deploy. Tutorial de 45 minutos completo.
</video:description>
<video:content_loc>https://exemplo.com/media/tutorial.mp4</video:content_loc>
<!-- OU video:player_loc (um dos dois é obrigatório) -->
<!-- OPCIONAIS IMPORTANTES -->
<video:player_loc>https://exemplo.com/embed/abc123</video:player_loc>
<video:duration>2700</video:duration> <!-- segundos -->
<video:publication_date>2026-04-18T09:00:00+00:00</video:publication_date>
<video:expiration_date>2027-04-18T09:00:00+00:00</video:expiration_date>
<video:rating>4.7</video:rating>
<video:view_count>12543</video:view_count>
<video:family_friendly>yes</video:family_friendly>
<video:requires_subscription>no</video:requires_subscription>
<video:live>no</video:live>
<!-- Tags de categorização -->
<video:category>Tutorials</video:category>
<video:tag>nextjs</video:tag>
<video:tag>react</video:tag>
<video:tag>web development</video:tag>
<!-- Restrição geográfica (opcional) -->
<video:restriction relationship="allow">BR US PT</video:restriction>
</video:video>
</url>
</urlset>Tags de vídeo: todas as opções
| Critério | Obrigatória? | Detalhe |
|---|---|---|
| video:thumbnail_loc | Sim | Miniatura JPG/PNG, 160×90 a 1920×1080, ≤ 32 MB |
| video:title | Sim | Até 100 chars — aparece na SERP |
| video:description | Sim | Até 2048 chars — descrição completa |
| video:content_loc OU video:player_loc | Um dos dois | URL do MP4 direto OU do player embed |
| video:duration | Não (recomendado) | Em segundos; 1 a 28.800 (8h max) |
| video:publication_date | Não | ISO 8601 — afeta ranqueamento por frescor |
| video:family_friendly | Não | yes/no — afeta SafeSearch |
| video:requires_subscription | Não | yes/no — sinaliza paywall |
| video:live | Não | yes/no — para streams ao vivo |
| video:rating | Não | 0.0 a 5.0 — aparece nas SERPs |
| video:category | Não | Categoria temática |
| video:tag | Não | Múltiplas — palavras-chave |
| video:restriction | Não | Países permitidos/bloqueados |
Sitemap combinado (páginas + imagens + vídeos)
Você pode ter os três tipos no MESMO sitemap:
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
xmlns:image="http://www.google.com/schemas/sitemap-image/1.1"
xmlns:video="http://www.google.com/schemas/sitemap-video/1.1">
<url>
<loc>https://exemplo.com/produto/bicicleta-mtb</loc>
<lastmod>2026-04-18</lastmod>
<image:image>
<image:loc>https://exemplo.com/img/bike-01.jpg</image:loc>
<image:caption>Bicicleta MTB Scott aro 29</image:caption>
</image:image>
<image:image>
<image:loc>https://exemplo.com/img/bike-02.jpg</image:loc>
</image:image>
<video:video>
<video:thumbnail_loc>https://exemplo.com/thumbs/bike-review.jpg</video:thumbnail_loc>
<video:title>Review completo Scott MTB 2026</video:title>
<video:description>Tiramos a bicicleta para testar em trilha...</video:description>
<video:content_loc>https://exemplo.com/media/review.mp4</video:content_loc>
<video:duration>360</video:duration>
</video:video>
</url>
</urlset>Quando separar
Para sites com milhares de imagens/vídeos, prefira arquivos separados (sitemap-images.xml, sitemap-videos.xml, sitemap.xml) + um sitemap-index.xml apontando para todos. Facilita diagnóstico — se algo quebrar, você sabe qual arquivo investigar.
Sitemap-index: organização para sites grandes
<?xml version="1.0" encoding="UTF-8"?>
<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<sitemap>
<loc>https://exemplo.com/sitemap-posts.xml</loc>
<lastmod>2026-04-18</lastmod>
</sitemap>
<sitemap>
<loc>https://exemplo.com/sitemap-produtos.xml</loc>
<lastmod>2026-04-18</lastmod>
</sitemap>
<sitemap>
<loc>https://exemplo.com/sitemap-images.xml</loc>
<lastmod>2026-04-18</lastmod>
</sitemap>
<sitemap>
<loc>https://exemplo.com/sitemap-videos.xml</loc>
<lastmod>2026-04-18</lastmod>
</sitemap>
</sitemapindex>
<!-- Envie ao GSC apenas sitemap-index.xml.
O Google segue automaticamente os filhos. -->Geração programática em Node.js
// npm install xml2js
import { Builder } from 'xml2js';
import fs from 'fs/promises';
interface ImageEntry {
loc: string;
caption?: string;
title?: string;
license?: string;
}
interface SitemapEntry {
loc: string;
lastmod?: string;
images?: ImageEntry[];
}
async function buildImageSitemap(entries: SitemapEntry[]): Promise<string> {
const builder = new Builder({
xmldec: { version: '1.0', encoding: 'UTF-8' },
headless: false,
});
const doc = {
urlset: {
$: {
xmlns: 'http://www.sitemaps.org/schemas/sitemap/0.9',
'xmlns:image': 'http://www.google.com/schemas/sitemap-image/1.1',
},
url: entries.map((e) => ({
loc: e.loc,
...(e.lastmod && { lastmod: e.lastmod }),
'image:image': e.images?.map((img) => ({
'image:loc': img.loc,
...(img.caption && { 'image:caption': img.caption }),
...(img.title && { 'image:title': img.title }),
...(img.license && { 'image:license': img.license }),
})),
})),
},
};
return builder.buildObject(doc);
}
// Uso
const xml = await buildImageSitemap(await loadFromDb());
await fs.writeFile('./public/sitemap-images.xml', xml, 'utf8');Em Next.js: gerando sitemap dinamicamente
// app/sitemap-images.xml/route.ts
import { NextResponse } from 'next/server';
export async function GET() {
const posts = await getPostsWithImages();
const xml = `<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
xmlns:image="http://www.google.com/schemas/sitemap-image/1.1">
${posts.map((p) => `
<url>
<loc>https://exemplo.com/blog/${p.slug}</loc>
${p.images.map((img) => `
<image:image>
<image:loc>${img.url}</image:loc>
<image:caption>${escapeXml(img.caption)}</image:caption>
</image:image>`).join('')}
</url>`).join('')}
</urlset>`;
return new NextResponse(xml, {
headers: { 'Content-Type': 'application/xml; charset=utf-8' },
});
}
function escapeXml(str: string) {
return str
.replace(/&/g, '&')
.replace(/</g, '<')
.replace(/>/g, '>')
.replace(/"/g, '"')
.replace(/'/g, ''');
}Combinando com Schema.org (VideoObject)
Sitemap diz “tenho esses vídeos”; Schema.org VideoObject diz “aqui está a estrutura deste vídeo na página”. Use os dois juntos para melhor indexação e rich results:
<!-- VideoObject na página do vídeo -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "VideoObject",
"name": "Tutorial Completo de Next.js",
"description": "Aprenda Next.js do zero...",
"thumbnailUrl": [
"https://exemplo.com/thumbs/tutorial-1x1.jpg",
"https://exemplo.com/thumbs/tutorial-4x3.jpg",
"https://exemplo.com/thumbs/tutorial-16x9.jpg"
],
"uploadDate": "2026-04-18T09:00:00-03:00",
"duration": "PT45M",
"contentUrl": "https://exemplo.com/media/tutorial.mp4",
"embedUrl": "https://exemplo.com/embed/abc123",
"interactionStatistic": {
"@type": "InteractionCounter",
"interactionType": "https://schema.org/WatchAction",
"userInteractionCount": 12543
}
}
</script>Para cobertura detalhada do schema e rich results, veja SERP snippet: como otimizar.
Boas práticas para mídia ranquear bem
- Nome de arquivo semântico:
tutorial-nextjs-completo.mp4, nãoVID_0001.mp4. Mesma regra para imagens. - Alt text descritivo em imagens: ainda é o sinal principal de relevância para Google Imagens.
- Estrutura de URL limpa:
/galeria/categoria/nome, não?id=123. - Thumbnails de qualidade: o Google usa elas na SERP; thumbnail pobre = baixo CTR.
- Transcrição de vídeos visível na página ajuda a ranquear por queries textuais relacionadas.
- Mobile-first: Google Imagens é majoritariamente consumido em mobile — teste responsive sempre.
- Core Web Vitals: páginas lentas têm mídia menos indexada e pior ranqueada.
Como monitorar a indexação de mídia
- Google Search Console → Sitemaps: verifica se sitemap de imagens/vídeos foi processado.
- GSC → Aprimoramentos → Vídeos: mostra vídeos detectados, indexados, com erros.
- GSC → Desempenho → Tipo “Image” ou “Video”: cliques e impressões específicas de Google Imagens/Vídeos.
- Rich Results Test: search.google.com/test/rich-results valida VideoObject de uma URL.
- Site: query:
site:exemplo.com filetype:jpgmostra imagens indexadas; use Image Search para confirmar visualmente.
Erros comuns
Anti-padrões frequentes
- URLs relativas no sitemap: sempre absolutas com https://.
- Imagens bloqueadas no robots.txt mas listadas no sitemap — contradição.
- Thumbnail SVG em sitemap de vídeo: Google exige JPG ou PNG.
- Faltar content_loc e player_loc: vídeo não será indexado sem pelo menos um dos dois.
- Caracteres especiais sem escape:
&na URL precisa virar&. - Enviar sitemap gigante sem sitemap-index: diagnóstico no GSC fica impossível.
- Lastmod de hoje para tudo no sitemap: o Google desconfia. Use data real de modificação.
- Esquecer de submeter ao GSC: sitemap no site + referência no robots.txt ajuda, mas submissão acelera.
Checklist do sitemap de mídia completo
- ✅ Namespace correto (image: e/ou video:) no urlset.
- ✅ Todas as tags obrigatórias presentes.
- ✅ URLs absolutas com HTTPS.
- ✅ Imagens/vídeos do mesmo domínio do sitemap.
- ✅ Máximo 1.000 imagens por URL.
- ✅ Arquivo ≤ 50 MB / 50.000 entradas; sitemap-index se maior.
- ✅ Encoding UTF-8 sem BOM.
- ✅ Caracteres especiais escapados corretamente.
- ✅ Referenciado no robots.txt + submetido no GSC.
- ✅ Complementado por alt text (imagens) e Schema.org VideoObject (vídeos).
- ✅ Monitoramento mensal no GSC → Aprimoramentos.
Para o básico de sitemap XML, veja como criar um sitemap.xml; para envio e monitoramento no Search Console, GSC: como enviar e monitorar sitemap.
Perguntas frequentes
Preciso de sitemap separado para imagens e vídeos?+
Não é obrigatório — o Google descobre mídia via crawl normal. Mas um sitemap especializado aumenta significativamente a chance de indexação, especialmente para sites com muitas imagens/vídeos ou com mídia em JavaScript (que crawler pode não enxergar). Recomendado para: e-commerces com milhares de produtos, portais de notícias com vídeos, bancos de imagens, sites educacionais com tutoriais em vídeo.
Qual a diferença entre sitemap de imagem e sitemap normal?+
Sitemap normal lista URLs de páginas. Sitemap de imagens (namespace image:) lista as IMAGENS dentro de cada URL, com metadados como caption, título, licença. Um sitemap normal pode incluir tags image: diretamente — não precisa ser arquivo separado. Mas separar ajuda em sites grandes para organização e diagnóstico no GSC.
Quais tags de vídeo são obrigatórias?+
Google exige quatro: video:thumbnail_loc (URL da miniatura), video:title (título), video:description (descrição) e uma de content_loc (URL do arquivo de vídeo) ou player_loc (URL do player embed). Sem essas, o vídeo não será indexado como rich result. Tags opcionais úteis: duration (em segundos), publication_date, family_friendly, requires_subscription.
Imagens hotlinked (de outros sites) podem estar no meu sitemap?+
Não. O Google só indexa imagens do mesmo domínio do sitemap. Exceções: subdomínios verificados no mesmo Search Console; CDN da mesma organização com redirect no domínio principal. Para imagens hospedadas em serviços como Cloudinary ou Imgix, configure CNAME apontando para seu domínio e inclua as URLs cname'adas.
Quantas imagens posso listar por URL?+
Máximo de 1000 imagens por URL no sitemap. Na prática, limite você mesmo: listar todas as thumbnails de um produto é bom; listar 500 imagens decorativas por página é ruim. Google não garante indexação de tudo — foca em imagens com alt text descritivo, nome de arquivo semântico e relevância para o conteúdo da página.
Sitemap substitui Schema.org VideoObject?+
Não, complementa. Sitemap diz ao Google "olha, tenho esses vídeos"; VideoObject schema diz "aqui está a estrutura do vídeo dentro desta página" (permite rich results nas SERPs com thumbnail grande, duração, data). Use os dois juntos: sitemap para descoberta, VideoObject para apresentação nas buscas. Veja o guia de SERP snippet.
Devo incluir images em base64 (data URLs) no sitemap?+
Não. Sitemap de imagens aceita apenas URLs absolutas (http/https). Data URLs (base64) estão embutidas no HTML — o Google pode descobri-las naturalmente se quiser, mas não via sitemap. Para imagens que realmente precisam de indexação, hospede em arquivo separado com URL estável.
Como saber se meu sitemap de vídeos está funcionando?+
Google Search Console → Aprimoramentos → Vídeos. Mostra quais vídeos foram detectados via sitemap ou schema, com status (válido, erro, aviso). Use Rich Results Test (search.google.com/test/rich-results) em URL específica para ver o que o Google extrai. Para monitoramento contínuo, ative alertas de queda de indexação no GSC.
Continue lendo
Como Criar Sitemap XML (2026): Guia Completo com Geração Automática
Guia definitivo de sitemap XML: estrutura, campos obrigatórios, sitemap-index, geração dinâmica em Next.js e WordPress, envio ao Search Console e erros comuns.
Open Graph Protocol: Guia Completo 2026 (Facebook, LinkedIn, WhatsApp)
Guia definitivo de Open Graph: tags essenciais, og:type por tipo de conteúdo, dimensões corretas de og:image por rede, implementação em Next.js/WordPress/HTML puro, debug por plataforma e os 7 erros que destroem o preview.
SERP Snippet: Como Otimizar Title, Description e Rich Results (2026)
Anatomia completa do snippet, todos os tipos de rich results (FAQ, How-to, Product, Article), implementação JSON-LD passo a passo, featured snippets e o que mudou com SGE/AI Overviews.
Google Search Console: Como Enviar e Monitorar Sitemap (Guia 2026)
Verificação de propriedade, envio passo a passo, sitemap-index para sites grandes, decifrar status, relatório de Páginas e estratégias para acelerar indexação.