Open-source tech internship corpus — free structured listings, public API, no-account board, community company registry.
Browse without signing up. Build on the API. Add companies with a PR. Listings are never paywalled.
- Site: openintern.dev
- Repo: github.com/dnexdev/openintern
- License: Apache-2.0
OpenIntern is an open data layer for tech internships (SWE, data, AI/ML, quant, hardware, PM):
| Surface | Policy |
|---|---|
| Corpus | Free forever; daily JSON/CSV dumps |
| API | GET /api/v1/jobs, /companies, /health (rate-limited hosted) |
| Board | Filter by role / region / term / duration — no account |
| Applied | Local browser only (localStorage) |
| Apply | Always outbound to the employer |
We poll public Greenhouse / Lever / Ashby / Workable / SmartRecruiters / Recruitee / Rippling / BambooHR job board APIs. We do not scrape LinkedIn, sell recruiter emails, or gate listings.
# prerequisites: Node 20+, Docker, pnpm 9
corepack enable && corepack prepare pnpm@9.15.0 --activate
cp .env.example .env
docker compose up -d
pnpm install
pnpm db:migrate
pnpm sync-companies
pnpm ingest # polls ATS boards (takes a while on first run)
pnpm dev # http://localhost:3000Full reference: /docs (also at /docs locally).
# List role families (grouped postings)
curl "https://openintern.dev/api/v1/jobs?role=software&limit=10"
# Filter by region + season
curl "https://openintern.dev/api/v1/jobs?region=canada&season=fall,winter"
# Duration overlap (e.g. 4–6 month postings match 4 or 6)
curl "https://openintern.dev/api/v1/jobs?duration_months=4,6"
# Single posting
curl "https://openintern.dev/api/v1/jobs/{id}"
# Companies in the registry
curl "https://openintern.dev/api/v1/companies"
# Pipeline health
curl "https://openintern.dev/api/v1/health"Query params for /api/v1/jobs: q, company (slug), role, region (remote|us|canada|europe|other), season (summer|fall|winter; spring→summer), duration_months (overlap), posted_after, page, limit (default 27 families, max 100). Board-compatible aliases term and duration are also accepted. List responses are grouped by role family (jobs[].postings[]); pagination counts families. Include total_pages and has_more; the hosted API defaults to 60 requests/minute/IP.
For bulk use, prefer daily dumps (flat, one row per posting; stable URLs):
- https://github.com/dnexdev/openintern/releases/download/dump-latest/jobs.json
- https://github.com/dnexdev/openintern/releases/download/dump-latest/jobs.csv
Or run pnpm dump / self-host — don’t paginate the hosted API all day. Dumps use the same live-job freshness policy as the board and API.
apps/web Next.js board + /api/v1
packages/db Drizzle schema + migrations
packages/ingest ATS pollers, classifier, dumps
data/companies Community YAML registry (PR to add)
docs/brand Icon + wordmark SVGs
See docs/SETUP.md.
Add a YAML entry under data/companies/ — see CONTRIBUTING.md. Always include website_url so logos resolve correctly.
LinkedIn scraping, contact/email finders, AI resume studio, Selenium farms, non-tech majors, paywalled listings, Auth.js accounts.