praxyjobs

API reference

Every endpoint, every filter.

Base URL https://jobs-api-stage.up.railway.app/v1. The machine-readable version of this page is the OpenAPI spec, served unchanged by the running API and checked against its routes in CI.

Conventions

GET/v1/jobs/preview

Keyless product-evaluation sample capped at ten open jobs. It has no cursor and omits production-only descriptions, lifecycle feeds, and company exports.

paramtypenotes
ai_work_arrangementquerySee the machine-readable OpenAPI contract for bounds and allowed values.
cityquerySee the machine-readable OpenAPI contract for bounds and allowed values.
countryquerySee the machine-readable OpenAPI contract for bounds and allowed values.
employment_typequerySee the machine-readable OpenAPI contract for bounds and allowed values.
limitquerySee the machine-readable OpenAPI contract for bounds and allowed values.
posted_sincequerySee the machine-readable OpenAPI contract for bounds and allowed values.
qquerySee the machine-readable OpenAPI contract for bounds and allowed values.
sourcequerySee the machine-readable OpenAPI contract for bounds and allowed values.
POST/v1/jobs/search

Typed JSON search for boolean keyword trees, facets, or an opt-in semantic query for current Growth and Scale accounts. Semantic mode searches open jobs, caps results at 100, and does not accept facets or cursor pagination. Keyword cursors remain bound to the original request and fail closed on filter drift.

GET/v1/jobs/export

Subscription-backed bulk export in CSV, NDJSON, or Parquet. CSV and NDJSON use bounded numbered parts; Parquet is returned as one spooled artifact. Description columns require a plan that explicitly includes them.

paramtypenotes
columnsquerySee the machine-readable OpenAPI contract for bounds and allowed values.
countryquerySee the machine-readable OpenAPI contract for bounds and allowed values.
exclude_duplicatesquerySee the machine-readable OpenAPI contract for bounds and allowed values.
formatquerySee the machine-readable OpenAPI contract for bounds and allowed values.
partquerySee the machine-readable OpenAPI contract for bounds and allowed values.
posted_sincequerySee the machine-readable OpenAPI contract for bounds and allowed values.
sourcequerySee the machine-readable OpenAPI contract for bounds and allowed values.
statusquerySee the machine-readable OpenAPI contract for bounds and allowed values.
GET/v1/jobs/{job_key}

One job by stable key for an active subscription-backed X-API-Key. The payload includes full description_text. Supports include_unresolved.

paramtypenotes
include_unresolvedquerySee the machine-readable OpenAPI contract for bounds and allowed values.
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.

paramtypenotes
countryquerySee the machine-readable OpenAPI contract for bounds and allowed values.
cursorquerySee the machine-readable OpenAPI contract for bounds and allowed values.
exportquerySee the machine-readable OpenAPI contract for bounds and allowed values.
include_unresolvedquerySee the machine-readable OpenAPI contract for bounds and allowed values.
limitquerySee the machine-readable OpenAPI contract for bounds and allowed values.
min_open_jobsquerySee the machine-readable OpenAPI contract for bounds and allowed values.
sourcequerySee the machine-readable OpenAPI contract for bounds and allowed values.
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.

paramtypenotes
include_unresolvedquerySee the machine-readable OpenAPI contract for bounds and allowed values.
GET/v1/companies/{company_key}/jobs

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

paramtypenotes
cursorquerySee the machine-readable OpenAPI contract for bounds and allowed values.
include_unresolvedquerySee the machine-readable OpenAPI contract for bounds and allowed values.
limitquerySee the machine-readable OpenAPI contract for bounds and allowed values.
statusquerySee the machine-readable OpenAPI contract for bounds and allowed values.
GET/v1/stats

Public corpus statistics: totals, per-source and per-country counts, career-family coverage, enrichment coverage, freshness percentiles, and optional per-source description, posting-date, and salary fill rates with refresh cadence and last-sweep time. The same measured values our own pages render — unavailable fields stay unavailable rather than being inferred from global totals.

GET/v1/analytics/companies/{company_key}/posting-velocity

Paid, measured comparison of a company's first-observed openings across equal current and prior windows. The response includes the underlying weekly series and evidence boundary; it is a source-observation count, not a demand forecast.

paramtypenotes
window_daysint1–365 days, default 30. The prior comparison window has the same length.
GET/v1/analytics/time-to-fill

Paid posting-duration proxy from first observation to definitive source closure, filterable by source, country, career family, or company. It does not claim a confirmed hire, and sparse samples return an explicit insufficient-data result instead of a guessed estimate.

paramtypenotes
company_keystringOne stable company key.
countryenumOne ISO 3166-1 alpha-2 country code.
familyenumOne canonical career-family code.
sourceenumOne canonical ATS source code.
window_daysint1–365 days, default 90.
GET/v1/analytics/state-of-hiring

Public quarterly report of first-observed posting volume and audited duration signals by ATS, country, and career family. Current quarters are labelled partial and never projected forward.

paramtypenotes
quarterstringUTC calendar quarter as YYYY-Q1 through YYYY-Q4. Omit for the latest completed quarter.
GET/v1/data-quality/current

The latest retained, measured data-quality artifact. It is served only when a complete worker-produced report is available; missing computation is never replaced with inferred quality 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.

