Developer guide

Integrate with the Reach Vacancy API

The Reach Vacancy API is a RESTful toolkit for surfacing live recruitment data across your career site or back-office workflows. Each request is built from simple URL segments, making it easy to fetch vacancies, metadata and supporting content in the format your application needs.


API Key

Every account has a unique API key that is supplied to them upon request. During development you can use our dummy data key in lieu of recieving the live data key.
a83d66d29041c407e8abf4187c533053.
The API key forms part of the hostname, all requests should be over HTTPS. For example, development requests can target https://a83d66d29041c407e8abf4187c533053.reach-ats.com/.


TLDR

A condensed reference to the most commonly used JSON endpoints.

Vacancy listings

All live vacancies

External feed (use internalListing for internal sites).

View JSON listing

https://a83d66d29041c407e8abf4187c533053.reach-ats.com/get/job/listing/-/-/-/-/JSON

Radius search listing

Add postcode and range; internal variant available via internalListingByPostcode.

View postcode search JSON

https://a83d66d29041c407e8abf4187c533053.reach-ats.com/get/job/listingByPostcode/B610GD/250/-/-/-/-/JSON

Vacancy detail (combine for full detail)

Vacancy information

Use internalInformation for intranet flows.

View vacancy info

https://a83d66d29041c407e8abf4187c533053.reach-ats.com/get/job/information/129436/JSON

Vacancy advert text

Raw HTML copy for the advert.

View advert JSON

https://a83d66d29041c407e8abf4187c533053.reach-ats.com/get/job/advert/129436/JSON

Vacancy files

Supporting documents and metadata.

View file list

https://a83d66d29041c407e8abf4187c533053.reach-ats.com/get/job/fileurls/129436/JSON

Vacancy alerts signup

Embed via iframe to collect job alert registrations.

Load iframe demo

https://a83d66d29041c407e8abf4187c533053.reach-ats.com/jobalert/load/6/2

List retrievals (JSON)

Populate dropdowns and filters with live account metadata.

Fetch offices

https://a83d66d29041c407e8abf4187c533053.reach-ats.com/get/job/offices

Also available: locations, roles, types, counties.


Overview

You can query the API from any modern language, including PHP, Python, .NET, Perl and Java. and recieve the payload in the format that works best for you.

Default call (XML)

Returns all live jobs in XML format.

View example

N.B. View the page source in your browser; XML responses render as raw markup.

JSON call example

Use positional segments to switch the response type.

View JSON response

Anatomy of a request

Each request is constructed from five segments:

  1. Action — usually get.
  2. Package — the module you are querying, e.g. job.
  3. Data — the resource within that package, e.g. listing or advert.
  4. Parameters — positional arguments separated by slashes. Use a hyphen (-) for empty values.
  5. Response type (Encoding) (optional) — override the default format with XML, JSON, CSV, PIPE or RAW. This is always the last parameter of the URL.

Example: /get/job/listing/-/-/-/-/JSON fetches the job listing, skips optional filters, and requests JSON.

Sample XML response

<response generated="2011-06-30T16:48:07+01:00" records="3">
	<record>
		<id><![CDATA[25618]]></id>
		<title><![CDATA[Assistant Store Manager - Camden]]></title>
		<category><![CDATA[Sales]]></category>
		<role><![CDATA[Sales]]></role>
		<type><![CDATA[Permanent]]></type>
		<hours><![CDATA[35]]></hours>
		<salarydescription><![CDATA[25,000]]></salarydescription>
		<closingdate><![CDATA[2013-01-04]]></closingdate>
	</record>
</response>

Vacancy API

The vacancy module exposes all live job data. Calls are grouped into packages, with the job package covering everything from vacancy listings to supporting media. Use filters and alternate encodings to power different channels such as career sites, aggregators or partner feeds.

Expand any endpoint below for its response schema. Where a value is typed in by your team, the schema names the panel and field it comes from on the Edit Vacancy screen — for example Key Information → Salary Description. Those labels are configurable per account, so yours may be worded differently.

Job package endpoints

  • listing — returns all live vacancies with optional keyword, location, type, role and encoding arguments.
  • listingByPostcode — adds mandatory postcode and range parameters for radius-based searches.
  • information — fetches a single vacancy record by job ID, including contact and workflow data.
  • advert (alias text or description) — returns the full advert copy in RAW format.
  • applyurl / applyurlsource / applysource — resolve application URLs for external or internal sources.
  • fileurls — lists downloadable assets tied to the vacancy.

Multi-value filters

The LOCATION, TYPE, ROLE and COUNTY slots accept one value or many. Separate multiple values with the pipe character | (URL-encoded as %7C). Each value is matched as a substring with LIKE '%value%'; multiple values are OR'd together within the same slot. For example, /get/job/listing/-/-/Permanent%7CContract/-/JSON returns vacancies whose type matches either Permanent or Contract. Single-value calls remain unchanged. Applies to every listing endpoint below except listing2, which is single-value only for backward compatibility.

Listing variations

/get/job/listing/KEYWORDS/LOCATION/TYPE/ROLE/ENCODING array<object> Default vacancy feed (XML by default). All filters optional; use - to skip and append the desired format.
Response
array<object>

Formats: XML (default) · JSON · RSS · CSV · PIPE · RAW

Records are ordered by vacancy ID descending. Vacancies whose closing date and time have passed are dropped before the response is built.

id integer Unique vacancy ID. Pass this to the single-vacancy endpoints.
title string Vacancy title with any HTML tags stripped. Vacancy editor: Key Information → Title
lastModified datetime When the vacancy record was last changed (YYYY-MM-DD HH:MM:SS, Europe/London).
timestamp integer lastModified as a Unix timestamp.
activationDate datetime When the vacancy was made live. Falls back to lastModified when no activation date is stored. Vacancy editor: Optional Information → Activation Date
activation_timestamp integer activationDate as a Unix timestamp. Vacancy editor: Optional Information → Activation Date
category string Vacancy category. Vacancy editor: Key Information → Categories
role string Vacancy role or discipline. Vacancy editor: Key Information → Role
internal boolean true when an internal workflow is attached to the vacancy, otherwise false. Vacancy editor: Candidate Attraction → the internal source behind “Candidates apply using”
external boolean true when an external workflow is attached, otherwise false. Vacancy editor: Candidate Attraction → the external source behind “Candidates apply using”
group string Department/group name the vacancy belongs to. Empty when the vacancy has no department. Vacancy editor: Key Information → the department/group field
type string Employment type. Vacancies of type Registration are never returned. Vacancy editor: Key Information → Vacancy Type
clientreference string Your own reference for the vacancy. Vacancy editor: Optional Information → Client Reference
hours string Hours exactly as entered on the vacancy. Vacancy editor: Key Information → Hours
salarydescription string Salary as it should be displayed. Vacancy editor: Key Information → Salary Description
closingdate string Closing date formatted for display (Weekday, Do Month YYYY). Vacancy editor: Optional Information → Closing Date
isodate date The same closing date as YYYY-MM-DD. Use this one for sorting and comparisons. Vacancy editor: Optional Information → Closing Date
closingtime time Closing time as HH:MM. Empty means the vacancy closes at 23:59:59 on the closing date. Vacancy editor: Optional Information → Closing Time
interviewdate1 date First interview date, when one has been set. Vacancy editor: Optional Information → 1st Interview Date
interviewdate2 date Second interview date, when one has been set. Vacancy editor: Optional Information → 2nd Interview Date
hrcontact string Job administrator for the vacancy. Vacancy editor: Vacancy Administrator → Contact
shortdescription string Short advert summary with HTML stripped. Vacancy editor: Advert → Short Description
officename string Office the vacancy is attached to. Vacancy editor: Vacancy Location → Address Book (value comes from the office record)
officegroup string Grouping the office belongs to. Vacancy editor: Vacancy Location → Address Book (value comes from the office record)
division string Division the office belongs to. Vacancy editor: Vacancy Location → Address Book (value comes from the office record)
logo string Office logo filename. Empty when the office has no logo. Vacancy editor: Vacancy Location → Address Book (value comes from the office record)
logo_cdn url Fully-qualified logo URL. Built from logo when no CDN URL is stored, and empty when there is no logo at all. Vacancy editor: Vacancy Location → Address Book (value comes from the office record)
logo_url url Website URL held against the office. Empty when none is set. Vacancy editor: Vacancy Location → Address Book (value comes from the office record)
officeAddressId integer ID of the office address record. Join against /get/lists/offices. Vacancy editor: Vacancy Location → Address Book
featured string Value of the vacancy’s featured property. Empty when the vacancy is not featured. Vacancy editor: Key Information → Featured?
contactnumber string Contact telephone number for the vacancy. Vacancy editor: Vacancy Administrator → Contact Number
address1 string First line of the vacancy address. Vacancy editor: Vacancy Location → Address 1
postcode string Vacancy postcode. May instead hold NATIONAL, ONLINE or VIRTUAL. Vacancy editor: Vacancy Location → Postcode
region string Region held against the vacancy. Vacancy editor: Vacancy Location → Region
county string County. Matches the values from /get/lists/counties. Vacancy editor: Vacancy Location → County
country string Country. Vacancy editor: Vacancy Location → Country
location string Location as displayed on the advert. Matches /get/lists/locations. Vacancy editor: Vacancy Location → City/Location
address string Address lines, location, county, postcode and country joined with commas. Empty parts are stripped out. Vacancy editor: Vacancy Location → Address 1, Address 2, City/Location, County, Postcode and Country
applyurl string Apply link built from your response domain, the vacancy ID and the apply source short code. Listing endpoints return this without a scheme — prefix it with https://. Vacancy editor: Candidate Attraction → Vacancy Candidate Sources
applicationtype string online or manual, depending on the apply source attached to the vacancy. Vacancy editor: Candidate Attraction → Vacancy Candidate Sources
lastAdded datetime When the vacancy was attached to its apply source. Vacancy editor: Candidate Attraction → Vacancy Candidate Sources
longitude float Longitude of the vacancy postcode. Empty when the postcode is not in the geocoding table. Vacancy editor: derived from Vacancy Location → Postcode
latitude float Latitude of the vacancy postcode. Empty when the postcode is not in the geocoding table. Vacancy editor: derived from Vacancy Location → Postcode
iwfId integer Internal workflow ID. Only present when internal is true. Vacancy editor: Candidate Attraction → the internal source behind “Candidates apply using”
ewfId integer External workflow ID. Only present when external is true. Vacancy editor: Candidate Attraction → the external source behind “Candidates apply using”
Example response
[
    {
        "id": "1024",
        "title": "Senior Care Assistant",
        "lastModified": "2026-07-14 09:12:03",
        "timestamp": "1784020323",
        "activationDate": "2026-07-01 08:00:00",
        "activation_timestamp": "1782806400",
        "category": "Care",
        "role": "Care Assistant",
        "internal": "true",
        "external": "true",
        "group": "Operations",
        "type": "Permanent",
        "clientreference": "REF-1024",
        "hours": "37.5",
        "salarydescription": "£25,000 - £28,000 per annum",
        "closingdate": "Friday, 28th August 2026",
        "isodate": "2026-08-28",
        "closingtime": "17:00",
        "interviewdate1": "2026-09-04",
        "interviewdate2": "2026-09-11",
        "hrcontact": "Jane Doe",
        "shortdescription": "Join our award-winning care team in Coventry.",
        "officename": "Coventry",
        "officegroup": "Midlands",
        "division": "Residential",
        "logo": "acme-logo.png",
        "logo_cdn": "https://cdn.reach-ats.com/images/logos/12/acme-logo.png",
        "logo_url": "https://www.acme.co.uk",
        "officeAddressId": "8",
        "featured": "1",
        "contactnumber": "024 7612 3456",
        "address1": "1 Example Street",
        "postcode": "CV3 1ET",
        "region": "West Midlands",
        "county": "Warwickshire",
        "country": "United Kingdom",
        "location": "Coventry",
        "address": "1 Example Street, Coventry, Warwickshire, CV3 1ET, United Kingdom",
        "applyurl": "jobs.acme.co.uk/1024ab",
        "applicationtype": "online",
        "lastAdded": "2026-07-01 08:00:00",
        "longitude": "-1.512",
        "latitude": "52.396",
        "iwfId": "17",
        "ewfId": "42"
    }
]

Every value is serialised as a string — the type column describes the underlying value. XML responses wrap the records in <response generated="…" records="…"> with one <record> per row.

/get/job/listingByPostcode/POSTCODE/RANGE/KEYWORDS/LOCATION/TYPE/ROLE/ENCODING array<object> Radius search by full or partial postcode. Provide postcode (max 15 chars) and range in miles; remaining filters mirror the base listing. Optional ?include= querystring accepts one or more of NATIONAL, ONLINE, VIRTUAL separated by the pipe character | (e.g. ?include=NATIONAL or ?include=NATIONAL|ONLINE). Jobs whose postcode matches any listed value are always returned, ignoring the radius filter. Values are case-insensitive; unknown values are ignored.
Response
array<object>

Formats: XML (default) · JSON · RSS · CSV · PIPE · RAW

The radius is applied as a filter only — no distance value is returned. Use longitude/latitude if you need to calculate one yourself.

id integer Unique vacancy ID. Pass this to the single-vacancy endpoints.
title string Vacancy title with any HTML tags stripped. Vacancy editor: Key Information → Title
lastModified datetime When the vacancy record was last changed (YYYY-MM-DD HH:MM:SS, Europe/London).
timestamp integer lastModified as a Unix timestamp.
activationDate datetime When the vacancy was made live. Falls back to lastModified when no activation date is stored. Vacancy editor: Optional Information → Activation Date
activation_timestamp integer activationDate as a Unix timestamp. Vacancy editor: Optional Information → Activation Date
category string Vacancy category. Vacancy editor: Key Information → Categories
role string Vacancy role or discipline. Vacancy editor: Key Information → Role
internal boolean true when an internal workflow is attached to the vacancy, otherwise false. Vacancy editor: Candidate Attraction → the internal source behind “Candidates apply using”
external boolean true when an external workflow is attached, otherwise false. Vacancy editor: Candidate Attraction → the external source behind “Candidates apply using”
group string Department/group name the vacancy belongs to. Empty when the vacancy has no department. Vacancy editor: Key Information → the department/group field
type string Employment type. Vacancies of type Registration are never returned. Vacancy editor: Key Information → Vacancy Type
clientreference string Your own reference for the vacancy. Vacancy editor: Optional Information → Client Reference
hours string Hours exactly as entered on the vacancy. Vacancy editor: Key Information → Hours
salarydescription string Salary as it should be displayed. Vacancy editor: Key Information → Salary Description
closingdate string Closing date formatted for display (Weekday, Do Month YYYY). Vacancy editor: Optional Information → Closing Date
isodate date The same closing date as YYYY-MM-DD. Use this one for sorting and comparisons. Vacancy editor: Optional Information → Closing Date
closingtime time Closing time as HH:MM. Empty means the vacancy closes at 23:59:59 on the closing date. Vacancy editor: Optional Information → Closing Time
interviewdate1 date First interview date, when one has been set. Vacancy editor: Optional Information → 1st Interview Date
interviewdate2 date Second interview date, when one has been set. Vacancy editor: Optional Information → 2nd Interview Date
hrcontact string Job administrator for the vacancy. Vacancy editor: Vacancy Administrator → Contact
shortdescription string Short advert summary with HTML stripped. Vacancy editor: Advert → Short Description
officename string Office the vacancy is attached to. Vacancy editor: Vacancy Location → Address Book (value comes from the office record)
officegroup string Grouping the office belongs to. Vacancy editor: Vacancy Location → Address Book (value comes from the office record)
division string Division the office belongs to. Vacancy editor: Vacancy Location → Address Book (value comes from the office record)
logo string Office logo filename. Empty when the office has no logo. Vacancy editor: Vacancy Location → Address Book (value comes from the office record)
logo_cdn url Fully-qualified logo URL. Built from logo when no CDN URL is stored, and empty when there is no logo at all. Vacancy editor: Vacancy Location → Address Book (value comes from the office record)
logo_url url Website URL held against the office. Empty when none is set. Vacancy editor: Vacancy Location → Address Book (value comes from the office record)
featured string Value of the vacancy’s featured property. Empty when the vacancy is not featured. Vacancy editor: Key Information → Featured?
contactnumber string Contact telephone number for the vacancy. Vacancy editor: Vacancy Administrator → Contact Number
address1 string First line of the vacancy address. Vacancy editor: Vacancy Location → Address 1
postcode string Vacancy postcode. May instead hold NATIONAL, ONLINE or VIRTUAL. Vacancy editor: Vacancy Location → Postcode
region string Region held against the vacancy. Vacancy editor: Vacancy Location → Region
county string County. Matches the values from /get/lists/counties. Vacancy editor: Vacancy Location → County
country string Country. Vacancy editor: Vacancy Location → Country
location string Location as displayed on the advert. Matches /get/lists/locations. Vacancy editor: Vacancy Location → City/Location
address string Address lines, location, county, postcode and country joined with commas. Empty parts are stripped out. Vacancy editor: Vacancy Location → Address 1, Address 2, City/Location, County, Postcode and Country
applyurl string Apply link built from your response domain, the vacancy ID and the apply source short code. Listing endpoints return this without a scheme — prefix it with https://. Vacancy editor: Candidate Attraction → Vacancy Candidate Sources
applicationtype string online or manual, depending on the apply source attached to the vacancy. Vacancy editor: Candidate Attraction → Vacancy Candidate Sources
longitude float Longitude of the vacancy postcode. Empty when the postcode is not in the geocoding table. Vacancy editor: derived from Vacancy Location → Postcode
latitude float Latitude of the vacancy postcode. Empty when the postcode is not in the geocoding table. Vacancy editor: derived from Vacancy Location → Postcode
Example response
[
    {
        "id": "1024",
        "title": "Senior Care Assistant",
        "lastModified": "2026-07-14 09:12:03",
        "timestamp": "1784020323",
        "activationDate": "2026-07-01 08:00:00",
        "activation_timestamp": "1782806400",
        "category": "Care",
        "role": "Care Assistant",
        "internal": "true",
        "external": "true",
        "group": "Operations",
        "type": "Permanent",
        "clientreference": "REF-1024",
        "hours": "37.5",
        "salarydescription": "£25,000 - £28,000 per annum",
        "closingdate": "Friday, 28th August 2026",
        "isodate": "2026-08-28",
        "closingtime": "17:00",
        "interviewdate1": "2026-09-04",
        "interviewdate2": "2026-09-11",
        "hrcontact": "Jane Doe",
        "shortdescription": "Join our award-winning care team in Coventry.",
        "officename": "Coventry",
        "officegroup": "Midlands",
        "division": "Residential",
        "logo": "acme-logo.png",
        "logo_cdn": "https://cdn.reach-ats.com/images/logos/12/acme-logo.png",
        "logo_url": "https://www.acme.co.uk",
        "featured": "1",
        "contactnumber": "024 7612 3456",
        "address1": "1 Example Street",
        "postcode": "CV3 1ET",
        "region": "West Midlands",
        "county": "Warwickshire",
        "country": "United Kingdom",
        "location": "Coventry",
        "address": "1 Example Street, Coventry, Warwickshire, CV3 1ET, United Kingdom",
        "applyurl": "jobs.acme.co.uk/1024ab",
        "applicationtype": "online",
        "longitude": "-1.512",
        "latitude": "52.396"
    }
]

