hirenode logohirenode.io
API v1

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.

Global by default
25+ countries — US, UK, EU, MENA, APAC, LATAM.
REST + JSON
Bearer auth, cursor pagination, no SDK required.
Edge-ready
TypeScript SDK runs in Node, Bun, Deno, Workers, Edge, browser.

Base URL

https://api.hirenode.io

All endpoints respond with JSON over HTTPS only. TLS 1.3, no plain-HTTP redirect.

Quickstart

cURL
curl https://api.hirenode.io/v1/jobs \
  -H "Authorization: Bearer YOUR_API_KEY"
TypeScript SDK
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,
});
Python (requests)
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

MethodPathDescription
GET/v1/jobsList 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/:idFetch a single job by canonical id, including the full origin payload under raw.
GET/v1/companiesAggregated company directory built from the live jobs index — job_count, top stacks, locations.
params: tech, location, limit
GET/v1/statsGlobal market stats: totals, last-7-day deltas, top stacks, top locations, salary percentiles.
GET/v1/demo/jobsPublic, 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

StatusNameWhen
400Bad RequestQuery failed Zod validation. Check the details field.
401UnauthorizedMissing or invalid Authorization bearer token.
403ForbiddenKey exists but tier doesn't include this endpoint or filter.
404Not FoundResource id doesn't exist or has rolled off the 45-day window.
429Too Many RequestsRate limit hit. Honor the Retry-After header.
500Server ErrorSomething broke on our side. Reported automatically; safe to retry.

Rate limits

TierRequests / secMonthly cap
Hobby5250
Pro1050,000
Scale30250,000
EnterpriseCustomCustom

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 →