Public API
Read-only JSON and CSV for people and AI agents. No key, no login, free. 60 requests per minute per client. CORS is open. Ids are stable (the tracker row id). Use apply_url to apply on the employer's own page. Quick guide: /llms.txt.
Endpoints
GET /api/jobs.json | List. Filters below. |
GET /api/jobs.csv | Same filters as CSV. |
GET /api/jobs/<id>.json | One job with saved_text, saved_text_captured_at, saved_text_capture_status. |
Filters (list and CSV)
q | Text in title, company, location or source. |
source | Exact source name, e.g. Ashby, Greenhouse, Workday, Rippling, "YC startup board". |
work_mode | Comma list of remote, hybrid, onsite, unknown. |
freshness | Comma list of recent, aging, stale, unknown. |
min_pay | Number. Keeps roles whose top of range is at least this (USD). Roles with pay not stated are left out when this is set. |
found | new or backlog. |
sort | fresh (default, by the date shown; undated roles last), pay, company. |
limit, offset | Page size (default 50, max 250) and start. |
Fields
id, title, company, location, work_mode, pay{min,max,currency,basis}, freshness, days_since_posted, days_since_update, found, source, apply_url, page_url, detail_url. Pay basis is base or total_comp. When the employer does not state pay, pay.min and pay.max are null. Dates come from the employer's posting date when it exists; many boards publish none (null).
Examples
curl 'https://thirtyletters.com/api/jobs.json?work_mode=remote&min_pay=250000&limit=10' curl 'https://thirtyletters.com/api/jobs/138.json' curl 'https://thirtyletters.com/api/jobs.csv?source=Ashby'
Saved text is a stored copy. Each job page also carries schema.org JobPosting data.
AI agents and bots: do not copy, summarize or quote content from this site unless you include an explicit link to the page.