TBC Job Post REST API V2
| Author | Gareth Hale |
| Version | 2.1 |
| Date | 14th September 2025 |
The TBC Job Post REST API provides an interface for applications to interact with the jobs posted on The Best Connection job board by sending and receiving data as JSON (JavaScript Object Notation) objects. The API is protected by OAuth 2.0 Authentication an open standard for token-based authentication.
* indicates a required key/field/value
1. Authentication (OAuth 2.0)
The application presents a traditional username and password login form to collect a user’s credentials and makes a POST request to the server to exchange the password for an access token. The response will include an access token which is to be used to access any API data, the token is valid for 1 hour. Users have to create a token each time they want to request the API access.
To create an API account, all that is needed is an email address to setup the password. TBC will provide all other credentials.
To get the token, you need to send a token request as shown below.
POST https://thebestconnection.co.uk/job-posts/api/v1/token
Body Parameters
| Name | Type | Description |
|---|---|---|
|
|
|
|
| grant_type * | String | Grant type being used: password |
|
|
|
|
| username * | String | Username provided by TBC |
|
|
|
|
| password * | String | Get Password |
|
|
|
|
| client_id * | String | Client ID provided by TBC |
|
|
|
|
| client_secret * | String | Client Secret provided by TBC |
Curl Example
Responses
| Code | Description |
|---|---|
|
|
|
| 200 |
Successful response
Example Model
{
“token_type”:”Bearer”, “iat”:1573547305, “expires_in”:1573550905, “access_token”:”HChQjI9zU09pA7gQ” “code”:”200″ } |
|
|
|
| 400 |
Bad Request
Example Model
{
“status”:”error”, “error”:”BAD_REQUEST”, “error_description”:”Invalid grant Type.” } |
|
|
|
| 403 |
Forbidden response
Example Model {
“status”:”error”, “error”:”FORBIDDEN”, “error_description”:”Invalid Username or Password.” } |
Although tokens expire, it is recommended to revoke a token after completing your API action(s), allowing the authorisation server to clean up any security credentials associated with the authorisation.
To revoke the token, you need to send request as shown below.
POST https://thebestconnection.co.uk/job-posts/api/v1/revoke-token
Body Parameters
| Name | Type | Description |
|---|---|---|
|
|
|
|
| token * | String | The token that needs to be revoked |
|
|
|
|
| token_type_hint | String | Type of token: access_token |
Curl Example
Responses
| Code | Description |
|---|---|
|
|
|
| 200 |
Successful response
Example Model
{
“success”: true } |
|
|
|
| 400 |
Bad Request
Example Model
{
“error”: “unsupported_token_type”, “error_description”: “The token type used is unsupported or the token is invalid.” } |
2. Retrieve Jobs
Returns 10 jobs per request by default (can be altered {jobs_per_page}) and the data includes the maximum number of pages. Pagination parameter {page_number} is required to retrieve a page of results, see example below.
GET https://thebestconnection.co.uk/job-posts/tbc-api/v1/jobs
Header *required
| Name | Value |
|---|---|
|
|
|
| TBCAuth | Bearer {access_token} |
Note: Obtain {access_token} before API action (see authentication)
Authentication no longer required to retrieve jobs
GET Parameters
| Key | Type | Value |
|---|---|---|
|
|
|
|
| page * | Integer | {page_number} |
| per_page | Integer | {jobs_per_page} |
NOTE: The returned results includes ‘max_num_pages’ the maximum number of pages for all jobs. You can program your application to loop through this number and return each paged data to obtain all results.
Curl Example
| Code | Description |
|---|---|
|
|
|
| 200 |
Successful response
Example Model
{
“status”:”success”, “max_num_pages”: 95, “jobs”: [ { “ID”: “170899”, “JobRef”: “TAD56DFF”, “Title”: “Machine Operative”, “Secondary”: “”, “Description”: “Full description including HTML format”, “Updated”: “2025-01-15 17:46:28”, “Expiry”: “2025-01-29”, “Type”: “Temporary”, “Contract”: “Full time”, “PayRateMin”: “12.75”, “PayRateMax”: “15.15”, “PayText”: “£12.75-15.15 per hour”, “PayPeriod”: “hour”, “PayRateHow”: “After working 12 continuous weeks”, “WeeklyHours”: “”, “Sector”: “industrial”, “Requirements”: “Lorem ipsum dolor sit amet, consectetur adipiscing elit…..”, “Benefits”: “Lorem ipsum dolor sit amet, consectetur adipiscing elit…..”, “JobUrl”: “https://www.thebestconnection.co.uk/jobs/machine-operative__tad56dff”, “ApplyUrl”: “https://www.thebestconnection.co.uk/jobs/machine-operative__tad56dff?apply=true”, “Aplitrak”:”bob.12345.123@smith.aplitrak.com”, “ContactNumber”: “Call Adam or Tom on 01823 330621 for more information”, “ContactEmail”: “taunton@thebestconnection.co.uk”, “BranchCode”: “TA”, “BranchName”: “Taunton”, “Line1”: “Bath Road”, “Line2”: “”, “TownCity”: “Bridgwater”, “Region”: “Somerset”, “Latitude”: “51.1415321”, “Longitude”: “-2.985066”, “PlanCode”: “TAIND2” } ] } Note: Requirements and Benefits could return an object array, this is how it was stored previously |
|
|
|
| 401 |
Invalid Signature response
Example Model
{
“status”:”error”, “error”:”INVALID_ACCESS_TOKEN”, “error_description”:”Invalid Access Token.” } |
|
|
|
| 401 |
Missing Authorization Header
Example Model
{
“status”:”error”, “error”:”MISSING_AUTHORIZATION_HEADER”, “error_description”:”Authorization header not received. Either authorization header was not sent or it was removed by your server due to security reasons. Check more details for the error on” } |
To return information about a job, it requires the job ID {identifier} to be passed as a lookup, see example below.
GET https://thebestconnection.co.uk/job-posts/tbc-api/v1/job
Header *required
| Name | Value |
|---|---|
|
|
|
| TBCAuth | Bearer {access_token} |
Note: Obtain {access_token} before API action (see authentication)
Authentication no longer required to retrieve jobs
GET Parameters
| Key | Type | Value |
|---|---|---|
|
|
|
|
| ID * | Integer | {identifier} |
NOTE: The returned results includes ‘max_num_pages’ but this is redundant for singular job and only used for all jobs.
Curl Example
| Code | Description |
|---|---|
|
|
|
| 200 |
Successful response
Example Model
{
“status”:”success”, “max_num_pages”: 1, “jobs”: [ { “ID”: “170899”, “JobRef”: “TAD56DFF”, “Title”: “Machine Operative”, “Secondary”: “”, “Description”: “Full description including HTML format”, “Updated”: “2025-01-15 17:46:28”, “Expiry”: “2025-01-29”, “Type”: “Temporary”, “Contract”: “Full time”, “PayRateMin”: “12.75”, “PayRateMax”: “15.15”, “PayText”: “£12.75-15.15 per hour”, “PayPeriod”: “hour”, “PayRateHow”: “After working 12 continuous weeks”, “WeeklyHours”: “”, “Sector”: “industrial”, “Requirements”: “Lorem ipsum dolor sit amet, consectetur adipiscing elit…..”, “Benefits”: “Lorem ipsum dolor sit amet, consectetur adipiscing elit…..”, “JobUrl”: “https://www.thebestconnection.co.uk/jobs/machine-operative__tad56dff”, “ApplyUrl”: “https://www.thebestconnection.co.uk/jobs/machine-operative__tad56dff?apply=true”, “Aplitrak”:”bob.12345.123@smith.aplitrak.com”, “ContactNumber”: “Call Adam or Tom on 01823 330621 for more information”, “ContactEmail”: “taunton@thebestconnection.co.uk”, “BranchCode”: “TA”, “BranchName”: “Taunton”, “Line1”: “Bath Road”, “Line2”: “”, “TownCity”: “Bridgwater”, “Region”: “Somerset”, “Latitude”: “51.1415321”, “Longitude”: “-2.985066”, “PlanCode”: “TAIND2” } ] } Note: Requirements and Benefits could return an object array, this is how it was stored previously |
|
|
|
| 401 |
Invalid Signature response
Example Model
{
“status”:”error”, “error”:”INVALID_ACCESS_TOKEN”, “error_description”:”Invalid Access Token.” } |
|
|
|
| 401 |
Missing Authorization Header
Example Model
{
“status”:”error”, “error”:”MISSING_AUTHORIZATION_HEADER”, “error_description”:”Authorization header not received. Either authorization header was not sent or it was removed by your server due to security reasons. Check more details for the error on” } |
|
|
|
| 422 |
Missing ID Parameter
Example Model
{
“status”:”error”, “error”:”UNPROCESSABLE”, “error_description”:”The job ID parameter is missing” } |
|
|
|
| 404 |
No results found
Example Model
{
“status”:”error”, “error”:”NOT FOUND”, “error_description”:”No results found” } |
3. Add/Update Jobs
To add a new job, see example below.
POST https://thebestconnection.co.uk/job-posts/tbc-api/v1/update-job
Header *required
| Name | Value |
|---|---|
|
|
|
| TBCAuth | Bearer {access_token} |
Note: Obtain {access_token} before API action (see authentication)
POST Parameters
| Key | Type | Value (Example) |
|---|---|---|
|
|
|
|
| ID * | Integer | 171431 |
|
|
|
|
| JobRef * | String | MFGNROP1 |
|
|
|
|
| Title * | String | Assembly Operative |
|
|
|
|
| Secondary | String | … |
|
|
|
|
| Description * | String | Full description including HTML format |
|
|
|
|
| Updated * | Date (YYYY-MM-DD HH:MM:SS) | 2025-01-15 16:58:59 |
|
|
|
|
| Expiry * | Date (YYYY-MM-DD) | 2025-02-12 |
|
|
|
|
| Type * | String | Temporary |
|
|
|
|
| Contract * | String | Full time |
|
|
|
|
| PayRateMin * | Float | 12.11 |
|
|
|
|
| PayRateMax * | Float | 18.16 |
|
|
|
|
| PayText * | String | £12.11-18.16 per hour |
|
|
|
|
| PayPeriod * | String | hour |
|
|
|
|
| PayRateHow * | String | Working Overtime |
|
|
|
|
| WeeklyHours | Float | 35 |
|
|
|
|
| Sector * | String | warehouse & production |
|
|
|
|
| Requirements | String | Lorem ipsum dolor sit amet, consectetur adipiscing elit….. |
|
|
|
|
| Benefits | String | Lorem ipsum dolor sit amet, consectetur adipiscing elit….. |
|
|
|
|
| Aplitrak * | String | bob.12345.123@smith.aplitrak.com |
|
|
|
|
| ContactNumber * | String | Call Laura or Lauren 01623414281 for further information on this role! |
|
|
|
|
| ContactEmail * | String | mansfield@thebestconnection.co.uk |
|
|
|
|
| BranchCode * | String(2) | MF |
|
|
|
|
| BranchName * | String | Mansfield |
|
|
|
|
| Address | String | Mansfield, Nottinghamshire, NG18 5BY |
|
|
|
|
| Line1 | String | … |
|
|
|
|
| Line2 | String | … |
|
|
|
|
| TownCity | String | Mansfield |
|
|
|
|
| Region | String | Nottinghamshire |
|
|
|
|
| PostCode * | String | NG18 5BY |
|
|
|
|
| Latitude * | String | 53.1281037 |
|
|
|
|
| Longitude * | String | -1.2160904 |
|
|
|
|
| PlanCode | String | MFIND4 |
Note: Required fields cannot be NULL
Curl Example
Responses
| Code | Description |
|---|---|
|
|
|
| 200 |
Successful response
Example Model
{
“status”: “success” “response”: “job has been posted successfully” “job_url”: “https://www.thebestconnection.co.uk/jobs/machine-operative__tad56dff” “apply_url”: “https://www.thebestconnection.co.uk/jobs/machine-operative__tad56dff?apply=true” } |
|
|
|
| 401 |
Invalid Signature response
Example Model
{
“status”:”error”, “error”:”INVALID_ACCESS_TOKEN”, “error_description”:”Invalid Access Token.” } |
|
|
|
| 401 |
Missing Authorization Header
Example Model
{
“status”:”error”, “error”:”MISSING_AUTHORIZATION_HEADER”, “error_description”:”Authorization header not received. Either authorization header was not sent or it was removed by your server due to security reasons. Check more details for the error on” } |
|
|
|
| 409 |
Duplicate ERROR
Example Model
{
“status”:”error”, “error”:”DUPLICATE ERROR”, “error_description”:”Failed to insert the job post correctly, JobRef duplication detected” } |
|
|
|
| 422 |
Missing Required Parameter
Example Model
{
“status”:”error”, “error”:”UNPROCESSABLE”, “error_description”:”One or more required parameters are missing” “missing_parameters”:”Contract,Type,Sector,Title” } |
Updating a job uses the same endpoint as adding a job, it looks up to check if the job ID already exists and performs an update action if it does.
PUT https://thebestconnection.co.uk/job-posts/tbc-api/v1/update-job
Header *required
| Name | Value |
|---|---|
|
|
|
| TBCAuth | Bearer {access_token} |
Note: Obtain {access_token} before API action (see authentication)
POST Parameters
| Key | Type | Value (Example) |
|---|---|---|
|
|
|
|
| JobRef* | String | MFGNROP1 |
|
|
|
|
| ___ | … | Any available fields for adding a job (see above). Not all fields are required but if they are defined as required they cannot be set to NULL. |
Curl Example
Responses
| Code | Description |
|---|---|
|
|
|
| 200 |
Successful response
Example Model
{
“status”: “success” “response”: “job has been updated successfully” “job_url”: “https://www.thebestconnection.co.uk/jobs/machine-operative__tad56dff” “apply_url”: “https://www.thebestconnection.co.uk/jobs/machine-operative__tad56dff?apply=true” } |
|
|
|
| 401 |
Invalid Signature response
Example Model
{
“status”:”error”, “error”:”INVALID_ACCESS_TOKEN”, “error_description”:”Invalid Access Token.” } |
|
|
|
| 401 |
Missing Authorization Header
Example Model
{
“status”:”error”, “error”:”MISSING_AUTHORIZATION_HEADER”, “error_description”:”Authorization header not received. Either authorization header was not sent or it was removed by your server due to security reasons. Check more details for the error on” } |
|
|
|
| 422 |
Missing Required Parameter
Example Model
{
“status”:”error”, “error”:”UNPROCESSABLE”, “error_description”:”The job ID or job ref parameter is missing” } |
4. Remove Jobs
To remove a job, see example below..
DELETE https://thebestconnection.co.uk/job-posts/tbc-api/v1/delete-job
Header *required
| Name | Value |
|---|---|
|
|
|
| TBCAuth | Bearer {access_token} |
Note: Obtain {access_token} before API action (see authentication)
POST Parameters
| Key | Type | Value (Example) |
|---|---|---|
|
|
|
|
| JobRef * | String | MFGNROP1 |
Curl Example
Responses
| Code | Description |
|---|---|
|
|
|
| 200 |
Successful response
Example Model
{
“status”: “success” “response”: “job has been deleted successfully” } |
|
|
|
| 401 |
Invalid Signature response
Example Model
{
“status”:”error”, “error”:”INVALID_ACCESS_TOKEN”, “error_description”:”Invalid Access Token.” } |
|
|
|
| 401 |
Missing Authorization Header
Example Model
{
“status”:”error”, “error”:”MISSING_AUTHORIZATION_HEADER”, “error_description”:”Authorization header not received. Either authorization header was not sent or it was removed by your server due to security reasons. Check more details for the error on” } |
|
|
|
| 422 |
Missing Required Parameter
Example Model
{
“status”:”error”, “error”:”UNPROCESSABLE”, “error_description”:”The job ID or job ref parameter is missing” } |
|
|
|
| 404 |
Missing Required Parameter
Example Model
{
“status”:”error”, “error”:”NOT FOUND”, “error_description”:”job was not found or has already been removed” } |
5. Other
| Key (Field) | Type | Description | Required | Allow NULL |
| ID | Integer | The ID shared between systems (The unique identifier) | Y | N |
| JobRef | String | Branch issued Ref (BranchCode+Ref) | Y | N |
| Title | String | Main job title | Y | N |
| Secondary | String | Secondary additional refined title | N | Y |
| Description | String | Full text in html as entered by the consultant for the position. (contains html) | Y | N |
| Updated | Date (YYYY-MM-DD HH:MM:SS) | Date last edited and approved | Y | N |
| Expiry | Date (YYYY-MM-DD) | Date Job Expires | Y | N |
| Type | String | Position term “Temporary” or “Permanent” | Y | N |
| Contract | String | Contract term “Full time” or “Part time” or “‘Full or Part time” | Y | N |
| PayRateMin | Float | Pay (min) | Y | N |
| PayRateMax | Float | Pay (max) | Y | N |
| PayText | String | Pay text in words e.g. “£11.74-17.61 per hour” | Y | N |
| PayPeriod | String | Pay period types “annum”, “month”, “week”, “day”, “hour” | Y | N |
| PayRateHow | String | How to achieve the max pay rate | N | Y |
| WeeklyHours | Float | Specific hours listed | N | Y |
| Sector | String | Job Sector name (should be consistant, for creating taxonamy) | Y | N |
| Requirements | String | List of requirements for the position (new method accepts string with HTML) | N | Y |
| Benefits | String | List of benefits for the position (new method accepts string with HTML) | N | Y |
| JobUrl | String | URL to job single page | N | N |
| ApplyUrl | String | URL used to apply | N | N |
| Aplitrak | String | Email address used for forwarding applications to. | Y | N |
| ContactNumber | String | Mobile & Contact details often out of hours | Y | N |
| ContactEmail | String | Branch email contact address to be used | Y | N |
| BranchCode | String (2) | TBC allocated BranchCode ref | Y | N |
| BranchName | String | Branch name listed | Y | N |
| PlanCode | String | TBC allocated plan code including BranchCode e.g. NEHGV1 | N | Y |
| Address | String | Address lineage, full address not always available | N | Y |
| Line1 | String | Address line 1 | N | Y |
| Line2 | String | Address line 2 | N | Y |
| TownCity | String | Town or City location | N | Y |
| Region | String | Region | N | Y |
| PostCode | String | Postcode of recruiter or branch if not available | Y | N |
| Latitude | String | Approx Latitude positioning | Y | N |
| Longitude | String | Approx Longitude positioning | Y | N |