Recruiting Ops

Come Funziona Davvero un Feed XML Indeed e Google for Jobs JSON-LD

ClarityHire Team(Editorial)5 min read

I due canali di distribuzione principale

Quando posti un lavoro su Indeed o Google for Jobs hai due opzioni:

  1. Posta direttamente — accedi Indeed.com riempiendo un modulo clicca pubblica
  2. 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:

Per Google for Jobs:

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.

job board integrationxml feedgoogle for jobsjson-ldjob posting

Articoli correlati