Every value is serialised as a string — the type column describes the underlying value. XML responses wrap the records in <response generated="…" records="…"> with one <record> per row.

/get/job/listingBySource/SOURCES/KEYWORDS/LOCATION/TYPE/ROLE/ENCODING array<object> Limit results to one or more sources. First segment accepts comma-separated source IDs or short codes.
Response
array<object>

Formats: XML (default) · JSON · RSS · CSV · PIPE · RAW

Same shape as listing, restricted to the sources you pass in.

id integer Unique vacancy ID. Pass this to the single-vacancy endpoints.
title string Vacancy title with any HTML tags stripped. Vacancy editor: Key Information → Title
lastModified datetime When the vacancy record was last changed (YYYY-MM-DD HH:MM:SS, Europe/London).
timestamp integer lastModified as a Unix timestamp.
activationDate datetime When the vacancy was made live. Falls back to lastModified when no activation date is stored. Vacancy editor: Optional Information → Activation Date
activation_timestamp integer activationDate as a Unix timestamp. Vacancy editor: Optional Information → Activation Date
category string Vacancy category. Vacancy editor: Key Information → Categories
role string Vacancy role or discipline. Vacancy editor: Key Information → Role
internal boolean true when an internal workflow is attached to the vacancy, otherwise false. Vacancy editor: Candidate Attraction → the internal source behind “Candidates apply using”
external boolean true when an external workflow is attached, otherwise false. Vacancy editor: Candidate Attraction → the external source behind “Candidates apply using”
group string Department/group name the vacancy belongs to. Empty when the vacancy has no department. Vacancy editor: Key Information → the department/group field
type string Employment type. Vacancies of type Registration are never returned. Vacancy editor: Key Information → Vacancy Type
clientreference string Your own reference for the vacancy. Vacancy editor: Optional Information → Client Reference
hours string Hours exactly as entered on the vacancy. Vacancy editor: Key Information → Hours
salarydescription string Salary as it should be displayed. Vacancy editor: Key Information → Salary Description
closingdate string Closing date formatted for display (Weekday, Do Month YYYY). Vacancy editor: Optional Information → Closing Date
isodate date The same closing date as YYYY-MM-DD. Use this one for sorting and comparisons. Vacancy editor: Optional Information → Closing Date
closingtime time Closing time as HH:MM. Empty means the vacancy closes at 23:59:59 on the closing date. Vacancy editor: Optional Information → Closing Time
interviewdate1 date First interview date, when one has been set. Vacancy editor: Optional Information → 1st Interview Date
interviewdate2 date Second interview date, when one has been set. Vacancy editor: Optional Information → 2nd Interview Date
hrcontact string Job administrator for the vacancy. Vacancy editor: Vacancy Administrator → Contact
shortdescription string Short advert summary with HTML stripped. Vacancy editor: Advert → Short Description
officename string Office the vacancy is attached to. Vacancy editor: Vacancy Location → Address Book (value comes from the office record)
officegroup string Grouping the office belongs to. Vacancy editor: Vacancy Location → Address Book (value comes from the office record)
division string Division the office belongs to. Vacancy editor: Vacancy Location → Address Book (value comes from the office record)
logo string Office logo filename. Empty when the office has no logo. Vacancy editor: Vacancy Location → Address Book (value comes from the office record)
logo_cdn url Fully-qualified logo URL. Built from logo when no CDN URL is stored, and empty when there is no logo at all. Vacancy editor: Vacancy Location → Address Book (value comes from the office record)
logo_url url Website URL held against the office. Empty when none is set. Vacancy editor: Vacancy Location → Address Book (value comes from the office record)
officeAddressId integer ID of the office address record. Join against /get/lists/offices. Vacancy editor: Vacancy Location → Address Book
featured string Value of the vacancy’s featured property. Empty when the vacancy is not featured. Vacancy editor: Key Information → Featured?
contactnumber string Contact telephone number for the vacancy. Vacancy editor: Vacancy Administrator → Contact Number
address1 string First line of the vacancy address. Vacancy editor: Vacancy Location → Address 1
postcode string Vacancy postcode. May instead hold NATIONAL, ONLINE or VIRTUAL. Vacancy editor: Vacancy Location → Postcode
region string Region held against the vacancy. Vacancy editor: Vacancy Location → Region
county string County. Matches the values from /get/lists/counties. Vacancy editor: Vacancy Location → County
country string Country. Vacancy editor: Vacancy Location → Country
location string Location as displayed on the advert. Matches /get/lists/locations. Vacancy editor: Vacancy Location → City/Location
address string Address lines, location, county, postcode and country joined with commas. Empty parts are stripped out. Vacancy editor: Vacancy Location → Address 1, Address 2, City/Location, County, Postcode and Country
applyurl string Apply link built from your response domain, the vacancy ID and the apply source short code. Listing endpoints return this without a scheme — prefix it with https://. Vacancy editor: Candidate Attraction → Vacancy Candidate Sources
applicationtype string online or manual, depending on the apply source attached to the vacancy. Vacancy editor: Candidate Attraction → Vacancy Candidate Sources
lastAdded datetime When the vacancy was attached to its apply source. Vacancy editor: Candidate Attraction → Vacancy Candidate Sources
longitude float Longitude of the vacancy postcode. Empty when the postcode is not in the geocoding table. Vacancy editor: derived from Vacancy Location → Postcode
latitude float Latitude of the vacancy postcode. Empty when the postcode is not in the geocoding table. Vacancy editor: derived from Vacancy Location → Postcode
iwfId integer Internal workflow ID. Only present when internal is true. Vacancy editor: Candidate Attraction → the internal source behind “Candidates apply using”
ewfId integer External workflow ID. Only present when external is true. Vacancy editor: Candidate Attraction → the external source behind “Candidates apply using”
Example response
[
    {
        "id": "1024",
        "title": "Senior Care Assistant",
        "lastModified": "2026-07-14 09:12:03",
        "timestamp": "1784020323",
        "activationDate": "2026-07-01 08:00:00",
        "activation_timestamp": "1782806400",
        "category": "Care",
        "role": "Care Assistant",
        "internal": "true",
        "external": "true",
        "group": "Operations",
        "type": "Permanent",
        "clientreference": "REF-1024",
        "hours": "37.5",
        "salarydescription": "£25,000 - £28,000 per annum",
        "closingdate": "Friday, 28th August 2026",
        "isodate": "2026-08-28",
        "closingtime": "17:00",
        "interviewdate1": "2026-09-04",
        "interviewdate2": "2026-09-11",
        "hrcontact": "Jane Doe",
        "shortdescription": "Join our award-winning care team in Coventry.",
        "officename": "Coventry",
        "officegroup": "Midlands",
        "division": "Residential",
        "logo": "acme-logo.png",
        "logo_cdn": "https://cdn.reach-ats.com/images/logos/12/acme-logo.png",
        "logo_url": "https://www.acme.co.uk",
        "officeAddressId": "8",
        "featured": "1",
        "contactnumber": "024 7612 3456",
        "address1": "1 Example Street",
        "postcode": "CV3 1ET",
        "region": "West Midlands",
        "county": "Warwickshire",
        "country": "United Kingdom",
        "location": "Coventry",
        "address": "1 Example Street, Coventry, Warwickshire, CV3 1ET, United Kingdom",
        "applyurl": "jobs.acme.co.uk/1024ab",
        "applicationtype": "online",
        "lastAdded": "2026-07-01 08:00:00",
        "longitude": "-1.512",
        "latitude": "52.396",
        "iwfId": "17",
        "ewfId": "42"
    }
]

Every value is serialised as a string — the type column describes the underlying value. XML responses wrap the records in <response generated="…" records="…"> with one <record> per row.

/get/job/listingBySourceAndPostcode/SOURCES/POSTCODE/RANGE/KEYWORDS/LOCATION/TYPE/ROLE/ENCODING array<object> Combines source filters with postcode radius. Adds postcode and range parameters to the source listing signature. Optional ?include= querystring accepts one or more of NATIONAL, ONLINE, VIRTUAL separated by the pipe character | (e.g. ?include=NATIONAL or ?include=NATIONAL|ONLINE). Jobs whose postcode matches any listed value are always returned, ignoring the radius filter. Values are case-insensitive; unknown values are ignored.
Response
array<object>

Formats: XML (default) · JSON · RSS · CSV · PIPE · RAW

This variant does not return the internal or external workflow flags.

id integer Unique vacancy ID. Pass this to the single-vacancy endpoints.
title string Vacancy title with any HTML tags stripped. Vacancy editor: Key Information → Title
lastModified datetime When the vacancy record was last changed (YYYY-MM-DD HH:MM:SS, Europe/London).
timestamp integer lastModified as a Unix timestamp.
activationDate datetime When the vacancy was made live. Falls back to lastModified when no activation date is stored. Vacancy editor: Optional Information → Activation Date
activation_timestamp integer activationDate as a Unix timestamp. Vacancy editor: Optional Information → Activation Date
category string Vacancy category. Vacancy editor: Key Information → Categories
role string Vacancy role or discipline. Vacancy editor: Key Information → Role
group string Department/group name the vacancy belongs to. Empty when the vacancy has no department. Vacancy editor: Key Information → the department/group field
type string Employment type. Vacancies of type Registration are never returned. Vacancy editor: Key Information → Vacancy Type
clientreference string Your own reference for the vacancy. Vacancy editor: Optional Information → Client Reference
hours string Hours exactly as entered on the vacancy. Vacancy editor: Key Information → Hours
salarydescription string Salary as it should be displayed. Vacancy editor: Key Information → Salary Description
closingdate string Closing date formatted for display (Weekday, Do Month YYYY). Vacancy editor: Optional Information → Closing Date
isodate date The same closing date as YYYY-MM-DD. Use this one for sorting and comparisons. Vacancy editor: Optional Information → Closing Date
closingtime time Closing time as HH:MM. Empty means the vacancy closes at 23:59:59 on the closing date. Vacancy editor: Optional Information → Closing Time
interviewdate1 date First interview date, when one has been set. Vacancy editor: Optional Information → 1st Interview Date
interviewdate2 date Second interview date, when one has been set. Vacancy editor: Optional Information → 2nd Interview Date
hrcontact string Job administrator for the vacancy. Vacancy editor: Vacancy Administrator → Contact
shortdescription string Short advert summary with HTML stripped. Vacancy editor: Advert → Short Description
officename string Office the vacancy is attached to. Vacancy editor: Vacancy Location → Address Book (value comes from the office record)
officegroup string Grouping the office belongs to. Vacancy editor: Vacancy Location → Address Book (value comes from the office record)
division string Division the office belongs to. Vacancy editor: Vacancy Location → Address Book (value comes from the office record)
logo string Office logo filename. Empty when the office has no logo. Vacancy editor: Vacancy Location → Address Book (value comes from the office record)
logo_cdn url Fully-qualified logo URL. Built from logo when no CDN URL is stored, and empty when there is no logo at all. Vacancy editor: Vacancy Location → Address Book (value comes from the office record)
logo_url url Website URL held against the office. Empty when none is set. Vacancy editor: Vacancy Location → Address Book (value comes from the office record)
featured string Value of the vacancy’s featured property. Empty when the vacancy is not featured. Vacancy editor: Key Information → Featured?
contactnumber string Contact telephone number for the vacancy. Vacancy editor: Vacancy Administrator → Contact Number
address1 string First line of the vacancy address. Vacancy editor: Vacancy Location → Address 1
postcode string Vacancy postcode. May instead hold NATIONAL, ONLINE or VIRTUAL. Vacancy editor: Vacancy Location → Postcode
region string Region held against the vacancy. Vacancy editor: Vacancy Location → Region
county string County. Matches the values from /get/lists/counties. Vacancy editor: Vacancy Location → County
country string Country. Vacancy editor: Vacancy Location → Country
location string Location as displayed on the advert. Matches /get/lists/locations. Vacancy editor: Vacancy Location → City/Location
address string Address lines, location, county, postcode and country joined with commas. Empty parts are stripped out. Vacancy editor: Vacancy Location → Address 1, Address 2, City/Location, County, Postcode and Country
applyurl string Apply link built from your response domain, the vacancy ID and the apply source short code. Listing endpoints return this without a scheme — prefix it with https://. Vacancy editor: Candidate Attraction → Vacancy Candidate Sources
applicationtype string online or manual, depending on the apply source attached to the vacancy. Vacancy editor: Candidate Attraction → Vacancy Candidate Sources
longitude float Longitude of the vacancy postcode. Empty when the postcode is not in the geocoding table. Vacancy editor: derived from Vacancy Location → Postcode
latitude float Latitude of the vacancy postcode. Empty when the postcode is not in the geocoding table. Vacancy editor: derived from Vacancy Location → Postcode
Example response
[
    {
        "id": "1024",
        "title": "Senior Care Assistant",
        "lastModified": "2026-07-14 09:12:03",
        "timestamp": "1784020323",
        "activationDate": "2026-07-01 08:00:00",
        "activation_timestamp": "1782806400",
        "category": "Care",
        "role": "Care Assistant",
        "group": "Operations",
        "type": "Permanent",
        "clientreference": "REF-1024",
        "hours": "37.5",
        "salarydescription": "£25,000 - £28,000 per annum",
        "closingdate": "Friday, 28th August 2026",
        "isodate": "2026-08-28",
        "closingtime": "17:00",
        "interviewdate1": "2026-09-04",
        "interviewdate2": "2026-09-11",
        "hrcontact": "Jane Doe",
        "shortdescription": "Join our award-winning care team in Coventry.",
        "officename": "Coventry",
        "officegroup": "Midlands",
        "division": "Residential",
        "logo": "acme-logo.png",
        "logo_cdn": "https://cdn.reach-ats.com/images/logos/12/acme-logo.png",
        "logo_url": "https://www.acme.co.uk",
        "featured": "1",
        "contactnumber": "024 7612 3456",
        "address1": "1 Example Street",
        "postcode": "CV3 1ET",
        "region": "West Midlands",
        "county": "Warwickshire",
        "country": "United Kingdom",
        "location": "Coventry",
        "address": "1 Example Street, Coventry, Warwickshire, CV3 1ET, United Kingdom",
        "applyurl": "jobs.acme.co.uk/1024ab",
        "applicationtype": "online",
        "longitude": "-1.512",
        "latitude": "52.396"
    }
]

Every value is serialised as a string — the type column describes the underlying value. XML responses wrap the records in <response generated="…" records="…"> with one <record> per row.

/get/job/internalListing/KEYWORDS/LOCATION/TYPE/ROLE/ENCODING array<object> Surfacing vacancies for internal audiences. Internal variants exist for postcode and source-based filtering.
Response
array<object>

Formats: XML (default) · JSON · RSS · CSV · PIPE · RAW

Internal feed: applyurl and applicationtype resolve against internal apply sources, and only the external flag is returned.

