Recruiting Ops

Feed XML Indeed e Google for Jobs JSON-LD, Spiegati

ClarityHire Team(Editorial)5 min read

I due principali canali di distribuzione

Quando pubblichi un annuncio di lavoro su Indeed o Google for Jobs, hai due opzioni:

  1. Pubblica direttamente — accedi a Indeed.com, compila un modulo e fai clic su pubblica
  2. Distribuisci tramite feed — fornisci i tuoi annunci di lavoro in un formato leggibile da macchine (XML o JSON-LD); la job board estrae dal tuo feed e li indicizza

La pubblicazione diretta è facile ma limitata. La distribuzione tramite feed è un po' più tecnica, ma ti dà un controllo preciso: puoi aggiornare lo stato, lo stipendio o i requisiti di un annuncio nel tuo sistema, e riflettendosi su Indeed entro poche ore senza doverli reinserire manualmente.

La maggior parte dei team di reclutamento seri utilizza 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 Nome della Tua 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 cercando un senior backend engineer...</p>
      <ul>
        <li>5+ anni di esperienza con 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 del posto (obbligatorio)
  • <description>: Descrizione completa del lavoro. Racchiudila in <![CDATA[...]]> se contiene HTML o caratteri speciali. Non inserire HTML dentro CDATA — mantienilo come testo pulito oppure aggiungi il markup HTML.
  • <salary>: Stipendio base in USD. Alcune regioni accettano intervalli di stipendio, ma Indeed indicizza principalmente valori singoli.
  • <jobLocation>: Città, regione, paese. Se il lavoro è remoto, ometti questo campo oppure imposta la città come "Remoto".
  • <date>: Data di pubblicazione del lavoro (formato ISO 8601). Indeed lo usa per dare priorità agli annunci più recenti.
  • <repourl>: Collegamento alla tua pagina carriere relativa a questo specifico lavoro. Quando qualcuno fa clic su "Candida", arriva qui.
  • <employmentType>: FULL_TIME, PART_TIME, CONTRACT, TEMPORARY

Google for Jobs: JSON-LD

Google utilizza un formato diverso chiamato dati strutturati JobPosting in JSON-LD. Viene incorporato 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 cercando 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": "USD",
    "minValue": 120000,
    "maxValue": 160000,
    "unitText": "YEAR"
  },
  "employmentType": "FULL_TIME",
  "validThrough": "2026-06-21"
}
</script>

Campi critici per l'indicizzazione di Google:

  • datePosted: Deve essere presente e recente. Google penalizza gli annunci vecchi.
  • hiringOrganization: Nome dell'azienda e (opzionalmente) logo. Viene utilizzato per il frammento del marchio dell'azienda.
  • baseSalary: Intervallo di stipendio (minimo/massimo). Facoltativo ma migliora il CTR.
  • validThrough: Data di chiusura del lavoro. Google rimuove gli annunci dopo questa data.
  • jobLocation: Indirizzo postale completo o remoto.

Tranelli di CDATA e caratteri speciali

In XML, i caratteri speciali come <, > e & danneggiano il feed. Racchiudi la tua descrizione in <![CDATA[...]]>:

<description><![CDATA[
Stiamo cercando uno sviluppatore con 5+ anni di esperienza.
Esperienza con: Java, Spring Boot, Docker.
]]></description>

Dentro CDATA, puoi includere HTML semplice:

<description><![CDATA[
<p>Stiamo cercando uno sviluppatore con 5+ anni di esperienza.</p>
<ul>
  <li>Java 8+</li>
  <li>Spring Boot</li>
  <li>Docker</li>
</ul>
]]></description>

Senza CDATA, i tag <p> e <li> interrompono il parser XML. Lo strumento di validazione dei feed di Indeed rifiuterà l'intero feed.

Codifica dello stipendio

Indeed XML: Solo un valore singolo di stipendio. Se hai un intervallo, usa il punto medio o l'estremità inferiore.

<salary>140000</salary>

Google for Jobs: Supporta gli intervalli:

"baseSalary": {
  "@type": "PriceSpecification",
  "currency": "USD",
  "minValue": 120000,
  "maxValue": 160000,
  "unitText": "YEAR"
}

Se il tuo lavoro è pagato su base oraria, usa:

"baseSalary": {
  "@type": "PriceSpecification",
  "currency": "USD",
  "minValue": 45,
  "maxValue": 65,
  "unitText": "HOUR"
}

Frequenza di aggiornamento e refresh

Una volta configurato l'URL del feed, Indeed lo visita periodicamente (di solito quotidianamente, talvolta più frequentemente se gli annunci cambiano spesso). Quando un lavoro si chiude, rimuovilo dal feed oppure imposta una data di chiusura. Indeed automaticamente lo rimuoverà dall'indice.

Google for Jobs visita le pagine HTML dove incorpori il markup JobPosting JSON-LD. Ogni volta che un candidato accede alla tua pagina di lavoro, il crawler di Google la indicizza. Se rimuovi il markup JSON-LD, il lavoro scompare da Google for Jobs entro pochi giorni.

Validazione e debug

Per Indeed XML:

  • Utilizza lo strumento di convalida del feed di Indeed per testare il tuo feed prima di collegarlo
  • Errori comuni: CDATA malformato, campi obbligatori mancanti, formato data non valido

Per Google for Jobs:

Come ClarityHire genera i feed

ClarityHire genera automaticamente sia un feed XML Indeed su /api/jobs/feed.xml che un template JSON-LD di Google for Jobs da incorporare nelle tue pagine di lavoro su /careers/jobs/[job-id].

Quando aggiorni un annuncio (titolo, stipendio, descrizione), i feed si aggiornano automaticamente. I lavori chiusi vengono rimossi dai feed entro 2 ore. Il sistema rispetta il flag visibility del tuo annuncio: gli annunci in bozza non compaiono nei feed.

TL;DR

Indeed richiede XML con descrizioni avvolte in CDATA, stipendio e ubicazione. Google for Jobs richiede il markup JSON-LD nel tuo HTML con datePosted, validThrough e intervalli di stipendio. Entrambi utilizzano formati di data ISO (YYYY-MM-DD o timestamp ISO 8601). CDATA è il tuo alleato quando avvolgi descrizioni HTML in XML. Valida prima di distribuire. Rimuovi automaticamente gli annunci chiusi dai feed. Testa con il test Rich Results di Google e lo strumento di validazione di Indeed.

Una volta configurato, i tuoi annunci si distribuiscono a Indeed e Google senza reinserimento manuale. La configurazione richiede un giorno; il valore continuativo è enorme.

integrazione job boardfeed xmlgoogle for jobsjson-ldannuncio di lavoro

Articoli correlati