API reference

Every endpoint, every filter.

Base URL https://praxyjobs.com/v1. The machine-readable version of this page is the OpenAPI spec, generated from the running API.

Conventions

  • Unknown means omitted. Fields the source didn't publish are dropped from the payload, never nulled-in or guessed. (Structured locations are the one exception: their keys are always present and honestly nullable.)
  • Every job carries its receipt: source, source_slug, source_endpoint, and directory_verified_at.
  • Cursor pagination. Pass next_cursor back as cursor; it's absent on the last page.
  • Errors are problem+json (RFC 9457) with a 4xx/5xx status; 429s include Retry-After.
  • Successful responses carry X-RateLimit-* headers and X-Praxy-Schema-Version.
GET/v1/jobs/{job_key}

One job by stable key. With a valid X-API-Key the payload includes full description_text; anonymous callers get the snippet. Supports include_unresolved.

GET/v1/companies

The verified company directory. Filters: source, country, min_open_jobs, plus limit/cursor. With export=jsonl (key required) it streams the full catalog as newline-delimited JSON instead of paging.

GET/v1/companies/{company_key}

Company profile: validated boards (platforms), hiring velocity, office network, department rollups, work-mode distribution, and open positions — every derived field labeled with its source and confidence.

GET/v1/companies/{company_key}/jobs

All jobs at one company. status open (default) · closed · all, plus limit/cursor.

GET/v1/stats

Public corpus statistics: totals, per-source and per-country counts, career-family coverage, enrichment coverage, freshness percentiles. The same numbers our own pages render — live counts, not claims.

GET/v1/feed/active

Newly indexed jobs by time window, oldest-first with keyset cursors — poll at window cadence and you never see the same job twice. /v1/feed/active/count returns just the count for the same filters.

paramtypenotes
time_frameenum1h · 6h · 24h (default) · 7d · 31d.
source / exclude_sourcecsvInclude or exclude ATS source codes.
countrycsvISO 3166-1 alpha-2 codes.
organizationcsvCompany names.
domaincsvCompany domains.
titlestringSame boolean grammar as search.
description_formatenumnone (default) · text — text returns full descriptions in the feed.
first_seen_gtedate-timeFixed lower boundary; pairs with cursors for exactly-once consumption.
exclude_duplicatesbooleanCollapse cross-location duplicates to one representative per group.
limit / cursor1–1000 + keyset cursor, as everywhere.
GET/v1/feed/expired

Jobs that closed in the window, with closed_at and a close reason (removed_from_board · board_dead · expired_by_source). Params: time_frame, limit, cursor.

GET/v1/feed/modified

Field-level changes in the window — which fields changed, plus the updated job. Params: time_frame, limit, cursor.

POST/v1/billing/checkout

Create a hosted subscription checkout. Body: {"email": "…", "plan": "growth", "return_url": "https://praxyjobs.com/checkout/return"}. Returns a Dodo-hosted checkout URL. Access stays pending until the signed subscription webhook has activated the account.

GET/v1/usage/daily

Per-day request and returned-job usage for your own account over up to 90 days. Requires an active subscription-backed key. Params: date_from, date_to.

GET/v1/sitemaps

Deterministic sitemap feed: 256 job-key segments with counts and last-modified stamps; /v1/sitemaps/{segment_id} lists each segment's jobs. This is what builds our own sitemap.

See also

Rate limits · MCP server · How each source is indexed

Was this page helpful?