Recruitingoperaties

Indeed XML-feeds & Google for Jobs JSON-LD, uitgelegd

ClarityHire Team(Editorial)5 min read

De twee belangrijkste distributiechannels

Wanneer je een vacature op Indeed of Google for Jobs plaatst, heb je twee opties:

  1. Direct plaatsen — log in op Indeed.com, vul een formulier in, klik op publiceren
  2. Via feed syndiceren — verstrek je eigen vacaturelijsting in een machinelesbaar formaat (XML of JSON-LD); het vacaturebord haalt het uit je feed en indexeert het

Direct plaatsen is gemakkelijk maar beperkt. Syndicatie is iets meer technisch, maar geeft je precieze controle: je kunt een vacature's status, salaris of vereisten in je systeem bijwerken, en dit wordt op Indeed weerspiegeld binnen enkele uren zonder dat je gegevens opnieuw hoeft in te voeren.

De meeste professionele wervingsteams gebruiken feeds.

Het Indeed XML-formaat

Indeed accepteert een proprietaire XML-feed. Hier is de structuur:

<?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>

Belangrijkste elementen:

  • <title>: Vacaturetitel (verplicht)
  • <description>: Volledige vacaturebeschrijving. Verpak het in <![CDATA[...]]> als het HTML of speciale tekens bevat. Plaats HTML niet binnen de CDATA — houd het schone tekst of voeg de HTML-opmaak toe.
  • <salary>: Basissalaris in USD. Sommige regio's accepteren salarisbereiken, maar Indeed indexeert primair enkele waarden.
  • <jobLocation>: Stad, staat, land. Bij externe locaties, laat het achterwege of stel de stad in op "Remote".
  • <date>: Wanneer de vacature is geplaatst (ISO 8601-formaat). Indeed gebruikt dit om nieuwere plaatsingen prioriteit te geven.
  • <repourl>: Koppeling terug naar je carrièrepagina voor deze specifieke vacature. Wanneer iemand op "Solliciteer" klikt, belanden zij hier.
  • <employmentType>: FULL_TIME, PART_TIME, CONTRACT, TEMPORARY

Google for Jobs: JSON-LD

Google heeft een ander formaat genaamd JobPosting structured data in JSON-LD. Dit is ingebed in je HTML als een <script type="application/ld+json"> tag.

<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>

Kritische velden voor Google om te indexeren:

  • datePosted: Moet aanwezig zijn en recent. Google geeft oude plaatsingen een lagere rangschikking.
  • hiringOrganization: Bedrijfsnaam en (optioneel) logo. Gebruikt voor het werkgeversmerkfragment.
  • baseSalary: Salariswaaier (min/max). Optioneel, maar verbetert de click-through rate.
  • validThrough: Datum waarop de vacature sluit. Google verwijdert plaatsingen na deze datum.
  • jobLocation: Volledig postadres of remote.

CDATA-valkuilen en speciale tekens

In XML breken speciale tekens zoals <, > en & de feed. Verpak je beschrijving in <![CDATA[...]]>:

<description><![CDATA[
We are looking for a developer with 5+ years experience.
Experience with: Java, Spring Boot, Docker.
]]></description>

Binnen CDATA kun je gewone HTML opnemen:

<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>

Zonder CDATA breken de tags <p> en <li> de XML-parser. De feed-validator van Indeed zal de gehele feed afwijzen.

Salariskodering

Indeed XML: Alleen een enkele salariswaarde. Als je een bereik hebt, gebruik dan het middelste of de laagste waarde.

<salary>140000</salary>

Google for Jobs: Ondersteunt bereiken:

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

Als je vacature per uur betaald wordt, gebruik dan:

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

Updatefrequentie en vernieuwingen

Zodra je een feed-URL hebt ingesteld, crawlt Indeed deze periodiek (meestal dagelijks, soms vaker als vacatures vaak veranderen). Wanneer een vacature sluit, verwijder je deze uit de feed of stel je een sluitingsdatum in. Indeed zal deze automatisch de-indexeren.

Google for Jobs crawlt de HTML-pagina's waar je JobPosting JSON-LD inbedt. Telkens wanneer een kandidaat je vacaturepagina bezoekt, indexeert Google's crawler deze. Als je de JSON-LD-markup verwijdert, verdwijnt de vacature binnen enkele dagen uit Google for Jobs.

Validatie en debugging

Voor Indeed XML:

  • Gebruik Indeed's Feed Validator om je feed te testen voordat je deze verbindt
  • Veelvoorkomende fouten: misvormde CDATA, ontbrekende verplichte velden, ongeldig datumformaat

Voor Google for Jobs:

Hoe ClarityHire feeds genereert

ClarityHire genereert automatisch zowel een Indeed XML-feed op /api/jobs/feed.xml als een Google for Jobs JSON-LD-template die je op je vacaturepagina's inbedt op /careers/jobs/[job-id].

Wanneer je een vacature bijwerkt (titel, salaris, beschrijving), worden de feeds automatisch vernieuwd. Gesloten vacatures worden binnen 2 uur uit feeds verwijderd. Het systeem respecteert je vacature's visibility flag: conceptvacatures verschijnen niet in feeds.

TL;DR

Indeed verwacht XML met CDATA-gewikkelde beschrijvingen, salaris en locatie. Google for Jobs verwacht JSON-LD-markup op je HTML met datePosted, validThrough en salarisbereiken. Beide gebruiken ISO-datumformaten (YYYY-MM-DD of ISO 8601-timestamps). CDATA is je vriend wanneer je HTML-beschrijvingen in XML inwikkelt. Valideer vóór implementatie. Verwijder gesloten vacatures automatisch uit feeds. Test met Google's Rich Results Test en Indeed's validator.

Nadat alles is ingesteld, worden je vacatures zonder herhaalde invoer naar Indeed en Google gedistribueerd. De setup duurt een dag; de voortdurende voordelen zijn enorm.

vacaturebordintegratiexml-feedgoogle for jobsjson-ldvacatureplaatsing