id integer Unique vacancy ID. Pass this to the single-vacancy endpoints.
title string Vacancy title with any HTML tags stripped. Vacancy editor: Key Information → Title
lastModified datetime When the vacancy record was last changed (YYYY-MM-DD HH:MM:SS, Europe/London).
timestamp integer lastModified as a Unix timestamp.
activationDate datetime When the vacancy was made live. Falls back to lastModified when no activation date is stored. Vacancy editor: Optional Information → Activation Date
activation_timestamp integer activationDate as a Unix timestamp. Vacancy editor: Optional Information → Activation Date
category string Vacancy category. Vacancy editor: Key Information → Categories
role string Vacancy role or discipline. Vacancy editor: Key Information → Role
external boolean true when an external workflow is attached, otherwise false. Vacancy editor: Candidate Attraction → the external source behind “Candidates apply using”
group string Department/group name the vacancy belongs to. Empty when the vacancy has no department. Vacancy editor: Key Information → the department/group field
type string Employment type. Vacancies of type Registration are never returned. Vacancy editor: Key Information → Vacancy Type
clientreference string Your own reference for the vacancy. Vacancy editor: Optional Information → Client Reference
hours string Hours exactly as entered on the vacancy. Vacancy editor: Key Information → Hours
salarydescription string Salary as it should be displayed. Vacancy editor: Key Information → Salary Description
closingdate string Closing date formatted for display (Weekday, Do Month YYYY). Vacancy editor: Optional Information → Closing Date
isodate date The same closing date as YYYY-MM-DD. Use this one for sorting and comparisons. Vacancy editor: Optional Information → Closing Date
closingtime time Closing time as HH:MM. Empty means the vacancy closes at 23:59:59 on the closing date. Vacancy editor: Optional Information → Closing Time
interviewdate1 date First interview date, when one has been set. Vacancy editor: Optional Information → 1st Interview Date
interviewdate2 date Second interview date, when one has been set. Vacancy editor: Optional Information → 2nd Interview Date
hrcontact string Job administrator for the vacancy. Vacancy editor: Vacancy Administrator → Contact
shortdescription string Short advert summary with HTML stripped. Vacancy editor: Advert → Short Description
officename string Office the vacancy is attached to. Vacancy editor: Vacancy Location → Address Book (value comes from the office record)
officegroup string Grouping the office belongs to. Vacancy editor: Vacancy Location → Address Book (value comes from the office record)
division string Division the office belongs to. Vacancy editor: Vacancy Location → Address Book (value comes from the office record)
logo string Office logo filename. Empty when the office has no logo. Vacancy editor: Vacancy Location → Address Book (value comes from the office record)
logo_cdn url Fully-qualified logo URL. Built from logo when no CDN URL is stored, and empty when there is no logo at all. Vacancy editor: Vacancy Location → Address Book (value comes from the office record)
logo_url url Website URL held against the office. Empty when none is set. Vacancy editor: Vacancy Location → Address Book (value comes from the office record)
featured string Value of the vacancy’s featured property. Empty when the vacancy is not featured. Vacancy editor: Key Information → Featured?
contactnumber string Contact telephone number for the vacancy. Vacancy editor: Vacancy Administrator → Contact Number
address1 string First line of the vacancy address. Vacancy editor: Vacancy Location → Address 1
postcode string Vacancy postcode. May instead hold NATIONAL, ONLINE or VIRTUAL. Vacancy editor: Vacancy Location → Postcode
region string Region held against the vacancy. Vacancy editor: Vacancy Location → Region
county string County. Matches the values from /get/lists/counties. Vacancy editor: Vacancy Location → County
country string Country. Vacancy editor: Vacancy Location → Country
location string Location as displayed on the advert. Matches /get/lists/locations. Vacancy editor: Vacancy Location → City/Location
address string Address lines, location, county, postcode and country joined with commas. Empty parts are stripped out. Vacancy editor: Vacancy Location → Address 1, Address 2, City/Location, County, Postcode and Country
applyurl string Apply link built from your response domain, the vacancy ID and the apply source short code. Listing endpoints return this without a scheme — prefix it with https://. Vacancy editor: Candidate Attraction → Vacancy Candidate Sources
applicationtype string online or manual, depending on the apply source attached to the vacancy. Vacancy editor: Candidate Attraction → Vacancy Candidate Sources
lastAdded datetime When the vacancy was attached to its apply source. Vacancy editor: Candidate Attraction → Vacancy Candidate Sources
longitude float Longitude of the vacancy postcode. Empty when the postcode is not in the geocoding table. Vacancy editor: derived from Vacancy Location → Postcode
latitude float Latitude of the vacancy postcode. Empty when the postcode is not in the geocoding table. Vacancy editor: derived from Vacancy Location → Postcode
hiring_manager string Comma-separated names of the users allocated to the vacancy. Vacancy editor: the hiring managers allocated to the vacancy
Example response
[
    {
        "id": "1024",
        "title": "Senior Care Assistant",
        "lastModified": "2026-07-14 09:12:03",
        "timestamp": "1784020323",
        "activationDate": "2026-07-01 08:00:00",
        "activation_timestamp": "1782806400",
        "category": "Care",
        "role": "Care Assistant",
        "external": "true",
        "group": "Operations",
        "type": "Permanent",
        "clientreference": "REF-1024",
        "hours": "37.5",
        "salarydescription": "£25,000 - £28,000 per annum",
        "closingdate": "Friday, 28th August 2026",
        "isodate": "2026-08-28",
        "closingtime": "17:00",
        "interviewdate1": "2026-09-04",
        "interviewdate2": "2026-09-11",
        "hrcontact": "Jane Doe",
        "shortdescription": "Join our award-winning care team in Coventry.",
        "officename": "Coventry",
        "officegroup": "Midlands",
        "division": "Residential",
        "logo": "acme-logo.png",
        "logo_cdn": "https://cdn.reach-ats.com/images/logos/12/acme-logo.png",
        "logo_url": "https://www.acme.co.uk",
        "featured": "1",
        "contactnumber": "024 7612 3456",
        "address1": "1 Example Street",
        "postcode": "CV3 1ET",
        "region": "West Midlands",
        "county": "Warwickshire",
        "country": "United Kingdom",
        "location": "Coventry",
        "address": "1 Example Street, Coventry, Warwickshire, CV3 1ET, United Kingdom",
        "applyurl": "jobs.acme.co.uk/1024ab",
        "applicationtype": "online",
        "lastAdded": "2026-07-01 08:00:00",
        "longitude": "-1.512",
        "latitude": "52.396",
        "hiring_manager": "Jane Doe, Sam Patel"
    }
]

Every value is serialised as a string — the type column describes the underlying value. XML responses wrap the records in <response generated="…" records="…"> with one <record> per row.

/get/job/internalListingByPostcode/POSTCODE/RANGE/KEYWORDS/LOCATION/TYPE/ROLE/ENCODING array<object> Internal-only vacancies filtered by postcode radius. Matches the public postcode signature but limits sources to internal types. Optional ?include= querystring accepts one or more of NATIONAL, ONLINE, VIRTUAL separated by the pipe character | (e.g. ?include=NATIONAL or ?include=NATIONAL|ONLINE). Jobs whose postcode matches any listed value are always returned, ignoring the radius filter. Values are case-insensitive; unknown values are ignored.
Response
array<object>

Formats: XML (default) · JSON · RSS · CSV · PIPE · RAW

Internal apply sources only. The radius is applied as a filter — no distance value is returned.

id integer Unique vacancy ID. Pass this to the single-vacancy endpoints.
title string Vacancy title with any HTML tags stripped. Vacancy editor: Key Information → Title
lastModified datetime When the vacancy record was last changed (YYYY-MM-DD HH:MM:SS, Europe/London).
timestamp integer lastModified as a Unix timestamp.
activationDate datetime When the vacancy was made live. Falls back to lastModified when no activation date is stored. Vacancy editor: Optional Information → Activation Date
activation_timestamp integer activationDate as a Unix timestamp. Vacancy editor: Optional Information → Activation Date
category string Vacancy category. Vacancy editor: Key Information → Categories
role string Vacancy role or discipline. Vacancy editor: Key Information → Role
external boolean true when an external workflow is attached, otherwise false. Vacancy editor: Candidate Attraction → the external source behind “Candidates apply using”
group string Department/group name the vacancy belongs to. Empty when the vacancy has no department. Vacancy editor: Key Information → the department/group field
type string Employment type. Vacancies of type Registration are never returned. Vacancy editor: Key Information → Vacancy Type
clientreference string Your own reference for the vacancy. Vacancy editor: Optional Information → Client Reference
hours string Hours exactly as entered on the vacancy. Vacancy editor: Key Information → Hours
salarydescription string Salary as it should be displayed. Vacancy editor: Key Information → Salary Description
closingdate string Closing date formatted for display (Weekday, Do Month YYYY). Vacancy editor: Optional Information → Closing Date
isodate date The same closing date as YYYY-MM-DD. Use this one for sorting and comparisons. Vacancy editor: Optional Information → Closing Date
closingtime time Closing time as HH:MM. Empty means the vacancy closes at 23:59:59 on the closing date. Vacancy editor: Optional Information → Closing Time
interviewdate1 date First interview date, when one has been set. Vacancy editor: Optional Information → 1st Interview Date
interviewdate2 date Second interview date, when one has been set. Vacancy editor: Optional Information → 2nd Interview Date
hrcontact string Job administrator for the vacancy. Vacancy editor: Vacancy Administrator → Contact
shortdescription string Short advert summary with HTML stripped. Vacancy editor: Advert → Short Description
officename string Office the vacancy is attached to. Vacancy editor: Vacancy Location → Address Book (value comes from the office record)
officegroup string Grouping the office belongs to. Vacancy editor: Vacancy Location → Address Book (value comes from the office record)
division string Division the office belongs to. Vacancy editor: Vacancy Location → Address Book (value comes from the office record)
logo string Office logo filename. Empty when the office has no logo. Vacancy editor: Vacancy Location → Address Book (value comes from the office record)
logo_cdn url Fully-qualified logo URL. Built from logo when no CDN URL is stored, and empty when there is no logo at all. Vacancy editor: Vacancy Location → Address Book (value comes from the office record)
logo_url url Website URL held against the office. Empty when none is set. Vacancy editor: Vacancy Location → Address Book (value comes from the office record)
featured string Value of the vacancy’s featured property. Empty when the vacancy is not featured. Vacancy editor: Key Information → Featured?
contactnumber string Contact telephone number for the vacancy. Vacancy editor: Vacancy Administrator → Contact Number
address1 string First line of the vacancy address. Vacancy editor: Vacancy Location → Address 1
postcode string Vacancy postcode. May instead hold NATIONAL, ONLINE or VIRTUAL. Vacancy editor: Vacancy Location → Postcode
region string Region held against the vacancy. Vacancy editor: Vacancy Location → Region
county string County. Matches the values from /get/lists/counties. Vacancy editor: Vacancy Location → County
country string Country. Vacancy editor: Vacancy Location → Country
location string Location as displayed on the advert. Matches /get/lists/locations. Vacancy editor: Vacancy Location → City/Location
address string Address lines, location, county, postcode and country joined with commas. Empty parts are stripped out. Vacancy editor: Vacancy Location → Address 1, Address 2, City/Location, County, Postcode and Country
applyurl string Apply link built from your response domain, the vacancy ID and the apply source short code. Listing endpoints return this without a scheme — prefix it with https://. Vacancy editor: Candidate Attraction → Vacancy Candidate Sources
applicationtype string online or manual, depending on the apply source attached to the vacancy. Vacancy editor: Candidate Attraction → Vacancy Candidate Sources
longitude float Longitude of the vacancy postcode. Empty when the postcode is not in the geocoding table. Vacancy editor: derived from Vacancy Location → Postcode
latitude float Latitude of the vacancy postcode. Empty when the postcode is not in the geocoding table. Vacancy editor: derived from Vacancy Location → Postcode
Example response
[
    {
        "id": "1024",
        "title": "Senior Care Assistant",
        "lastModified": "2026-07-14 09:12:03",
        "timestamp": "1784020323",
        "activationDate": "2026-07-01 08:00:00",
        "activation_timestamp": "1782806400",
        "category": "Care",
        "role": "Care Assistant",
        "external": "true",
        "group": "Operations",
        "type": "Permanent",
        "clientreference": "REF-1024",
        "hours": "37.5",
        "salarydescription": "£25,000 - £28,000 per annum",
        "closingdate": "Friday, 28th August 2026",
        "isodate": "2026-08-28",
        "closingtime": "17:00",
        "interviewdate1": "2026-09-04",
        "interviewdate2": "2026-09-11",
        "hrcontact": "Jane Doe",
        "shortdescription": "Join our award-winning care team in Coventry.",
        "officename": "Coventry",
        "officegroup": "Midlands",
        "division": "Residential",
        "logo": "acme-logo.png",
        "logo_cdn": "https://cdn.reach-ats.com/images/logos/12/acme-logo.png",
        "logo_url": "https://www.acme.co.uk",
        "featured": "1",
        "contactnumber": "024 7612 3456",
        "address1": "1 Example Street",
        "postcode": "CV3 1ET",
        "region": "West Midlands",
        "county": "Warwickshire",
        "country": "United Kingdom",
        "location": "Coventry",
        "address": "1 Example Street, Coventry, Warwickshire, CV3 1ET, United Kingdom",
        "applyurl": "jobs.acme.co.uk/1024ab",
        "applicationtype": "online",
        "longitude": "-1.512",
        "latitude": "52.396"
    }
]

Every value is serialised as a string — the type column describes the underlying value. XML responses wrap the records in <response generated="…" records="…"> with one <record> per row.

/get/job/internalListingBySource/SOURCES/KEYWORDS/LOCATION/TYPE/ROLE/ENCODING array<object> Internal jobs available through specific sources. Accepts comma-separated internal source IDs or short codes.
Response
array<object>

Formats: XML (default) · JSON · RSS · CSV · PIPE · RAW

Internal apply sources only, restricted to the sources you pass in.

id integer Unique vacancy ID. Pass this to the single-vacancy endpoints.
title string Vacancy title with any HTML tags stripped. Vacancy editor: Key Information → Title
lastModified datetime When the vacancy record was last changed (YYYY-MM-DD HH:MM:SS, Europe/London).
timestamp integer lastModified as a Unix timestamp.
activationDate datetime When the vacancy was made live. Falls back to lastModified when no activation date is stored. Vacancy editor: Optional Information → Activation Date
activation_timestamp integer activationDate as a Unix timestamp. Vacancy editor: Optional Information → Activation Date
category string Vacancy category. Vacancy editor: Key Information → Categories
role string Vacancy role or discipline. Vacancy editor: Key Information → Role
external boolean true when an external workflow is attached, otherwise false. Vacancy editor: Candidate Attraction → the external source behind “Candidates apply using”
group string Department/group name the vacancy belongs to. Empty when the vacancy has no department. Vacancy editor: Key Information → the department/group field
type string Employment type. Vacancies of type Registration are never returned. Vacancy editor: Key Information → Vacancy Type
clientreference string Your own reference for the vacancy. Vacancy editor: Optional Information → Client Reference
hours string Hours exactly as entered on the vacancy. Vacancy editor: Key Information → Hours
salarydescription string Salary as it should be displayed. Vacancy editor: Key Information → Salary Description
closingdate string Closing date formatted for display (Weekday, Do Month YYYY). Vacancy editor: Optional Information → Closing Date
isodate date The same closing date as YYYY-MM-DD. Use this one for sorting and comparisons. Vacancy editor: Optional Information → Closing Date
closingtime time Closing time as HH:MM. Empty means the vacancy closes at 23:59:59 on the closing date. Vacancy editor: Optional Information → Closing Time
interviewdate1 date First interview date, when one has been set. Vacancy editor: Optional Information → 1st Interview Date
interviewdate2 date Second interview date, when one has been set. Vacancy editor: Optional Information → 2nd Interview Date
hrcontact string Job administrator for the vacancy. Vacancy editor: Vacancy Administrator → Contact
shortdescription string Short advert summary with HTML stripped. Vacancy editor: Advert → Short Description
officename string Office the vacancy is attached to. Vacancy editor: Vacancy Location → Address Book (value comes from the office record)
officegroup string Grouping the office belongs to. Vacancy editor: Vacancy Location → Address Book (value comes from the office record)
division string Division the office belongs to. Vacancy editor: Vacancy Location → Address Book (value comes from the office record)
logo string Office logo filename. Empty when the office has no logo. Vacancy editor: Vacancy Location → Address Book (value comes from the office record)
logo_cdn url Fully-qualified logo URL. Built from logo when no CDN URL is stored, and empty when there is no logo at all. Vacancy editor: Vacancy Location → Address Book (value comes from the office record)
logo_url url Website URL held against the office. Empty when none is set. Vacancy editor: Vacancy Location → Address Book (value comes from the office record)
featured string Value of the vacancy’s featured property. Empty when the vacancy is not featured. Vacancy editor: Key Information → Featured?
contactnumber string Contact telephone number for the vacancy. Vacancy editor: Vacancy Administrator → Contact Number
address1 string First line of the vacancy address. Vacancy editor: Vacancy Location → Address 1
postcode string Vacancy postcode. May instead hold NATIONAL, ONLINE or VIRTUAL. Vacancy editor: Vacancy Location → Postcode
region string Region held against the vacancy. Vacancy editor: Vacancy Location → Region
county string County. Matches the values from /get/lists/counties. Vacancy editor: Vacancy Location → County
country string Country. Vacancy editor: Vacancy Location → Country
location string Location as displayed on the advert. Matches /get/lists/locations. Vacancy editor: Vacancy Location → City/Location
address string Address lines, location, county, postcode and country joined with commas. Empty parts are stripped out. Vacancy editor: Vacancy Location → Address 1, Address 2, City/Location, County, Postcode and Country
applyurl string Apply link built from your response domain, the vacancy ID and the apply source short code. Listing endpoints return this without a scheme — prefix it with https://. Vacancy editor: Candidate Attraction → Vacancy Candidate Sources
applicationtype string online or manual, depending on the apply source attached to the vacancy. Vacancy editor: Candidate Attraction → Vacancy Candidate Sources
lastAdded datetime When the vacancy was attached to its apply source. Vacancy editor: Candidate Attraction → Vacancy Candidate Sources
longitude float Longitude of the vacancy postcode. Empty when the postcode is not in the geocoding table. Vacancy editor: derived from Vacancy Location → Postcode
latitude float Latitude of the vacancy postcode. Empty when the postcode is not in the geocoding table. Vacancy editor: derived from Vacancy Location → Postcode
hiring_manager string Comma-separated names of the users allocated to the vacancy. Vacancy editor: the hiring managers allocated to the vacancy
Example response
[
    {
        "id": "1024",
        "title": "Senior Care Assistant",
        "lastModified": "2026-07-14 09:12:03",
        "timestamp": "1784020323",
        "activationDate": "2026-07-01 08:00:00",
        "activation_timestamp": "1782806400",
        "category": "Care",
        "role": "Care Assistant",
        "external": "true",
        "group": "Operations",
        "type": "Permanent",
        "clientreference": "REF-1024",
        "hours": "37.5",
        "salarydescription": "£25,000 - £28,000 per annum",
        "closingdate": "Friday, 28th August 2026",
        "isodate": "2026-08-28",
        "closingtime": "17:00",
        "interviewdate1": "2026-09-04",
        "interviewdate2": "2026-09-11",
        "hrcontact": "Jane Doe",
        "shortdescription": "Join our award-winning care team in Coventry.",
        "officename": "Coventry",
        "officegroup": "Midlands",
        "division": "Residential",
        "logo": "acme-logo.png",
        "logo_cdn": "https://cdn.reach-ats.com/images/logos/12/acme-logo.png",
        "logo_url": "https://www.acme.co.uk",
        "featured": "1",
        "contactnumber": "024 7612 3456",
        "address1": "1 Example Street",
        "postcode": "CV3 1ET",
        "region": "West Midlands",
        "county": "Warwickshire",
        "country": "United Kingdom",
        "location": "Coventry",
        "address": "1 Example Street, Coventry, Warwickshire, CV3 1ET, United Kingdom",
        "applyurl": "jobs.acme.co.uk/1024ab",
        "applicationtype": "online",
        "lastAdded": "2026-07-01 08:00:00",
        "longitude": "-1.512",
        "latitude": "52.396",
        "hiring_manager": "Jane Doe, Sam Patel"
    }
]

