Overview
What the API does
The Referio Jobs API lets you create, update, and expire job listings without touching the dashboard. It's a small, predictable JSON REST API — if you can send an HTTP request, you can post a job.
There are three ways people use it:
Employers, directly
Wire your careers page or internal tooling straight to Referio with your own employer API key.
ATS & job platforms
Post on behalf of many employers at once with a single platform key — each job is scoped by employer email.
AI agents
A self-describing JSON index lets agents discover the schema and post autonomously.
Base URL https://referio.io/api/v1
All requests and responses are JSON. All endpoints require authentication.
Quick start
Post your first job
Grab an API key from Settings → API keys, then send a single POST. The job goes live the moment it's accepted.
curl -X POST https://referio.io/api/v1/jobs \
-H "Authorization: Bearer $REFERIO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"title": "Senior Platform Engineer",
"description": "Own our build and deploy pipeline end to end. Kubernetes, Go, and a small, kind team.",
"referral_fee_amount": 8000,
"referral_fee_currency": "USD",
"location": "London or remote (UK)",
"work_mode": "remote",
"employment_type": "full_time",
"tags": ["golang", "kubernetes", "platform"],
"external_id": "ats-job-4471"
}'A 201 Created response comes back with the stored job, including its slug (its public URL) and the fee converted to USD.
HTTP/1.1 201 Created
{
"job": {
"id": "8f3c…",
"slug": "senior-platform-engineer",
"status": "active",
"referral_fee_amount": 8000,
"referral_fee_currency": "USD",
"referral_fee_usd": 8000,
"external_id": "ats-job-4471"
}
}Authentication
API keys & Bearer tokens
Every request authenticates with a Bearer token in the Authorization header:
Authorization: Bearer <your_api_key>There are two kinds of key:
Employer key
Scoped to a single employer — your own account. It can only create and edit that employer's jobs. Generate one in Settings → API keys. The employer_email field is ignored.
Platform key
For ATS providers and job-posting platforms posting on behalf of many employers. Pass employer_emailwith each job to say who owns it — the employer is created automatically if it's new.
Treat keys like passwords. Send them only over HTTPS, never embed them in client-side code, and rotate (revoke & reissue) them if one leaks.
The fee rule
Every job pays US$5,000+
Referio exists so that referring great people is worth real money. That's why every job must carry a referral fee worth at least US$5,000. You can quote the fee in any supported currency — the API converts it to USD at the current exchange rate and rejects anything below the minimum with a 422.
Supported currencies
Endpoints
The full surface
/api/v1/jobsexternal_id. This is the endpoint you'll use most./api/v1/jobs/:idreferral_fee_amount and referral_fee_currency together./api/v1/jobs/:id/api/v1/jobs/:id/expireDELETE, for clients that can't send the DELETE method./api/v1Example — mark a role as filled:
curl -X PATCH https://referio.io/api/v1/jobs/8f3c… \
-H "Authorization: Bearer $REFERIO_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "status": "filled" }'Job fields
Request body reference
The body for POST /api/v1/jobs (and the editable fields for PATCH). Unknown fields are ignored.
| Field | Type | Required | Notes |
|---|---|---|---|
title | string | Yes | The role title. 3–140 characters. |
description | string | Yes | Full role description. Minimum 20 characters. Plain text or markdown. |
referral_fee_amount | number | Yes | The referral fee you'll pay. Must convert to at least US$5,000. |
referral_fee_currency | string | Yes | ISO 4217 code, e.g. USD. Must be a supported currency (see below). |
employer_email | string | Platform key only | Identifies which employer owns the job. Required with a platform key, ignored with an employer key. An employer account is created on first use. |
employer_name | string | No | Display name for a newly-provisioned employer. |
location | string | No | Free-text location, up to 160 characters. |
work_mode | enum | No | remote · hybrid · onsite. Defaults to onsite. |
employment_type | enum | No | full_time · part_time · contract · temporary. Defaults to full_time. |
salary_min | number | No | Lower bound of the advertised salary. |
salary_max | number | No | Upper bound of the advertised salary. |
salary_currency | string | No | ISO 4217 code for the salary range. |
tags | string[] | No | Up to 12 tags for filtering and discovery. |
apply_instructions | string | No | How candidates apply. Up to 2,000 characters. |
expires_at | string | No | ISO 8601 datetime. The job auto-expires after this moment. |
external_id | string | No | Your own ID for the job. Re-posting with the same external_id updates the existing job instead of creating a duplicate (idempotency). |
status | enum | No | active · draft · expired · filled. Defaults to active (live on the board). |
Idempotency
Re-post safely with external_id
Pass your own external_id on every job. The first call creates the job; any later call with the same external_id updates the existing one instead of creating a duplicate. This makes syncs from an ATS safe to retry and replay — you can push your whole board on a schedule without fear of duplicates.
Responses & errors
What you get back
Success returns the stored job object. Validation problems return a 422 with a details object describing each field.
HTTP/1.1 422 Unprocessable Entity
{
"error": "Validation failed",
"details": {
"fieldErrors": {
"title": ["Title is too short."]
}
}
}| Status | Meaning |
|---|---|
200 | OK — job updated or expired. |
201 | Created — a new job was posted. |
400 | Bad request — malformed JSON, or missing employer_email on a platform key. |
401 | Unauthorized — missing or invalid API key. |
403 | Forbidden — an employer key tried to touch another employer's job. |
404 | Not found — no job with that id. |
422 | Validation failed — see the details object. Includes the US$5,000 fee minimum. |
ATS & platforms
Posting on behalf of employers
If you run an applicant tracking system or a job-posting platform, a single platform key lets you post for all of your employer customers. Identify each employer with employer_emailon the job body — Referio provisions the employer account automatically the first time it sees a new address, so there's no onboarding step to build.
curl -X POST https://referio.io/api/v1/jobs \
-H "Authorization: Bearer $REFERIO_PLATFORM_KEY" \
-H "Content-Type: application/json" \
-d '{
"employer_email": "talent@acme.com",
"employer_name": "Acme Corp",
"title": "Staff Designer",
"description": "Lead design across our flagship product. Strong systems thinking required.",
"referral_fee_amount": 6500,
"referral_fee_currency": "GBP",
"external_id": "acme-217"
}'Combine this with external_idand you can mirror an entire customer's job board into Referio idempotently, on whatever schedule suits you.
For AI agents
Built to be driven by software
This API is designed to be discoverable and safe for autonomous agents. If you're an agent integrating Referio, here's the short version:
- Discover the schema by sending
GET https://referio.io/api/v1. It returns auth rules, constraints, and the full request body shape as JSON — no key needed. - Authenticate with
Authorization: Bearer <key>on every write. - Honour the fee minimum:
referral_fee_amountmust convert to ≥ US$5,000, or the write is rejected with422. Read theerrormessage and adjust. - Be idempotent: always send a stable
external_idso retries never create duplicates. - Required fields are
title,description,referral_fee_amount, andreferral_fee_currency(plusemployer_emailon a platform key). Everything else has sensible defaults.
Ready to post?
Create an account, generate a key, and put your first role on the board in minutes.