The hirenode API
One REST endpoint. One schema. 8.4M+ deduplicated jobs across 25+ countries, refreshed hourly. Authenticate with a bearer token from your dashboard and you're live in five minutes.
Base URL
https://api.hirenode.io
All endpoints respond with JSON over HTTPS only. TLS 1.3, no plain-HTTP redirect.
Quickstart
curl https://api.hirenode.io/v1/jobs \ -H "Authorization: Bearer YOUR_API_KEY"
import { Hirenode } from "@hirenode/sdk";
const hn = new Hirenode({ apiKey: process.env.HIRENODE_API_KEY });
const { data, pagination } = await hn.jobs.list({
tech: ["typescript"],
country: "DE",
remote: true,
limit: 50,
});import requests
r = requests.get(
"https://api.hirenode.io/v1/jobs",
headers={"Authorization": f"Bearer {API_KEY}"},
params={"tech": "rust", "location": "London", "salary_min": 90000},
)
print(r.json()["data"])Authentication
All requests require a bearer token in the Authorization header. Generate keys from your dashboard. Rotate any time — old keys revoke instantly, no grace period. Sandbox and production keys are separate; sandbox keys are prefixed with hn_sk_test_.
Endpoints
| Method | Path | Description |
|---|---|---|
| GET | /v1/jobs | List jobs. Cursor / offset pagination, filterable by stack, location, salary, country, remote. params: q, tech, location, country, remote, salary_min, salary_is_predicted, limit, offset |
| GET | /v1/jobs/:id | Fetch a single job by canonical id, including the full origin payload under raw. |
| GET | /v1/companies | Aggregated company directory built from the live jobs index — job_count, top stacks, locations. params: tech, location, limit |
| GET | /v1/stats | Global market stats: totals, last-7-day deltas, top stacks, top locations, salary percentiles. |
| GET | /v1/demo/jobs | Public, unauthenticated synthetic-data preview. Use this in tutorials and example code. |
Response shape
Every list endpoint returns { data: T[], pagination }. Single-resource endpoints return the bare object. Errors return { error, details? } with a matching HTTP status.
{
"data": [
{
"id": "job_8x2pq7vk0c",
"title": "Senior Rust Engineer",
"company": "Acme Robotics",
"company_logo_url": "https://cdn.hirenode.io/logos/acme.png",
"location": "Berlin, DE",
"country": "DE",
"timezone": "Europe/Berlin",
"remote": true,
"category": "engineering",
"tech_stack": ["Rust", "Tokio", "PostgreSQL", "Kubernetes"],
"salary_min": 95000,
"salary_max": 135000,
"salary_currency": "EUR",
"salary_is_predicted": false,
"salary_range": "EUR 95k - 135k",
"apply_url": "https://acme.example/jobs/4821/apply",
"source": "arbeitnow",
"source_url": "https://arbeitnow.com/view/...",
"posted_at": "2026-05-24T09:12:00Z",
"discovered_at": "2026-05-24T10:08:14Z"
}
],
"pagination": { "limit": 20, "offset": 0, "total": 142 }
}Pagination
Use limit (max 100) and offset for simple paging, or cursor for stable iteration over large result sets. The SDK ships an async iterator:
for await (const job of hn.jobs.stream({ country: "US" })) {
await indexJob(job);
}Errors
| Status | Name | When |
|---|---|---|
| 400 | Bad Request | Query failed Zod validation. Check the details field. |
| 401 | Unauthorized | Missing or invalid Authorization bearer token. |
| 403 | Forbidden | Key exists but tier doesn't include this endpoint or filter. |
| 404 | Not Found | Resource id doesn't exist or has rolled off the 45-day window. |
| 429 | Too Many Requests | Rate limit hit. Honor the Retry-After header. |
| 500 | Server Error | Something broke on our side. Reported automatically; safe to retry. |
Rate limits
| Tier | Requests / sec | Monthly cap |
|---|---|---|
| Hobby | 5 | 250 |
| Pro | 10 | 50,000 |
| Scale | 30 | 250,000 |
| Enterprise | Custom | Custom |
When you hit a limit we return 429 with Retry-After (seconds). We never silently rebill you into a higher tier.
Webhooks
On Scale and above, register an HTTPS endpoint and we push events as they happen: job.created, job.updated, job.removed, and company.hiring_surge. Each payload is HMAC-SHA256 signed via X-Hirenode-Signature; verify it before trusting the body.
import { Hirenode } from "@hirenode/sdk";
// Express / Hono / Bun handler
app.post("/webhooks/hirenode", async (req, res) => {
const sig = req.headers["x-hirenode-signature"];
const event = Hirenode.webhooks.verify(req.rawBody, sig, process.env.WH_SECRET);
if (event.type === "job.created") {
await indexJob(event.data);
}
res.sendStatus(200);
});Failed deliveries retry with exponential backoff for 24h, then mark the endpoint inactive and email you.
We've got your back
- • 99.9% uptime SLA on Scale+ with financial credits on miss.
- • GDPR-compliant, publicly-listed data only, no PII. EU residency available.
- • 90-day data-export guarantee if you ever leave. The SDK is MIT.
- • Real humans on support — no tiered chatbot triage, even on free.
Full reference
Advanced filters, webhook setup, SDK downloads, and the live playground are in the authenticated reference.
Open full reference →