Post jobs from your own system
One JSON call, or a feed URL we poll. Every advert goes through the same compliance gate as our own — and the response tells you exactly why anything did not go live, in your own field names.
We tell you why, not just "200 OK"
Most job boards accept a push and return success. When the advert then fails to appear, there is no way to find out why, and it becomes a support ticket. Every response here carries the verdict the publish gate actually reached — so your integration can repair itself.
{
"reference": "REQ-4471",
"accepted": true,
"job_id": 10842,
"status": "draft",
"live": false,
"quality": 76,
"blocks": [
{ "code": "REG27_TENURE_UNSTATED", "field": "tenure",
"message": "Advert does not state whether the position is for temporary or permanent work (Conduct Regs 2003 reg.27(1))." }
],
"warns": [
{ "code": "SALARY_MISSING", "field": "salary",
"message": "No salary advertised (allowed, but lowers quality/SEO)." }
]
}
Add tenure, re-send the same reference, and it publishes. Nothing else changes.
POST /wp-json/verifera/v1/employer/jobs
Authenticate with your key in the X-Verifera-Key header. Send one job, or up to 100 in a batch — a single vacancy does not need a wrapper.
curl -X POST https://verifera.co.uk/wp-json/verifera/v1/employer/jobs \
-H "X-Verifera-Key: $VERIFERA_KEY" \
-H "Content-Type: application/json" \
-d '{
"jobs": [
{
"reference": "REQ-4471",
"title": "Band 6 ICU Nurse",
"company": "Sampleton NHS Foundation Trust",
"location": "Manchester",
"postcode": "M13 9WL",
"description": "Full advert text…",
"apply_url": "https://careers.example.nhs.uk/jobs/4471",
"salary_min": 35392,
"salary_max": 42618,
"salary_unit": "YEAR",
"currency": "GBP",
"employment_type": "FULL_TIME",
"tenure": "permanent",
"closing": "2026-09-30"
}
]
}'
Fields
| Field | Notes |
|---|---|
reference | Required. Your own stable id. Re-sending the same reference updates that job rather than creating a second one — so a retry is safe. |
title, company, location, description, apply_url | The particulars a listing needs to be publishable. |
tenure | permanent or temporary. A statutory particular of the advert under reg.27(1) — an advert that does not state it cannot be published. This is not the same question as full-time or part-time. |
employment_type | The hours axis: FULL_TIME, PART_TIME, CONTRACT, TEMPORARY, PER_DIEM, INTERN. |
salary_min, salary_max, salary_unit, currency | Optional, strongly recommended. Adverts that state pay attract substantially more applications, and Google's job results prefer them. |
postcode, category, closing, expired | Optional. expired: true retires a vacancy. |
Reading and retiring
GET /wp-json/verifera/v1/employer/jobs— everything currently live for your accountGET /wp-json/verifera/v1/employer/jobs/{reference}— one job, with its current verdictDELETE /wp-json/verifera/v1/employer/jobs/{reference}— retires the advert
A retired advert is expired, not erased. An advert that ran is a record that it ran, and the evidence outlives the vacancy.
Give us a feed URL instead
If your ATS already publishes an XML or JSON feed of your vacancies, send us the URL. We poll it on a schedule, and the same compliance gate applies. No integration work at your end at all.
Multi-posting platforms — Broadbean, LogicMelon, Idibu and similar — can also route to us. Tell us which one you use.
What we need first
Keys are issued against a signed agreement, not a sign-up form. The reason is regulatory rather than commercial: under reg.27(2) of the Conduct of Employment Agencies Regulations 2003 we must hold your authority to advertise your vacancies, and a self-service button cannot record that.
The agreement takes a few minutes and covers the authority to advertise, your statutory identifier (Companies House, CQC or NHS ODS), and who to contact about a listing.
The details worth knowing up front
- 100 jobs per request. Send more in successive batches.
- A batch is a delta, not a snapshot. Posting five jobs does not retire the others on your account — use
DELETEorexpired: truefor that. - Rate limited per key, with
429when exceeded. - Partial success is reported honestly. A batch where some rows are rejected returns
ok: falseand a per-row result, never a blanket failure. - Your key identifies you. The employer is taken from the authenticated key and never from the request body, so a key cannot post on another employer's behalf.