Come Funziona Davvero un Feed XML Indeed e Google for Jobs JSON-LD
I due canali di distribuzione principale
Quando posti un lavoro su Indeed o Google for Jobs hai due opzioni:
- Posta direttamente — accedi Indeed.com riempiendo un modulo clicca pubblica
- Sintetizza via feed — fornisci il tuo listing di lavoro in un formato machine-readable (XML o JSON-LD); la job board estrae dal tuo feed e lo indicizza
Il posting diretto è facile ma limitato. La sintetizzazione è un po' più tecnica ma ti dà controllo preciso: puoi aggiornare lo status di un lavoro salary o requisiti nel tuo sistema e riflettersi su Indeed entro ore senza re-entrare i dati.
La maggior parte dei team di assunzione serio usa i feed.
Il formato XML Indeed
Indeed accetta un feed XML proprietario. Ecco la struttura:
<?xml version="1.0" encoding="UTF-8"?>
<source>
<publisher>Il Tuo Nome Azienda</publisher>
<publisherurl>https://tuaazienda.com</publisherurl>
<lastBuildDate>2026-05-21T10:00:00Z</lastBuildDate>
<job>
<title>Senior Backend Engineer</title>
<date>2026-05-21T08:00:00Z</date>
<repourl>https://tuaazienda.com/jobs/senior-backend-engineer</repourl>
<description><![CDATA[
<p>Stiamo assumendo un senior backend engineer...</p>
<ul>
<li>5+ anni esperienza Python/Go</li>
</ul>
]]></description>
<salary>120000</salary>
<hiringOrganization>La Tua Azienda</hiringOrganization>
<jobLocation>
<countryName>IT</countryName>
<stateName>Lombardia</stateName>
<cityName>Milano</cityName>
</jobLocation>
<employmentType>FULL_TIME</employmentType>
<jobCategory>ENGINEER</jobCategory>
</job>
</source>
Elementi chiave:
<title>: Titolo di lavoro (richiesto)<description>: Descrizione di lavoro completa. Avvolgi in<![CDATA[...]]>se contiene HTML o caratteri speciali. Non mettere HTML dentro CDATA — mantienilo testo pulito o aggiungi il markup HTML.<salary>: Stipendio base in EUR. Alcune regioni accettano intervalli di salario ma Indeed principalmente indicizza valori singoli.<jobLocation>: Città stato paese. Se remoto ometti o imposta città a "Remoto".<date>: Quando il lavoro è stato postato (formato ISO 8601). Indeed lo usa per prioritizzare post più nuovi.<repourl>: Link di ritorno alla tua pagina di carriera per quel lavoro specifico. Quando qualcuno clicca "Applica" arriva qui.<employmentType>: FULL_TIME, PART_TIME, CONTRACT, TEMPORARY
Google for Jobs: JSON-LD
Google ha un formato diverso chiamato JobPosting dati strutturati in JSON-LD. Questo è embedded nel tuo HTML come tag <script type="application/ld+json">.
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "JobPosting",
"title": "Senior Backend Engineer",
"description": "Stiamo assumendo un senior backend engineer...",
"identifier": {
"@type": "PropertyValue",
"name": "La Tua Azienda",
"value": "job_123"
},
"datePosted": "2026-05-21",
"hiringOrganization": {
"@type": "Organization",
"name": "La Tua Azienda",
"sameAs": "https://tuaazienda.com",
"logo": "https://tuaazienda.com/logo.png"
},
"jobLocation": {
"@type": "Place",
"address": {
"@type": "PostalAddress",
"streetAddress": "Via Roma 123",
"addressLocality": "Milano",
"addressRegion": "MI",
"postalCode": "20100",
"addressCountry": "IT"
}
},
"baseSalary": {
"@type": "PriceSpecification",
"currency": "EUR",
"minValue": 120000,
"maxValue": 160000,
"unitText": "YEAR"
},
"employmentType": "FULL_TIME",
"validThrough": "2026-06-21"
}
</script>
Campi critici per Google indicizzare:
datePosted: Deve essere presente e recente. Google de-rank i post vecchi.hiringOrganization: Nome azienda e (opzionalmente) logo. Usato per lo snippet del brand del datore di lavoro.baseSalary: Intervallo di salario (min/max). Opzionale ma migliora CTR.validThrough: Data di chiusura di lavoro. Google rimuove i post dopo questa data.jobLocation: Indirizzo postale completo o remoto.
Cdata pitfall e caratteri speciali
In XML i caratteri speciali come < > e & rompono il feed. Avvolgi la tua descrizione in <![CDATA[...]]>:
<description><![CDATA[
Stiamo cercando uno sviluppatore con 5+ anni esperienza.
Esperienza con: Java Spring Boot Docker.
]]></description>
Dentro CDATA puoi includere HTML semplice:
<description><![CDATA[
<p>Stiamo cercando uno sviluppatore con 5+ anni esperienza.</p>
<ul>
<li>Java 8+</li>
<li>Spring Boot</li>
<li>Docker</li>
</ul>
]]></description>
Senza CDATA i tag <p> e <li> rompono il parser XML. Il validatore di feed di Indeed rifiuterà l'intero feed.
Codifica di salary
Indeed XML: Solo valore singolo di salary. Se hai un intervallo usa il midpoint o l'estremità bassa.
<salary>140000</salary>
Google for Jobs: Supporta intervalli:
"baseSalary": {
"@type": "PriceSpecification",
"currency": "EUR",
"minValue": 120000,
"maxValue": 160000,
"unitText": "YEAR"
}
Se il tuo lavoro è orario usa:
"baseSalary": {
"@type": "PriceSpecification",
"currency": "EUR",
"minValue": 45,
"maxValue": 65,
"unitText": "HOUR"
}
Frequenza di aggiornamento e refresh
Una volta che hai impostato un URL di feed Indeed lo craw periodicamente (solitamente giornalmente a volte più frequentemente se i lavori cambiano spesso). Quando un lavoro si chiude rimuovilo dal feed o imposta una data di chiusura. Indeed automaticamente lo de-indicizza.
Google for Jobs craw le pagine HTML dove emetti markup JobPosting JSON-LD. Ogni volta che un candidato visita la tua pagina di lavoro Google's crawler l'indicizza. Se rimuovi il markup JSON-LD il lavoro scompare da Google for Jobs entro giorni.
Validazione e debugging
Per Indeed XML:
- Usa il [Feed Validator] di Indeed (https://support.indeed.com/hc/en-us/articles/204897847-Feed-file-validator) per testare il tuo feed prima di connetterlo
- Errori comuni: CDATA malformato, campi mancanti richiesti, formato data non valido
Per Google for Jobs:
- Usa Google's Structured Data Testing Tool o il più nuovo Rich Results Test
- Controlla per datePosted mancante formati data non validi o problemi di codifica di stringa tipo CDATA
Come ClarityHire genera i feed
ClarityHire auto-genera entrambi un feed XML Indeed a /api/jobs/feed.xml e un template Google for Jobs JSON-LD che emetti sulle tue pagine di lavoro a /careers/jobs/[job-id].
Quando aggiorni un lavoro (titolo, salary, descrizione) i feed si aggiornano automaticamente. I lavori chiusi sono rimossi dai feed entro 2 ore. Il sistema rispetta il flag visibility del tuo lavoro: i lavori draft non appaiono nei feed.
TL;DR
Indeed si aspetta XML con descrizioni avvolte CDATA salary e location. Google for Jobs si aspetta markup JSON-LD su tuo HTML con datePosted validThrough e intervalli di salary. Entrambi usano formati di data ISO (YYYY-MM-DD o timestamp ISO 8601). CDATA è tuo amico quando avvolgi descrizioni HTML in XML. Valida prima di deployare. Auto-rimuovi i lavori chiusi dai feed. Testa con Google's Rich Results Test e il validatore di Indeed.
Una volta impostato i tuoi lavori si distribuiscono a Indeed e Google senza re-entry. Il setup richiede un giorno; la leva in corso è immensa.