paramtypenotes
countrycsvISO 3166-1 alpha-2 codes.
cursorstringOpaque keyset cursor from next_cursor.
description_formatenumnone (default) · text — text returns full descriptions in the feed.
domaincsvCompany domains.
exclude_duplicatesbooleanCollapse cross-location duplicates to one representative per group.
exclude_sourcecsvExclude canonical ATS source codes.
first_seen_gtedate-timeFixed lower boundary; pairs with cursors for exactly-once consumption.
limitint1–1000, default 100.
organizationcsvCompany names.
sourcecsvInclude canonical ATS source codes.
time_frameenum1h · 6h · 24h (default) · 7d · 31d.
titlestringSame boolean grammar as search.
GET/v1/feed/active/count

A credit-free count for the active-feed filters. Use it to size a pull before requesting job records.

paramtypenotes
countryquerySee the machine-readable OpenAPI contract for bounds and allowed values.
domainquerySee the machine-readable OpenAPI contract for bounds and allowed values.
exclude_duplicatesquerySee the machine-readable OpenAPI contract for bounds and allowed values.
exclude_sourcequerySee the machine-readable OpenAPI contract for bounds and allowed values.
first_seen_gtequerySee the machine-readable OpenAPI contract for bounds and allowed values.
organizationquerySee the machine-readable OpenAPI contract for bounds and allowed values.
sourcequerySee the machine-readable OpenAPI contract for bounds and allowed values.
time_framequerySee the machine-readable OpenAPI contract for bounds and allowed values.
titlequerySee the machine-readable OpenAPI contract for bounds and allowed values.
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.

paramtypenotes
cursorquerySee the machine-readable OpenAPI contract for bounds and allowed values.
limitquerySee the machine-readable OpenAPI contract for bounds and allowed values.
time_framequerySee the machine-readable OpenAPI contract for bounds and allowed values.
GET/v1/feed/modified

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

paramtypenotes
cursorquerySee the machine-readable OpenAPI contract for bounds and allowed values.
limitquerySee the machine-readable OpenAPI contract for bounds and allowed values.
time_framequerySee the machine-readable OpenAPI contract for bounds and allowed values.
GET/v1/feed/changes

Durable, sequence-ordered upsert and tombstone events. Persist next_seq only after processing the page, then pass it back as since_seq to resume after an arbitrarily long consumer gap.

paramtypenotes
limitquerySee the machine-readable OpenAPI contract for bounds and allowed values.
since_seqquerySee the machine-readable OpenAPI contract for bounds and allowed values.
GET/v1/datasets

Scale-only index of verified, immutable active-corpus snapshots. Dataset access is a flat plan entitlement and does not consume per-job API credits.

GET/v1/datasets/{snapshot_date}

One dated snapshot manifest with short-lived signed Parquet part URLs, columns, row counts, and a single explicit expiry time.

GET/v1/destinations

List the authenticated Scale account's outbound Postgres and webhook destinations. Secret connection settings are never returned.

POST/v1/destinations

Create a disabled outbound destination. Enabling is a separate explicit operation, and each account has a bounded destination count.

GET/v1/destinations/{destination_id}

Read one redacted destination configuration and its delivery state.

PATCH/v1/destinations/{destination_id}

Update destination metadata or replace its stored secret configuration. Mutations fail with a retryable conflict while delivery is in progress.

DELETE/v1/destinations/{destination_id}

Soft-delete an idle destination. A successful deletion returns no body.

POST/v1/destinations/{destination_id}/enable

Enable delivery and clear the destination's consecutive-failure count.

POST/v1/destinations/{destination_id}/disable

Pause future delivery without deleting destination metadata or run history.

GET/v1/destinations/{destination_id}/runs

Recent delivery runs with bounded, redacted reports and explicit source and destination acknowledgement counts.

paramtypenotes
limitquerySee the machine-readable OpenAPI contract for bounds and allowed values.
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.

POST/v1/billing/webhook

Signed billing-provider callback used to activate and update subscriptions. Duplicate event IDs are idempotent; unsigned payloads are rejected.

POST/v1/billing/claim

Exchange the single-use checkout claim token for an activated API key after the subscription webhook completes. Responses are never cached.

POST/v1/billing/portal

Create a hosted billing-portal session for the authenticated paid account.

POST/v1/keys

Compatibility-only credential issuance retained for older clients. Body: {"email": "…"}. While paid enforcement is active, this credential does not unlock production REST endpoints; evaluate with /v1/jobs/preview and /v1/stats, then subscribe for production access.

GET/v1/account/usage

Current plan, billing-period allowance, aggregate consumption, daily usage, and recent authenticated activity for the paid account behind the key.

GET/v1/account/keys

List non-secret metadata for every key in the current paid account, including labels, four-character hints, status, and last use. Raw key material is never returned by this endpoint.

POST/v1/account/keys

Create another account key with an optional label. The raw key is returned exactly once and shares the subscription's allowance with sibling keys.

POST/v1/account/keys/rotate

Stage a replacement key without revoking the current one. Test the replacement, then revoke the old key explicitly.

DELETE/v1/account/keys/{key_id}

Revoke an account-owned key. The last active key cannot be revoked, preventing accidental account lockout.

GET/v1/usage/daily

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

paramtypenotes
date_fromquerySee the machine-readable OpenAPI contract for bounds and allowed values.
date_toquerySee the machine-readable OpenAPI contract for bounds and allowed values.
GET/v1/sitemaps

Deterministic sitemap feed: 256 job-key segments with counts and last-modified stamps. This is what builds our own sitemap.

GET/v1/sitemaps/{segment_id}

Active deduplicated job keys and honest last-modified timestamps for one deterministic sitemap segment.

See also

Rate limits · MCP server · How each source is indexed