Usage

Real, use-case-driven examples for the jobsuche CLI — a command-line client for the Bundesagentur für Arbeit Jobsuche API (Germany’s largest job database). It exposes the API’s two read-only endpoints: search job listings (Stellenangebote) by keyword/location/radius, and fetch full job details by reference number (refnr).

Every command prints pretty JSON to stdout (use --compact for a single line), so the examples pipe to jq where it helps.

Install

npm i -g @maschinenlesbar.org/jobsuche-cli

The installed binary is jobsuche. Without a global install you can run the built CLI directly with node dist/src/cli/index.js (substitute that for jobsuche in any example below). The API’s public X-API-Key is sent automatically, so no credentials setup is needed.

Use cases

1. Find jobs by keyword and city

Quickest way to see what’s available for a role in a place.

jobsuche search --was Informatiker --wo Berlin --size 10

--was is the keyword/title, --wo the location, --size caps the page size. The result is a JobSearchResult object: stellenangebote (the listings), plus maxErgebnisse (total matches), page and size.

2. Search within a radius of a location

Catch listings in the surrounding area, not just the exact city.

jobsuche search --was Pflegefachkraft --wo "München" --umkreis 50

--umkreis is the radius in km around --wo. Radius results carry a per-listing arbeitsort.entfernung (distance in km) you can sort on:

jobsuche search --was Pflegefachkraft --wo "München" --umkreis 50 \
  | jq '.stellenangebote | sort_by(.arbeitsort.entfernung)
        | .[] | {titel, ort: .arbeitsort.ort, km: .arbeitsort.entfernung}'

3. Only recently published listings

Skip stale postings — show what went live in the last week.

jobsuche search --was Data --wo Hamburg --veroeffentlicht-seit 7

--veroeffentlicht-seit <days> filters to listings published within the last N days. Combine with --umkreis for a tight, fresh local search.

4. Page through a large result set

Total matches can run into the thousands; walk them a page at a time.

# page 1
jobsuche search --was Projektmanager --size 25 --page 1
# page 2
jobsuche search --was Projektmanager --size 25 --page 2

--page is 1-based and --size is the page size. Check maxErgebnisse against page * size to know when you have reached the end:

jobsuche search --was Projektmanager --size 25 --page 1 \
  | jq '{total: .maxErgebnisse, page, size, returned: (.stellenangebote | length)}'

5. Extract just the reference numbers

Get a clean list of refnr values to feed into details (use case 7).

jobsuche search --was Elektroniker --wo Köln --size 20 \
  | jq -r '.stellenangebote[].refnr'

refnr (e.g. 10001-1002716922-S) is the stable id for each listing and the input for the details command.

6. Filter by offer type (Angebotsart)

Separate regular job vacancies from apprenticeships/trainee postings.

# regular job vacancies (Arbeit)
jobsuche search --was Mechatroniker --wo Stuttgart --angebotsart 1

# apprenticeships / dual-study (Ausbildung)
jobsuche search --was Mechatroniker --wo Stuttgart --angebotsart 4

--angebotsart <code> takes the API’s numeric offer-type code and is passed through verbatim (e.g. 1 regular vacancy, 4 apprenticeship/dual-study).

7. Fetch full details for a listing

Get the complete payload for one job — description, contact, dates, and more.

jobsuche details 14225-dafcdd47aabe512d-S

Pass the refnr from any search result; the CLI base64-encodes it into the API’s encryptedJobCode for you. A purely numeric refnr (e.g. 1002716922) or an already-encoded code also works. Exit code 4 means the listing was not found (404).

8. Search jobs at a specific employer

Narrow to one company’s openings in a region.

jobsuche search --arbeitgeber "Deutsche Bahn AG" --wo Frankfurt --umkreis 30

--arbeitgeber filters by employer name (matched against the full registered name, so use the exact spelling, e.g. "Deutsche Bahn AG"). Pull a quick title-and-city overview:

jobsuche search --arbeitgeber "Deutsche Bahn AG" --wo Frankfurt --umkreis 30 \
  | jq -r '.stellenangebote[] | "\(.titel) — \(.arbeitsort.ort)"'

9. Browse an occupational field, including temp-work agencies

Cast a wider net across a whole field and don’t exclude staffing agencies.

jobsuche search --berufsfeld "Altenpflege" --wo Leipzig \
  --umkreis 40 --zeitarbeit

--berufsfeld searches a broad occupational category (vs. the more specific --was); --zeitarbeit is a boolean flag that includes temp-work / staffing agencies in the results.

10. Search → pick first result → fetch its details (one-liner)

Chain a search straight into a detail lookup without copy-pasting a refnr.

jobsuche details "$(jobsuche search --was Informatiker --wo Berlin --size 1 \
  | jq -r '.stellenangebote[0].refnr')"

Useful in scripts. Add --compact to either call for single-line JSON when feeding another tool.

Global options

These apply to every command and may be given before or after the command name (e.g. both jobsuche --compact search … and jobsuche search … --compact):

Option Description
--base-url <url> API base URL (default https://rest.arbeitsagentur.de)
--api-key <key> override the X-API-Key (env JOBSUCHE_API_KEY); blank/whitespace is ignored and the default public key is used
--timeout <ms> per-request timeout in milliseconds (at most 2147483647)
--user-agent <ua> User-Agent header value
--max-retries <n> retries for transient 429/503 responses
--max-response-bytes <n> cap response body size in bytes (0 = unlimited; default 100 MiB)
--compact print JSON on a single line instead of pretty-printed
-V, --version print the version
-h, --help show help (also jobsuche <command> --help)

Exit codes: 0 success; 2 usage errors (bad flag/value, missing command); 3 on 401/403; 4 on 404; 1 for any other error (network, parse, etc.).

View the source on GitHub →