Skip to content
Pegel Jobs

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.

GET /api/v1/jobs

Paginated list of currently-active roles. Same filter vocabulary as the /jobs page.

ParamTypeDescription
pageintegerPage number (1-based). Default 1.
pageSizeintegerRows per page. Default 25, max 100.
sectorstringComma-separated sector keys. Same set as the /jobs filter.
stagestringComma-separated company-stage keys.
germanstringComma of `needed`, `not_needed`, `unknown`.
senioritystringComma-separated seniority strings.
contractstringComma-separated contract-type strings.
locationstringComma-separated location strings.
visabooleanPass `1` to limit to roles whose hybrid visa filter returns sponsors.
postedWithinstringOne of `7d`, `30d`, `90d`, `all`.
qstringFree-text query against title.
GET /api/v1/jobs/{id}

Single role by full UUID or the 8-character suffix used in /jobs/<slug>-<suffix> URLs.

GET /api/v1/companies

All active companies plus a live open-role count. Not paginated because the allowlist is operator-curated.

ParamTypeDescription
sortstringOne of `alpha`, `hiring`, `recent`. Default alpha.
GET /api/v1/companies/{slug}

Single company with all currently-active open roles inlined.

Response envelope

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.

Rate limit

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.