Every value is serialised as a string — the type column describes the underlying value. XML responses wrap the records in <response generated="…" records="…"> with one <record> per row.

/get/job/internalListingBySourceAndPostcode/SOURCES/POSTCODE/RANGE/KEYWORDS/LOCATION/TYPE/ROLE/ENCODING array<object> Hybrid filter for internal roles by source and geography. Combines the source list with postcode radius parameters. Optional ?include= querystring accepts one or more of NATIONAL, ONLINE, VIRTUAL separated by the pipe character | (e.g. ?include=NATIONAL or ?include=NATIONAL|ONLINE). Jobs whose postcode matches any listed value are always returned, ignoring the radius filter. Values are case-insensitive; unknown values are ignored.
Response
array<object>

Formats: XML (default) · JSON · RSS · CSV · PIPE · RAW

Internal apply sources only. The radius is applied as a filter — no distance value is returned.

id integer Unique vacancy ID. Pass this to the single-vacancy endpoints.
title string Vacancy title with any HTML tags stripped. Vacancy editor: Key Information → Title
lastModified datetime When the vacancy record was last changed (YYYY-MM-DD HH:MM:SS, Europe/London).
timestamp integer lastModified as a Unix timestamp.
activationDate datetime When the vacancy was made live. Falls back to lastModified when no activation date is stored. Vacancy editor: Optional Information → Activation Date
activation_timestamp integer activationDate as a Unix timestamp. Vacancy editor: Optional Information → Activation Date
category string Vacancy category. Vacancy editor: Key Information → Categories
role string Vacancy role or discipline. Vacancy editor: Key Information → Role
external boolean true when an external workflow is attached, otherwise false. Vacancy editor: Candidate Attraction → the external source behind “Candidates apply using”
group string Department/group name the vacancy belongs to. Empty when the vacancy has no department. Vacancy editor: Key Information → the department/group field
type string Employment type. Vacancies of type Registration are never returned. Vacancy editor: Key Information → Vacancy Type
clientreference string Your own reference for the vacancy. Vacancy editor: Optional Information → Client Reference
hours string Hours exactly as entered on the vacancy. Vacancy editor: Key Information → Hours
salarydescription string Salary as it should be displayed. Vacancy editor: Key Information → Salary Description
closingdate string Closing date formatted for display (Weekday, Do Month YYYY). Vacancy editor: Optional Information → Closing Date
isodate date The same closing date as YYYY-MM-DD. Use this one for sorting and comparisons. Vacancy editor: Optional Information → Closing Date
closingtime time Closing time as HH:MM. Empty means the vacancy closes at 23:59:59 on the closing date. Vacancy editor: Optional Information → Closing Time
interviewdate1 date First interview date, when one has been set. Vacancy editor: Optional Information → 1st Interview Date
interviewdate2 date Second interview date, when one has been set. Vacancy editor: Optional Information → 2nd Interview Date
hrcontact string Job administrator for the vacancy. Vacancy editor: Vacancy Administrator → Contact
shortdescription string Short advert summary with HTML stripped. Vacancy editor: Advert → Short Description
officename string Office the vacancy is attached to. Vacancy editor: Vacancy Location → Address Book (value comes from the office record)
officegroup string Grouping the office belongs to. Vacancy editor: Vacancy Location → Address Book (value comes from the office record)
division string Division the office belongs to. Vacancy editor: Vacancy Location → Address Book (value comes from the office record)
logo string Office logo filename. Empty when the office has no logo. Vacancy editor: Vacancy Location → Address Book (value comes from the office record)
logo_cdn url Fully-qualified logo URL. Built from logo when no CDN URL is stored, and empty when there is no logo at all. Vacancy editor: Vacancy Location → Address Book (value comes from the office record)
logo_url url Website URL held against the office. Empty when none is set. Vacancy editor: Vacancy Location → Address Book (value comes from the office record)
featured string Value of the vacancy’s featured property. Empty when the vacancy is not featured. Vacancy editor: Key Information → Featured?
contactnumber string Contact telephone number for the vacancy. Vacancy editor: Vacancy Administrator → Contact Number
address1 string First line of the vacancy address. Vacancy editor: Vacancy Location → Address 1
postcode string Vacancy postcode. May instead hold NATIONAL, ONLINE or VIRTUAL. Vacancy editor: Vacancy Location → Postcode
region string Region held against the vacancy. Vacancy editor: Vacancy Location → Region
county string County. Matches the values from /get/lists/counties. Vacancy editor: Vacancy Location → County
country string Country. Vacancy editor: Vacancy Location → Country
location string Location as displayed on the advert. Matches /get/lists/locations. Vacancy editor: Vacancy Location → City/Location
address string Address lines, location, county, postcode and country joined with commas. Empty parts are stripped out. Vacancy editor: Vacancy Location → Address 1, Address 2, City/Location, County, Postcode and Country
applyurl string Apply link built from your response domain, the vacancy ID and the apply source short code. Listing endpoints return this without a scheme — prefix it with https://. Vacancy editor: Candidate Attraction → Vacancy Candidate Sources
applicationtype string online or manual, depending on the apply source attached to the vacancy. Vacancy editor: Candidate Attraction → Vacancy Candidate Sources
longitude float Longitude of the vacancy postcode. Empty when the postcode is not in the geocoding table. Vacancy editor: derived from Vacancy Location → Postcode
latitude float Latitude of the vacancy postcode. Empty when the postcode is not in the geocoding table. Vacancy editor: derived from Vacancy Location → Postcode
Example response
[
    {
        "id": "1024",
        "title": "Senior Care Assistant",
        "lastModified": "2026-07-14 09:12:03",
        "timestamp": "1784020323",
        "activationDate": "2026-07-01 08:00:00",
        "activation_timestamp": "1782806400",
        "category": "Care",
        "role": "Care Assistant",
        "external": "true",
        "group": "Operations",
        "type": "Permanent",
        "clientreference": "REF-1024",
        "hours": "37.5",
        "salarydescription": "£25,000 - £28,000 per annum",
        "closingdate": "Friday, 28th August 2026",
        "isodate": "2026-08-28",
        "closingtime": "17:00",
        "interviewdate1": "2026-09-04",
        "interviewdate2": "2026-09-11",
        "hrcontact": "Jane Doe",
        "shortdescription": "Join our award-winning care team in Coventry.",
        "officename": "Coventry",
        "officegroup": "Midlands",
        "division": "Residential",
        "logo": "acme-logo.png",
        "logo_cdn": "https://cdn.reach-ats.com/images/logos/12/acme-logo.png",
        "logo_url": "https://www.acme.co.uk",
        "featured": "1",
        "contactnumber": "024 7612 3456",
        "address1": "1 Example Street",
        "postcode": "CV3 1ET",
        "region": "West Midlands",
        "county": "Warwickshire",
        "country": "United Kingdom",
        "location": "Coventry",
        "address": "1 Example Street, Coventry, Warwickshire, CV3 1ET, United Kingdom",
        "applyurl": "jobs.acme.co.uk/1024ab",
        "applicationtype": "online",
        "longitude": "-1.512",
        "latitude": "52.396"
    }
]

Every value is serialised as a string — the type column describes the underlying value. XML responses wrap the records in <response generated="…" records="…"> with one <record> per row.

/get/job/listingCounty/KEYWORDS/COUNTY/TYPE/ROLE/ENCODING array<object> County-specific vacancy search. Swap LOCATION for COUNTY to align with data surfaced by /get/lists/counties.
Response
array<object>

Formats: XML (default) · JSON · RSS · CSV · PIPE · RAW

The county feed leaves out the modification and activation timestamps that the other listings carry.

id integer Unique vacancy ID. Pass this to the single-vacancy endpoints.
title string Vacancy title with any HTML tags stripped. Vacancy editor: Key Information → Title
category string Vacancy category. Vacancy editor: Key Information → Categories
role string Vacancy role or discipline. Vacancy editor: Key Information → Role
internal boolean true when an internal workflow is attached to the vacancy, otherwise false. Vacancy editor: Candidate Attraction → the internal source behind “Candidates apply using”
external boolean true when an external workflow is attached, otherwise false. Vacancy editor: Candidate Attraction → the external source behind “Candidates apply using”
group string Department/group name the vacancy belongs to. Empty when the vacancy has no department. Vacancy editor: Key Information → the department/group field
type string Employment type. Vacancies of type Registration are never returned. Vacancy editor: Key Information → Vacancy Type
clientreference string Your own reference for the vacancy. Vacancy editor: Optional Information → Client Reference
hours string Hours exactly as entered on the vacancy. Vacancy editor: Key Information → Hours
salarydescription string Salary as it should be displayed. Vacancy editor: Key Information → Salary Description
closingdate string Closing date formatted for display (Weekday, Do Month YYYY). Vacancy editor: Optional Information → Closing Date
isodate date The same closing date as YYYY-MM-DD. Use this one for sorting and comparisons. Vacancy editor: Optional Information → Closing Date
closingtime time Closing time as HH:MM. Empty means the vacancy closes at 23:59:59 on the closing date. Vacancy editor: Optional Information → Closing Time
interviewdate1 date First interview date, when one has been set. Vacancy editor: Optional Information → 1st Interview Date
interviewdate2 date Second interview date, when one has been set. Vacancy editor: Optional Information → 2nd Interview Date
hrcontact string Job administrator for the vacancy. Vacancy editor: Vacancy Administrator → Contact
shortdescription string Short advert summary with HTML stripped. Vacancy editor: Advert → Short Description
officename string Office the vacancy is attached to. Vacancy editor: Vacancy Location → Address Book (value comes from the office record)
officegroup string Grouping the office belongs to. Vacancy editor: Vacancy Location → Address Book (value comes from the office record)
division string Division the office belongs to. Vacancy editor: Vacancy Location → Address Book (value comes from the office record)
logo string Office logo filename. Empty when the office has no logo. Vacancy editor: Vacancy Location → Address Book (value comes from the office record)
logo_cdn url Fully-qualified logo URL. Built from logo when no CDN URL is stored, and empty when there is no logo at all. Vacancy editor: Vacancy Location → Address Book (value comes from the office record)
featured string Value of the vacancy’s featured property. Empty when the vacancy is not featured. Vacancy editor: Key Information → Featured?
contactnumber string Contact telephone number for the vacancy. Vacancy editor: Vacancy Administrator → Contact Number
address1 string First line of the vacancy address. Vacancy editor: Vacancy Location → Address 1
postcode string Vacancy postcode. May instead hold NATIONAL, ONLINE or VIRTUAL. Vacancy editor: Vacancy Location → Postcode
region string Region held against the vacancy. Vacancy editor: Vacancy Location → Region
county string County. Matches the values from /get/lists/counties. Vacancy editor: Vacancy Location → County
country string Country. Vacancy editor: Vacancy Location → Country
location string Location as displayed on the advert. Matches /get/lists/locations. Vacancy editor: Vacancy Location → City/Location
address string Address lines, location, county, postcode and country joined with commas. Empty parts are stripped out. Vacancy editor: Vacancy Location → Address 1, Address 2, City/Location, County, Postcode and Country
applyurl string Apply link built from your response domain, the vacancy ID and the apply source short code. Listing endpoints return this without a scheme — prefix it with https://. Vacancy editor: Candidate Attraction → Vacancy Candidate Sources
applicationtype string online or manual, depending on the apply source attached to the vacancy. Vacancy editor: Candidate Attraction → Vacancy Candidate Sources
longitude float Longitude of the vacancy postcode. Empty when the postcode is not in the geocoding table. Vacancy editor: derived from Vacancy Location → Postcode
latitude float Latitude of the vacancy postcode. Empty when the postcode is not in the geocoding table. Vacancy editor: derived from Vacancy Location → Postcode
Example response
[
    {
        "id": "1024",
        "title": "Senior Care Assistant",
        "category": "Care",
        "role": "Care Assistant",
        "internal": "true",
        "external": "true",
        "group": "Operations",
        "type": "Permanent",
        "clientreference": "REF-1024",
        "hours": "37.5",
        "salarydescription": "£25,000 - £28,000 per annum",
        "closingdate": "Friday, 28th August 2026",
        "isodate": "2026-08-28",
        "closingtime": "17:00",
        "interviewdate1": "2026-09-04",
        "interviewdate2": "2026-09-11",
        "hrcontact": "Jane Doe",
        "shortdescription": "Join our award-winning care team in Coventry.",
        "officename": "Coventry",
        "officegroup": "Midlands",
        "division": "Residential",
        "logo": "acme-logo.png",
        "logo_cdn": "https://cdn.reach-ats.com/images/logos/12/acme-logo.png",
        "featured": "1",
        "contactnumber": "024 7612 3456",
        "address1": "1 Example Street",
        "postcode": "CV3 1ET",
        "region": "West Midlands",
        "county": "Warwickshire",
        "country": "United Kingdom",
        "location": "Coventry",
        "address": "1 Example Street, Coventry, Warwickshire, CV3 1ET, United Kingdom",
        "applyurl": "jobs.acme.co.uk/1024ab",
        "applicationtype": "online",
        "longitude": "-1.512",
        "latitude": "52.396"
    }
]

Every value is serialised as a string — the type column describes the underlying value. XML responses wrap the records in <response generated="…" records="…"> with one <record> per row.

/get/job/referralListing/KEYWORDS/LOCATION/TYPE/ROLE/ENCODING array<object> Feed of roles assigned to employee referral programmes. Filters vacancies that have referral apply sources.
Response
array<object>

Formats: XML (default) · JSON · RSS · CSV · PIPE · RAW

applyurl resolves against the vacancy’s referral source.

