API
Public read-only API for Berlin startup roles and the companies hiring them. Same filter vocabulary as the website. JSON responses, no auth, no caching (build your own around query + timestamp keys). The site itself is the authoritative source — the API is the same data, plus the original ATS URL, in a stable JSON shape.
Source license: the jobs feed and company list are released under CC0; see Terms for the full text.
Machine-readable contract: OpenAPI 3.1.
Paginated list of currently-active roles. Same filter vocabulary as the /jobs page.
| Param | Type | Description |
|---|---|---|
page | integer | Page number (1-based). Default 1. |
pageSize | integer | Rows per page. Default 25, max 100. |
sector | string | Comma-separated sector keys. Same set as the /jobs filter. |
stage | string | Comma-separated company-stage keys. |
german | string | Comma of `needed`, `not_needed`, `unknown`. |
seniority | string | Comma-separated seniority strings. |
contract | string | Comma-separated contract-type strings. |
location | string | Comma-separated location strings. |
visa | boolean | Pass `1` to limit to roles whose hybrid visa filter returns sponsors. |
postedWithin | string | One of `7d`, `30d`, `90d`, `all`. |
q | string | Free-text query against title. |
Single role by full UUID or the 8-character suffix used in /jobs/<slug>-<suffix> URLs.
All active companies plus a live open-role count. Not paginated because the allowlist is operator-curated.
| Param | Type | Description |
|---|---|---|
sort | string | One of `alpha`, `hiring`, `recent`. Default alpha. |
Single company with all currently-active open roles inlined.
List endpoints return { data: T[], pagination }. Single-resource endpoints return { data: T }. Errors are { error: { status, message } } with the matching HTTP status. Every response sends Cache-Control: private, no-store.
A job carries salaryMin, salaryMax, salaryCurrency and salaryPeriod only when the employer disclosed them. Pegel never estimates pay, so null means "not disclosed", never "we guessed". Treat it that way downstream. techTags is the classifier's stack read, and an empty array means no stack signal was found.
60 requests per minute per IP, fixed-window. Every response carries X-RateLimit-Limit, X-RateLimit-Remaining, and X-RateLimit-Reset (Unix seconds). When you hit the limit you get a 429 with Retry-After in seconds. Identifier is the first hop of x-forwarded-for — if you're behind a corporate egress NAT, your whole office shares one bucket.