Feeds XML de Indeed y JSON-LD de Google for Jobs, explicados
Los dos canales principales de distribución
Cuando publicas una oferta de empleo en Indeed o Google for Jobs, tienes dos opciones:
- Publicar directamente — accede a Indeed.com, rellena un formulario, haz clic en publicar
- Distribuir a través de feed — proporciona tu propia oferta de empleo en un formato legible por máquinas (XML o JSON-LD); la bolsa de empleo extrae datos de tu feed e lo indexa
La publicación directa es fácil pero limitada. La distribución mediante feed es un poco más técnica, pero te ofrece control preciso: puedes actualizar el estado, el salario o los requisitos de una oferta en tu sistema, y se reflejará en Indeed en cuestión de horas sin necesidad de volver a introducir los datos.
La mayoría de los equipos de selección profesionales utilizan feeds.
El formato XML de Indeed
Indeed acepta un feed XML propietario. Esta es la estructura:
<?xml version="1.0" encoding="UTF-8"?>
<source>
<publisher>Your Company Name</publisher>
<publisherurl>https://yourcompany.com</publisherurl>
<lastBuildDate>2026-05-21T10:00:00Z</lastBuildDate>
<job>
<title>Senior Backend Engineer</title>
<date>2026-05-21T08:00:00Z</date>
<repourl>https://yourcompany.com/jobs/senior-backend-engineer</repourl>
<description><![CDATA[
<p>We are hiring a senior backend engineer...</p>
<ul>
<li>5+ years Python/Go experience</li>
</ul>
]]></description>
<salary>120000</salary>
<hiringOrganization>Your Company</hiringOrganization>
<jobLocation>
<countryName>US</countryName>
<stateName>California</stateName>
<cityName>San Francisco</cityName>
</jobLocation>
<employmentType>FULL_TIME</employmentType>
<jobCategory>ENGINEER</jobCategory>
</job>
</source>
Elementos clave:
<title>: Título del puesto (obligatorio)<description>: Descripción completa de la oferta. Envuélvelo en<![CDATA[...]]>si contiene HTML o caracteres especiales. No incluyas HTML dentro de CDATA, mantenlo como texto limpio o añade el marcado HTML.<salary>: Salario base en USD. Algunas regiones aceptan rangos de salario, pero Indeed indexa principalmente valores únicos.<jobLocation>: Ciudad, estado, país. Si es trabajo remoto, omítelo o establece la ciudad como "Remote."<date>: Cuándo se publicó la oferta (formato ISO 8601). Indeed utiliza esto para priorizar ofertas más recientes.<repourl>: Enlace de vuelta a tu página de carreras para ese puesto específico. Cuando alguien hace clic en "Solicitar", llega aquí.<employmentType>: FULL_TIME, PART_TIME, CONTRACT, TEMPORARY
Google for Jobs: JSON-LD
Google utiliza un formato diferente llamado JobPosting structured data en JSON-LD. Esto se incrusta en tu HTML como una etiqueta <script type="application/ld+json">.
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "JobPosting",
"title": "Senior Backend Engineer",
"description": "We are hiring a senior backend engineer...",
"identifier": {
"@type": "PropertyValue",
"name": "Your Company",
"value": "job_123"
},
"datePosted": "2026-05-21",
"hiringOrganization": {
"@type": "Organization",
"name": "Your Company",
"sameAs": "https://yourcompany.com",
"logo": "https://yourcompany.com/logo.png"
},
"jobLocation": {
"@type": "Place",
"address": {
"@type": "PostalAddress",
"streetAddress": "123 Main St",
"addressLocality": "San Francisco",
"addressRegion": "CA",
"postalCode": "94105",
"addressCountry": "US"
}
},
"baseSalary": {
"@type": "PriceSpecification",
"currency": "USD",
"minValue": 120000,
"maxValue": 160000,
"unitText": "YEAR"
},
"employmentType": "FULL_TIME",
"validThrough": "2026-06-21"
}
</script>
Campos críticos para que Google indexe:
datePosted: Debe estar presente y ser reciente. Google reduce la clasificación de ofertas antiguas.hiringOrganization: Nombre de la empresa y (opcionalmente) logo. Se utiliza para el fragmento de marca del empleador.baseSalary: Rango de salario (mín/máx). Opcional pero mejora el CTR.validThrough: Fecha de cierre de la oferta. Google elimina las ofertas después de esta fecha.jobLocation: Dirección postal completa o remoto.
Trampas con CDATA y caracteres especiales
En XML, los caracteres especiales como <, > y & rompen el feed. Envuelve tu descripción en <![CDATA[...]]>:
<description><![CDATA[
We are looking for a developer with 5+ years experience.
Experience with: Java, Spring Boot, Docker.
]]></description>
Dentro de CDATA, puedes incluir HTML simple:
<description><![CDATA[
<p>We are looking for a developer with 5+ years experience.</p>
<ul>
<li>Java 8+</li>
<li>Spring Boot</li>
<li>Docker</li>
</ul>
]]></description>
Sin CDATA, las etiquetas <p> y <li> rompen el analizador XML. El validador de feed de Indeed rechazará todo el feed.
Codificación de salario
XML de Indeed: Valor de salario único solamente. Si tienes un rango, utiliza el punto medio o el extremo inferior.
<salary>140000</salary>
Google for Jobs: Soporta rangos:
"baseSalary": {
"@type": "PriceSpecification",
"currency": "USD",
"minValue": 120000,
"maxValue": 160000,
"unitText": "YEAR"
}
Si tu oferta es por hora, utiliza:
"baseSalary": {
"@type": "PriceSpecification",
"currency": "USD",
"minValue": 45,
"maxValue": 65,
"unitText": "HOUR"
}
Frecuencia de actualización y actualizaciones
Una vez que hayas configurado una URL de feed, Indeed la rastrea periódicamente (normalmente diariamente, a veces con más frecuencia si las ofertas cambian a menudo). Cuando una oferta se cierra, elimínala del feed o establece una fecha de cierre. Indeed la desindexará automáticamente.
Google for Jobs rastrea las páginas HTML donde incrustas el marcado JSON-LD de JobPosting. Cada vez que un candidato visita tu página de ofertas, el rastreador de Google la indexa. Si eliminas el marcado JSON-LD, la oferta desaparece de Google for Jobs en cuestión de días.
Validación y depuración
Para XML de Indeed:
- Utiliza el Validador de Feed de Indeed para probar tu feed antes de conectarlo
- Errores comunes: CDATA malformado, campos obligatorios faltantes, formato de fecha inválido
Para Google for Jobs:
- Utiliza la Herramienta de Prueba de Datos Estructurados de Google o la más nueva Prueba de Resultados Enriquecidos
- Comprueba si falta datePosted, formatos de fecha inválidos o problemas de codificación de cadenas similares a CDATA
Cómo ClarityHire genera feeds
ClarityHire genera automáticamente tanto un feed XML de Indeed en /api/jobs/feed.xml como una plantilla JSON-LD de Google for Jobs que incrustas en tus páginas de ofertas en /careers/jobs/[job-id].
Cuando actualizas una oferta (título, salario, descripción), los feeds se actualizan automáticamente. Las ofertas cerradas se eliminan de los feeds en 2 horas. El sistema respeta la bandera de visibility de tu oferta: las ofertas en borrador no aparecen en los feeds.
Resumen
Indeed espera XML con descripciones envueltas en CDATA, salario y ubicación. Google for Jobs espera marcado JSON-LD en tu HTML con datePosted, validThrough y rangos de salario. Ambos utilizan formatos de fecha ISO (YYYY-MM-DD o marcas de tiempo ISO 8601). CDATA es tu aliado cuando envuelves descripciones HTML en XML. Valida antes de desplegar. Elimina automáticamente las ofertas cerradas de los feeds. Prueba con la Prueba de Resultados Enriquecidos de Google y el validador de Indeed.
Una vez configurado, tus ofertas se distribuyen a Indeed y Google sin volver a introducir datos. La configuración inicial lleva un día; la ventaja a largo plazo es enorme.