Job feed API

Pull HireOnChain's most recent open jobs into your own board with one authenticated GET. Free for partner boards. In return, every job you show links back to its HireOnChain page.

Get a key

Message @0xHireOnChain with your board's name and URL. You get one secret key, tied to your board's name. Keep it on your server. The feed is not built for browser calls, and a key shipped in page JavaScript will be revoked.

Send it on every request:

Authorization: Bearer <your key>

List open jobs

GET https://api.hireonchain.io/feed/v1/jobs

Open jobs, newest first. Closed, paused and expired jobs are never included.

Query paramMeaning
limit1 to 100. Default 50.
sinceISO 8601 date. Only jobs posted at or after it.
cursorThe next_cursor from the previous page. Opaque; pass it back unchanged.
curl "https://api.hireonchain.io/feed/v1/jobs?limit=50" \
  -H "Authorization: Bearer $HOC_FEED_KEY"
{
  "data": [
    {
      "id": "3f6c1a9e-8b2d-4c71-9e0a-5d4b7f2e1c88",
      "slug": "senior-solidity-engineer-nova-labs",
      "url": "https://hireonchain.io/apply?id=3f6c…&native=true&utm_source=yourboard&utm_medium=job_feed",
      "status": "open",
      "source": "posted",
      "title": "Senior Solidity Engineer",
      "company": {
        "name": "Nova Labs",
        "logo_url": "https://…/logo.png",
        "url": "https://novalabs.xyz",
        "verified": true
      },
      "location": { "raw": "Remote (EU)", "city": null, "region": null, "country": null, "remote": true },
      "employment_type": "full_time",
      "seniority": "senior",
      "comp": { "min": 180000, "max": 230000, "currency": "USD", "period": "year", "equity": true, "raw": null },
      "tags": ["solidity", "evm", "defi"],
      "chains": ["ethereum"],
      "description": {
        "format": "structured",
        "summary": "…",
        "sections": [{ "heading": "About the role", "body_md": "…" }],
        "responsibilities": ["…"],
        "requirements": ["…"],
        "nice_to_have": [],
        "benefits": [],
        "raw_text": "…",
        "raw_html": null,
        "normalizer_version": "…"
      },
      "apply": { "type": "internal", "url": null },
      "posted_at": "2026-10-11T14:02:11.000Z",
      "updated_at": "2026-10-11T14:02:11.000Z",
      "closes_at": null
    }
  ],
  "next_cursor": "MjAyNi0xMC0xMVQxNDowMjoxMS4wMDBafDNmNmMxYTll…"
}

Fields you will use most

  • id: stable. Use it as your primary key.
  • url: the job's HireOnChain page, already tagged with your board. Link to this.
  • description.format: when it is structured, render summary, sections and the lists. When it is raw, those are empty and raw_text holds the full description.
  • comp: min/max are numbers in currency per period. Any of them can be null.
  • apply: internal jobs are applied to on HireOnChain. external jobs carry the employer's own apply link.

Remove closed jobs

GET https://api.hireonchain.io/feed/v1/jobs/closed?since=2026-10-01T00:00:00Z

IDs of jobs that closed since since, as { "data": [{ "id", "closed_at" }] }. It looks back 30 days at most. Delete these from your board.

Keeping in sync

// Run every 15–60 minutes.
const H = { Authorization: `Bearer ${process.env.HOC_FEED_KEY}` };

// 1. New and current jobs since your last run (page until next_cursor is null)
let cursor = null;
do {
  const qs = new URLSearchParams({ limit: "100", since: lastRunIso });
  if (cursor) qs.set("cursor", cursor);
  const page = await fetch(`https://api.hireonchain.io/feed/v1/jobs?${qs}`, { headers: H }).then(r => r.json());
  for (const job of page.data) upsert(job);      // key on job.id
  cursor = page.next_cursor;
} while (cursor);

// 2. Take down anything we closed
const closed = await fetch(`https://api.hireonchain.io/feed/v1/jobs/closed?since=${lastRunIso}`, { headers: H }).then(r => r.json());
for (const { id } of closed.data) remove(id);

Responses may be cached for up to 5 minutes, so polling more often than that gains nothing.

Errors and limits

StatusMeaning
401Missing or invalid key.
400Malformed since or cursor.
429Over 60 requests a minute for your key. Wait for the Retry-After header's seconds.

Terms

  • Every job you display links to its url, unmodified.
  • Show “via HireOnChain” on the listing or the page that carries the feed.
  • Don't edit a job's title, company or compensation, and don't resell the feed.
  • We can rotate or revoke a key at any time. We'll message you first unless the key has leaked.

Run a board?

Partner access is free. Tell us where the jobs will appear.

Request a feed key