StartupKit
DE

Public Jobs API

Bauen Sie Ihre eigene Jobseite (z. B. mit Next.js auf Vercel) auf Ihrer Kit-Hiring-Pipeline auf. Listen Sie veröffentlichte Stellen auf und empfangen Sie Bewerbungen über eine öffentliche REST-API, ein offizielles TypeScript-SDK und eine Next.js-Vorlage mit einem Klick.

Warum das zählt

Das gehostete Karriereportal und das einbettbare Widget von Kit decken die meisten Anforderungen ab. Wenn Sie aber die volle Kontrolle über das Design möchten (eine maßgeschneiderte Karriereseite, eine eigene Landingpage pro Stelle oder eine Jobbörse, die zu Ihrem Produkt passt), können Sie mit der Public Jobs API Ihre veröffentlichten Stellen auslesen und Bewerbungen direkt in Ihre Kit-Pipeline einreichen, während Kit weiterhin Screening, Phasen, Interviews und die Kommunikation mit Kandidaten übernimmt.

Es gibt außerdem ein offizielles TypeScript-SDK und eine Next.js-Vorlage mit Ein-Klick-Deploy, mit denen Sie in wenigen Minuten eine eigene Jobseite ausliefern. Oder Sie überspringen beides und rufen die untenstehenden REST-Endpunkte direkt mit einem beliebigen HTTP-Client auf.

Sehen Sie sich Fourthwalls eigene Karriereseite als Kundenbeispiel aus der Praxis an. Die Übersicht stellt auch Kits Next.js-Vorlage vor.

API-Schlüssel

Erstellen Sie ein Schlüsselpaar unter Hiring → Karriereportal → Öffentliche API-Schlüssel. Jedes Paar besteht aus:

  • Veröffentlichbarer Schlüssel (pk_…): kann bedenkenlos im Browser ausgeliefert werden. Er kann veröffentlichte Stellen lesen und Bewerbungen einreichen, sonst nichts, und gibt niemals Kandidatendaten preis. Bevor er Bewerbungen einreichen oder presigned Uploads anfordern kann, müssen Sie mindestens eine Bot-Abwehr einrichten (eine Origin-Allowlist oder Ihr eigenes Cloudflare-Turnstile-Widget), andernfalls werden diese Anfragen mit 403 bot_protection_required abgelehnt. Das Lesen von Stellen funktioniert auch ohne diese Konfiguration.
  • Geheimer Schlüssel (sk_…): ausschließlich für die serverseitige Nutzung (z. B. eine Next.js Server Action). Er überspringt die browserseitigen Origin-/Turnstile-Prüfungen. Geben Sie ihn niemals in clientseitigem Code preis. Keiner der beiden Schlüssel kann personenbezogene Kandidatendaten lesen.

Der geheime Schlüssel wird nur ein einziges Mal angezeigt, bei der Erstellung oder Rotation. Sie können ihn jederzeit über die Einstellungsseite des Schlüssels rotieren; der bisherige geheime Schlüssel funktioniert sofort nicht mehr.

Authentifizieren Sie jede Anfrage mit einem Bearer-Header:

Authorization: Bearer sk_your_secret_key

Endpunkte

Basis-URL: https://startupkit.app oder https://app.startupkit.app (Standard des SDK; beide liefern dieselbe API) oder Ihre benutzerdefinierte Karriere-Domain.

Veröffentlichte Stellen auflisten

GET /api/public/v1/jobs?department=&location=&employment_type=&remote=&locale=&page=&per_page=

Gibt ausschließlich veröffentlichte Stellen Ihres Kontos zurück.

{
  "data": [
    {
      "id": "JdK2hQ8…",
      "title": "Senior Rails Developer",
      "department": "Engineering",
      "location": "Poznań, Poland",
      "employment_type": "full_time",
      "remote": true,
      "location_display": "Poznań, Poland · Remote (Poland, EU)",
      "city": "Poznań",
      "region": null,
      "country_code": "PL",
      "remote_regions": ["PL", "EU"],
      "published_at": "2026-06-01T12:00:00Z",
      "url": "https://careers.yourco.com/JdK2hQ8…",
      "apply_url": "https://careers.yourco.com/JdK2hQ8…/apply",
      "salary": { "min": 120000, "max": 160000, "currency": "USD", "period": "YEAR" }
    }
  ],
  "pagination": { "current_page": 1, "total_pages": 3, "total_count": 42, "per_page": 20 }
}

