Free, read-only, no authentication. Returns only currently live
occupational therapy job listings. Open CORS for browser and agent clients.
Responses are cached for 60 seconds; send If-None-Match with a
previously returned ETag to get a 304. Rate limited
per IP; exceeding the limit returns 429 with
Retry-After. JSON responses are UTF-8; timestamps are ISO 8601.
Every response advertises the current one-minute window:
X-RateLimit-Limit (requests allowed),
X-RateLimit-Remaining (requests left), and
X-RateLimit-Reset (unix epoch seconds when the window ends).
Use these to self-throttle before you are blocked; OPTIONS
preflights do not consume quota. Because successful responses are
cacheable, a response served from a shared cache may report another
request's snapshot — treat the values as advisory and always honour a
429.
Data is provided as-is. You may use it to power search, agents, and aggregations that link back to otjobs.au as the source. Please do not re-host the listings as a competing directory. Listing content belongs to the hiring organisations.
GET /api/v1/jobs — paginated live listings.
Filters: category (area-of-practice code, see
/meta), state (nsw/qld/vic/...),
employment_type, q (free text),
updated_since (ISO date/datetime),
page, per_page (default 25, max 100).GET /api/v1/jobs/{id} — one listing; 404 if it is not live.GET /api/v1/meta — categories, states, employment types,
live counts, freshness. Call this first for vocabulary and volume.Every listing includes job_posting_jsonld: schema.org
JobPosting structured data, identical to the markup embedded in the HTML
detail pages. Each listing also carries date_posted and
valid_through.
curl "https://otjobs.au/api/v1/meta" curl "https://otjobs.au/api/v1/jobs?state=nsw&per_page=5" curl "https://otjobs.au/api/v1/jobs?category=paediatric&state=vic" curl "https://otjobs.au/api/v1/jobs?q=newcastle&updated_since=2026-10-01" curl "https://otjobs.au/api/v1/jobs/123"