For developers and ATS teams

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.

What makes this different

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.

An advert that did not go live
{
  "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.

Posting jobs

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

FieldNotes
referenceRequired. 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_urlThe particulars a listing needs to be publishable.
tenurepermanent 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_typeThe hours axis: FULL_TIME, PART_TIME, CONTRACT, TEMPORARY, PER_DIEM, INTERN.
salary_min, salary_max, salary_unit, currencyOptional, strongly recommended. Adverts that state pay attract substantially more applications, and Google's job results prefer them.
postcode, category, closing, expiredOptional. expired: true retires a vacancy.

Reading and retiring

  • GET /wp-json/verifera/v1/employer/jobs — everything currently live for your account
  • GET /wp-json/verifera/v1/employer/jobs/{reference} — one job, with its current verdict
  • DELETE /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.

If you would rather not write code

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.

Getting a key

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.

Limits and behaviour

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 DELETE or expired: true for that.
  • Rate limited per key, with 429 when exceeded.
  • Partial success is reported honestly. A batch where some rows are rejected returns ok: false and 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.
Help others hire with confidence

Reviews on Trustpilot

Worked with Verifera as a candidate or employer? Your honest review helps the next person trust verified hiring.