Die id ist das öffentliche Token der Stelle. Verwenden Sie es für die Detail- und Bewerbungs-Endpunkte. employment_type ist einer der Werte full_time, part_time, b2b, contract oder internship. Mit demselben Wert können Sie die veröffentlichten Stellen am Listen-Endpunkt filtern.

Standort und Remote-Stellen

Zeigen Sie location_display an. Das ist die fertige Ortsangabe: der Standort, das Wort „Remote“ und die Länder, aus denen Remote-Kandidaten arbeiten dürfen, jeweils genau einmal (Poznań, Poland · Remote (Poland, EU), Berlin, Remote). Mit locale=de, fr, es oder pl erhalten Sie die Angabe in dieser Sprache; Standard ist Englisch.

Setzen Sie location und remote nicht selbst zu einer Ortsangabe zusammen. location ist Freitext, genau so, wie er im Stellenformular eingegeben wurde, und kann bereits „Remote“ enthalten. So kommt es, dass eine Jobbörse das Wort zweimal ausgibt.

Die strukturierten Felder sind für Filter, Sortierung und das Google-for-Jobs-Markup gedacht:

Feld Beschreibung
city, region Büro oder Stadt der Stelle, sofern bekannt. Sonst null.
country_code Land dieses Orts nach ISO 3166-1 alpha-2 (PL) oder null.
remote true, wenn die Stelle remote ausgeübt werden kann.
remote_regions Von wo aus Remote-Kandidaten arbeiten dürfen: Codes nach ISO 3166-1 alpha-2, dazu EU für jeden EU-Mitgliedstaat. Leer, wenn die Stelle nicht remote ist oder keine Einschränkung nennt.

Eine Stelle samt Bewerbungsformular abrufen

GET /api/public/v1/jobs/:public_token

Gibt die Stelle zurück, ergänzt um ein application_form, das genau beschreibt, welche Felder und Fragen zu rendern sind, welcher Einwilligungshinweis anzuzeigen ist, ob ein Lebenslauf erforderlich ist sowie welche Dateitypen und -größen dafür akzeptiert werden und ob Turnstile erforderlich ist.

{
  "id": "JdK2hQ8…",
  "title": "Senior Rails Developer",
  "description_html": "<p>We're hiring…</p>",
  "accepting_applications": true,
  "stages": [{ "name": "Application Review", "type": "application_form" }],
  "application_form": {
    "fields": [
      { "name": "cover_letter", "type": "textarea", "label": "Cover letter", "required": false }
    ],
    "questions": [
      { "key": "why_us", "type": "text", "prompt": "Why do you want to join?", "required": true, "max_length": 2000 }
    ],
    "consent_disclosure_html": "<p>By applying you agree…</p>",
    "resume": {
      "required": false,
      "content_types": ["application/pdf", "application/msword", "application/vnd.openxmlformats-officedocument.wordprocessingml.document"],
      "max_byte_size": 10485760
    },
    "turnstile": { "required": false, "sitekey": null }
  }
}

required-Flags werden serverseitig durchgesetzt. Steht resume.required auf true, wird eine Bewerbung ohne resume_signed_id mit 422 validation_failed abgelehnt. Dasselbe gilt für jedes unbeantwortete Feld und jede unbeantwortete Frage mit required: true. Wenn Sie das Formular dynamisch aus diesem Schema rendern, berücksichtigen Sie diese Flags, sonst füllen Kandidaten alles aus und werden erst beim Absenden abgewiesen.

Lebenslauf hochladen (presigned)

Lebensläufe werden direkt in den Speicher hochgeladen und passieren daher niemals Ihren Server (das vermeidet Body-Größenlimits in Serverless-Umgebungen).

