Menu

Bulk upload specification

Document history
Date Version Description
11/05/2018 1.0 First version for launch.
13/07/2018 1.1 Addition of job vacancy expiry/deletion. Addition of Bulk Upload and Bulk Expiry feedback report. Removal of all deprecated fields from Universal Jobmatch. Country field deprecated.
30/08/2018 1.2 Updating vacancy xml field data types - “Welsh”, “Salary”, “Salary / Text”.
Addition of VacancyRefCode values in the feedback report.
Addition of new VacancyCategory field to Appendix 1.
Addition of VacancyCategory enumeration values to Appendix 2.
Addition of VacancyCategory entry in Appendix 3.
27/09/2018 1.3 Updated VacancyType options to include “id=3” for “Temporary” contract_type vacancies.
Adding vacancyRefCodes to Bulk Upload report example in Appendix 5.
01/10/2018 1.4 Addition of Appendix 7 including the XSD schema.
21/01/2019 1.5 Updated VacancyType options to include “id=4” for “Apprenticeship” contract_type vacancies.
Updated Appendix 7 the XSD schema to include the new option above.
20/02/2019 1.6 Updated to include new salary input methods and salary validation criteria.
Salary / Currency deprecated.
Schema updated accordingly.
Changes to Salary Min, Max, Frequency and Text descriptions in Appendix 1.
Addition of new enumeration value for salary frequency in Appendix 2.
Addition of Appendix 8 giving details of salary input methods and validation criteria.
19/03/2019 1.7 Updated to include VacancyExpiry field.
Addition of new rejection reasons relating to VacancyExpiry field.
Updated Appendix 3 to include VacancyExpiry.
Updated the XSD schema to include the new field above (Appendix 7).
Adding new footnote to sample bulk upload report relating to the treatment of volunteer jobs in Appendix 5.
09/05/2019 1.8 Removing footnote from sample bulk upload report relating to the treatment of volunteer jobs in Appendix 5.
21/08/2019 1.9 Adding new failure message for ads that have been deleted by the service management team.
30/03/2020 2.0 Adding new failure messages for:
  • ads that have been rejected due to multiple VacancyRefCodes in a feed
  • systems diagnostics failure message
Updating salary validation criteria in Appendix 8 to be in line with 2020/21 National Minimum Wage thresholds (which apply from 1st April 2020).
01/01/2021 2.1 Remove RecruitInternationally field. Appendix 9 added.
31/03/2021 2.2 Updating salary validation criteria in Appendix 8 to be in line with 2021/22 National Minimum Wage thresholds (which apply from 1st April 2021).
09/06/2021 2.3 Adding a new section on “Bulk Upload data retention” to notify bulk uploaders of auto-deletion of bulk upload data after 30 days.
20/10/2021 2.4 Updating VacancyCategory ids 11, 12 and 13.
14/12/2021 2.5 Added Social Care (ID: 177) category.
31/03/2022 2.6 Updating salary validation criteria in Appendix 8 to be in line with 2022/23 National Minimum Wage thresholds (which apply from 1st April 2022).
01/03/2023 2.7 Updating salary validation criteria in Appendix 8 to be in line with 2023/24 National Minimum Wage thresholds (which apply from 1st April 2023).
17/01/2024 2.8 Changing category id 27 description from “Teaching Jobs” to “Education Jobs”.
Updated number of categories in VacancyCategory description in Appendix 1.
28/02/2024 2.9 Updating salary validation criteria in Appendix 8 to be in line with 2024/25 National Minimum Wage thresholds (which apply from 1st April 2024).
04/04/2024 3.0 Updated to include VacancyRemote field.
Addition of new rejection reasons relating to VacancyRemote field.
Addition of new VacancyRemote field to Appendix 1.
Addition of VacancyRemote enumeration values to Appendix 2.
Updated Appendix 3 to include VacancyRemote.
Updated the XSD schema to include VacancyRemote (Appendix 7).
08/07/2024 3.1 Updating descriptions for VacancyRemote IDs in Appendix 2.
29/07/2024 3.2 Updating descriptions for Contact / Email and Contact / Phone in Appendix 1.
Changing category id 27 description from “Education Jobs” to “Education & Childcare Jobs”.
18/09/2024 3.3 Updating the Bulk Upload feedback report section to include feedback report generation time.
23/09/2024 3.4 Updating the feedback report generation time in the Bulk Upload feedback report section.
17/03/2025 3.5 Updating salary validation criteria in Appendix 8 to be in line with 2025/26 National Minimum Wage thresholds (which apply from 1st April 2025).

Summary

This document is for employers and third-parties working on behalf of employers who are looking to add job vacancies to the 'Find a job' service in an automated way.

The purpose of this document is to cover the process and technical details of Bulk Uploading job vacancies to the 'Find a job' service.

What is Bulk Uploading?

The standard way of posting job vacancies on the 'Find a job' service is to post them manually via the site’s web interface however, it is also possible to post job vacancies in an automated way via the Bulk Upload process.

Bulk Uploading is typically used by larger companies who have many concurrent job vacancies and/or companies who post their job vacancies to many different recruitment services.

When Bulk Uploading, the job vacancies must be put in an XML file and sent via Secure File Transfer Protocol (SFTP) to the 'Find a job' service where they will automatically get uploaded to the website therefore saving time and effort especially when posting job vacancies in large volumes.

Bulk Upload data can be sent to the 'Find a job' service either by the employer or via a third party such as a multi-posting company (e.g. Broadbean or Idibu) or an Applicant Tracking System (ATS) (e.g. Workable or RecruiterBox).

Getting started as a Bulk Uploader

The following process for getting setup as a Bulk Uploader assumes that you have already registered as an Employer and created a Company on the 'Find a job' service and that this has been verified for posting by the 'Find a job' support team.

As part of this process you must have accepted the terms and conditions of the 'Find a job' service.

If you are in this position, please follow the Bulk Uploader onboarding process in order to start Bulk Uploading job vacancies. Please note that only the administrator user for a Company can access the Bulk Uploader credentials:

