Quick Decision Guide
Add job search to your app
Build your own product on Hirebase data
Use
POST /v2/jobs/export — sync to your own databaseShow 'similar jobs' under a listing
Use
POST /v2/jobs/vsearch with search_type: "job"Match jobs to a candidate's resume
Use
POST /v2/resumes/embed → POST /v2/jobs/neural-search with vector.vectorsBuild company profile pages
Keep your local data fresh
Use
GET /v2/jobs/expired-jobs on a schedule1. Adding Job Search to an Existing App
Use:POST /v2/jobs/search
This is the right starting point for most integrations: a job board, a careers page, a search bar in a community app, an internal tool — anywhere you want users to type a query and see a paginated list of matching jobs back.
It’s the simplest endpoint to integrate, the response shape is predictable, and every job comes back with a unique job_slug and company_slug you can use to build clean URLs in your own app:
GET /v2/jobs/{job_id} for the full record.
When this stops being the right choice
The/jobs/search endpoint is paginated. As long as your users are searching — narrowing a filter, looking at the first few pages of relevant jobs — pagination is fine and you’ll never feel a slowdown.
Where it breaks down is when you try to use the search endpoint to iterate over the entire dataset. Past roughly 200,000 results, deep pagination gets noticeably slow. If you find yourself writing a loop that keeps incrementing page to walk every job in the database, you’ve outgrown this endpoint — see the next section.
2. Building Your Own Product on Hirebase Data
Use:POST /v2/jobs/export
If you’re building a real product on top of Hirebase data — your own search engine, an analytics dashboard, an ATS feature, an LLM agent that needs offline access to job listings — don’t paginate the search endpoint. Use the export API instead.
POST /v2/jobs/export takes the same filter shape as /jobs/search but kicks off an async task that produces a CSV or JSON file. The export returns at most limit records (default 10) — to back-fill a dataset, pass a large limit (e.g. the total_count from /jobs/search for the same filters), or paginate with page + limit. You then poll GET /v2/tasks/{task_id} until state is "finished", download the file from result.download_url, and load it into your own database (Postgres, ElasticSearch, MongoDB — whatever fits your stack).
days_ago: 1) to pick up new listings, and use Expired Jobs to remove stale ones (see section 6).
The export returns at most
limit records (default 10). Set limit high to export your full result set (e.g. the total_count from /jobs/search for the same filters), or paginate with page + limit.3. Similar Jobs / Recommendations
Use:POST /v2/jobs/vsearch with search_type: "job"
If you have a job detail page and want a “Similar jobs” rail at the bottom, vector search is built for this. Pass the _id of the job the user is looking at, and Hirebase returns the most semantically similar listings:
score field is not currently returned on this endpoint.
The same endpoint with search_type: "summary" powers a natural-language search bar — useful if you want users to type “remote backend role at a Series B fintech with equity” instead of clicking filters.
4. Resume-to-Jobs Matching
If your product takes a candidate’s resume (PDF, DOCX, etc.) and recommends jobs, there are two supported paths. Pick based on whether you want the resume stored.Path A — Stored (reusable artifact_id)
Use: POST /v2/resumes/upload/ → POST /v2/resumes/{id}/parse → POST /v2/jobs/vsearch (or neural-search). Best when you’ll re-query the same candidate repeatedly.
- Upload the resume to
/v2/resumes/upload/. You get back an_id(a MongoDB ObjectId) that doubles as theartifact_id. - Parse it via
/v2/resumes/{id}/parseto populate structured fields. - Match jobs with
artifact_id:
Path B — Stateless (nothing stored)
Use:POST /v2/resumes/embed → POST /v2/jobs/neural-search with vector.vectors. Best when you don’t want the resume stored server-side.
- Embed the resume at
/v2/resumes/embed. You get back parsed structured data plus a 768-dimensionalembedding(no stored id). - Pass the embedding into
/v2/jobs/neural-searchasvector.vectors: [<embedding>].
5. Company Profiles and Sales Prospecting
Use:POST /v2/hirebase/companies/search + GET /v2/hirebase/companies/{company_slug}
If you’re building company profile pages, a “companies hiring now” directory, or a sales prospecting tool that targets companies with active job openings, the company endpoints are the right place to start.
POST /v2/hirebase/companies/search— find companies by industry, keyword, size, job board, etc.GET /v2/hirebase/companies/{slug}— full profile for a single company.GET /v2/hirebase/companies/{slug}/jobs— paginated jobs for that company.
6. Keeping a Synced Database Fresh
Use:GET /v2/jobs/expired-jobs on a schedule
If you’ve taken the export route and have a local copy of Hirebase data, you need two things to keep it fresh:
- New jobs — run a small daily export with
days_ago: 1and upsert into your DB. - Removed jobs — call
/v2/jobs/expired-jobs?since=YYYY-MM-DDdaily, and mark the returned(company_slug, job_slug)pairs as expired in your DB.
Combining Endpoints
Most real products use more than one endpoint. A typical job-board build looks like:- Search —
POST /v2/jobs/searchpowers the search bar. - Detail —
GET /v2/jobs/{job_id}powers the job detail page. - Similar —
POST /v2/jobs/vsearch(withsearch_type: "job") powers the “Similar jobs” rail at the bottom. - Company —
GET /v2/hirebase/companies/{slug}powers the company sidebar.
- Embed —
POST /v2/resumes/embedper user when they sign up. - Match —
POST /v2/jobs/neural-searchwithvector.vectorsfrom the embed response on a schedule to surface new matches.
- Backfill — one big
POST /v2/jobs/exportto seed your DB. - Daily delta — small
export+expired-jobscalls on a cron. - Query locally — once the data is yours, you can index, embed, and serve it however you want.
Still not sure?
Pick/v2/jobs/search and start prototyping. If you find yourself paginating past page ~2,000, switch to /v2/jobs/export. If you find yourself running the same query repeatedly to refresh data, switch to /v2/jobs/export + /v2/jobs/expired-jobs on a schedule. If users are typing natural-language queries instead of clicking filters, add /v2/jobs/vsearch.
Email spencer@hirebase.org if you want a sanity check on which endpoint fits — happy to talk through a specific use case.