API & dumps

OpenIntern is a free, structured corpus of tech internships. Browse the board with no account. Mark applied status in your browser only. Query the public API or download the daily dump for bulk use.

Endpoints

MethodPathDescription
GET/api/v1/jobsList role families with nested postings (paginated, filterable)
GET/api/v1/jobs/{id}Single job by UUID
GET/api/v1/companiesCompany registry
GET/api/v1/healthIngest pipeline health

GET /api/v1/jobs query params

ParamNotes
qTitle substring (case-insensitive)
companyCompany slug (exact)
rolesoftware|backend|frontend|fullstack|data|ml|mobile|security|devops|hardware|quant|product|research — repeatable or comma-separated (OR)
regionremote|us|canada|europe|other — repeatable or comma-separated (OR)
seasonsummer|fall|winter (spring → summer). Repeatable or comma-separated. Board-compatible alias: term
duration_monthsRepeatable/comma-separated ints (1–24). Matches jobs whose duration array overlaps any selected value (e.g. Cohere “4–6 months” matches 4 or 6). Board-compatible alias: duration
posted_afterISO date — jobs posted on/after
pagePage number (default 1)
limitPage size in role families (default 27, max 100)

The live API is grouped by role family (same title variants across locations). Response shape: { jobs, page, limit, total, total_pages, has_more }. Each entry has role_family_id, company, title, and postings[] (id, location, posted_at, apply_url). Daily dumps stay flat (one row per posting).

Examples

curl "https://openintern.dev/api/v1/jobs?role=ml,software&limit=10"
curl "https://openintern.dev/api/v1/jobs?region=canada&season=fall,winter"
curl "https://openintern.dev/api/v1/jobs?duration_months=4,6"
curl "https://openintern.dev/api/v1/jobs/{id}"
curl "https://openintern.dev/api/v1/companies"
curl "https://openintern.dev/api/v1/health"

Rate limits & bulk access

The hosted API defaults to 60 requests per minute per IP. Limits are best-effort on serverless instances and may be changed for stability. For bulk consumers, prefer the daily dumps below or self-host — don’t paginate the hosted API all day.

Dump fields

JSON/CSV rows include: id, title, company, company_slug, locations, apply_url, excerpt, terms, term_years, duration_months (int[]), cohort_year, roles, regions, is_remote, source, posted_at, first_seen_at, last_seen_at. Seasons are summer|fall|winter only (spring stored as summer). Past seasons and old postings without term years are hidden consistently on the board, API, sitemap, job detail pages, and dumps. JSON uses the envelope { generatedAt, count, jobs }; CSV is flat.

Daily dumps

Stable download URLs (updated daily via GitHub Actions):

Release tag: dump-latest

Add a company

Extend the corpus with a YAML PR — see CONTRIBUTING.md. Supported ATS: Greenhouse, Lever, Ashby, Workable, SmartRecruiters, Recruitee, Rippling, BambooHR.