Bulk Uploader onboarding steps
Step # Who Description
1 Employer user Open a web browser and navigate to the Employer section of the 'Find a job' service.
2 Employer user Login and navigate to the Company profile page of the company you wish to start Bulk Uploading for.
3 Employer user Scroll to the “Bulk Upload credentials” section and hit the “Request Bulk Upload credentials” button to send a support request to the 'Find a job' Support team.
N.B. Only the administrator Employer user of a company can request and view Bulk Upload details.
4 'Find a job' Support Receive request, validate details and send the Bulk Upload Specification document (what you are currently reading) to the Employer user.
5 'Find a job' Support Generate Bulk Upload credentials and add them to the Company profile on the 'Find a job' service for the administrator Employer user to see. Then inform the Employer user that the system is ready for them to start uploading XML files of jobs.
6 Employer user Review document and determine whether you are able to Bulk Upload job vacancies to the 'Find a job' service for your Company either directly or via a third party.
7 Employer user If the Employer cannot Bulk Upload job vacancies then inform the Support team and continue to use the web interface to post job vacancies.

If the Employer can Bulk Upload job vacancies then the Employer should complete any technical work required to start Bulk Uploading.
8 Employer user When the technical work to generate the Bulk Upload data is complete and the file validated against an XML checker (see Bulk Upload operation) then the Employer is ready to start Bulk Uploading data for the Company. At this point the Employer must log in to the 'Find a job' service and navigate to the Company profile page.
9 Employer user Scroll to the “Bulk Upload” section where the SFTP credentials will be visible.
10 Employer user Use the SFTP credentials supplied to start sending your job vacancies and deletions to 'Find a job' and they will be added to the site against your Company.

If you use a third party for uploading you will need to share these credentials with them.

As there is no externally available test environment for Bulk Uploading please load jobs to the live service when ready.

N.B. If you need to contact the 'Find a job' support team during this process please use the contact us option in the footer of the site.

Bulk Upload operations

Using the Bulk Upload process job vacancies can be posted, edited and deleted. Bulk Uploaded job vacancies will also automatically expire after 30 days unless a specific closing date is defined. These operations are described in more detail below:

Posting new job vacancies

New job vacancies can be added to the 'Find a job' service via the Bulk Upload service. Valid job vacancies will be added to the site as soon as they are processed however, there are a number of reasons why a job vacancy might fail to reach the website:

  1. Duplicates - if the system detects that the job vacancy is a duplicate of an existing live vacancy then the system will not post the duplicate.
  2. Bad words - if the system detects a rude/offensive word or malicious content within the job vacancy then the vacancy will not be put live.

Editing job vacancies

Job Vacancies can be edited via the Bulk Upload service using the “VacancyRefCode” field (see Appendix 1 - Job Vacancy fields) as a unique reference for the advert. If the VacancyRefCode for a job vacancy matches the value for an existing live advert for the company then the job vacancy will be modified to the updated content. The closing date for a vacancy can be edited using this method.

N.B. Bulk Uploaded job vacancies cannot be edited via the web interface.

Job vacancy expiry

All job vacancies expire after 30 days unless a specific expiry date is defined by the user or explicitly deleted using the Job deletion functionality.

Job vacancy deletion

Live job vacancies can be deleted from 'Find a job' service via the Bulk Upload service. If a vacancy is currently live on the website and is included within the expiry/delete file then it will be removed from the website. If the vacancy continues to be included in the job vacancy file however, it will be reinstated and put live again and therefore it is important that any vacancies that are included in the deletion file are also removed from the new/edit file.

Bulk Uploading new/edited vacancies

The 'Find a job' Bulk Upload process requires all new or edited job vacancies to be packaged into one or more XML files according to a specific format. This format is similar to and compatible with the version that was used on the previous Universal Jobmatch service in order that previously existing Bulk Uploaders do not need to change the content of the data that they are sending.