id integer Unique vacancy ID. Pass this to the single-vacancy endpoints.
title string Vacancy title with any HTML tags stripped. Vacancy editor: Key Information → Title
lastModified datetime When the vacancy record was last changed (YYYY-MM-DD HH:MM:SS, Europe/London).
timestamp integer lastModified as a Unix timestamp.
category string Vacancy category. Vacancy editor: Key Information → Categories
role string Vacancy role or discipline. Vacancy editor: Key Information → Role
internal boolean true when an internal workflow is attached to the vacancy, otherwise false. Vacancy editor: Candidate Attraction → the internal source behind “Candidates apply using”
external boolean true when an external workflow is attached, otherwise false. Vacancy editor: Candidate Attraction → the external source behind “Candidates apply using”
group string Department/group name the vacancy belongs to. Empty when the vacancy has no department. Vacancy editor: Key Information → the department/group field
type string Employment type. Vacancies of type Registration are never returned. Vacancy editor: Key Information → Vacancy Type
clientreference string Your own reference for the vacancy. Vacancy editor: Optional Information → Client Reference
hours string Hours exactly as entered on the vacancy. Vacancy editor: Key Information → Hours
salarydescription string Salary as it should be displayed. Vacancy editor: Key Information → Salary Description
closingdate string Closing date formatted for display (Weekday, Do Month YYYY). Vacancy editor: Optional Information → Closing Date
isodate date The same closing date as YYYY-MM-DD. Use this one for sorting and comparisons. Vacancy editor: Optional Information → Closing Date
closingtime time Closing time as HH:MM. Empty means the vacancy closes at 23:59:59 on the closing date. Vacancy editor: Optional Information → Closing Time
interviewdate1 date First interview date, when one has been set. Vacancy editor: Optional Information → 1st Interview Date
interviewdate2 date Second interview date, when one has been set. Vacancy editor: Optional Information → 2nd Interview Date
hrcontact string Job administrator for the vacancy. Vacancy editor: Vacancy Administrator → Contact
shortdescription string Short advert summary with HTML stripped. Vacancy editor: Advert → Short Description
officename string Office the vacancy is attached to. Vacancy editor: Vacancy Location → Address Book (value comes from the office record)
officegroup string Grouping the office belongs to. Vacancy editor: Vacancy Location → Address Book (value comes from the office record)
division string Division the office belongs to. Vacancy editor: Vacancy Location → Address Book (value comes from the office record)
logo string Office logo filename. Empty when the office has no logo. Vacancy editor: Vacancy Location → Address Book (value comes from the office record)
logo_cdn url Fully-qualified logo URL. Built from logo when no CDN URL is stored, and empty when there is no logo at all. Vacancy editor: Vacancy Location → Address Book (value comes from the office record)
featured string Value of the vacancy’s featured property. Empty when the vacancy is not featured. Vacancy editor: Key Information → Featured?
contactnumber string Contact telephone number for the vacancy. Vacancy editor: Vacancy Administrator → Contact Number
address1 string First line of the vacancy address. Vacancy editor: Vacancy Location → Address 1
postcode string Vacancy postcode. May instead hold NATIONAL, ONLINE or VIRTUAL. Vacancy editor: Vacancy Location → Postcode
region string Region held against the vacancy. Vacancy editor: Vacancy Location → Region
county string County. Matches the values from /get/lists/counties. Vacancy editor: Vacancy Location → County
country string Country. Vacancy editor: Vacancy Location → Country
location string Location as displayed on the advert. Matches /get/lists/locations. Vacancy editor: Vacancy Location → City/Location
address string Address lines, location, county, postcode and country joined with commas. Empty parts are stripped out. Vacancy editor: Vacancy Location → Address 1, Address 2, City/Location, County, Postcode and Country
applyurl string Apply link built from your response domain, the vacancy ID and the apply source short code. Listing endpoints return this without a scheme — prefix it with https://. Vacancy editor: Candidate Attraction → Vacancy Candidate Sources
longitude float Longitude of the vacancy postcode. Empty when the postcode is not in the geocoding table. Vacancy editor: derived from Vacancy Location → Postcode
latitude float Latitude of the vacancy postcode. Empty when the postcode is not in the geocoding table. Vacancy editor: derived from Vacancy Location → Postcode
applicationtype string referral or online, depending on the referral source attached to the vacancy. Vacancy editor: Candidate Attraction → Vacancy Candidate Sources
Example response
[
    {
        "id": "1024",
        "title": "Senior Care Assistant",
        "lastModified": "2026-07-14 09:12:03",
        "timestamp": "1784020323",
        "category": "Care",
        "role": "Care Assistant",
        "internal": "true",
        "external": "true",
        "group": "Operations",
        "type": "Permanent",
        "clientreference": "REF-1024",
        "hours": "37.5",
        "salarydescription": "£25,000 - £28,000 per annum",
        "closingdate": "Friday, 28th August 2026",
        "isodate": "2026-08-28",
        "closingtime": "17:00",
        "interviewdate1": "2026-09-04",
        "interviewdate2": "2026-09-11",
        "hrcontact": "Jane Doe",
        "shortdescription": "Join our award-winning care team in Coventry.",
        "officename": "Coventry",
        "officegroup": "Midlands",
        "division": "Residential",
        "logo": "acme-logo.png",
        "logo_cdn": "https://cdn.reach-ats.com/images/logos/12/acme-logo.png",
        "featured": "1",
        "contactnumber": "024 7612 3456",
        "address1": "1 Example Street",
        "postcode": "CV3 1ET",
        "region": "West Midlands",
        "county": "Warwickshire",
        "country": "United Kingdom",
        "location": "Coventry",
        "address": "1 Example Street, Coventry, Warwickshire, CV3 1ET, United Kingdom",
        "applyurl": "jobs.acme.co.uk/1024ab",
        "longitude": "-1.512",
        "latitude": "52.396",
        "applicationtype": "online"
    }
]

Every value is serialised as a string — the type column describes the underlying value. XML responses wrap the records in <response generated="…" records="…"> with one <record> per row.

/get/job/speculativeListing/KEYWORDS/LOCATION/TYPE/ROLE/ENCODING array<object> Speculative opportunities open for general interest applications. Ideal when pairing with /get/lists/types filters.
Response
array<object>

Formats: XML (default) · JSON · RSS · CSV · PIPE · RAW

applyurl resolves against the vacancy’s speculative source.

id integer Unique vacancy ID. Pass this to the single-vacancy endpoints.
title string Vacancy title with any HTML tags stripped. Vacancy editor: Key Information → Title
lastModified datetime When the vacancy record was last changed (YYYY-MM-DD HH:MM:SS, Europe/London).
timestamp integer lastModified as a Unix timestamp.
category string Vacancy category. Vacancy editor: Key Information → Categories
role string Vacancy role or discipline. Vacancy editor: Key Information → Role
internal boolean true when an internal workflow is attached to the vacancy, otherwise false. Vacancy editor: Candidate Attraction → the internal source behind “Candidates apply using”
external boolean true when an external workflow is attached, otherwise false. Vacancy editor: Candidate Attraction → the external source behind “Candidates apply using”
group string Department/group name the vacancy belongs to. Empty when the vacancy has no department. Vacancy editor: Key Information → the department/group field
type string Employment type. Vacancies of type Registration are never returned. Vacancy editor: Key Information → Vacancy Type
clientreference string Your own reference for the vacancy. Vacancy editor: Optional Information → Client Reference
hours string Hours exactly as entered on the vacancy. Vacancy editor: Key Information → Hours
salarydescription string Salary as it should be displayed. Vacancy editor: Key Information → Salary Description
closingdate string Closing date formatted for display (Weekday, Do Month YYYY). Vacancy editor: Optional Information → Closing Date
isodate date The same closing date as YYYY-MM-DD. Use this one for sorting and comparisons. Vacancy editor: Optional Information → Closing Date
closingtime time Closing time as HH:MM. Empty means the vacancy closes at 23:59:59 on the closing date. Vacancy editor: Optional Information → Closing Time
interviewdate1 date First interview date, when one has been set. Vacancy editor: Optional Information → 1st Interview Date
interviewdate2 date Second interview date, when one has been set. Vacancy editor: Optional Information → 2nd Interview Date
hrcontact string Job administrator for the vacancy. Vacancy editor: Vacancy Administrator → Contact
shortdescription string Short advert summary with HTML stripped. Vacancy editor: Advert → Short Description
officename string Office the vacancy is attached to. Vacancy editor: Vacancy Location → Address Book (value comes from the office record)
officegroup string Grouping the office belongs to. Vacancy editor: Vacancy Location → Address Book (value comes from the office record)
division string Division the office belongs to. Vacancy editor: Vacancy Location → Address Book (value comes from the office record)
logo string Office logo filename. Empty when the office has no logo. Vacancy editor: Vacancy Location → Address Book (value comes from the office record)
logo_cdn url Fully-qualified logo URL. Built from logo when no CDN URL is stored, and empty when there is no logo at all. Vacancy editor: Vacancy Location → Address Book (value comes from the office record)
featured string Value of the vacancy’s featured property. Empty when the vacancy is not featured. Vacancy editor: Key Information → Featured?
contactnumber string Contact telephone number for the vacancy. Vacancy editor: Vacancy Administrator → Contact Number
address1 string First line of the vacancy address. Vacancy editor: Vacancy Location → Address 1
postcode string Vacancy postcode. May instead hold NATIONAL, ONLINE or VIRTUAL. Vacancy editor: Vacancy Location → Postcode
region string Region held against the vacancy. Vacancy editor: Vacancy Location → Region
county string County. Matches the values from /get/lists/counties. Vacancy editor: Vacancy Location → County
country string Country. Vacancy editor: Vacancy Location → Country
location string Location as displayed on the advert. Matches /get/lists/locations. Vacancy editor: Vacancy Location → City/Location
address string Address lines, location, county, postcode and country joined with commas. Empty parts are stripped out. Vacancy editor: Vacancy Location → Address 1, Address 2, City/Location, County, Postcode and Country
applyurl string Apply link built from your response domain, the vacancy ID and the apply source short code. Listing endpoints return this without a scheme — prefix it with https://. Vacancy editor: Candidate Attraction → Vacancy Candidate Sources
applicationtype string online or manual, depending on the apply source attached to the vacancy. Vacancy editor: Candidate Attraction → Vacancy Candidate Sources
longitude float Longitude of the vacancy postcode. Empty when the postcode is not in the geocoding table. Vacancy editor: derived from Vacancy Location → Postcode
latitude float Latitude of the vacancy postcode. Empty when the postcode is not in the geocoding table. Vacancy editor: derived from Vacancy Location → Postcode
Example response
[
    {
        "id": "1024",
        "title": "Senior Care Assistant",
        "lastModified": "2026-07-14 09:12:03",
        "timestamp": "1784020323",
        "category": "Care",
        "role": "Care Assistant",
        "internal": "true",
        "external": "true",
        "group": "Operations",
        "type": "Permanent",
        "clientreference": "REF-1024",
        "hours": "37.5",
        "salarydescription": "£25,000 - £28,000 per annum",
        "closingdate": "Friday, 28th August 2026",
        "isodate": "2026-08-28",
        "closingtime": "17:00",
        "interviewdate1": "2026-09-04",
        "interviewdate2": "2026-09-11",
        "hrcontact": "Jane Doe",
        "shortdescription": "Join our award-winning care team in Coventry.",
        "officename": "Coventry",
        "officegroup": "Midlands",
        "division": "Residential",
        "logo": "acme-logo.png",
        "logo_cdn": "https://cdn.reach-ats.com/images/logos/12/acme-logo.png",
        "featured": "1",
        "contactnumber": "024 7612 3456",
        "address1": "1 Example Street",
        "postcode": "CV3 1ET",
        "region": "West Midlands",
        "county": "Warwickshire",
        "country": "United Kingdom",
        "location": "Coventry",
        "address": "1 Example Street, Coventry, Warwickshire, CV3 1ET, United Kingdom",
        "applyurl": "jobs.acme.co.uk/1024ab",
        "applicationtype": "online",
        "longitude": "-1.512",
        "latitude": "52.396"
    }
]

Every value is serialised as a string — the type column describes the underlying value. XML responses wrap the records in <response generated="…" records="…"> with one <record> per row.

/get/job/openDayListing/KEYWORDS/LOCATION/TYPE/ROLE/ENCODING array<object> Events and open day listings published as vacancies. Keeps the core filter arguments while surfacing event-specific metadata.
Response
array<object>

Formats: XML (default) · JSON · RSS · CSV · PIPE · RAW

Same shape as listing, restricted to vacancies published through an open day source.

id integer Unique vacancy ID. Pass this to the single-vacancy endpoints.
title string Vacancy title with any HTML tags stripped. Vacancy editor: Key Information → Title
lastModified datetime When the vacancy record was last changed (YYYY-MM-DD HH:MM:SS, Europe/London).
timestamp integer lastModified as a Unix timestamp.
activationDate datetime When the vacancy was made live. Falls back to lastModified when no activation date is stored. Vacancy editor: Optional Information → Activation Date
activation_timestamp integer activationDate as a Unix timestamp. Vacancy editor: Optional Information → Activation Date
category string Vacancy category. Vacancy editor: Key Information → Categories
role string Vacancy role or discipline. Vacancy editor: Key Information → Role
internal boolean true when an internal workflow is attached to the vacancy, otherwise false. Vacancy editor: Candidate Attraction → the internal source behind “Candidates apply using”
external boolean true when an external workflow is attached, otherwise false. Vacancy editor: Candidate Attraction → the external source behind “Candidates apply using”
group string Department/group name the vacancy belongs to. Empty when the vacancy has no department. Vacancy editor: Key Information → the department/group field
type string Employment type. Vacancies of type Registration are never returned. Vacancy editor: Key Information → Vacancy Type
clientreference string Your own reference for the vacancy. Vacancy editor: Optional Information → Client Reference
hours string Hours exactly as entered on the vacancy. Vacancy editor: Key Information → Hours
salarydescription string Salary as it should be displayed. Vacancy editor: Key Information → Salary Description
closingdate string Closing date formatted for display (Weekday, Do Month YYYY). Vacancy editor: Optional Information → Closing Date
isodate date The same closing date as YYYY-MM-DD. Use this one for sorting and comparisons. Vacancy editor: Optional Information → Closing Date
closingtime time Closing time as HH:MM. Empty means the vacancy closes at 23:59:59 on the closing date. Vacancy editor: Optional Information → Closing Time
interviewdate1 date First interview date, when one has been set. Vacancy editor: Optional Information → 1st Interview Date
interviewdate2 date Second interview date, when one has been set. Vacancy editor: Optional Information → 2nd Interview Date
hrcontact string Job administrator for the vacancy. Vacancy editor: Vacancy Administrator → Contact
shortdescription string Short advert summary with HTML stripped. Vacancy editor: Advert → Short Description
officename string Office the vacancy is attached to. Vacancy editor: Vacancy Location → Address Book (value comes from the office record)
officegroup string Grouping the office belongs to. Vacancy editor: Vacancy Location → Address Book (value comes from the office record)
division string Division the office belongs to. Vacancy editor: Vacancy Location → Address Book (value comes from the office record)
logo string Office logo filename. Empty when the office has no logo. Vacancy editor: Vacancy Location → Address Book (value comes from the office record)
logo_cdn url Fully-qualified logo URL. Built from logo when no CDN URL is stored, and empty when there is no logo at all. Vacancy editor: Vacancy Location → Address Book (value comes from the office record)
logo_url url Website URL held against the office. Empty when none is set. Vacancy editor: Vacancy Location → Address Book (value comes from the office record)
officeAddressId integer ID of the office address record. Join against /get/lists/offices. Vacancy editor: Vacancy Location → Address Book
featured string Value of the vacancy’s featured property. Empty when the vacancy is not featured. Vacancy editor: Key Information → Featured?
contactnumber string Contact telephone number for the vacancy. Vacancy editor: Vacancy Administrator → Contact Number
address1 string First line of the vacancy address. Vacancy editor: Vacancy Location → Address 1
postcode string Vacancy postcode. May instead hold NATIONAL, ONLINE or VIRTUAL. Vacancy editor: Vacancy Location → Postcode
region string Region held against the vacancy. Vacancy editor: Vacancy Location → Region
county string County. Matches the values from /get/lists/counties. Vacancy editor: Vacancy Location → County
country string Country. Vacancy editor: Vacancy Location → Country
location string Location as displayed on the advert. Matches /get/lists/locations. Vacancy editor: Vacancy Location → City/Location
address string Address lines, location, county, postcode and country joined with commas. Empty parts are stripped out. Vacancy editor: Vacancy Location → Address 1, Address 2, City/Location, County, Postcode and Country
applyurl string Apply link built from your response domain, the vacancy ID and the apply source short code. Listing endpoints return this without a scheme — prefix it with https://. Vacancy editor: Candidate Attraction → Vacancy Candidate Sources
applicationtype string online or manual, depending on the apply source attached to the vacancy. Vacancy editor: Candidate Attraction → Vacancy Candidate Sources
lastAdded datetime When the vacancy was attached to its apply source. Vacancy editor: Candidate Attraction → Vacancy Candidate Sources
longitude float Longitude of the vacancy postcode. Empty when the postcode is not in the geocoding table. Vacancy editor: derived from Vacancy Location → Postcode
latitude float Latitude of the vacancy postcode. Empty when the postcode is not in the geocoding table. Vacancy editor: derived from Vacancy Location → Postcode
iwfId integer Internal workflow ID. Only present when internal is true. Vacancy editor: Candidate Attraction → the internal source behind “Candidates apply using”
ewfId integer External workflow ID. Only present when external is true. Vacancy editor: Candidate Attraction → the external source behind “Candidates apply using”
Example response
[
    {
        "id": "1024",
        "title": "Senior Care Assistant",
        "lastModified": "2026-07-14 09:12:03",
        "timestamp": "1784020323",
        "activationDate": "2026-07-01 08:00:00",
        "activation_timestamp": "1782806400",
        "category": "Care",
        "role": "Care Assistant",
        "internal": "true",
        "external": "true",
        "group": "Operations",
        "type": "Permanent",
        "clientreference": "REF-1024",
        "hours": "37.5",
        "salarydescription": "£25,000 - £28,000 per annum",
        "closingdate": "Friday, 28th August 2026",
        "isodate": "2026-08-28",
        "closingtime": "17:00",
        "interviewdate1": "2026-09-04",
        "interviewdate2": "2026-09-11",
        "hrcontact": "Jane Doe",
        "shortdescription": "Join our award-winning care team in Coventry.",
        "officename": "Coventry",
        "officegroup": "Midlands",
        "division": "Residential",
        "logo": "acme-logo.png",
        "logo_cdn": "https://cdn.reach-ats.com/images/logos/12/acme-logo.png",
        "logo_url": "https://www.acme.co.uk",
        "officeAddressId": "8",
        "featured": "1",
        "contactnumber": "024 7612 3456",
        "address1": "1 Example Street",
        "postcode": "CV3 1ET",
        "region": "West Midlands",
        "county": "Warwickshire",
        "country": "United Kingdom",
        "location": "Coventry",
        "address": "1 Example Street, Coventry, Warwickshire, CV3 1ET, United Kingdom",
        "applyurl": "jobs.acme.co.uk/1024ab",
        "applicationtype": "online",
        "lastAdded": "2026-07-01 08:00:00",
        "longitude": "-1.512",
        "latitude": "52.396",
        "iwfId": "17",
        "ewfId": "42"
    }
]

Every value is serialised as a string — the type column describes the underlying value. XML responses wrap the records in <response generated="…" records="…"> with one <record> per row.

Job details & media

All single-vacancy endpoints below only return data for vacancies whose status is live. By default they also exclude vacancies whose closing date/time has passed; pass the optional ?show_closed=1 querystring to lift the closing-date check (the live status check is always enforced). Inaccessible vacancies return an empty response.

/get/job/information/{JOB_ID}/ENCODING array<object> Full vacancy record, including contact and workflow data. Defaults to XML; pass /JSON etc. to change format.
Response
array<object>

Formats: XML (default) · JSON · RSS · CSV · PIPE · RAW

