Recruiting Ops

Indeed XML-Feeds und Google for Jobs JSON-LD erklärt

ClarityHire Team(Editorial)5 min read

Die zwei Hauptverteilungskanäle

Wenn Sie eine Stelle auf Indeed oder Google for Jobs posten, haben Sie zwei Optionen:

  1. Direkt posten — Melden Sie sich auf Indeed.com an, füllen Sie ein Formular aus, klicken Sie auf Veröffentlichen
  2. Über Feed verbreiten — Stellen Sie Ihre eigene Stellenausschreibung in einem maschinenlesbaren Format (XML oder JSON-LD) bereit; die Job-Plattform ruft Ihren Feed ab und indiziert ihn

Direktes Posten ist einfach, aber begrenzt. Die Verbreitung über Feeds ist etwas technischer, gibt Ihnen aber präzise Kontrolle: Sie können den Status, das Gehalt oder die Anforderungen einer Stelle in Ihrem System aktualisieren, und dies spiegelt sich innerhalb von Stunden auf Indeed wider, ohne die Daten erneut eingeben zu müssen.

Die meisten professionellen Recruiting-Teams nutzen Feeds.

Das Indeed XML-Format

Indeed akzeptiert einen proprietären XML-Feed. Hier ist die Struktur:

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

Wichtige Elemente:

  • <title>: Stellenbezeichnung (erforderlich)
  • <description>: Vollständige Stellenbeschreibung. Umhüllen Sie sie mit <![CDATA[...]]>, wenn sie HTML oder Sonderzeichen enthält. Geben Sie HTML nicht innerhalb des CDATA ein — halten Sie es bei sauberen Text oder fügen Sie das HTML-Markup hinzu.
  • <salary>: Grundgehalt in USD. Einige Regionen akzeptieren Gehaltsspannen, aber Indeed indiziert in erster Linie einzelne Werte.
  • <jobLocation>: Stadt, Bundesstaat, Land. Falls Remote, weglassen oder Stadt auf „Remote" setzen.
  • <date>: Wann die Stelle gepostet wurde (ISO 8601-Format). Indeed nutzt dies, um neuere Postings zu priorisieren.
  • <repourl>: Link zurück zu Ihrer Careers-Seite für diese spezifische Stelle. Wenn jemand auf „Bewerben" klickt, landen Sie hier.
  • <employmentType>: FULL_TIME, PART_TIME, CONTRACT, TEMPORARY

Google for Jobs: JSON-LD

Google hat ein anderes Format namens JobPosting strukturierte Daten in JSON-LD. Diese sind in Ihrem HTML als <script type="application/ld+json">-Tag eingebettet.

<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 Felder für die Google-Indizierung:

  • datePosted: Muss vorhanden und aktuell sein. Google stuft alte Postings herab.
  • hiringOrganization: Unternehmensname und (optional) Logo. Wird für das Employer-Brand-Snippet verwendet.
  • baseSalary: Gehaltsspanne (Min./Max.). Optional, verbessert aber die Klickrate.
  • validThrough: Bewerbungsschluss der Stelle. Google entfernt Postings nach diesem Datum.
  • jobLocation: Vollständige Postanschrift oder Remote.

CDATA-Fallstricke und Sonderzeichen

In XML unterbrechen Sonderzeichen wie <, > und & den Feed. Umhüllen Sie Ihre Beschreibung mit <![CDATA[...]]>:

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

Innerhalb von CDATA können Sie einfaches HTML einfügen:

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

Ohne CDATA unterbrechen die <p>- und <li>-Tags den XML-Parser. Indeed's Feed-Validator wird den gesamten Feed ablehnen.

Gehaltskodierung

Indeed XML: Nur einzelner Gehaltswert. Falls Sie eine Spanne haben, nutzen Sie den Mittelwert oder das niedrigere Ende.

<salary>140000</salary>

Google for Jobs: Unterstützt Spannen:

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

Falls Ihre Stelle stündlich bezahlt wird, verwenden Sie:

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

Aktualisierungshäufigkeit und Auffrischungen

Sobald Sie eine Feed-URL eingerichtet haben, crawlt Indeed sie regelmäßig (normalerweise täglich, manchmal häufiger, wenn sich die Stellen häufig ändern). Wenn eine Stelle geschlossen wird, entfernen Sie sie aus dem Feed oder setzen Sie ein Abschlussdatum. Indeed wird sie automatisch de-indizieren.

Google for Jobs crawlt die HTML-Seiten, auf denen Sie JobPosting JSON-LD-Markup einbetten. Jedes Mal, wenn ein Kandidat Ihre Stellenseite besucht, indiziert Googles Crawler sie. Wenn Sie das JSON-LD-Markup entfernen, verschwindet die Stelle innerhalb weniger Tage aus Google for Jobs.

Validierung und Debugging

Für Indeed XML:

  • Verwenden Sie Indeed's Feed Validator, um Ihren Feed vor der Verbindung zu testen
  • Häufige Fehler: Malformed CDATA, fehlende erforderliche Felder, ungültiges Datumsformat

Für Google for Jobs:

Wie ClarityHire Feeds generiert

ClarityHire generiert automatisch einen Indeed XML-Feed unter /api/jobs/feed.xml und eine Google for Jobs JSON-LD-Vorlage, die Sie auf Ihren Stellenseiten unter /careers/jobs/[job-id] einbetten.

Wenn Sie eine Stelle aktualisieren (Titel, Gehalt, Beschreibung), werden die Feeds automatisch aktualisiert. Geschlossene Stellen werden innerhalb von 2 Stunden aus Feeds entfernt. Das System respektiert das visibility-Flag Ihrer Stelle: Entwurfsstellen erscheinen nicht in Feeds.

TL;DR

Indeed erwartet XML mit CDATA-umhüllten Beschreibungen, Gehalt und Standort. Google for Jobs erwartet JSON-LD-Markup auf Ihrem HTML mit datePosted, validThrough und Gehaltsspannen. Beide verwenden ISO-Datumsformate (YYYY-MM-DD oder ISO 8601-Zeitstempel). CDATA ist Ihr Freund beim Umhüllen von HTML-Beschreibungen in XML. Validieren Sie vor der Bereitstellung. Entfernen Sie geschlossene Stellen automatisch aus Feeds. Testen Sie mit Googles Rich Results Test und Indeed's Validator.

Nach der Einrichtung werden Ihre Stellen ohne erneute Eingabe auf Indeed und Google verteilt. Die Einrichtung dauert einen Tag; der laufende Nutzen ist immens.

Job-Board-IntegrationXML-FeedGoogle for JobsJSON-LDStellenausschreibung