Skip to content
Pegel Jobs

API

Public read-only API for roles and tracked companies. Berlin is the default market for existing clients. Hamburg and Munich become available when each city is public. The API uses the website's filter vocabulary and returns 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
marketstringberlin, hamburg, munich, or paris. Defaults to berlin. Cities return 404 until public.
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.
rolestringComma-separated role-family ids, such as `finance,legal`. Matches either family using stored classification. Unclassified jobs are excluded. See OpenAPI for all accepted ids.
germanstringGerman cities only. Comma of `needed`, `not_needed`, `unknown`. Paris rejects this filter.
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.

ParamTypeDescription
marketstringberlin, hamburg, munich, or paris. Defaults to berlin. Cities return 404 until public.
GET /api/v1/companies

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

ParamTypeDescription
marketstringberlin, hamburg, munich, or paris. Defaults to berlin. Cities return 404 until public.
sortstringOne of `alpha`, `hiring`, `recent`. Default alpha.
GET /api/v1/companies/{slug}

Single company with all currently-active open roles inlined.

ParamTypeDescription
marketstringberlin, hamburg, munich, or paris. Defaults to berlin. Cities return 404 until public.
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: public, max-age=300, s-maxage=300, stale-while-revalidate=3600.

Every job and company has a markets array with public memberships only. An unknown or repeated market value returns 400. A known city that is not public returns 404. Job detail URLs stay shared across markets.

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.