Always a single record. Note that internal and external are raw workflow IDs here, not the true/false flags the listing endpoints return.

id integer Vacancy ID.
title string Vacancy title. Unlike the listing endpoints this is returned unmodified, so it may contain markup. Vacancy editor: Key Information → Title
category string Vacancy category. Vacancy editor: Key Information → Categories
role string Vacancy role or discipline. Vacancy editor: Key Information → Role
type string Employment type. Vacancy editor: Key Information → Vacancy Type
internal integer Internal workflow ID, or 0 when none is attached. Note this is the raw ID here, not the true/false flag the listing endpoints return. Vacancy editor: Candidate Attraction → the internal source behind “Candidates apply using”
external integer External workflow ID, or 0 when none is attached. Vacancy editor: Candidate Attraction → the external source behind “Candidates apply using”
hours string Hours exactly as entered on the vacancy. Vacancy editor: Key Information → Hours
salarydescription string Salary as it should be displayed. Vacancy editor: Key Information → Salary Description
closingdate date Closing date as YYYY-MM-DD. This endpoint does not pre-format the date. Vacancy editor: Optional Information → Closing Date
closingtime time Closing time as HH:MM. Empty means end of the closing day. Vacancy editor: Optional Information → Closing Time
interviewdate1 date First interview date, when one has been set. Vacancy editor: Optional Information → 1st Interview Date
interviewdate2 date Second interview date, when one has been set. Vacancy editor: Optional Information → 2nd Interview Date
hrcontact string Job administrator for the vacancy. Vacancy editor: Vacancy Administrator → Contact
recruiterEmail string Recruiter email address held against the vacancy. Vacancy editor: Vacancy Administrator → Email Address
contactnumber string Contact telephone number for the vacancy. Vacancy editor: Vacancy Administrator → Contact Number
address1 string First line of the vacancy address. Vacancy editor: Vacancy Location → Address 1
postcode string Vacancy postcode. May instead hold NATIONAL, ONLINE or VIRTUAL. Vacancy editor: Vacancy Location → Postcode
region string Region held against the vacancy. Vacancy editor: Vacancy Location → Region
county string County. Vacancy editor: Vacancy Location → County
country string Country. Vacancy editor: Vacancy Location → Country
location string Location as displayed on the advert. Vacancy editor: Vacancy Location → City/Location
clientreference string Your own reference for the vacancy. Vacancy editor: Optional Information → Client Reference
activationDate datetime When the vacancy was made live. Falls back to the last modified date when no activation date is stored. Vacancy editor: Optional Information → Activation Date
activation_timestamp integer activationDate as a Unix timestamp. Vacancy editor: Optional Information → Activation Date
hiring_manager string Comma-separated names of the users allocated to the vacancy. Vacancy editor: the hiring managers allocated to the vacancy
logo string Office logo filename. Empty when the office has no logo. Vacancy editor: Vacancy Location → Address Book (value comes from the office record)
logo_cdn url Fully-qualified office logo URL. Vacancy editor: Vacancy Location → Address Book (value comes from the office record)
division string Division the office belongs to. Vacancy editor: Vacancy Location → Address Book (value comes from the office record)
office string Office the vacancy is attached to. Vacancy editor: Vacancy Location → Address Book (value comes from the office record)
activationdate datetime Date of the “made live” event for the vacancy, when one was recorded. Mind the lower-case spelling — this is a separate field to activationDate above and both are returned.
applyurl url Apply link including the scheme and the apply source short code. Vacancy editor: Candidate Attraction → Vacancy Candidate Sources
shortdescription string Short advert summary. Vacancy editor: Advert → Short Description
Example response
[
    {
        "id": "1024",
        "title": "Senior Care Assistant",
        "category": "Care",
        "role": "Care Assistant",
        "type": "Permanent",
        "internal": "17",
        "external": "42",
        "hours": "37.5",
        "salarydescription": "£25,000 - £28,000 per annum",
        "closingdate": "2026-08-28",
        "closingtime": "17:00",
        "interviewdate1": "2026-09-04",
        "interviewdate2": "2026-09-11",
        "hrcontact": "Jane Doe",
        "recruiterEmail": "recruitment@acme.co.uk",
        "contactnumber": "024 7612 3456",
        "address1": "1 Example Street",
        "postcode": "CV3 1ET",
        "region": "West Midlands",
        "county": "Warwickshire",
        "country": "United Kingdom",
        "location": "Coventry",
        "clientreference": "REF-1024",
        "activationDate": "2026-07-01 08:00:00",
        "activation_timestamp": "1782806400",
        "hiring_manager": "Jane Doe, Sam Patel",
        "logo": "acme-logo.png",
        "logo_cdn": "https://cdn.reach-ats.com/images/logos/12/acme-logo.png",
        "division": "Residential",
        "office": "Coventry",
        "activationdate": "2026-07-01 08:04:11",
        "applyurl": "https://jobs.acme.co.uk/1024ab",
        "shortdescription": "Join our award-winning care team in Coventry."
    }
]

Every value is serialised as a string — the type column describes the underlying value. XML responses wrap the records in <response generated="…" records="…"> with one <record> per row.

/get/job/advert/{JOB_ID}/ENCODING string (HTML) Advert copy returned as RAW HTML. Aliases: /text, /description. Default encoding is RAW
Response
string (HTML)

Formats: RAW (default) · XML · JSON · CSV · PIPE

Returns the advert HTML on its own with no wrapper. Ask for another encoding to receive it inside a record under the advertText key. The /text and /description aliases behave identically.

Example response
<p>We are looking for a Senior Care Assistant to join our Coventry team.</p><ul><li>37.5 hours per week</li></ul>

Every value is serialised as a string — the type column describes the underlying value. XML responses wrap the records in <response generated="…" records="…"> with one <record> per row.

/get/job/fileurls/{JOB_ID}/ENCODING array<object> Supporting documents with display names. XML by default; use /JSON for client apps.
Response
array<object>

Formats: XML (default) · JSON · RSS · CSV · PIPE · RAW

One record per attached file. Files marked as hidden and files with no description are excluded.

type string Document type recorded against the vacancy file. Vacancy editor: Vacancy Files → the document type chosen when the file is attached
file_description string Display name for the file. Falls back to type when the stored file has no description of its own. Vacancy editor: Vacancy Files → the file’s own description, when it has one
url url Download link, resolving to /get/job/file/{FILE_UID} on your API host.
Example response
[
    {
        "type": "Job Description",
        "file_description": "Senior Care Assistant JD",
        "url": "https://your-key.reach-ats.com/get/job/file/98213"
    }
]

Every value is serialised as a string — the type column describes the underlying value. XML responses wrap the records in <response generated="…" records="…"> with one <record> per row.

/get/job/files/{JOB_ID}/ENCODING array<object> Detailed metadata for each vacancy file. Pairs with /file/{FILE_UID} to download content.
Response
array<object>

Formats: XML (default) · JSON · RSS · CSV · PIPE · RAW

Alias of fileurls — identical response.

type string Document type recorded against the vacancy file. Vacancy editor: Vacancy Files → the document type chosen when the file is attached
file_description string Display name for the file. Falls back to type when the stored file has no description of its own. Vacancy editor: Vacancy Files → the file’s own description, when it has one
url url Download link, resolving to /get/job/file/{FILE_UID} on your API host.
Example response
[
    {
        "type": "Job Description",
        "file_description": "Senior Care Assistant JD",
        "url": "https://your-key.reach-ats.com/get/job/file/98213"
    }
]

Every value is serialised as a string — the type column describes the underlying value. XML responses wrap the records in <response generated="…" records="…"> with one <record> per row.

/get/job/webimage/{JOB_ID}/ENCODING binary Retrieves the primary job image. Streams the binary directly for hero imagery. Default encoding is RAW
Response
binary

Formats: Binary stream — the ENCODING segment is ignored.

Streams the vacancy’s web image using the stored Content-Type header. Nothing is returned when the vacancy has no image.

Every value is serialised as a string — the type column describes the underlying value. XML responses wrap the records in <response generated="…" records="…"> with one <record> per row.

/get/job/video/{JOB_ID}/ENCODING string (HTML) Job video embed markup. Use /video_embed for iframe-ready content. Default encoding is RAW
Response
string (HTML)

Formats: RAW HTML — the ENCODING segment is ignored.

Returns the stored embed markup, HTML-entity decoded. Empty when the vacancy has no video. /video_embed/{JOB_ID}/ENCODING is a different call: it returns the advert’s advertVideo field and does honour the encoding segment.

Example response
<iframe src="https://player.vimeo.com/video/123456789" width="640" height="360" frameborder="0" allowfullscreen></iframe>

Every value is serialised as a string — the type column describes the underlying value. XML responses wrap the records in <response generated="…" records="…"> with one <record> per row.

/get/job/applyurl/{JOB_ID}/ENCODING string (URL) External application URL. See /applyurlsource/{JOB_ID}/{TYPE} for internal vs external sources. Default encoding is RAW
Response
string (URL)

Formats: RAW (default) · XML · JSON · CSV · PIPE

The response-domain apply link for the vacancy, with no source short code. /applyurlsource/{JOB_ID}/{TYPE} returns the same link with the short code for ext (default) or int sources appended, and /applysource/{JOB_ID}/{TYPE} returns just the short code.

Example response
https://jobs.acme.co.uk/1024

Every value is serialised as a string — the type column describes the underlying value. XML responses wrap the records in <response generated="…" records="…"> with one <record> per row.

/get/job/referralurl/{JOB_ID}/ENCODING string (URL) Referral programme application link. Targets referral source type. Default encoding is RAW
Response
string (URL)

Formats: RAW (default) · XML · JSON · CSV · PIPE

Built from the vacancy’s referral source. Returned without a scheme — prefix it with https://. Empty when the vacancy has no referral source.

Example response
jobs.acme.co.uk/1024rf

Every value is serialised as a string — the type column describes the underlying value. XML responses wrap the records in <response generated="…" records="…"> with one <record> per row.

Job metadata (similar to the new Lists API below)

/get/job/locations array<object> Distinct location values across all jobs. Use for search filters and job alerts.
Response
array<object>

Formats: JSON (default) · XML · CSV · PIPE · RAW

One row per distinct location across every vacancy on the account, whatever its status. Populated from Vacancy Location → City/Location on each vacancy.

value string One distinct value, sorted A→Z. Blank entries are included when vacancies hold an empty value.
Example response
[
    {
        "value": "Coventry"
    }
]

Every value is serialised as a string — the type column describes the underlying value. XML responses wrap the records in <response generated="…" records="…"> with one <record> per row.

/get/job/counties array<object> Unique county list. Pairs with listingCounty for search.
Response
array<object>

Formats: JSON (default) · XML · CSV · PIPE · RAW

One row per distinct county across every vacancy on the account. Feed these values straight into listingCounty. Populated from Vacancy Location → County on each vacancy.

value string One distinct value, sorted A→Z. Blank entries are included when vacancies hold an empty value.
Example response
[
    {
        "value": "Coventry"
    }
]

Every value is serialised as a string — the type column describes the underlying value. XML responses wrap the records in <response generated="…" records="…"> with one <record> per row.

/get/job/roles array<object> Distinct job roles. Provides options for discipline selectors.
Response
array<object>

Formats: JSON (default) · XML · CSV · PIPE · RAW

One row per distinct role in use on vacancies. Populated from Key Information → Role on each vacancy.

value string One distinct value, sorted A→Z. Blank entries are included when vacancies hold an empty value.
Example response
[
    {
        "value": "Coventry"
    }
]

Every value is serialised as a string — the type column describes the underlying value. XML responses wrap the records in <response generated="…" records="…"> with one <record> per row.

/get/job/types array<object> Distinct employment types. Excludes the registration placeholder.
Response
array<object>

Formats: JSON (default) · XML · CSV · PIPE · RAW

One row per distinct type. Vacancies of type registration are excluded. Populated from Key Information → Vacancy Type on each vacancy.

value string One distinct value, sorted A→Z. Blank entries are included when vacancies hold an empty value.
Example response
[
    {
        "value": "Coventry"
    }
]

Every value is serialised as a string — the type column describes the underlying value. XML responses wrap the records in <response generated="…" records="…"> with one <record> per row.

/get/job/live_locations array<object> Locations with currently live vacancies. Restrict filters to active options.
Response
array<object>

Formats: JSON (default) · XML · CSV · PIPE · RAW

As locations, limited to vacancies with status live. Populated from Vacancy Location → City/Location on each vacancy.

value string One distinct value, sorted A→Z. Blank entries are included when vacancies hold an empty value.
Example response
[
    {
        "value": "Coventry"
    }
]

Every value is serialised as a string — the type column describes the underlying value. XML responses wrap the records in <response generated="…" records="…"> with one <record> per row.

/get/job/live_roles array<object> Roles with live vacancies. Ideal for job alert pickers.
Response
array<object>

Formats: JSON (default) · XML · CSV · PIPE · RAW

As roles, limited to vacancies with status live. Populated from Key Information → Role on each vacancy.

value string One distinct value, sorted A→Z. Blank entries are included when vacancies hold an empty value.
Example response
[
    {
        "value": "Coventry"
    }
]

Every value is serialised as a string — the type column describes the underlying value. XML responses wrap the records in <response generated="…" records="…"> with one <record> per row.

/get/job/all_roles array<object> All possible roles set up for use. Ideal for job alert pickers.
Response
array<object>

Formats: JSON (default) · XML · CSV · PIPE · RAW

Read from the managed role list rather than from vacancies, so roles with no vacancies against them are included. These are the options behind Key Information → Role, managed under account settings.

value string One distinct value, sorted A→Z. Blank entries are included when vacancies hold an empty value.
Example response
[
    {
        "value": "Coventry"
    }
]

Every value is serialised as a string — the type column describes the underlying value. XML responses wrap the records in <response generated="…" records="…"> with one <record> per row.

/get/job/regions array<object> Distinct regions from office addresses. Useful for multi-region sites.
Response
array<object>

Formats: JSON (default) · XML · CSV · PIPE · RAW

Distinct region values taken from your office addresses. Comes from the office record, not the vacancy — the vacancy picks an office at Vacancy Location → Address Book.

value string One distinct value, sorted A→Z. Blank entries are included when vacancies hold an empty value.
Example response
[
    {
        "value": "Coventry"
    }
]

Every value is serialised as a string — the type column describes the underlying value. XML responses wrap the records in <response generated="…" records="…"> with one <record> per row.

/get/job/offices array<object> Office records including logos and CDN URLs. Power branded job cards or directory pages.
Response
array<object>

Formats: JSON (default) · XML · CSV · PIPE · RAW

A trimmed office row, sorted by office name. Use /get/lists/offices when you need the full record. Office records, not vacancy fields — a vacancy is tied to one of these at Vacancy Location → Address Book.

value string Office name.
logo string Logo filename held against the office. Empty when none is set.
logo_cdn url Fully-qualified logo URL. Built from logo when no CDN URL is stored.
Example response
[
    {
        "value": "Coventry",
        "logo": "acme-logo.png",
        "logo_cdn": "https://cdn.reach-ats.com/images/logos/12/acme-logo.png"
    }
]

Every value is serialised as a string — the type column describes the underlying value. XML responses wrap the records in <response generated="…" records="…"> with one <record> per row.

/get/job/groups array<object> Department or group identifiers. Map vacancies to internal teams.
Response
array<object>

Formats: JSON (default) · XML · CSV · PIPE · RAW

Every department/group on the account, sorted by name. Unlike /get/lists/groups this call does not filter on status. Populated from Key Information → the department/group field on each vacancy.

id integer Identifier to store against your own records.
value string Display name.
Example response
[
    {
        "id": "6",
        "value": "Operations"
    }
]

Every value is serialised as a string — the type column describes the underlying value. XML responses wrap the records in <response generated="…" records="…"> with one <record> per row.

/get/job/categories array<object> Categories currently used on live vacancies. Returns inactive options too (status 0 filters applied).
Response
array<object>

Formats: JSON (default) · XML · CSV · PIPE · RAW

Distinct category values in use on vacancies, whatever the vacancy status. Populated from Key Information → Categories on each vacancy.

value string One distinct value, sorted A→Z. Blank entries are included when vacancies hold an empty value.
Example response
[
    {
        "value": "Coventry"
    }
]

Every value is serialised as a string — the type column describes the underlying value. XML responses wrap the records in <response generated="…" records="…"> with one <record> per row.

/get/job/all_categories array<object> Managed category list with IDs. Returns inactive options too (status 0 filters applied).
Response
array<object>

Formats: JSON (default) · XML · CSV · PIPE · RAW

The managed category list, sorted by its configured sort order. value holds the category name. These are the options behind Key Information → Categories, managed under account settings.

id integer Identifier to store against your own records.
value string Display name.
Example response
[
    {
        "id": "6",
        "value": "Operations"
    }
]

Every value is serialised as a string — the type column describes the underlying value. XML responses wrap the records in <response generated="…" records="…"> with one <record> per row.


Lists API

The lists module provides lightweight endpoints for populating filters, dropdowns and form pickers. Each call mirrors a metadata query from the Job controller but exposes it under the /get/lists namespace, returning JSON by default for easy client-side consumption.

Core list endpoints

These endpoints are related to the vacancies set up within the system - only values used will be included in the list

/get/lists/categories array<object> Distinct job categories currently in use. Pulls from live job data so it always reflects published vacancies.
Response
array<object>

Formats: JSON (default) · XML · CSV · PIPE · RAW

Distinct category values in use on vacancies. Populated from Key Information → Categories on each vacancy.

value string One distinct value, sorted A→Z. Blank entries are included when vacancies hold an empty value.
Example response
[
    {
        "value": "Coventry"
    }
]