POST /api/public/v1/direct_uploads
{ "blob": { "filename": "cv.pdf", "byte_size": 102400, "checksum": "<base64 MD5>", "content_type": "application/pdf" } }
{
  "signed_id": "eyJf…",
  "direct_upload": { "url": "https://…s3…", "headers": { "Content-Type": "application/pdf", "Content-MD5": "…" } }
}

Senden Sie die Dateibytes per PUT an direct_upload.url mit den zurückgegebenen headers, und übergeben Sie anschließend die signed_id als resume_signed_id, wenn Sie die Bewerbung einreichen.

Bewerbung einreichen

POST /api/public/v1/jobs/:public_token/applications
{
  "application": {
    "email": "[email protected]",
    "first_name": "Ada",
    "last_name": "Lovelace",
    "phone": "+1 555 0100",
    "responses": { "cover_letter": "…", "why_us": "…" },
    "resume_signed_id": "eyJf…"
  },
  "turnstile_token": "<token>"
}

Gibt 201 mit einer minimalen Bestätigung ohne personenbezogene Daten zurück:

{ "id": "app_9fQ…", "status": "submitted", "job": "JdK2hQ8…", "submitted_at": "2026-06-11T09:30:00Z" }

Das turnstile_token wird nur bei Browser-Einreichungen (pk_) benötigt, wenn für den Schlüssel Turnstile konfiguriert ist; serverseitige Aufrufe (sk_) überspringen es.

Talentpool

Nicht jeder, dem Ihr Unternehmen gefällt, passt heute auf eine offene Stelle. Der Talentpool erfasst diese Menschen (E-Mail-Adresse, LinkedIn, optional einen Lebenslauf), sodass Sie sie einladen können, sobald die passende Stelle frei wird. Einträge landen zunächst unverifiziert im System: Kit verschickt einen Bestätigungslink, und niemand gelangt über diesen Endpunkt in Ihren Pool, bevor er ihn angeklickt hat. (Admins können Lebensläufe außerdem direkt importieren, das ist ein separater Zugang mit eigenen Regeln.)

Bei einer Talentpool-Anmeldung bittet jemand darum, seine Daten ohne konkrete Stelle bei Ihnen zu hinterlegen. Dafür braucht es eine ausdrückliche Einwilligung: ein tatsächlich aktiviertes Kontrollkästchen, nicht bloß einen Hinweis, den Sie anzeigen. Eine öffentliche Anmeldung ohne diese Einwilligung lehnt Kit ab. Bei einem Admin-Import wird stattdessen eine Bestätigung der Rechtsgrundlage festgehalten, denn dort ist niemand da, der etwas ankreuzen könnte.

Das Anmeldeformular abrufen

GET /api/public/v1/talent_pool
{
  "accepting_signups": true,
  "consent": {
    "required": true,
    "disclosure_html": "<p>Keep my details on file for 24 months…</p>",
    "retention_months": 24,
    "privacy_policy_url": "https://yourco.com/privacy"
  },
  "fields": [
    { "name": "email", "required": true },
    { "name": "linkedin_url", "required": false },
    { "name": "resume_signed_id", "required": false }
  ],
  "resume": {
    "required": false,
    "content_types": ["application/pdf", "application/msword", "application/vnd.openxmlformats-officedocument.wordprocessingml.document"],
    "max_byte_size": 10485760
  },
  "turnstile": { "required": false, "sitekey": null }
}

Rendern Sie consent.disclosure_html als Beschriftung eines Kontrollkästchens, das nicht aktiviert vorbelegt ist. Es ist Ihr eigener Einwilligungstext. Bearbeiten Sie ihn unter Hiring → Einstellungen → Einwilligung, zusammen mit retention_months: Dieser Wert steuert, wann Kit Einträge anonymisiert, deren Einwilligung niemand erneuert hat.

Dem Talentpool beitreten

POST /api/public/v1/talent_pool/entries
{
  "talent_pool_entry": {
    "email": "[email protected]",
    "linkedin_url": "https://linkedin.com/in/ada",
    "resume_signed_id": "eyJf…",
    "consent": true,
    "consent_ip_address": "203.0.113.7"
  },
  "turnstile_token": "<token>"
}

Gibt 201 mit einer Bestätigung ohne personenbezogene Daten zurück:

{ "id": "tpe_9fQ…", "status": "pending_verification", "submitted_at": "2026-06-11T09:30:00Z" }

Lebensläufe nutzen denselben presigned Upload wie Bewerbungen: fordern Sie eine signed_id an, senden Sie die Bytes per PUT und übergeben Sie sie anschließend als resume_signed_id.

Festhalten, wer eingewilligt hat

Zu jedem Eintrag speichert Kit einen Einwilligungsnachweis: den genau angezeigten Text, den Zeitstempel und die IP-Adresse der Person, die zugestimmt hat. Am letzten Feld scheitern serverseitige Integrationen gern unbemerkt.

Wird aus dem Browser mit einem pk_-Schlüssel eingereicht, stellt Kit die IP-Adresse selbst fest und ignoriert ein mitgesendetes consent_ip_address. Ein Schlüssel, der im JavaScript der Seite ausgeliefert wird, darf seinen eigenen Nachweis nicht schreiben können.

Wird von Ihrem Server mit einem sk_-Schlüssel eingereicht, sieht Kit die IP-Adresse Ihres Servers, nicht die der Person. Senden Sie die tatsächliche Adresse als consent_ip_address. In einer Vercel Server Action ist das der erste Eintrag in x-forwarded-for:

import { headers } from "next/headers";

const forwarded = (await headers()).get("x-forwarded-for");
const consentIp = forwarded?.split(",")[0]?.trim();

Dieser Wert ist von Ihnen behauptet, nicht bewiesen: Kit speichert, was Sie senden, sobald es sich als IP-Adresse parsen lässt, und lehnt alles andere mit 422 invalid_consent_ip ab. Lassen Sie das Feld weg, wenn Sie die Adresse nicht kennen. Kit hält dann keine IP fest, statt einen Nachweis zu speichern, der auf die falsche Maschine zeigt.

Analytik für Stellenanzeigen

Das Dashboard Hiring → Karriereportal-Analytik in Kit (Aufrufe, eindeutige Besucher, Traffic-Quellen, UTM-Kampagnen, Länder, Geräte, Landingpages und der Trichter von Aufruf bis Bewerbung) füllt sich auch aus Ihrer eigenen Website. Ihre Website meldet, was Besucher tun; Kit zeichnet es genauso auf wie Besuche des gehosteten Karriereportals, sodass jedes Diagramm und der Analytik-Tab der einzelnen Stelle unverändert funktionieren.

Solange Ihre Website keine Ereignisse sendet, zeigt das Dashboard einen Hinweis an, sobald einer Ihrer API-Schlüssel im gewählten Zeitraum verwendet wurde.

Ereignisse kommen aus dem Browser des Besuchers und tragen einen veröffentlichbaren Schlüssel (pk_). Kit liest die (maskierte) IP-Adresse, das Gerät und das Land des Besuchers aus dieser Anfrage; würden Sie Ereignisse über Ihren Server weiterleiten, wäre jeder Besucher als Ihr Server verzeichnet. Geheime Schlüssel werden mit publishable_key_required abgelehnt. Hat der Schlüssel eine Origin-Allowlist, nehmen Sie den Origin Ihrer Website darin auf.

Ereignisse senden

POST /api/public/v1/events

{
  "events": [
    {
      "name": "job.viewed",
      "job": "abc123",
      "url": "https://careers.acme.com/jobs/abc123?utm_source=linkedin",
      "referrer": "https://www.linkedin.com/",
      "time": "2026-09-22T10:00:00.000Z"
    }
  ]
}
Ereignis Wann job
job_board.viewed Die Stellenliste wird angezeigt Keine
job.viewed Eine Stellenseite wird angezeigt Erforderlich
application.started Der Besucher interagiert zum ersten Mal mit dem Bewerbungsformular Erforderlich
application.submitted Eine Bewerbung wurde angenommen Erforderlich
talent_pool.joined Eine Talentpool-Anmeldung wurde angenommen Keine
  • job ist die id der Stelle (öffentliches Token) aus GET /jobs.
  • url ist die Seite, auf der das Ereignis stattfand (location.href), und referrer ist document.referrer. Das erste Ereignis eines Besuchs legt dessen Landingpage, verweisende Domain und utm_*-Kampagne fest. Eine url auf einem anderen Host als dem Origin der Anfrage wird ignoriert, und ein Referrer von Ihrer eigenen Website zählt als direkter Traffic.
  • time ist optional. Kit übernimmt den Wert nur, wenn er in der letzten Minute liegt; andernfalls wird der Zeitpunkt des Eingangs festgehalten.
  • Senden Sie bis zu 20 Ereignisse pro Anfrage. Crawler werden stillschweigend verworfen.

