JobsPost a jobDashboardPublic APIPrivacyGetInterestGetJSONAll GetApps
Public API

The board, as JSON, with no key.

An open job board that made you register to read it would not be much of one. The public half of every listing is available over plain HTTPS with no signup, no API key and no headers — curl it and you get JSON.

Every open job

# no headers, no key, nothing curl https://itsodrhfoxgsqtczzwpw.supabase.co/functions/v1/jobs

Returns the most recent 25 open jobs, newest first. Add ?page=2 to walk back, ?q=react to search titles and descriptions, and ?expired=true to include listings in their two-day expired window.

One job

curl https://itsodrhfoxgsqtczzwpw.supabase.co/functions/v1/jobs/<id>

What comes back

{ "id": "k3n8xq2wp4a", "title": "Senior React Engineer", "description": "We need someone to own the front end…", "url": "https://getjob.getapps.tech/job?id=k3n8xq2wp4a", "posted_at": "2026-09-15T09:12:44.113Z", "closes_at": "2026-09-27T09:12:44.113Z", // applications close "removed_at": "2026-09-29T09:12:44.113Z", // deleted outright "open": true, "expired": false }

What is not in it

The company, the location, the salary, the skills and the apply link. Those need a free account, here and in the browser alike — and not as a matter of policy in a document somewhere. The feed runs on the same public key the website ships with, and that key is granted read access to exactly seven columns in the database. A bug in the feed's code cannot widen that; it can only make the request fail.

If you want the full listing for a job, open its url and sign in. There is no paid tier that unlocks it, and no key we can issue you — the boundary is the same one every visitor gets.

Rules of the road

  • CORS is open, so a browser app can call this directly with no proxy.
  • Responses are cached for 60 seconds at the edge. Polling faster than that gets you the same bytes.
  • It is read-only. Posting a job needs a signed-in session, on purpose.
  • Everything expires. A job you cached last week is very likely gone — check removed_at rather than assuming an id stays valid.
  • Be reasonable. Sustained hammering gets throttled; a poll every few minutes will never notice.

From JavaScript

const r = await fetch("https://itsodrhfoxgsqtczzwpw.supabase.co/functions/v1/jobs?q=remote"); const { jobs } = await r.json(); jobs.forEach(j => console.log(j.title, j.url));

From Python

import urllib.request, json with urllib.request.urlopen("https://itsodrhfoxgsqtczzwpw.supabase.co/functions/v1/jobs") as r: feed = json.load(r) for job in feed["jobs"]: print(job["title"], "—", job["url"])