Every value is serialised as a string — the type column describes the underlying value. XML responses wrap the records in <response generated="…" records="…"> with one <record> per row.

/get/lists/locations array<object> Unique list of locations. Use for geography filters on search forms.
Response
array<object>

Formats: JSON (default) · XML · CSV · PIPE · RAW

One row per distinct location across every vacancy on the account. Populated from Vacancy Location → City/Location on each vacancy.

value string One distinct value, sorted A→Z. Blank entries are included when vacancies hold an empty value.
Example response
[
    {
        "value": "Coventry"
    }
]

Every value is serialised as a string — the type column describes the underlying value. XML responses wrap the records in <response generated="…" records="…"> with one <record> per row.

/get/lists/counties array<object> Distinct counties across the account. Ideal for regional breakdowns alongside locations.
Response
array<object>

Formats: JSON (default) · XML · CSV · PIPE · RAW

One row per distinct county. Feed these values straight into /get/job/listingCounty. Populated from Vacancy Location → County on each vacancy.

value string One distinct value, sorted A→Z. Blank entries are included when vacancies hold an empty value.
Example response
[
    {
        "value": "Coventry"
    }
]

Every value is serialised as a string — the type column describes the underlying value. XML responses wrap the records in <response generated="…" records="…"> with one <record> per row.

/get/lists/roles array<object> All role names referenced by vacancies. Populate speciality/discipline selectors.
Response
array<object>

Formats: JSON (default) · XML · CSV · PIPE · RAW

One row per distinct role in use on vacancies. Populated from Key Information → Role on each vacancy.

value string One distinct value, sorted A→Z. Blank entries are included when vacancies hold an empty value.
Example response
[
    {
        "value": "Coventry"
    }
]

Every value is serialised as a string — the type column describes the underlying value. XML responses wrap the records in <response generated="…" records="…"> with one <record> per row.

/get/lists/types array<object> Distinct job types (e.g. Permanent, Part Time). Excludes the registration placeholder.
Response
array<object>

Formats: JSON (default) · XML · CSV · PIPE · RAW

One row per distinct type. Vacancies of type registration are excluded. Populated from Key Information → Vacancy Type on each vacancy.

value string One distinct value, sorted A→Z. Blank entries are included when vacancies hold an empty value.
Example response
[
    {
        "value": "Coventry"
    }
]

Every value is serialised as a string — the type column describes the underlying value. XML responses wrap the records in <response generated="…" records="…"> with one <record> per row.

Live-only variants

Use the live_* endpoints to limit filter options to values that have active vacancies.

/get/lists/live_locations array<object> Locations associated with live jobs. Ideal for map filters or alert sign-up forms.
Response
array<object>

Formats: JSON (default) · XML · CSV · PIPE · RAW

As locations, limited to vacancies with status live. Populated from Vacancy Location → City/Location on each vacancy.

value string One distinct value, sorted A→Z. Blank entries are included when vacancies hold an empty value.
Example response
[
    {
        "value": "Coventry"
    }
]

Every value is serialised as a string — the type column describes the underlying value. XML responses wrap the records in <response generated="…" records="…"> with one <record> per row.

/get/lists/live_roles array<object> Role values that have at least one live vacancy. Keeps drop-downs free of empty categories.
Response
array<object>

Formats: JSON (default) · XML · CSV · PIPE · RAW

As roles, limited to vacancies with status live. Populated from Key Information → Role on each vacancy.

value string One distinct value, sorted A→Z. Blank entries are included when vacancies hold an empty value.
Example response
[
    {
        "value": "Coventry"
    }
]

Every value is serialised as a string — the type column describes the underlying value. XML responses wrap the records in <response generated="…" records="…"> with one <record> per row.

Organisation lookups

/get/lists/offices array<object> Full office records including branding assets. Perfect for office directories or branded cards.
Response
array<object>

Formats: JSON (default) · XML · CSV · PIPE · RAW

Returns the whole office record for every active office, so columns beyond those listed here may appear as the office record grows. Sorted by office name. Office records, not vacancy fields — a vacancy is tied to one of these at Vacancy Location → Address Book.

id integer Office address ID. Matches officeAddressId on listing records.
accountId integer Your account ID.
office string Office name.
officeGroup string Grouping the office belongs to.
division string Division the office belongs to.
address1 string First line of the office address.
address2 string Second line of the office address.
town string Town.
county string County.
region string Region. Matches /get/lists/regions.
country string Country.
postcode string Office postcode.
logo string Logo filename.
logo_cdn url Fully-qualified logo URL.
url url Office website.
status integer Record status. 0 is an active office.
Example response
[
    {
        "id": "8",
        "accountId": "12",
        "office": "Coventry",
        "officeGroup": "Midlands",
        "division": "Residential",
        "address1": "1 Example Street",
        "address2": "Foleshill",
        "town": "Coventry",
        "county": "Warwickshire",
        "region": "West Midlands",
        "country": "United Kingdom",
        "postcode": "CV3 1ET",
        "logo": "acme-logo.png",
        "logo_cdn": "https://cdn.reach-ats.com/images/logos/12/acme-logo.png",
        "url": "https://www.acme.co.uk",
        "status": "0"
    }
]

Every value is serialised as a string — the type column describes the underlying value. XML responses wrap the records in <response generated="…" records="…"> with one <record> per row.

/get/lists/regions array<object> Distinct regions defined in office addresses. Align regional career pages with data.
Response
array<object>

Formats: JSON (default) · XML · CSV · PIPE · RAW

Distinct region values taken from your office addresses. Comes from the office record, not the vacancy — the vacancy picks an office at Vacancy Location → Address Book.

value string One distinct value, sorted A→Z. Blank entries are included when vacancies hold an empty value.
Example response
[
    {
        "value": "Coventry"
    }
]

Every value is serialised as a string — the type column describes the underlying value. XML responses wrap the records in <response generated="…" records="…"> with one <record> per row.

/get/lists/groups array<object> Department or group IDs with display names. Synchronise internal team filters.
Response
array<object>

Formats: JSON (default) · XML · CSV · PIPE · RAW

Active departments/groups only, sorted by name. value holds the group name. Populated from Key Information → the department/group field on each vacancy.

id integer Identifier to store against your own records.
value string Display name.
Example response
[
    {
        "id": "6",
        "value": "Operations"
    }
]

Every value is serialised as a string — the type column describes the underlying value. XML responses wrap the records in <response generated="…" records="…"> with one <record> per row.

/get/lists/all_categories array<object> Managed category options (ID and label). Includes inactive catalogue entries for administration.
Response
array<object>

Formats: JSON (default) · XML · CSV · PIPE · RAW

The managed category list, sorted by its configured sort order. value holds the category name. These are the options behind Key Information → Categories, managed under account settings.

id integer Identifier to store against your own records.
value string Display name.
Example response
[
    {
        "id": "6",
        "value": "Operations"
    }
]

Every value is serialised as a string — the type column describes the underlying value. XML responses wrap the records in <response generated="…" records="…"> with one <record> per row.

/get/lists/all_roles array<object> All possible roles set up for use. Ideal for job alert pickers.
Response
array<object>

Formats: JSON (default) · XML · CSV · PIPE · RAW

Read from the managed role list rather than from vacancies, so roles with no vacancies against them are included. These are the options behind Key Information → Role, managed under account settings.

value string One distinct value, sorted A→Z. Blank entries are included when vacancies hold an empty value.
Example response
[
    {
        "value": "Coventry"
    }
]

Every value is serialised as a string — the type column describes the underlying value. XML responses wrap the records in <response generated="…" records="…"> with one <record> per row.

When to use the Lists controller

  • Seed search filters and job alert preferences without duplicating enumeration tables in your CMS.
  • Build client-side autocomplete or dropdown controls with a lightweight JSON payload.
  • Pair List responses with Job endpoints (e.g. listing) to offer contextual filtering.

Job Alerts

Job alert sign-up forms typically ask candidates to opt into roles, locations or employment types they are interested in. The vacancy metadata endpoints provide the lookup data you need to build these filters dynamically, ensuring your alert preferences always reflect the current catalogue.

Pre-built alert experience

Reach ships a responsive HTML page for job alert sign-up. Embed it inside an iframe or surface it within a modal/popup to collect alert registrations.

Preview alert page

It may be possible for us to create a bespoke sign up template for you mimicing your branding styles, please let us know if this is something you require.

Alert embed endpoints

The Jobalert module exposes helper routes for pre-built signup forms that you can iFrame or load in a modal. Swap the rows, version, client, or group parameters as needed.

Endpoint Purpose Key Options
/jobalert/load/{ROWS}/{VERSION} Default alert form with type/role filters. ROWS controls number item in the multple select boxes; VERSION picks template (1 legacy, 2 updated).
/jobalert/loadWithLocation/{ROWS}/{VERSION} Signup including location dropdown. VERSION 1 (legacy), 2 (jobalertlocation2), 3 (jobalertlocation3).
/jobalert/loadWithTown/{ROWS}/{VIEW} Signup using town list instead of region. Set VIEW to a template name (e.g. jobalertlocation2) or leave numeric for defaults.
Bespoke template endpoints
/jobalert/loadClient/{ROWS}/{CLIENT}/{LIVE} Serve a named client template with live or cached data. CLIENT view name (e.g. jobalert2); set LIVE=true for lists to only use current live vacancy data.
/jobalert/loadClientGroup/{ROWS}/{GROUP}/{CLIENT} Pre-filter form by group/department. GROUP slug or - for all; CLIENT selects the view template.

Code Samples

The PHP snippets below demonstrate how to consume listing data and specific vacancy detail. Swap in your account’s API key and adjust the rendering code to match your templating approach.

A basic API class

<?php
class ReachApiClient {
    private string $host;

    public function __construct(string $apiKey) {
        $this->host = sprintf('https://%s.reach-ats.com', $apiKey);
    }

    public function get(string $path): string {
        $url = $this->host . $path;

        if (ini_get('allow_url_fopen')) {
            $response = @file_get_contents($url);
        } elseif (function_exists('curl_init')) {
            $curl = curl_init($url);
            curl_setopt_array($curl, [
                CURLOPT_RETURNTRANSFER => true,
                CURLOPT_CONNECTTIMEOUT => 5,
                CURLOPT_TIMEOUT => 10,
            ]);
            $response = curl_exec($curl);
            curl_close($curl);
        } else {
            throw new RuntimeException('Unable to fetch data; enable allow_url_fopen or install cURL.');
        }

        if ($response === false) {
            throw new RuntimeException("Reach ATS request failed for {$url}");
        }

        return $response;
    }

    public function getJson(string $path): array {
        $payload = trim($this->get($path));

        if ($payload === '' || strcasecmp($payload, 'null') === 0) {
            return [];
        }

        try {
            $decoded = json_decode($payload, true, 512, JSON_THROW_ON_ERROR);
        } catch (JsonException $exception) {
            error_log(sprintf('Reach ATS JSON decode failed for "%s": %s', $path, $exception->getMessage()));
            return [];
        }

        return is_array($decoded) ? $decoded : [];
    }

    public static function renderOptions(array $values, ?string $selected = null): string {
        $items = array_unique(array_filter(array_map('strval', $values)));
        sort($items, SORT_NATURAL | SORT_FLAG_CASE);

        return implode('', array_map(static function (string $value) use ($selected): string {
            $isSelected = $selected !== null && strcasecmp($selected, $value) === 0;
            return sprintf(
                '<option value="%s"%s>%s</option>',
                rawurlencode($value),
                $isSelected ? ' selected' : '',
                htmlspecialchars($value, ENT_QUOTES, 'UTF-8')
            );
        }, $items));
    }

    public function listing(
        string $keywords = '-',
        string $location = '-',
        string $type = '-',
        string $role = '-',
        string $encoding = 'JSON'
    ): array {
        return $this->getJson($this->buildPath('/get/job/listing/', [
            $keywords,
            $location,
            $type,
            $role,
            $this->formatEncoding($encoding),
        ]));
    }

    public function listingByPostcode(
        string $postcode,
        string $range,
        string $keywords = '-',
        string $location = '-',
        string $type = '-',
        string $role = '-',
        string $encoding = 'JSON'
    ): array {
        return $this->getJson($this->buildPath('/get/job/listingByPostcode/', [
            $postcode,
            $range,
            $keywords,
            $location,
            $type,
            $role,
            $this->formatEncoding($encoding),
        ]));
    }

    public function listingBySource(
        string $sources,
        string $keywords = '-',
        string $location = '-',
        string $type = '-',
        string $role = '-',
        string $encoding = 'JSON'
    ): array {
        return $this->getJson($this->buildPath('/get/job/listingBySource/', [
            $sources,
            $keywords,
            $location,
            $type,
            $role,
            $this->formatEncoding($encoding),
        ]));
    }

    public function listingBySourceAndPostcode(
        string $sources,
        string $postcode,
        string $range,
        string $keywords = '-',
        string $location = '-',
        string $type = '-',
        string $role = '-',
        string $encoding = 'JSON'
    ): array {
        return $this->getJson($this->buildPath('/get/job/listingBySourceAndPostcode/', [
            $sources,
            $postcode,
            $range,
            $keywords,
            $location,
            $type,
            $role,
            $this->formatEncoding($encoding),
        ]));
    }

    public function internalListing(
        string $keywords = '-',
        string $location = '-',
        string $type = '-',
        string $role = '-',
        string $encoding = 'JSON'
    ): array {
        return $this->getJson($this->buildPath('/get/job/internalListing/', [
            $keywords,
            $location,
            $type,
            $role,
            $this->formatEncoding($encoding),
        ]));
    }

    public function internalListingByPostcode(
        string $postcode,
        string $range,
        string $keywords = '-',
        string $location = '-',
        string $type = '-',
        string $role = '-',
        string $encoding = 'JSON'
    ): array {
        return $this->getJson($this->buildPath('/get/job/internalListingByPostcode/', [
            $postcode,
            $range,
            $keywords,
            $location,
            $type,
            $role,
            $this->formatEncoding($encoding),
        ]));
    }

    public function internalListingBySource(
        string $sources,
        string $keywords = '-',
        string $location = '-',
        string $type = '-',
        string $role = '-',
        string $encoding = 'JSON'
    ): array {
        return $this->getJson($this->buildPath('/get/job/internalListingBySource/', [
            $sources,
            $keywords,
            $location,
            $type,
            $role,
            $this->formatEncoding($encoding),
        ]));
    }

    public function internalListingBySourceAndPostcode(
        string $sources,
        string $postcode,
        string $range,
        string $keywords = '-',
        string $location = '-',
        string $type = '-',
        string $role = '-',
        string $encoding = 'JSON'
    ): array {
        return $this->getJson($this->buildPath('/get/job/internalListingBySourceAndPostcode/', [
            $sources,
            $postcode,
            $range,
            $keywords,
            $location,
            $type,
            $role,
            $this->formatEncoding($encoding),
        ]));
    }

    public function listingByCounty(
        string $keywords = '-',
        string $county = '-',
        string $type = '-',
        string $role = '-',
        string $encoding = 'JSON'
    ): array {
        return $this->getJson($this->buildPath('/get/job/listingCounty/', [
            $keywords,
            $county,
            $type,
            $role,
            $this->formatEncoding($encoding),
        ]));
    }

    public function referralListing(
        string $keywords = '-',
        string $location = '-',
        string $type = '-',
        string $role = '-',
        string $encoding = 'JSON'
    ): array {
        return $this->getJson($this->buildPath('/get/job/referralListing/', [
            $keywords,
            $location,
            $type,
            $role,
            $this->formatEncoding($encoding),
        ]));
    }

    public function speculativeListing(
        string $keywords = '-',
        string $location = '-',
        string $type = '-',
        string $role = '-',
        string $encoding = 'JSON'
    ): array {
        return $this->getJson($this->buildPath('/get/job/speculativeListing/', [
            $keywords,
            $location,
            $type,
            $role,
            $this->formatEncoding($encoding),
        ]));
    }

    public function openDayListing(
        string $keywords = '-',
        string $location = '-',
        string $type = '-',
        string $role = '-',
        string $encoding = 'JSON'
    ): array {
        return $this->getJson($this->buildPath('/get/job/openDayListing/', [
            $keywords,
            $location,
            $type,
            $role,
            $this->formatEncoding($encoding),
        ]));
    }

    public function jobInformation(int $jobId, string $encoding = 'JSON'): array {
        return $this->getJson($this->buildPath('/get/job/information/', [
            $jobId,
            $this->formatEncoding($encoding),
        ]))[0] ?? [];
    }

    public function jobAdvert(int $jobId): string {
        return $this->get($this->buildPath('/get/job/advert/', [$jobId]));
    }

    public function jobFileUrls(int $jobId, string $encoding = 'JSON'): array {
        return $this->getJson($this->buildPath('/get/job/fileurls/', [
            $jobId,
            $this->formatEncoding($encoding),
        ]));
    }

    private function buildPath(string $prefix, array $segments): string {
        return $prefix . implode('/', array_map([$this, 'segment'], $segments));
    }

    private function segment(string $value): string {
        if ($value === null || $value === '') {
            return '-';
        }
        if ($value === '-') {
            return '-';
        }
        return rawurlencode((string) $value);
    }

    private function formatEncoding(?string $encoding): string {
        return strtoupper($encoding ?? 'JSON');
    }
}
?>
							

The API class implemented to display & filter vacancies (JSON)

