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 und ein TypeScript-SDK.
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.
Außerdem gibt es ein offizielles Next.js-Template mit Ein-Klick-Deployment und ein TypeScript-SDK, mit denen Sie eine eigene Jobseite in wenigen Minuten ausliefern können.
API-Schlüssel
Erstellen Sie ein Schlüsselpaar unter Hiring → Career Portal → Public API Keys. Jedes Paar besteht aus:
-
Publishable Key (
pk_…) — kann bedenkenlos im Browser ausgeliefert werden. Er kann veröffentlichte Stellen lesen und Bewerbungen einreichen, sonst nichts. Er gibt niemals Kandidatendaten preis. Sie können ihn auf bestimmte Origins beschränken und mit Ihrem eigenen Cloudflare-Turnstile-Widget schützen. -
Secret Key (
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 Secret Key wird nur ein einziges Mal angezeigt — bei der Erstellung oder Rotation. Sie können ihn jederzeit über die Einstellungsseite des Schlüssels rotieren; der vorherige Secret Key verliert sofort seine Gültigkeit.
Authentifizieren Sie jede Anfrage mit einem Bearer-Header:
Authorization: Bearer sk_your_secret_key
Endpunkte
Basis-URL: https://app.startupkit.app (oder Ihre benutzerdefinierte Karriere-Domain).
Veröffentlichte Stellen auflisten
GET /api/public/v1/jobs?department=&location=&employment_type=&remote=&page=&per_page=
Gibt ausschließlich veröffentlichte Stellen Ihres Kontos zurück.
{
"data": [
{
"id": "JdK2hQ8…",
"title": "Senior Rails Developer",
"department": "Engineering",
"location": "Remote",
"employment_type": "full_time",
"remote": true,
"published_at": "2026-06-01T12:00:00Z",
"url": "https://careers.yourco.com/JdK2hQ8…",
"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.
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, welche Dateitypen und -größen für Lebensläufe 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": {
"content_types": ["application/pdf", "application/msword", "application/vnd.openxmlformats-officedocument.wordprocessingml.document"],
"max_byte_size": 10485760
},
"turnstile": { "required": false, "sitekey": null }
}
}
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.
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 | origin_not_allowed |
Browser-Origin steht nicht auf der Allowlist des Schlüssels |
| 404 | not_found |
Stelle nicht gefunden oder nicht veröffentlicht |
| 409 | already_applied |
Diese E-Mail-Adresse hat sich bereits auf diese Stelle beworben |
| 422 | validation_failed |
Ungültige Bewerbungsfelder (siehe fields) |
| 422 | turnstile_failed |
Turnstile-Verifizierung fehlgeschlagen |
| 422 |
invalid_content_type / file_too_large
|
Abgelehnter Lebenslauf-Upload |
Status-Updates per 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-Template
-
TypeScript-SDK —
npm install @startupkit-app/jobs. Ein typisierter Client ohne Abhängigkeiten mitlistJobs,getJob,uploadFileundapply. - Next.js-Template — eine Jobbörse mit Ein-Klick-Deployment (Deploy to Vercel), die Sie forken und anpassen können. Sie bringt den Secret Key, dynamische Bewerbungsformulare, den presigned Lebenslauf-Upload und SEO/JSON-LD direkt mit.
Beide nutzen den oben beschriebenen Vertrag — Sie können also auch mit jedem beliebigen Framework per einfachem HTTP dagegen entwickeln.
Rate Limits
Bewerbungs-Einreichungen sind auf 10/Stunde pro IP begrenzt, Upload-Anfragen auf 30/Stunde pro IP — zusätzlich zu den globalen API-Rate-Limits. Browser-Schlüssel sind außerdem durch ihre Origin-Allowlist und optional durch Turnstile geschützt.