In order to ensure that the Bulk Uploaded job vacancies can be successfully uploaded to the 'Find a job' site the data must meet the following requirements:

  1. Job vacancy data should be put in one or more XML files.
  2. On initial upload the first XML file upload should ideally contain all live job vacancies (i.e. they are all new to the system).
  3. Subsequent XML files should contain all new job vacancies.
  4. The XML data must be well structured and a valid XML document.
  5. XML files must contain UTF-8 encoded data.
  6. XML files must be checked against an XML checker (e.g. https://www.xmlvalidation.com/(opens in new tab)).
  7. The XML data itself must contain the fields as specified in Appendix 1 - New/Edited Job Vacancy fields.
  8. If you do not have data for an optional XML tag then please leave the tag out rather than leaving the field empty.
  9. Avoid special characters in job vacancies because they can cause unexpected problems with job vacancies on the 'Find a job' service. This is especially so for XML special characters that must be escaped if included in job vacancies (please visit this site for more information - http://xml.silmaril.ie/specials.html(opens in new tab)).
  10. There is no specific naming convention for files but we strongly recommend using the format <company_name>-upload-<timestamp>.xml (e.g. MyCompanyName-upload-20180618-103412.xml). This will help with issue verification if required.

Bulk Uploading expired/deleted vacancies

The 'Find a job' Bulk Upload process for expired/deleted job vacancies is very similar to that for new or edited job vacancies and is similarly compatible with the version used on the previous Universal Jobmatch service.

In order to ensure that the Bulk Uploaded job vacancies can be successfully expired/deleted from the 'Find a job' site the data must meet the following requirements:

  1. Job vacancy expirations/deletions should be put in one or more XML files.
  2. XML files should contain all job vacancies to be removed from the Find a job site whether due to manual deletion or expiry (please note that any job not removed in this way will automatically expire from Find a job after 30 days).
  3. The XML data must be well structured and a valid XML document.
  4. XML files must contain UTF-8 encoded data.
  5. XML files must be checked against an XML checker (e.g. https://www.xmlvalidation.com/(opens in new tab)).
  6. The XML data itself must contain the fields as specified in Appendix 4 - Job Vacancy expiry/deletion fields.
  7. If you do not have data for an optional XML tag then please leave the tag out rather than leaving the field empty.
  8. Avoid special characters in job vacancies because they can cause unexpected problems with job vacancies on the 'Find a job' service. This is especially so for XML special characters that must be escaped if included in job vacancies (please visit this site for more information - http://xml.silmaril.ie/specials.html(opens in new tab)).
  9. There is no specific naming convention for files but we strongly recommend using the format <company_name>-expire-<timestamp>.xml (e.g. MyCompanyName-expire-20180618-103412.xml). This will help with issue verification if required.
  10. Please note that in order to keep a job vacancy expired/deleted from the Find a job site it must also be removed from the upload file for new/edited vacancies.

Sending Bulk Upload data

When the job vacancy data for new/edited vacancies and expired/deleted vacancies is packaged into one or more Bulk Upload files it must be sent to the ‘Inbound’ folder under your username on the 'Find a job' SFTP server. The credentials for your Company are displayed to the administrator Employer user on the Company profile page within the Employer pages of the 'Find a job' service. The process of sending data to the 'Find a job' service must meet the following rules:

  1. All XML data for the Company must be sent via SFTP to the “Inbound” folder on the SFTP server using the correct set of credentials. The 'Find a job' SFTP server is located at: sftp.findajob.dwp.gov.uk on Port 2222.
  2. In order to populate the 'Find a job' service with all job vacancies, the first new/edit file upload should contain all live job vacancies for the Company.
  3. All subsequent new/edit file uploads should only contain new/updated job vacancies.
  4. Data should be sent regularly - we recommend once per day.
  5. The 'Find a job' service will ingest new data on a daily basis.
  6. All updates will appear on the 'Find a job' service within 24 hours unless there is an issue with the service.

Bulk Upload data retention

All data in the ‘Processed’ and ‘Outbound’ files within your SFTP account will be deleted after 30 days of being uploaded and processed. Please note that this is so the service conforms with GDPR requirements and to retain optimal performance.

Bulk Upload feedback report

When a batch of Bulk Uploaded job vacancies is processed by the Find a job system, a report is generated detailing the number of vacancies that have been successfully posted and the number that have been rejected along with reasons for rejection. This report is generated in text-only format (.txt) and added to the “Outbound” folder on the SFTP server (please see Appendix 5 for an example report). This will take approximately 2 to 5 hours to be generated, depending on the size of your file and how many other files the system is processing at this time.

The Bulk Upload report is split into three sections:

  1. Header.
  2. Success messages.
  3. Failure messages.

Header

This section provides key information relating to the Bulk Upload run and the company initiating the Bulk Upload.

Message Details
Bulk Upload Report Report type.
Run ID: 11111 The ID of the Bulk Upload event.
Company ID: 22222 The ID of your company in the Find a job system.
Company Name: Your Company Ltd The name of your company in the Find a job system.
Timestamp:
2018-07-13 09:00:00
The date and time at which the Bulk Upload file was processed and the report generated.

Success messages

This section of the Bulk Upload report provides a summary of the ads that have successfully been posted.

Message Metric Details
Ads live from this feed
- 20.00% (20 out of 100)
Expressed as a percentage of all ads included in the Bulk Upload file (%) Ads in this Bulk Upload file that are now posted live.
Ads added or updated in this run
- 12.00% (12 out of 100)
Expressed as a percentage of all ads included in the Bulk Upload file (%) New ads, not included in any previous Bulk Upload file that have successfully been posted to live or existing ads that were updated in this Bulk Upload file.
Ads from previous runs
- 8.00% (8 out of 100)
Expressed as a percentage of all ads included in the Bulk Upload file (%) Old ads that have been included in previous Bulk Upload files that are still in a posted state.

Failure messages

This section of the Bulk Upload report provides a summary of the ads that have been rejected grouped by the reason for rejection. The VacancyRefCode for each rejected ad is listed below the reason for rejection.

Message Metric Details
Ads rejected
- 80.00% (80 out of 100)
Expressed as a percentage of all ads included in the Bulk Upload file (%) Ads included in the Bulk Upload file that have not been posted live.
- description below 100 characters: XX Number of ads Ads that do not have the minimum 100 characters in the description field.
- inappropriate phrase used: XX Number of ads Ads that have an inappropriate phrase in one or more fields.
- incorrect ApplyMethod value: XX Number of ads Ads that have an invalid ApplyMethod value.
- incorrect ApplyUrl value: XX Number of ads Ads that have an invalid ApplyUrl value.
- incorrect VacancyStatus value: XX Number of ads Ads that have an invalid VacancyStatus value.
- incorrect VacancyType value: XX Number of ads Ads that have an invalid VacancyType value.
- missing ApplyUrl: XX Number of ads Ads that are missing an ApplyUrl.
- missing contact info: XX Number of ads Ads that are missing contact information.
- missing $field: XX Number of ads Ads that are missing a mandatory field e.g. title, description, etc.
- title above 100 characters: XX Number of ads Ads that have more than the maximum 100 characters in the title field.
- salary min below national minimum wage Number of ads Ads that have a salary min value below the National Minimum Wage
- salary max below national minimum wage Number of ads Ads that have a salary max value below the National Minimum Wage
- salary min and max below national minimum wage Number of ads Ads that have salary min and max values below the National Minimum Wage
- salary min must be in standard UK decimal format Number of ads Ads that have a salary min value in an unsupported format
- salary max must be in standard UK decimal format Number of ads Ads that have a salary max value in an unsupported format
- salary frequency specified but missing salary min Number of ads Ads that have a salary frequency value but no salary min value
- salary min specified but missing salary frequency Number of ads Ads that have a salary min value but no salary frequency value
- salary max less than salary min Number of ads Ads that have a salary max value that is less than the salary min value
- salary frequency needs to be a number from 1 to 7 Number of ads Ads that have a salary frequency value in an unsupported format
- salary min missing in salary range Number of ads Ads that have a salary max and frequency value but are missing a salary min value
- closing date must be between posting/editing date +1 day and posting date +30 days Number of ads Ads that have a VacancyExpiry date that is in the past, the same as the posting/editing date, or after the posting date +30 days.
- incorrect VacancyExpiry value Number of ads Ads that have a VacancyExpiry value that is not in the correct format (i.e. YYYY-MM-DD)
- in deleted state Number of ads Ads that have been deleted by the service management team
- VacancyRefCode duplicates: XX Number of ads Ads that have a duplicate VacancyRefCode value i.e. it has been used already in the same XML feed.
- system diagnostics: failed to digest internal <field name> field Number of ads A value in the xml feed has failed to be digested. The field cited is an internal system field. This failure message is to enable the system administrator to carry out internal diagnostics.
- system error: XX Number of ads A system error has occurred when processing this ad.
- incorrect VacancyRemote value: XX Number of ads Ads that have an invalid VacancyRemote value.

Inappropriate phrases

This section of the Bulk Upload report provides a summary of any inappropriate phrases used in ads, grouped by phrase. The VacancyRefCode of the ad that included the inappropriate phrase is detailed under each phrase. If a vacancy has an inappropriate phrase in one or more field the report will detail the phrase, the number of instances and the field in which it occurred:

Message Metric Details
List of inappropriate phrases detected
- inappropriate text in $field (e.g. title):
- sauna: XX
- xxxxx: XX
Number of ads Ads detected with inappropriate phrases in the title field with details of each phrase.
List of inappropriate phrases detected
- inappropriate text in $field (e.g. description):
- sauna: XX
- xxxxx: XX
Number of ads Ads detected with inappropriate phrases in the description field with details of each phrase.

Rejected ads summary

If any ads were rejected by the Find a job system, then a summary of all the vacancyRefCode values of the rejected ads will be found at the end of the report.

Bulk Expiry feedback report

When a Bulk Expiry file is processed by the Find a job system, a report is generated detailing the number of vacancies that have been successfully expired. This report is generated in text-only format (.txt) and added to the “Outbound” folder on the SFTP server (please see Appendix 6 for an example report).

The Bulk Expiry report is split into two sections:

  1. Header.
  2. Success message.

Header

This section provides key information relating to the Bulk Expiry run and the company initiating the Bulk Expiry.

Message Details
Bulk Expiry Report Report type.
Run ID: 11111 The ID of the Bulk Expiry event.
Company ID: 22222 The ID of your company in the Find a job system.
Company Name: Your Company Ltd The name of your company in the Find a job system.
Timestamp: 2018-07-13 09:00:00 The date and time at which the Bulk Expiry file was processed and the report generated.

Success messages

This section of the Bulk Expiry report provides a summary of the ads that have successfully been expired.

Message Metric Details
Ads expired: 95.00%
(95 out of 100)
Expressed as a percentage of all ads included in the Bulk Expiry file (%) Ads that have been expired by this Bulk Expiry file. Please note this will not include vacancies that have already automatically expired or been deleted.

Appendix 1 - New/Edited Job Vacancy fields

The following list defines all of the XML tags and attributes used to define a file of new/edited Job Vacancies to the 'Find a job' service. The tags are displayed in the order that your XML should be formatted in:

N.B. There are a number of tags in the table that have been deprecated. These are still in the document because we want to maintain backwards compatibility with job vacancy XML files that were generated for the previous 'Find a job' service.

Field Name
(Listed in order)
Mandatory / Optional Data Type Min/Max Character Length Description of the field Tag example
XML declaration Mandatory N/A N/A Not strictly a field but this is placed at the top of the XML to declare that the content is XML <?xml version="1.0" encoding="UTF-8"?>
Vacancies Mandatory N/A N/A A parent tag which contains all job vacancies within this file. <Vacancies>
  <Vacancy>
    ... </...>
    ... </...>
    ... </...>
  </Vacancy>
</Vacancies>
Vacancy Mandatory N/A N/A A parent tag which contains all data about a specific job vacancy. <Vacancy>
  ... </...>
  ... </...>
  ... </...>
</Vacancy>
VacancyRefCode Mandatory String Max: 50 An attribute of the Vacancy tag which acts as the external identifier of the job vacancy. Must be unique to the job vacancy within the company and is used to determine a job vacancy should be added or edited. No special characters allowed. <Vacancy vacancyRefCode="#XYZ123456">
Title Mandatory String Max: 100 The title of the job vacancy <Title>Title of the job vacancy</Title>
Description Mandatory String Min: 100
Max: 65k
The description of the job vacancy. Please do not include HTML in this. <Description>A full description of the job vacancy being posted to the 'Find a job' service.</Description>
Location Mandatory N/A N/A A parent tag which contains all of the other location based content. <Location>
  ... </...>
  ... </...>
  ... </...>
</Location>
Location / StreetAddress Optional String Max: 200 The street address of the job vacancy <StreetAddress>24 High Street</StreetAddress>
Location / City Optional String Max: 50 The city of the job vacancy <City>Plymouth</City>
Location / State(region) Optional String Max: 50 The county of the job vacancy <State>Devon</State>
Location / PostalCode Mandatory String Max: 25 The full postcode of the job vacancy. <PostalCode>PL1 4AT</PostalCode>
Contact Optional N/A N/A A parent tag which contains all of the other contact information.

This field is only required if using ApplyMethod “3” (see below)
<Contact>
  ... </...>
  ... </...>
  ... </...>
</Contact>
Contact / Name Optional String Max: 100 The name of the person hiring <Name>John Doe</Name>
Contact / Address Optional N/A N/A A parent tag which contains all address information. <Address>
  <...> </...>
  <...> </...>
</Address>
Contact / Address / StreetAddress Optional String Max: 200 The street address of the person hiring <StreetAddress>53-64 Kings Lane</StreetAddress>
Contact / Address / City Optional String Max: 50 The city of the person hiring <City>Leeds</City>
Contact / Address / State Optional String Max: 50 The county of the person hiring <State>West Yorkshire</State>
Contact / Address / PostalCode Optional String Max: 25 The postcode of the person hiring <PostalCode>LS5 8DW</PostalCode>
Contact / Address / Country Optional String Max: 50 The country of the person hiring <Country>UK</Country>
Contact / Email Optional String Max: 80 The email address of the person hiring

This field is only required if using ApplyMethod “3” (see below)
<Email>johndoe@company.co.uk</Email>
Contact / Website Optional String Max: 80 The URL of the website of the company hiring <WebSite>www.gov.uk</WebSite>
Contact / Phone Optional String Max: 25 The phone number of the person hiring

This field is only required if using ApplyMethod “3” (see below)
<Phone>01420420420</Phone>
Contact / Fax Optional String Max: 25 The fax number of the person hiring <Fax>01420420430</Fax>
Welsh Optional N/A N/A A tag containing two Welsh related attributes <Welsh/>
Welsh / iswelsh Optional Boolean (Lower case)
true OR false
N/A An attribute of the Welsh tag which tells the system that this vacancy is written in Welsh. isWelsh="false"
Welsh / translationAssistanceRequired Optional Boolean (Lower case)
true OR false
N/A An attribute of the Welsh tag which tells the DWP helpdesk that this role needs translating from Welsh to English or English to Welsh. translationAssistanceRequired="false"
Salary Optional N/A N/A A parent tag which contains all of the other salary information. <Salary>
  <...> </...>
  <...> </...>
  <...> </...>
</Salary>
Salary / Min Optional - Mandatory if Salary / Frequency is defined Decimal N/A The fixed salary for the job vacancy or the minimum value for a salary range. If specified, Salary / Frequency must also be specified. Must comply with National Minimum Wage law. Please see Appendix 8 for more details on salary input and validation criteria. <Min>20000.00</Min>
Salary / Max Optional - Mandatory if Salary / Min is defined Decimal N/A The maximum value for a salary range. If specified, Salary / Min must also be specified. Must comply with National Minimum Wage law. Please see Appendix 8 for more details on salary input and validation criteria. <Max>30000.00</Max>
Salary / Frequency Optional - Mandatory if Salary / Min is defined Enumeration
(Appendix 2)
See appendix The frequency of salary for the job vacancy – the id attribute defines the enumeration value. If specified, Salary / Min must also be specified. Please see Appendix 8 for more details on salary input and validation criteria. <Frequency id="1" />
Salary / Text Optional String Max: 255 A string of text to be appended to the salary as additional salary information. This field should only be used for supplementary information related to the compensation arrangement for the role (such as allowances, bonuses and pension contributions) and should not be used to input fixed salaries or salary ranges. Please see Appendix 8 for more details on salary input and validation criteria. <Text>Plus bonus</Text>
VacancyCategory Optional Enumeration
(Appendix 2)
N/A The category of the job vacancy. There are 30 categories. If a category is not specified, the job vacancy will be automatically categorised based on keywords in the content of the job title and description fields. Please refer to Appendix 2 for more details on job categories. <VacancyCategory id="1" />
VacancyExpiry Optional String
YYYY-MM-DD
Min: 8
Max: 10
Optional expiry date for the ad. The date specified should be after the posting/editing date and before the maximum 30 day threshold. If the posting date specified is not between the posting/editing date +1 day and the posting date +30 days, then the ad will be rejected and a rejection reason detailed in the feedback report file. If left empty the ad will expire by default after 30 days of being posted. <VacancyExpiry>2019-04-30</VacancyExpiry>
VacancyType Mandatory Enumeration
(Appendix 2)
See appendix Whether the job vacancy is temporary, permanent, contract or an apprenticeship - the id attribute defines the enumeration value. <VacancyType id="1" />
VacancyStatus Mandatory Enumeration
(Appendix 2)
See appendix Whether the job vacancy is full time or part time – the id attribute defines the enumeration value. <VacancyStatus id="1" />
ApplyUrl Optional String Max: 2500 URL for applications if the application for the job vacancy is hosted on an external website. Please include http:// or https:// on all URLs.

This field is only required if using Apply Method “2” (see below).
<ApplyUrl>http://www.company.com/apply?id=123123</ApplyUrl>
ApplyMethod Mandatory Enumeration
(Appendix 2)
See appendix Defines how to receive applications for the job vacancy. There are three possible values and only one should be chosen:

“2” Apply via a URL to your system
“3” Apply via contact details provided (email, phone)

Please refer to Appendix 2 for more details on application methods.
<ApplyMethod id="2" />
VacancyRemote Optional Enumeration
(Appendix 2)
See appendix Defines the remote working arrangement for the job vacancy – either fully remote, hybrid remote or on-site only. There are 7 possible values. Please refer to Appendix 2 for more details on remote working options. <VacancyRemote id="1" />

Appendix 2 - Enumeration values

This section details all of the enumeration values for the job vacancy XML data defined in Appendix 1 - Job Vacancy fields. When adding this content to the XML please only provide the number (column 1) and not the description of the value (column 2).

Salary/Frequency

These are the possible values for the Salary/Frequency id attribute:

ID Description
1 Annual salary
2 Hourly salary (per hour)
3 Weekly salary (per week)
4 Monthly salary (per month)
5 Fortnightly salary
6 Daily salary (per day)
7 Annual salary pro rata (per year pro rata)

VacancyCategory

These are the possible values for the VacancyCategory id attribute:

ID Description
1 Accounting & Finance Jobs
2 Admin Jobs
3 Agriculture, Fishing & Forestry Jobs
4 Consultancy Jobs
5 Creative & Design Jobs
6 Customer Service Jobs
7 Domestic Help & Cleaning Jobs
8 Energy, Oil & Gas Jobs
9 Engineering Jobs
10 Graduate Jobs
11 HR & Recruitment Jobs
12 Healthcare & Nursing Jobs
13 Hospitality & Catering Jobs
14 IT Jobs
15 Legal Jobs
16 Logistics & Warehouse Jobs
17 Maintenance Jobs
18 Manufacturing Jobs
19 Other/General Jobs
20 PR, Advertising & Marketing Jobs
21 Property Jobs
22 Retail Jobs
23 Sales Jobs
24 Scientific & QA Jobs
25 Security & Protective Services Jobs
26 Social Work Jobs
27 Education & Childcare Jobs
28 Trade & Construction Jobs
29 Travel Jobs
177 Social Care Jobs

VacancyType

These are the possible values for the VacancyType id attribute:

ID Description
1 Permanent
2 Contract
3 Temporary
4 Apprenticeship

VacancyStatus

These are the possible values for the VacancyStatus id attribute:

ID Description
1 Full time
2 Part time

ApplyMethod

These are the possible values for the ApplyMethod id attribute:

ID Description
2 Apply via an external URL - apply button takes the user to a separate website
3 Apply via supplied contact details (email, telephone) - details are shown below the job description

VacancyRemote

These are the possible values for the VacancyRemote id attribute:

ID Description
1 On-site only, on the road or in the field
This job can either only be done at a designated place of work, such as an office, or at temporary/continuously changing locations
2 Fully remote
No on-site, on the road or in the field work required (can work from home all of the time)
3 Hybrid - work remotely up to 1 day per week
This job can be done from home or another location of the employee’s choosing up to 1 day per week. The remaining days should be at a designated place of work, such as an office, or based out on the road or in the field
4 Hybrid - work remotely up to 2 days per week
This job can be done from home or another location of the employee’s choosing up to 2 days per week. The remaining days should be at a designated place of work, such as an office, or based out on the road or in the field
5 Hybrid - work remotely up to 3 days per week
This job can be done from home or another location of the employee’s choosing up to 3 days per week. The remaining days should be at a designated place of work, such as an office, or based out on the road or in the field
6 Hybrid - work remotely up to 4 days per week
This job can be done from home or another location of the employee’s choosing up to 4 days per week. The remaining days should be at a designated place of work, such as an office, or based out on the road or in the field
7 Hybrid - work remotely up to 5 days per week
This job can be done from home or another location of the employee’s choosing up to 5 days per week. The employee has the option of doing this job at a designated place of work, such as an office, or based out on the road or in the field

Appendix 3 - Example job vacancy

Below is an example of the job vacancy XML data for the 'Find a job' service. The find a job service will accept any jobs that contain extra fields - particularly those that were part of the Universal Jobmatch specification however, it will ignore any fields that are not part of this specification.

Example job vacancy XML:

            
              <?xml version="1.0" encoding="UTF-8"?>
              <Vacancies>
                <Vacancy vacancyRefCode="#XYZ123456">
                  <Title>Title of the job vacancy</Title>
                  <Description>A full description of the job vacancy being posted to the 'Find a job' service.</Description>
                  <Location>
                    <PostalCode>PL1 4AT</PostalCode>
                  </Location>
                  <Welsh isWelsh="false" translationAssistanceRequired="false" />
                  <Salary>
                    <Min>20000.00</Min>
                    <Max>30000.00</Max>
                    <Frequency id="1" />
                    <Text>Plus bonus</Text>
                  </Salary>
                  <VacancyType id="1" />
                  <VacancyStatus id="1" />
                  <VacancyCategory id="1" />
                  <VacancyExpiry>2019-04-30</VacancyExpiry>
                  <ApplyUrl>http://www.company.com/apply?id=123123</ApplyUrl>
                  <ApplyMethod id="2" />
                  <VacancyRemote id="1" />
                </Vacancy>
              </Vacancies>
            
          

Appendix 4 - Job Vacancy expiry/deletion fields

The following list defines all of the XML tags and attributes used to define a file of expired/deleted Job Vacancies that are to be removed from the 'Find a job' service. The tags are displayed in the order that your XML should be formatted in:

Field Name
(Listed in order)
Mandatory / Optional Data Type Min/Max Character Length Description of the field Tag example
XML declaration Mandatory N/A N/A Not strictly a field but this is placed at the top of the XML to declare that the content is XML <?xml version="1.0" encoding="UTF-8"?>
ExpireVacancies Mandatory N/A N/A A parent tag which contains all job vacancies to be expired/deleted within this file. <ExpireVacancies>
  <...> </...>
  <...> </...>
</ExpireVacancies>
ExpireVacancy Mandatory N/A N/A A parent tag which a specific job vacancy to be expired/deleted. <ExpireVacancy/>
VacancyRefCode Mandatory String Max: 50 An attribute of the Vacancy tag which acts as the external identifier of the job vacancy. Must be unique to the job vacancy within the company and is used to determine which job vacancy should be expired/deleted. No special characters allowed. vacancyRefCode="#XYZ123458"

An example of a job vacancy deletion/expiry file is:

            
              <?xml version="1.0" encoding="UTF-8"?>
              <ExpireVacancies>
                <ExpireVacancy vacancyRefCode="#XYZ123456"/>
                <ExpireVacancy vacancyRefCode="#XYZ123457"/>
                <ExpireVacancy vacancyRefCode="#XYZ123458"/>
              </ExpireVacancies>
            
          

Appendix 5 - Example Bulk Upload report

Below is an example of a text-only Bulk Upload report that will be generated by the 'Find a job' service.

Example Bulk Upload report:

Bulk Upload Report
Run ID: 11111
Company ID: 22222
Company name: Your Company Ltd
Timestamp: 2018-07-13 09:00:00

Ads live from this feed: 99.00% (990 out of 1000)
- ads added in this run: 89.00% (890 out of 1000)
- ads from previous runs: 10.00% (100 out of 1000)

Ads rejected: 1.00% (10 out of 1000)

  • - description below 100 characters: 1
    • - AB-D-123
  • - inappropriate phrase used: 2
    • - AC-8134
    • - CB-5633
  • - incorrect VacancyType value: 1
    • - 192356758
  • - missing ApplyUrl: 1
    • - 4543967
  • - missing contact info: 1
    • - BB-3451
  • - system error: 4

List of inappropriate phrases detected*

  • - inappropriate text in description:
    • - sauna: 1
      • - AC-8134
    • - assassin: 1
      • - CB-5633

Summary of vacancyRefCodes of rejected ads:
AB-D-123, AC-8134, CB-5633, 192356758, 4543967, BB-3451

* Please contact support if you believe a phrase has been used legitimately.

Appendix 6 - Example Bulk Expiry report

Below is an example of a text-only Bulk Expiry report that will be generated by the 'Find a job' service.

Example Bulk Expiry report:

Bulk Expiry Report
Run ID: 11111
Company ID: 22222
Company name: Your Company Ltd
Timestamp: 2018-07-13 09:00:00

Ads expired: 95.00% (95 out of 100)

Appendix 7 - XML Schema Definition

Below is the XML schema definition (XSD) that formally specifies the structure and element contents of a well defined XML feed for the bulk upload service:

            
              <xs:schema targetNamespace="findajob_bu" attributeFormDefault="unqualified" 
elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="Vacancies"> <xs:complexType> <xs:all> <xs:element name="Vacancy"> <xs:complexType> <xs:all> <xs:element name="Title"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:maxLength value="100"/> </xs:restriction> </xs:simpleType> </xs:element> <xs:element name="Description"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:minLength value="100"/> <xs:maxLength value="65000"/> </xs:restriction> </xs:simpleType> </xs:element> <xs:element name="Location"> <xs:complexType> <xs:all> <xs:element name="StreetAddress" minOccurs="0"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:maxLength value="200"/> </xs:restriction> </xs:simpleType> </xs:element> <xs:element name="City" minOccurs="0"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:maxLength value="50"/> </xs:restriction> </xs:simpleType> </xs:element> <xs:element name="State" minOccurs="0"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:maxLength value="50"/> </xs:restriction> </xs:simpleType> </xs:element> <xs:element name="PostalCode"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:maxLength value="25"/> </xs:restriction> </xs:simpleType> </xs:element> </xs:all> </xs:complexType> </xs:element> <xs:element name="Contact" minOccurs="0"> <xs:complexType> <xs:all> <xs:element name="Name" minOccurs="0"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:maxLength value="200"/> </xs:restriction> </xs:simpleType> </xs:element> <xs:element name="Address" minOccurs="0"> <xs:complexType> <xs:all> <xs:element name="StreetAddress" minOccurs="0"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:maxLength value="200"/> </xs:restriction> </xs:simpleType> </xs:element> <xs:element name="City" minOccurs="0"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:maxLength value="50"/> </xs:restriction> </xs:simpleType> </xs:element> <xs:element name="State" minOccurs="0"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:maxLength value="50"/> </xs:restriction> </xs:simpleType> </xs:element> <xs:element name="PostalCode" minOccurs="0"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:maxLength value="25"/> </xs:restriction> </xs:simpleType> </xs:element> <xs:element name="Country" minOccurs="0"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:maxLength value="50"/> </xs:restriction> </xs:simpleType> </xs:element> </xs:all> </xs:complexType> </xs:element> <xs:element name="Email" minOccurs="0"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:maxLength value="80"/> </xs:restriction> </xs:simpleType> </xs:element> <xs:element type="xs:anyURI" name="Website" minOccurs="0"/> <xs:element name="Phone" minOccurs="0"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:maxLength value="25"/> </xs:restriction> </xs:simpleType> </xs:element> <xs:element name="Fax" minOccurs="0"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:maxLength value="25"/> </xs:restriction> </xs:simpleType> </xs:element> </xs:all> </xs:complexType> </xs:element> <xs:element name="Welsh" minOccurs="0"> <xs:complexType> <xs:attribute name="isWelsh"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:enumeration value="true"/> <xs:enumeration value="false"/> </xs:restriction> </xs:simpleType> </xs:attribute> <xs:attribute name="translationAssistanceRequired"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:enumeration value="true"/> <xs:enumeration value="false"/> </xs:restriction> </xs:simpleType> </xs:attribute> </xs:complexType> </xs:element> <xs:element name="Salary" minOccurs="0"> <xs:complexType> <xs:all> <xs:element type="xs:float" name="Min" minOccurs="0"/> <xs:element type="xs:float" name="Max" minOccurs="0"/> <xs:element name="Frequency" minOccurs="0"> <xs:complexType> <xs:attribute name="id"> <xs:simpleType> <xs:restriction base="xs:integer"> <xs:enumeration value="1"/> <xs:enumeration value="2"/> <xs:enumeration value="3"/> <xs:enumeration value="4"/> <xs:enumeration value="5"/> <xs:enumeration value="6"/> <xs:enumeration value="7"/> </xs:restriction> </xs:simpleType> </xs:attribute> </xs:complexType> </xs:element> <xs:element type="xs:string" name="Text" minOccurs="0"/> </xs:all> </xs:complexType> </xs:element> <xs:element type="xs:date" name="VacancyExpiry" minOccurs="0"/> <xs:element name="VacancyType"> <xs:complexType> <xs:attribute name="id" use="required"> <xs:simpleType> <xs:restriction base="xs:integer"> <xs:enumeration value="1"/> <xs:enumeration value="2"/> <xs:enumeration value="3"/> <xs:enumeration value="4"/> </xs:restriction> </xs:simpleType> </xs:attribute> </xs:complexType> </xs:element> <xs:element name="VacancyStatus"> <xs:complexType> <xs:attribute name="id" use="required"> <xs:simpleType> <xs:restriction base="xs:integer"> <xs:enumeration value="1"/> <xs:enumeration value="2"/> </xs:restriction> </xs:simpleType> </xs:attribute> </xs:complexType> </xs:element> <xs:element name="VacancyCategory"> <xs:complexType> <xs:attribute name="id"> <xs:simpleType> <xs:restriction base="xs:integer"> <xs:enumeration value="1"/> <xs:enumeration value="2"/> <xs:enumeration value="3"/> <xs:enumeration value="4"/> <xs:enumeration value="5"/> <xs:enumeration value="6"/> <xs:enumeration value="7"/> <xs:enumeration value="8"/> <xs:enumeration value="9"/> <xs:enumeration value="10"/> <xs:enumeration value="11"/> <xs:enumeration value="12"/> <xs:enumeration value="13"/> <xs:enumeration value="14"/> <xs:enumeration value="15"/> <xs:enumeration value="16"/> <xs:enumeration value="17"/> <xs:enumeration value="18"/> <xs:enumeration value="19"/> <xs:enumeration value="20"/> <xs:enumeration value="21"/> <xs:enumeration value="22"/> <xs:enumeration value="23"/> <xs:enumeration value="24"/> <xs:enumeration value="25"/> <xs:enumeration value="26"/> <xs:enumeration value="27"/> <xs:enumeration value="28"/> <xs:enumeration value="29"/> </xs:restriction> </xs:simpleType> </xs:attribute> </xs:complexType> </xs:element> <xs:element type="xs:anyURI" name="ApplyUrl" minOccurs="0"/> <xs:element name="ApplyMethod"> <xs:complexType> <xs:attribute name="id" use="required"> <xs:simpleType> <xs:restriction base="xs:integer"> <xs:enumeration value="2"/> <xs:enumeration value="3"/> </xs:restriction> </xs:simpleType> </xs:attribute> </xs:complexType> </xs:element> <xs:element name="VacancyRemote" minOccurs="0"> <xs:complexType> <xs:attribute name="id" use="required"> <xs:simpleType> <xs:restriction base="xs:integer"> <xs:enumeration value="1"/> <xs:enumeration value="2"/> <xs:enumeration value="3"/> <xs:enumeration value="4"/> <xs:enumeration value="5"/> <xs:enumeration value="6"/> <xs:enumeration value="7"/> </xs:restriction> </xs:simpleType> </xs:attribute> </xs:complexType> </xs:element> </xs:all> <xs:attribute type="xs:string" name="vacancyRefCode" use="required"/> </xs:complexType> </xs:element> </xs:all> </xs:complexType> </xs:element> </xs:schema>

Appendix 8 - Salary Input & Validation

Salary Input

Bulk Uploaders can specify either a fixed salary or salary range along with salary frequency and additional salary information.

Salary input is optional. So, Bulk Uploaders can opt not to specify a salary or additional salary information. They can also opt to specify only additional salary information with no fixed salary or salary range.

Fixed Salary

To specify a fixed salary, Bulk Uploaders will need to specify a value in the Salary/Min field (e.g. <Min>12.21</Min>) and a frequency value (e.g. <Frequency id="2" />) in the Salary/Frequency field.

Please note, when specifying a fixed salary, omitting either the Salary/Min value or the Salary/Frequency value will result in the ad being rejected. Any rejections will be detailed with the corresponding VacancyRefCode in the bulk feedback report.

Salary Range

Employers can opt to specify a salary range by adding values into the Salary/Min, Salary/Max and Salary/Frequency fields.

Please note, when specifying a salary range, omitting either the Salary/Min value or the Salary/Frequency value will result in the ad being rejected. Omitting the Salary/Max value will result in a fixed salary being specified.

The Salary/Min and Salary/Max fields will only accept UK standard decimal format (i.e. numbers, comma and decimal point). For example ‘1,234.56’, ‘1,234’ or ‘1234.56’ would be accepted, whereas ‘£123’, ‘up to 123’, '1234.5678' or ‘10-20’ would all be rejected.

Additional Salary Information

Employers can also specify additional salary information (such as allowances, bonuses and pension contributions) via the Salary/Text field. Please note, this field should only be used for supplementary information related to the compensation arrangement for the role and should not be used to input fixed salaries or salary ranges.

Salary Validation

Salaries that have been specified via bulk (or manual) upload will now be checked to ensure they are compliant with National Minimum Wage Law (please see here for more details: https://www.gov.uk/national-minimum-wage-rates(opens in new tab)). Ads that do not comply will be rejected. The reason for the rejection along with the VacancyRefCode of the ad will be detailed in the bulk feedback report.

Fixed Salary

When entering a fixed salary, the value must be at least up to £12.21 per hour to meet the National Minimum Wage.

Salary Range

When entering a salary range, the salary must be at least £7.55 per hour to meet the National Minimum Wage for people under 18; and up to at least £12.21 per hour to meet the National Minimum Wage for people aged 21 and over.

Other salary frequencies will also be validated where the role is specified as full-time (please see the validation criteria below for more details). Where the role is specified as part-time, only Per hour frequencies will be validated.

Apprenticeship

Employers can now specify a job type of "Apprenticeship" in addition to the existing job types of "Permanent", "Temporary" and "Contract". This can be specified in a bulk upload xml by adding an ID of "4" in the VacancyType field.

If a job type of "Apprenticeship" is specified, the salary (whether fixed or range) must be at least £7.55 per hour to meet the National Minimum Wage for apprenticeships.

Validation Criteria

The table below details the rates to be used for salary validation at the various frequencies and thresholds:

Minimum wage breakdown by frequency and age group
Frequency Apprentice Under 18 Over 21 Calculation
Per hour (H) £7.55 £7.55 £12.21 (H)×1
Per day £45.30 £45.30 £73.26 (H)×6
Per week £226.50 £226.50 £366.30 (H)×6×5
Per fortnight £453.00 £453.00 £732.60 (H)×6×10
Per month £981.50 £981.50 £1,587.30 (H)×6×5×52/12
Per year £11,778.00 £11,778.00 £19,047.60 (H)×6×5×52
Per year, pro rata £11,778.00 £11,778.00 £19,047.60 (H)×6×5×52

Appendix 9 - decommissioning of the EURES integration

As the UK has now left the European Union, we no longer send ads posted on the Find a job service to the EURES jobs portal. As such, the “RecruitInternationally” field has been removed from this specification. The system will now ignore this field if it is included in a bulk upload xml file.