Die Antwort ist 202 Accepted mit einem Urteil je Ereignis, sodass ein vertipptes Token nicht den Rest des Stapels verwirft:

{ "accepted": 1, "rejected": [{ "index": 1, "code": "unknown_job" }] }

Die Codes je Ereignis sind unknown_event, job_required und unknown_job.

Das TypeScript-SDK (ab 0.5) kapselt all das in createTracker. Es bündelt Ereignisse, sendet sie beim Schließen des Tabs ab, tut beim serverseitigen Rendern nichts und wirft niemals Fehler:

import { createTracker } from "@startupkit-app/jobs";

const tracker = createTracker({ publishableKey: process.env.NEXT_PUBLIC_STARTUPKIT_PUBLISHABLE_KEY });

tracker.jobBoardViewed();
tracker.jobViewed(job.id);
tracker.applicationStarted(job.id);
tracker.applicationSubmitted(job.id);
tracker.talentPoolJoined();

Fehler

Fehler werden in einem einheitlichen Format zurückgegeben:

{ "error": { "code": "validation_failed", "message": "Email can't be blank", "fields": { "email": ["can't be blank"] } } }
Status Code Bedeutung
401 invalid_key Fehlender oder ungültiger API-Schlüssel
403 bot_protection_required Publishable Key (pk_) hat weder eine Origin-Allowlist noch Turnstile konfiguriert
403 origin_not_allowed Browser-Origin steht nicht auf der Allowlist des Schlüssels
403 publishable_key_required Analytik-Ereignisse mit einem geheimen Schlüssel (sk_) gesendet
404 not_found Stelle nicht gefunden oder nicht veröffentlicht
409 already_applied Diese E-Mail-Adresse hat sich bereits auf diese Stelle beworben
409 already_in_talent_pool Diese E-Mail-Adresse ist bereits im Talentpool
422 validation_failed Ungültige Bewerbungsfelder, dazu zählen ein fehlender erforderlicher Lebenslauf sowie unbeantwortete Pflichtfelder und -fragen (siehe fields)
422 consent_required Talentpool-Anmeldung ohne aktiviertes Einwilligungs-Kontrollkästchen eingegangen
422 invalid_consent_ip consent_ip_address ist keine gültige IP-Adresse
422 turnstile_failed Turnstile-Verifizierung fehlgeschlagen
422 too_many_events Mehr als 20 Analytik-Ereignisse in einer Anfrage
422 invalid_content_type / file_too_large / invalid_byte_size Abgelehnter Lebenslauf-Upload

Status-Updates über Webhooks

Um Bewerbungen nach der Einreichung weiterzuverfolgen, konfigurieren Sie ausgehende Webhooks. Relevante Ereignisse sind unter anderem application.submitted, application.advanced und application.rejected sowie job_posting.published/paused/closed. Bewerbungs-Payloads enthalten sowohl die numerische id als auch die API-prefix_id (app_…) sowie das public_token der Stelle, sodass Sie Webhook-Ereignisse mit API-Datensätzen verknüpfen können.

SDK & Next.js-Vorlage

