Job-API
Poste Stellenanzeigen direkt aus deinem eigenen System — ohne den Browser. Die API ist für Personaldienstleister und Betriebe gedacht, die viele Stellen automatisiert einstellen und aktualisieren. Abgerechnet wird per Prepaid-Guthaben: kein Checkout pro Anzeige.
Quickstart in 3 Schritten
-
1
API-Key erstellen
Lege in deinem Konto unter Dashboard → API-Keys einen Schlüssel an. Er wird dir einmalig im Klartext angezeigt — kopiere ihn sofort.
-
2
Verbindung prüfen
Ein erster Call an
GET /api/v1/mebestätigt, dass dein Key gültig ist, und zeigt deine Guthaben-Stände.curl https://gewerbejobs24.de/api/v1/me \ -H "Authorization: Bearer gj_live_dein_key" -
3
Erste Stelle posten
Schick einen
POST /api/v1/jobsmit Titel, Beschreibung, Kategorie und Standort. Die Anzeige geht bei ausreichendem Guthaben sofort live. Das vollständige Beispiel findest du bei den Code-Beispielen.
Verbindung testen
Trag deinen API-Key ein und teste ihn direkt hier im Browser. Dieser Test ruft ausschließlich
das lesende GET /api/v1/me auf —
es wird nichts gepostet und kein Guthaben verbraucht. Dein Key bleibt lokal in deinem Browser und
wird nirgends gespeichert.
Tipp: Ein HTTP 401 bedeutet ungültiger oder widerrufener Key.
Authentifizierung
Jeder Request trägt deinen API-Key im Authorization-Header
als Bearer-Token. Es gibt keine Cookies und keinen Login-Flow — die API ist rein Maschine-zu-Maschine.
Authorization: Bearer gj_live_dein_key
- •Der Key wird nur einmal bei der Erstellung im Klartext angezeigt. Gespeichert wird bei uns nur ein Hash — verlierst du ihn, erstelle einen neuen.
- •Du kannst mehrere Keys parallel führen (z. B. für Rotation) und jeden einzeln widerrufen.
- •Behandle den Key wie ein Passwort. Gib ihn nicht im Frontend oder in öffentlichen Repos preis.
Abrechnung (Prepaid)
Beim Posten wird das Guthaben in dieser Reihenfolge belastet:
- Zuerst ein Bundle-Credit (1 Credit = 1 Anzeige × 30 Tage), ältester zuerst.
- Sonst dein Geld-Guthaben, sofern es den Anzeigenpreis deckt.
- Reicht beides nicht, antwortet die API mit
HTTP 402und einem Hinweis, ein Bundle zu kaufen oder aufzuladen.
Deine aktuellen Stände fragst du jederzeit über
GET /api/v1/credits ab.
Endpoints-Referenz
Basis-URL: https://gewerbejobs24.de/api/v1.
Alle Antworten sind JSON, Enums werden als String übertragen.
| Methode | Pfad | Zweck |
|---|---|---|
| GET | /me | Key prüfen, Firmen-Infos + Guthaben-Stände |
| GET | /credits | Bundle-Credits (Rest) + Geld-Guthaben |
| GET | /jobs | Eigene Stellen listen |
| GET | /jobs/{id} | Status einer Stelle |
| POST | /jobs | Stelle anlegen und sofort veröffentlichen |
| POST | /jobs/bulk | Mehrere Stellen (Teilerfolg, HTTP 207) |
| POST | /jobs/{id}/deactivate | Stelle deaktivieren |
GET /me
Antwort · 200
{
"companyName": "Muster Elektro GmbH",
"email": "kontakt@muster-elektro.de",
"customerNumber": 10042,
"moneyCredit": 49.00,
"bundleCreditsRemaining": 8
}
GET /credits
Antwort · 200
{
"moneyCredit": 49.00,
"bundleCreditsRemaining": 8
}
GET /jobs
Antwort · 200
{
"jobs": [
{
"id": "665f0c1e9b3a2f00123abcd0",
"title": "Elektroniker (m/w/d) für Energie- und Gebäudetechnik",
"status": "Active",
"publicUrl": "https://gewerbejobs24.de/job/elektroniker-mwd-frankfurt",
"expiresAt": "2026-10-06T00:00:00Z",
"createdAt": "2026-09-06T09:12:00Z",
"externalRef": "req-2026-00042"
}
]
}
GET /jobs/{id}
Antwort · 200 · unbekannte ID → 404 job_not_found
{
"id": "665f0c1e9b3a2f00123abcd0",
"title": "Elektroniker (m/w/d) für Energie- und Gebäudetechnik",
"status": "Active",
"publicUrl": "https://gewerbejobs24.de/job/elektroniker-mwd-frankfurt",
"expiresAt": "2026-10-06T00:00:00Z",
"createdAt": "2026-09-06T09:12:00Z",
"externalRef": "req-2026-00042"
}
POST /jobs
Request-Body
{
"title": "Elektroniker (m/w/d) für Energie- und Gebäudetechnik",
"description": "…Volltext der Stellenbeschreibung…",
"companyName": "Muster Elektro GmbH",
"categorySlug": "elektro",
"types": ["FullTime"],
"locations": [
{ "city": "Frankfurt am Main", "postalCode": "60311", "state": "Hessen" }
],
"isRemote": false,
"isNationwide": false,
"contactEmail": "bewerbung@muster-elektro.de",
"salaryFrom": 3200,
"salaryTo": 4100,
"salaryUnit": "month",
"whatsAppNumber": null,
"attachmentUrl": null,
"externalRef": "req-2026-00042"
}
Pflichtfelder: title, description, companyName, categorySlug. types ∈ FullTime · PartTime · Minijob · Apprenticeship · Internship · Temporary · Freelance · ArbeitnehmerUeberlassung. externalRef ist deine eigene Referenz und erscheint in allen Antworten — ideal fürs Mapping auf deiner Seite.
Antwort · 201 · kein Guthaben → 402 insufficient_credits
{
"id": "665f0c1e9b3a2f00123abcd0",
"status": "Active",
"publicUrl": "https://gewerbejobs24.de/job/elektroniker-mwd-frankfurt",
"creditSource": "Bundle",
"expiresAt": "2026-10-06T00:00:00Z",
"externalRef": "req-2026-00042"
}
POST /jobs/bulk
Request-Body
{
"jobs": [
{
"title": "Elektroniker (m/w/d)",
"description": "…",
"companyName": "Muster Elektro GmbH",
"categorySlug": "elektro",
"types": ["FullTime"],
"locations": [{ "city": "Frankfurt am Main", "postalCode": "60311" }],
"externalRef": "req-1"
},
{
"title": "Anlagenmechaniker (m/w/d)",
"description": "…",
"companyName": "Muster Elektro GmbH",
"categorySlug": "shk",
"types": ["FullTime"],
"locations": [{ "city": "Offenbach", "postalCode": "63065" }],
"externalRef": "req-2"
}
]
}
Antwort · 207 (Teilerfolg)
{
"results": [
{
"index": 0, "externalRef": "req-1", "status": "created",
"id": "665f0c1e9b3a2f00123abcd0",
"publicUrl": "https://gewerbejobs24.de/job/elektroniker-mwd-frankfurt",
"creditSource": "Bundle", "expiresAt": "2026-10-06T00:00:00Z",
"error": null, "errorCode": null
},
{
"index": 1, "externalRef": "req-2", "status": "failed",
"id": null, "publicUrl": null, "creditSource": null, "expiresAt": null,
"error": "Kein Guthaben. Bitte kaufe ein Job-Bundle oder lade dein Guthaben auf.",
"errorCode": "insufficient_credits"
}
],
"summary": { "created": 1, "failed": 1, "creditsUsed": 1 }
}
Teilerfolg ist erlaubt: erfolgreiche Stellen bleiben live, fehlgeschlagene werden pro Element gemeldet. Guthaben wird nur für erfolgreiche Stellen verbraucht. Ein Bulk-Request zählt beim Rate-Limit als ein Request.
POST /jobs/{id}/deactivate
Antwort · 200 · unbekannte ID → 404 job_not_found
{
"id": "665f0c1e9b3a2f00123abcd0",
"status": "Deactivated"
}
Code-Beispiele
Eine Stelle anlegen (POST /api/v1/jobs) in deiner Sprache. Ersetze gj_live_dein_key durch deinen echten Key.
curl -X POST https://gewerbejobs24.de/api/v1/jobs \
-H "Authorization: Bearer gj_live_dein_key" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: 3f1c9d5e-8b0a-4c2f-9e7d-1a2b3c4d5e6f" \
-d '{
"title": "Elektroniker (m/w/d)",
"description": "…Volltext…",
"companyName": "Muster Elektro GmbH",
"categorySlug": "elektro",
"types": ["FullTime"],
"locations": [{ "city": "Frankfurt am Main", "postalCode": "60311", "state": "Hessen" }],
"contactEmail": "bewerbung@muster-elektro.de",
"salaryFrom": 3200, "salaryTo": 4100, "salaryUnit": "month",
"externalRef": "req-2026-00042"
}'
Idempotenz
Schreib-Requests solltest du mit einem Idempotency-Key-Header
absichern (z. B. eine UUID pro fachlichem Vorgang). Damit sind Wiederholungen nach Timeouts oder
Netzwerkfehlern sicher — du postest nie versehentlich doppelt.
Idempotency-Key: 3f1c9d5e-8b0a-4c2f-9e7d-1a2b3c4d5e6f
- •Gleicher Key + gleicher Body: Du erhältst die gespeicherte Antwort des ersten Aufrufs zurück — kein zweites Posting, kein zweiter Credit.
- •Gleicher Key, anderer Body: Die API antwortet mit
409 idempotency_conflict. - •Gespeicherte Antworten werden nach 24 Stunden automatisch verworfen. Verwende danach einen neuen Key.
Fehlercodes
Fehler kommen als JSON mit stabilem code und einer lesbaren message.
{ "error": { "code": "insufficient_credits", "message": "Kein Guthaben. Bitte kaufe ein Job-Bundle oder lade dein Guthaben auf." } }
| HTTP | code | Bedeutung |
|---|---|---|
| 400 | validation_error | Pflichtfeld fehlt, unbekannte Kategorie oder ungültiger Job-Typ. |
| 401 | unauthorized | Kein oder ungültiger API-Key im Authorization-Header. |
| 402 | insufficient_credits | Weder Bundle-Credit noch Geld-Guthaben reicht. Bundle kaufen oder aufladen. |
| 404 | job_not_found | Stelle existiert nicht oder gehört nicht zu deinem Konto. |
| 409 | idempotency_conflict | Gleicher Idempotency-Key mit abweichendem Body. |
| 429 | rate_limited | Rate-Limit überschritten. Kurz warten und erneut versuchen. |
Ein widerrufener Key wird mit 403 key_revoked abgewiesen.
Rate-Limits
Das Limit gilt pro API-Key als gleitendes Minutenfenster — aktuell großzügige
600 Requests pro Minute. Ein POST /jobs/bulk
zählt dabei als ein einziger Request, egal wie viele Stellen er enthält. Bei Überschreitung
antwortet die API mit 429 rate_limited —
baue in deinem Client einen kurzen Retry mit Backoff ein. Brauchst du mehr Durchsatz, sprich uns an.
Bereit loszulegen?
Erstelle deinen ersten API-Key im Dashboard und teste die Verbindung oben.