<?php
try {
    include_once('reach_api.php');
    $client = new ReachApiClient('a83d66d29041c407e8abf4187c533053');

    $listing = $client->listing();

    // Apply simple, client-side filtering beyond the API segments.
    $filters = [
        'division' => $_GET['division'] ?? null,
        'officename' => $_GET['officename'] ?? null,
        'hours' => $_GET['hours'] ?? null,
        'role' => $_GET['role'] ?? null,
    ];

    $filtered = array_filter($listing, static function (array $job) use ($filters): bool {
        foreach ($filters as $key => $value) {
            if ($value === null || $value === '') {
                continue;
            }
            if (!isset($job[$key]) || strcasecmp($job[$key], $value) !== 0) {
                return false;
            }
        }
        return true;
    });

    $options = [
        'division' => ReachApiClient::renderOptions(array_column($listing, 'division'), $filters['division']),
        'officename' => ReachApiClient::renderOptions(array_column($listing, 'officename'), $filters['officename']),
        'hours' => ReachApiClient::renderOptions(array_column($listing, 'hours'), $filters['hours']),
        'role' => ReachApiClient::renderOptions(array_column($listing, 'role'), $filters['role']),
    ];
} catch (Throwable $exception) {
    error_log($exception->getMessage());
    echo $exception->getMessage();
}
?>

<form method="get" action="">
    <label>
        Division
        <select name="division" onchange="this.form.submit()">
            <option value="">All divisions</option>
            <?= $options['division']; ?>
        </select>
    </label>
    <label>
        Office
        <select name="officename" onchange="this.form.submit()">
            <option value="">All offices</option>
            <?= $options['officename']; ?>
        </select>
    </label>
    <label>
        Role
        <select name="role" onchange="this.form.submit()">
            <option value="">All roles</option>
            <?= $options['role']; ?>
        </select>
    </label>
    <label>
        Hours
        <select name="hours" onchange="this.form.submit()">
            <option value="">Any hours</option>
            <?= $options['hours']; ?>
        </select>
    </label>
    <noscript><button type="submit">Apply filters</button></noscript>
</form>

<p>Showing <strong><?= count($filtered); ?></strong> of <strong><?= count($listing); ?></strong> vacancies.</p>

<?php foreach ($filtered as $job): ?>
    <?php
        try {
            $jobId = $job['id'];
            $job = $client->jobInformation($jobId);
            $advertHtml = $client->jobAdvert($jobId);
            $attachments = $client->jobFileUrls($jobId);
        } catch (Throwable $exception) {
            error_log($exception->getMessage());
            echo $exception->getMessage();
        }
    ?>
    <section class="vacancy-summary" style="border:1px solid #000;padding:5px 10px;margin-bottom:5px;">
        <h3><?= htmlspecialchars($job['title'], ENT_QUOTES, 'UTF-8'); ?></h3>
        <div class="vacancy-advert"><?= $advertHtml; ?></div>
        <?php if (!empty($attachments)): ?>
            <h4>Attachments</h4>
            <ul>
                <?php foreach ($attachments as $file): ?>
                    <li>
                        <a href="<?= htmlspecialchars($file['url'] ?? '#', ENT_QUOTES, 'UTF-8'); ?>" target="_blank">
                            <?= htmlspecialchars($file['type'] ?? 'Download', ENT_QUOTES, 'UTF-8'); ?>
                        </a>
                    </li>
                <?php endforeach; ?>
            </ul>
        <?php endif; ?>
    </section>
<?php endforeach; ?>
							

Fetch detail including advert text and files for a specific vacancy

<?php
try {
    include_once('reach_api.php');
    $client = new ReachApiClient('a83d66d29041c407e8abf4187c533053');
    $jobId = 129436;
    $information = $client->jobInformation($jobId);
    $advertHtml = $client->jobAdvert($jobId);
    $fileAttachments = $client->jobFileUrls($jobId);
} catch (Throwable $exception) {
    error_log($exception->getMessage());
    echo $exception->getMessage();
}

if (!empty($information)) {
    echo '<h3>' . htmlspecialchars($information['title'] ?? 'Vacancy', ENT_QUOTES, 'UTF-8') . '</h3>';
    echo $advertHtml; // Already HTML

    if (!empty($fileAttachments)) {
        echo '<h4>Supporting documents</h4><ul>';
        foreach ($fileAttachments as $file) {
            $label = htmlspecialchars($file['type'] ?? 'Download', ENT_QUOTES, 'UTF-8');
            $url = htmlspecialchars($file['url'] ?? '#', ENT_QUOTES, 'UTF-8');
            echo '<li><a href="' . $url . '" target="_blank">' . $label . '</a></li>';
        }
        echo '</ul>';
    }
}
?>
						

WordPress Plugin

The official Reach ATS WordPress plugin is the fastest way to embed live vacancies on a WordPress site — no theme edits, no PHP. Install the zip, set your API key, and use Gutenberg blocks or shortcodes anywhere. Prefer to wire it up by hand? See WordPress Shortcodes below.

Official WordPress plugin Alpha

Drop-in plugin with a Settings → Reach ATS admin page, Gutenberg blocks for listings, filtered listings and vacancy detail, plus transient caching of API responses.

Alpha release — please report issues to support@reach-ats.com.

  • Requires WordPress 6.0+ and PHP 8.0+
  • Install via Plugins → Add New → Upload Plugin
  • Configure your API key under Settings → Reach ATS

WordPress Shortcodes

If you’d rather not install the official plugin, the snippets below give you the same shortcodes via your theme’s functions.php file and register shortcodes for listings, vacancy detail pages. The examples use strict typing, shared network helpers and defensive error handling.

Shared helpers

<?php
class Reach_Api_Helper {
	private string $host;

	public function __construct(private readonly string $apiKey) {
		$this->host = sprintf('https://%s.reach-ats.com', $apiKey);
	}

	public function get(string $path): string {
		$url = $this->host . $path;

		if (ini_get('allow_url_fopen')) {
			$response = @file_get_contents($url);
		} elseif (function_exists('curl_init')) {
			$curl = curl_init($url);
			curl_setopt_array($curl, [
				CURLOPT_RETURNTRANSFER => true,
				CURLOPT_CONNECTTIMEOUT => 5,
				CURLOPT_TIMEOUT => 10,
			]);
			$response = curl_exec($curl);
			curl_close($curl);
		} else {
			throw new RuntimeException('Reach request requires allow_url_fopen or cURL support.');
		}

		if ($response === false) {
			throw new RuntimeException("Reach request failed for {$url}");
		}

		return $response;
	}

	public function getJson(string $path): array {
		return json_decode($this->get($path), true, 512, JSON_THROW_ON_ERROR);
	}

	public function listing(
		string $keywords = '-',
		string $location = '-',
		string $type = '-',
		string $role = '-',
		string $encoding = 'JSON'
	): array {
		return $this->getJson($this->buildPath('/get/job/listing/', [
			$keywords,
			$location,
			$type,
			$role,
			$this->formatEncoding($encoding),
		]));
	}

	/**
	 * Fetch the full live listing then filter it locally with array_filter()
	 * against any field in the job payload (e.g. role, location, type,
	 * county, region, group, officename, category, etc.).
	 *
	 * $filters is keyed by field name. Each value may be a single token
	 * or an array of tokens. Within a field the tokens are OR'd; between
	 * fields they are AND'd. Empty / missing fields skip that filter.
	 * Matching is case-insensitive substring (null payload values coerce
	 * to '' and never match a non-empty token).
	 *
	 * Example:
	 *     $api->filteredListing([
	 *         'role'   => ['Home Care Worker', 'Nurse'],
	 *         'county' => 'Greater Manchester',
	 *         'type'   => 'Permanent',
	 *     ]);
	 */
	public function filteredListing(
		array $filters = [],
		string $keywords = '-',
		string $encoding = 'JSON'
	): array {
		$jobs = $this->listing($keywords, '-', '-', '-', $encoding);

		$normalised = [];
		foreach ($filters as $field => $values) {
			$values = is_array($values) ? $values : [$values];
			$tokens = array_values(array_filter(
				array_map(static fn ($value): string => strtolower(trim((string) $value)), $values),
				static fn (string $value): bool => $value !== ''
			));
			if ($tokens !== []) {
				$normalised[(string) $field] = $tokens;
			}
		}

		if ($normalised === []) {
			return $jobs;
		}

		$matchesAny = static function (string $haystack, array $needles): bool {
			foreach ($needles as $needle) {
				if (str_contains($haystack, $needle)) {
					return true;
				}
			}
			return false;
		};

		return array_values(array_filter(
			$jobs,
			static function (array $job) use ($normalised, $matchesAny): bool {
				foreach ($normalised as $field => $tokens) {
					$haystack = strtolower((string) ($job[$field] ?? ''));
					if (!$matchesAny($haystack, $tokens)) {
						return false;
					}
				}
				return true;
			}
		));
	}

	public function jobInformation(int|string $jobId, string $encoding = 'JSON'): array {
		return $this->getJson($this->buildPath('/get/job/information/', [
			$jobId,
			$this->formatEncoding($encoding),
		]));
	}

	public function jobAdvert(int|string $jobId): string {
		return $this->get($this->buildPath('/get/job/advert/', [$jobId]));
	}

	public function jobFileUrls(int|string $jobId, string $encoding = 'JSON'): array {
		return $this->getJson($this->buildPath('/get/job/fileurls/', [
			$jobId,
			$this->formatEncoding($encoding),
		]));
	}

	private function buildPath(string $prefix, array $segments): string {
		return $prefix . implode('/', array_map([$this, 'segment'], $segments));
	}

	private function segment(null|int|string $value): string {
		if ($value === null || $value === '') {
			return '-';
		}
		if ($value === '-') {
			return '-';
		}
		return rawurlencode((string) $value);
	}

	private function formatEncoding(?string $encoding): string {
		return strtoupper($encoding ?? 'JSON');
	}
}
?>

Listing shortcode

Usage: [reach-listing key="YOUR_KEY" detail_slug="/vacancies/detail" qs_param="vacancy_id"]

function reach_listing_shortcode(array $atts): string {
	$atts = shortcode_atts([
		'key' => 'a83d66d29041c407e8abf4187c533053',
		'detail_slug' => '/vacancies/detail',
		'qs_param' => 'vacancy_id',
	], $atts, 'reach-listing');

	$api = new Reach_Api_Helper($atts['key']);

	try {
		$jobs = $api->listing();
	} catch (Throwable $exception) {
		error_log($exception->getMessage());
		return '<p>Vacancies are unavailable right now.</p>';
	}

	if (empty($jobs)) {
		return '<p>No live vacancies at the moment.</p>';
	}

	$output = '';
	foreach ($jobs as $job) {
		$advertExcerpt = !empty($job['shortdescription'])
			? $job['shortdescription']
			: substr(strip_tags($api->jobAdvert($job['id'])), 0, 200) . '...';

		$detailUrl = esc_url(add_query_arg($atts['qs_param'], $job['id'], $atts['detail_slug']));
		$applyUrl = esc_url($job['applyurl']);

		$output .= sprintf(
			'<article class="vacancy-card" data-group="%s">
				<header>
					<h3><a href="%s">%s</a></h3>
					<p><strong>Location:</strong> %s</p>
					<p><strong>Function:</strong> %s</p>
				</header>
				<p>%s</p>
				<p>
					<a class="btn btn-primary" target="_blank" href="%s">Apply now</a>
					<a class="btn btn-outline" href="%s">More detail</a>
				</p>
			</article>',
			esc_attr($job['group'] ?? ''),
			esc_url($detailUrl),
			esc_html($job['title']),
			esc_html($job['location'] ?? 'Not specified'),
			esc_html($job['role'] ?? 'Not specified'),
			esc_html($advertExcerpt),
			$applyUrl,
			esc_url($detailUrl)
		);
	}

	return $output;
}
add_shortcode('reach-listing', 'reach_listing_shortcode');

Filtered listing shortcode

Usage: [reach-filtered-listing key="YOUR_KEY" role="Nurse|Doctor" county="Greater Manchester"]

Any attribute other than the reserved set (key, detail_slug, qs_param, keywords) is treated as a filter on the job payload field of the same name (role, location, type, county, region, officename, group, category, applicationtype, etc.). Multi-value uses | or , as the separator (interchangeable). Tokens within a field are OR'd, fields are AND'd, matching is case-insensitive substring. keywords still routes through the API's server-side text search and is cheaper than in-memory filtering on large accounts.

function reach_filtered_listing_shortcode(array $atts): string {
	$atts = $atts ?: [];

	// Reserved shortcode attributes - everything else is treated as a filter.
	$reserved = ['key', 'detail_slug', 'qs_param', 'keywords'];
	$config = shortcode_atts([
		'key'         => 'a83d66d29041c407e8abf4187c533053',
		'detail_slug' => '/vacancies/detail',
		'qs_param'    => 'vacancy_id',
		'keywords'    => '-',
	], array_intersect_key($atts, array_flip($reserved)), 'reach-filtered-listing');

	// Build the filter map. Pipe OR comma separated values become multi-token OR filters.
	$filters = [];
	foreach (array_diff_key($atts, array_flip($reserved)) as $field => $value) {
		$tokens = preg_split('/[|,]/', (string) $value, -1, PREG_SPLIT_NO_EMPTY);
		$tokens = array_values(array_filter(array_map('trim', $tokens), 'strlen'));
		if ($tokens !== []) {
			$filters[(string) $field] = $tokens;
		}
	}

	$api = new Reach_Api_Helper($config['key']);

	try {
		$jobs = $api->filteredListing($filters, $config['keywords']);
	} catch (Throwable $exception) {
		error_log($exception->getMessage());
		return '<p>Vacancies are unavailable right now.</p>';
	}

	if (empty($jobs)) {
		return '<p>No live vacancies match those filters.</p>';
	}

	$output = '';
	foreach ($jobs as $job) {
		$advertExcerpt = !empty($job['shortdescription'])
			? $job['shortdescription']
			: substr(strip_tags($api->jobAdvert($job['id'])), 0, 200) . '...';

		$detailUrl = esc_url(add_query_arg($config['qs_param'], $job['id'], $config['detail_slug']));
		$applyUrl  = esc_url($job['applyurl']);

		$output .= sprintf(
			'<article class="vacancy-card" data-group="%s">
				<header>
					<h3><a href="%s">%s</a></h3>
					<p><strong>Location:</strong> %s</p>
					<p><strong>Function:</strong> %s</p>
				</header>
				<p>%s</p>
				<p>
					<a class="btn btn-primary" target="_blank" href="%s">Apply now</a>
					<a class="btn btn-outline" href="%s">More detail</a>
				</p>
			</article>',
			esc_attr($job['group'] ?? ''),
			esc_url($detailUrl),
			esc_html($job['title']),
			esc_html($job['location'] ?? 'Not specified'),
			esc_html($job['role'] ?? 'Not specified'),
			esc_html($advertExcerpt),
			$applyUrl,
			esc_url($detailUrl)
		);
	}

	return $output;
}
add_shortcode('reach-filtered-listing', 'reach_filtered_listing_shortcode');

Vacancy detail shortcode

Usage: [reach-detail key="YOUR_KEY" qs_param="vacancy_id"]

function reach_detail_shortcode(array $atts): string {
	$atts = shortcode_atts([
		'key' => 'a83d66d29041c407e8abf4187c533053',
		'qs_param' => 'vacancy_id',
	], $atts, 'reach-detail');

	$vacancyId = isset($_GET[$atts['qs_param']]) ? sanitize_text_field($_GET[$atts['qs_param']]) : null;
	if (!$vacancyId) {
		return '<p>Please select a vacancy.</p>';
	}

	$api = new Reach_Api_Helper($atts['key']);

	try {
		$info = $api->jobInformation($vacancyId);
		$detail = $info[0] ?? [];
		$advert = $api->jobAdvert($vacancyId);
		$files = $api->jobFileUrls($vacancyId);
	} catch (Throwable $exception) {
		error_log($exception->getMessage());
		return '<p>We can’t load that vacancy right now.</p>';
	}

	if (empty($detail)) {
		return '<p>Sorry, we can’t find that vacancy in our system.</p>';
	}

	ob_start();
	?>
		<article class="vacancy-detail">
			<h2><?= esc_html($detail['title']); ?></h2>
			<p>
				<strong>Location:</strong> <?= esc_html($detail['location'] ?? ''); ?><br />
				<strong>Category:</strong> <?= esc_html($detail['category'] ?? ''); ?><br />
				<strong>Closing date:</strong> <?= esc_html($detail['closingdate'] ?? ''); ?>
			</p>
			<div class="vacancy-advert"><?= wp_kses_post($advert); ?></div>
			<p><a class="btn btn-primary" target="_blank" href="<?= esc_url($detail['applyurl'] ?? '#'); ?>">Apply now</a></p>

			<?php if (!empty($files)): ?>
				<h3>Supporting documents</h3>
				<ul>
					<?php foreach ($files as $file): ?>
						<li><a href="<?= esc_url($file['url'] ?? '#'); ?>" target="_blank"><?= esc_html($file['type'] ?? 'Download'); ?></a></li>
					<?php endforeach; ?>
				</ul>
			<?php endif; ?>
		</article>
	<?php
	return ob_get_clean();
}
add_shortcode('reach-detail', 'reach_detail_shortcode');
						

Job alert signup iframe URL

Usage: [reach-jobalert-url key="YOUR_KEY" account_id="6" template_id="2"]. Returns a ready-to-embed URL.

function reach_jobalert_url_shortcode(array $atts): string {
	$atts = shortcode_atts([
		'key' => 'a83d66d29041c407e8abf4187c533053',
		'account_id' => '6',
		'template_id' => '2',
	], $atts, 'reach-jobalert-url');

	return sprintf(
		'https://%s.reach-ats.com/jobalert/load/%d/%d',
		rawurlencode($atts['key']),
		(int) $atts['account_id'],
		(int) $atts['template_id']
	);
}
add_shortcode('reach-jobalert-url', 'reach_jobalert_url_shortcode');