Zwei offizielle, quelloffene Ausgangspunkte setzen auf der oben beschriebenen REST-Schnittstelle auf. Nutzen Sie einen davon oder überspringen Sie beide und rufen die Endpunkte direkt mit einem beliebigen HTTP-Client auf.

  • TypeScript-SDK: @startupkit-app/jobs. Ein typisierter, abhängigkeitsfreier Client (natives fetch, ESM + CJS, Node ≥ 20.19), der in Node, Browsern und Edge-Runtimes läuft. Installieren Sie ihn mit npm install @startupkit-app/jobs und dann:

    import { createClient } from "@startupkit-app/jobs";
    
    const kit = createClient({ secretKey: process.env.KIT_SECRET_KEY });
    
    const page = await kit.listJobs({ department: "Engineering", remote: true });
    const job = await kit.getJob(page.data[0].id);
    const { signed_id } = await kit.uploadFile(resumeFile);
    await kit.apply(job.id, { email: "[email protected]", resume_signed_id: signed_id });
    

    Übergeben Sie in Browser-Code publishableKey (pk_…) statt secretKey. Weitere Methoden: allJobs() iteriert asynchron über alle Seiten, createUpload() bietet feinere Kontrolle über den presigned Upload, und getTalentPool() / joinTalentPool() decken die oben beschriebene Talentpool-Anmeldung ab, und createTracker() sendet Analytik-Ereignisse für Stellenanzeigen. Nicht-2xx-Antworten werfen KitApiError (mit .code und .fields); Fehler, die die API nie erreichen, werfen KitNetworkError. Der Client verwendet standardmäßig die Basis-URL https://app.startupkit.app; übergeben Sie baseUrl, um sie für eine benutzerdefinierte Karriere-Domain zu überschreiben.

  • Next.js-Vorlage: nextjs-job-board. Eine produktionsreife Karriereseite (Next.js App Router, Server Components + Server Actions, ISR mit tag-basierter Revalidierung), die Sie forken oder mit einem Klick deployen können. Sie rendert das Bewerbungsformular dynamisch aus dem API-Schema, führt presigned Lebenslauf-Uploads direkt in den Speicher durch, gibt schema.org-JobPosting-JSON-LD aus (bereit für Google for Jobs) und revalidiert optional sofort per Webhook. Setzen Sie eine einzige Umgebungsvariable, STARTUPKIT_SECRET_KEY (Ihr sk_…-Schlüssel), und deployen Sie:

    Deploy with Vercel

    Live-Demo: nextjs-job-board-orcin.vercel.app. Optionale Umgebungsvariablen: STARTUPKIT_BASE_URL (Standard: https://app.startupkit.app), NEXT_PUBLIC_TURNSTILE_SITE_KEY, KIT_WEBHOOK_SIGNING_SECRET und NEXT_PUBLIC_COMPANY_NAME.

Beide nutzen dieselbe Schnittstelle, sodass Sie auch mit jedem beliebigen Framework über einfaches HTTP entwickeln können. Eine typische eigene Jobseite verbindet vier Aufrufe: Stellen auflisten, eine Stelle samt Formular abrufen, einen presigned Upload für den Lebenslauf anfordern und die Bewerbung einreichen. Da alles reines JSON über HTTPS ist, funktioniert dieselbe Integration serverseitig (sk_-Schlüssel) wie im Browser (pk_-Schlüssel mit konfigurierter Bot-Abwehr).

Konvention für externe Stellenanzeigen

Damit Ihre Website Besucher über die Jobbörsenlinks von Kit empfangen kann, müssen die Stellendetails unter {careers_homepage}/jobs/{public_token} erreichbar sein. Verwenden Sie die id der Stelle aus der API (das öffentliche Token), nicht die numerische Datenbank-ID oder einen Slug, der nur aus dem Titel besteht. Bei einer Startseite unter https://example.com/careers lautet die Detail-URL https://example.com/careers/jobs/senior-engineer-abc123. Wenn Sie die Next.js-Vorlage unter /careers bereitstellen, konfigurieren Sie basePath in Next.js entsprechend.

Aktivieren Sie die externe Startseite und Stellenanzeigen auf Ihrer externen Karriereseite anzeigen in den Karriereportal-Einstellungen erst, wenn diese Seiten funktionieren. Bestehende Konten zeigen weiterhin Kit-Stellenanzeigen, bis sie die Option aktivieren.

Normale öffentliche Kit-Stellen-URLs richten sich nach der Einstellung für externe Stellenanzeigen, wenn die Stelle öffentlich ist und Bewerbungen annimmt. Dazu gehören geteilte Links, Jobbörsenlinks und die url der Stelle aus der öffentlichen API. Mit destination=kit zeigen Sie ausdrücklich die Kit-Stellenanzeige an. Wenn Sie die Option deaktivieren, zeigen dieselben öffentlichen URLs wieder die Kit-Seite. Einbettungen, JSON-Antworten und Kit-Bewerbungsrouten bleiben bei Kit. Abfrageparameter und Fragmente der Startseiten-URL werden nicht in den externen Stellenpfad übernommen.

Verwenden Sie die apply_url aus der API für das Kit-Bewerbungsformular; sie bleibt immer bei Kit. Fehlt dieses Feld in älteren API-Antworten, hängen Sie /apply nur dann an, wenn url eine aktive Kit-Karrieredomain oder eine gültige Kit-Route unter /careers/:slug/:public_token verwendet. Behalten Sie die Abfrageparameter bei. Verweist url auf eine nicht verifizierte Unternehmensdomain, aktualisieren Sie die API-Anbindung und verwenden Sie apply_url, statt einen Bewerbungslink daraus zu erstellen. Kit leitet utm_source, utm_medium, utm_campaign, utm_content, utm_term und eine ausdrücklich angegebene locale weiter. Übernehmen Sie die Kampagnenparameter in den Link von der externen Stellenanzeige zum Bewerbungsformular, damit die Herkunft zugeordnet werden kann. Verwenden Sie destination=kit für einen Link zurück zur Stellenbeschreibung bei Kit. Sie können auch eine eigene Bewerbungsseite verwenden, die auf die API zugreift. Die Vorlage nutzt ihre eigene Seite unter /jobs/{public_token}/apply.

Ältere Links mit #apply bleiben kompatibel: Der Browser öffnet zuerst die eigene Kit-Bewerbungsroute, statt zur externen Seite weiterzuleiten. Andere normale HTML-Aufrufe führen zur externen Stellenanzeige. Ohne JavaScript bietet die Übergangsseite die Links Stelle ansehen und Hier bewerben. HEAD-Anfragen leiten direkt zur externen Stellenanzeige weiter. Verwenden Sie für neue Bewerbungslinks apply_url oder /{public_token}/apply. Angemeldete Kandidaten sehen Stellenbeschreibungen in ihrem Kandidatenportal und können zu ihren Bewerbungen zurückkehren.

Behalten Sie diese Route bei, wenn Sie Ihre Website neu gestalten. Ein nicht vorhandenes öffentliches Token sollte 404 zurückgeben; eine geschlossene Stelle sollte deutlich erklären, dass keine Bewerbungen mehr angenommen werden. Testen Sie einen echten Jobbörsenlink und den zugehörigen Bewerbungsablauf, bevor Sie Weiterleitungen aktivieren. Weiterleitungsziele müssen HTTPS auf einer verifizierten Unternehmensdomain verwenden. Kit ruft die externe Website nicht zur Überprüfung ab.

Rate Limits

Bewerbungseinreichungen sind auf 10/Stunde pro IP begrenzt, Upload-Anfragen auf 30/Stunde pro IP und 300/Stunde pro Schlüssel, zusätzlich zu den globalen API-Rate-Limits. Browser-Schlüssel sind außerdem durch ihre Origin-Allowlist und optional durch Turnstile geschützt.

Analytik-Ereignisse sind auf 60 Anfragen/Minute und 600/Stunde pro IP sowie 10.000 Anfragen/Stunde pro Schlüssel begrenzt. Vom API-Limit pro Schlüssel sind sie ausgenommen, es würde sonst eine gut besuchte Website ausbremsen, die sich alle Besucher teilen.

Talentpool-Anmeldungen sind auf 100/Stunde pro Schlüssel begrenzt. Browser-Anmeldungen (pk_) unterliegen zusätzlich einer Grenze von 5/Stunde pro IP, serverseitige Anmeldungen (sk_) dagegen nicht: Sie alle erreichen Kit von derselben Ausgangsadresse, und eine Obergrenze pro IP würde Ihre gesamte Website ausbremsen statt einer einzelnen Person.

Suchbegriff eingeben...