Our Recruitment API allows third-party apps to manage applicants and credential documents. Were you looking to make your recruitment data available to third-party systems, like Zapier? Try our App Connect API instead.
Note that any updates done through the API will not result in updates to connected systems. This is to avoid an infinite loop of updates. Instead, we assume that the caller will handle updating any related data.
To use our Recruitment API, you will need to create an API key. Log in to Account Manager and navigate to Settings > Recruitment > API Keys. Make sure to give your API Key a descriptive name as it will appear in the history for all requests.
Note: The scope of the API key will cover all the data for an organisation. This is different from an App Connect API Key, which only covers data pertaining to the user account it belongs to.
You should create a separate key for each consumer of the api, that way you can update or disable each service without having to update the others.
The API key should be included in the Authorization header of your HTTP requests as a Bearer token.
POST /applicants/create Query Parameters: INTEGER recruitmentFlowId INTEGER selectedManagerId (optional) STRING email STRING greetingTitle (optional) STRING firstName STRING lastName DATE dateOfBirth (optional) STRING phone (optional) STRING address (optional) STRING address2 (optional) ANSWERS (array, optional) INTEGER questionId (optional) INTEGER selectionId (optional) STRING questionText STRING answer
To submit an application, we only need the basic contact details (name and email). We require a reference to an existing recruitment flow for the organisation (recruitmentFlowId), but the structure of the answers doesn't need to match up with what's on the given recruitment flow.
You can submit an application with no answers, and any answer requires only a question/answer text. The question and answer text don't need to match up with what's on the recruitment flow. You can optionally include a questionId to match up with an existing question on the flow, and a selectionId to match an existing response option for that question. You may prefer to include this information to allow for more accurate reporting later on.
Headers: Authorization: Bearer [Your API Key] Request https://lms.qintil.com/connect/v1/recruitment/applicants/create Request Example: { "recruitmentFlowId": 21989, "selectedManagerId": 5, "email": "person@example.com", "firstName": "Tom", "lastName": "Smith", "address": "1 Baker St., London, UK", "answers": { "questionId": 17, "selectionId": 235, "questionText": "You can enter any question text here", "answer": "Any response will work" } } Response Example: { "success": true, "message": "Document created successfully." "applicationId": 658439, "token": "vnw89-2983jfm-avjnkww-2093598j", "slug": "recruitment-flow-identifier" }
GET /applicants/active Query Parameters: INTEGER page (optional)
This endpoint returns the list of active applications for all recruiters (archived applications are excluded). Results are paged, returning newest results first, and the page parameter is optional.
Headers: Authorization: Bearer [Your API Key] Request https://lms.qintil.com/connect/v1/recruitment/applicants/active?page=7 Response Example: [ { "id": 180120, "startDate": "2025-09-16T15:19:25.25", "greetingTitle": "Mr", "firstName": "Sean", "lastName": "Thoma", "scoreTally": 0, "recruitmentFlowId": 71, "recruitmentFlowName": "DEMO - Application Flow", "email": "Sean@example.com", "phone": "89426465456151", "address": "99 Lane Head Rd, Shepley, Huddersfield HD8 8AD, UK", "country": "United Kingdom", "region": "England", "locality": "West Yorkshire", "postcode": "HD8 8AD" }, { "id": 175387, "startDate": "2025-08-28T14:21:43.213", "scoreTally": 0, "recruitmentFlowId": 71, "recruitmentFlowName": "DEMO - Application Flow", "email": "terry.m@example.com" }, { "id": 174165, "startDate": "2025-08-21T10:14:35.267", "greetingTitle": "Miss", "firstName": "Fran", "lastName": "Hamilton", "scoreTally": 0, "recruitmentFlowId": 71, "recruitmentFlowName": "DEMO - Application Flow", "email": "Fran.H@example.com", "phone": "58225255353455", "address": "31 Abbeyhill, Edinburgh EH8 8EA, UK", "country": "United Kingdom", "region": "Scotland", "locality": "Edinburgh", "postcode": "EH8 8EA" } ]
GET /applicants/details Query Parameters: INTEGER id
This endpoint returns the application details for a given joiner application. Only active applications found in the organisation's applicants tray will show.
Headers: Authorization: Bearer [Your API Key] Request https://lms.qintil.com/connect/v1/recruitment/applicants/details?id=174165 Response Example: { "id": 174165, "startDate": "2025-08-21T10:14:35.267", "greetingTitle": "Miss", "firstName": "Fran", "lastName": "Hamilton", "scoreTally": 0, "recruitmentFlowId": 71, "recruitmentFlowName": "DEMO - Application Flow", "email": "Fran.H@example.com", "phone": "58225255353455", "address": "31 Abbeyhill, Edinburgh EH8 8EA, UK", "country": "United Kingdom", "region": "Scotland", "locality": "Edinburgh", "postcode": "EH8 8EA", "answers": [ { "questionId": 593, "questionText": "Please select which role you are applying for with Apple tree:", "answer": "Care Assistant" }, { "questionId": 595, "questionText": "Please advise how much experience you hold in the role selected", "answer": "3-6 months" }, { "questionId": 594, "questionText": "Please advise where you are looking to work: (Include areas which you can travel in the additional field)", "answer": "Scotland" }, { "questionId": 596, "questionText": "Do you have a up to date CV available to upload?", "answer": "No" }, { "questionId": 598, "questionText": "How many hours are you wishing to work?", "answer": "30hrs per week" }, { "questionId": 609, "questionText": "Do you hold valid driving licence?", "answer": "Yes" }, { "questionId": 3294, "questionText": "Please select where you heard about this role?", "answer": "Facebook" } ], }
GET /credentials/get-types
Retrieve the set of credential types available for an organisation.
Headers: Authorization: Bearer [Your API Key] Request https://lms.qintil.com/connect/v1/recruitment/credentials/get-types Response Example: [ { "id": 176, "name": "Certificate of Sponsorship", "isRightToWork": false, "isAppraisal": false, "requireSeenAndVerified": true }, { "id": 237, "name": "Driving License", "description": "Please upload a copy of your Driving License.", "isRightToWork": false, "isAppraisal": false, "requireSeenAndVerified": true }, { "id": 264, "name": "ECS check", "isRightToWork": true, "isAppraisal": false, "requireSeenAndVerified": true } ]
GET /credentials/get-profile-status Query Parameters: INTEGER orgUserId
Get the onboarding or employment status for the specified user.
NOTE: API requests will only work for active on-boarding candidates and employees. Archived candidates can not be updated through the API.
Headers: Authorization: Bearer [Your API Key] Request https://lms.qintil.com/connect/v1/recruitment/credentials/get-profile-status Response Example: { "status": "candidate" }
Create a new credential document for the specified user and credential type. Only use this endpoint to add a new document type, not to update an existing one.
This endpoint will fail if:
A new document chain will be started if there is an existing archived document of this type.
The document will be reviewed by the recruitment team before being marked as valid unless the inspection details are included with the request.
Note that this endpoint will fail if the there's an existing document of this type on the profile that is either valid, pending, or rejected. To fix a rejected document, use the replace-document endpoint instead.
POST /credentials/create-document Query Parameters: INTEGER orgUserId INTEGER credentialTypeId DATE issued DATE expires DATE inspectedDate (optional) STRING inspectedByName (optional, ignored if inspectedDate is not included) FILE ATTACHMENT (required) STRING fileName STRING base64FileData (optional) STRING documentUrl (required if base64FileData is not included)
If the inspectedDate parameter is not included, then the document will appear in a PENDING INSPECTION status on the user's profile.
The File Attachment parameter is required, either in the form of a Document Url or as a Base 64 string containing the image data. In the former case, the document will be downloaded and stored on-site.
Dates must be sent in a "YYYY-MM-DD" format to pass validation.
Headers: Authorization: Bearer [Your API Key] Request https://lms.qintil.com/connect/v1/recruitment/credentials/create-document Request Example: { "orgUserId": 1699889, "credentialTypeId": 5, "issued": "2025-09-11", "expires": "2027-10-31", "inspectedByName": "Mark Tomson", "inspectedDate": "2025-09-19", "fileAttachment": { "fileName": "DriversLicense.png", "base64FileData": "iVBORw0KGgoAA..." } } Response Example: { "id": 658439, "success": true, "message": "Document created successfully." }
List all active credential documents for a given user.
GET /credentials/list-documents Query Parameters: INTEGER orgUserId
If a document has been earmarked for replacement (i.e., it is pending an upload document) but it has a valid previous document, the previous document will be returned with the status pending_replacement. If there is no previous document, it will return pending_document. Documents currently under review will return their review status.
Headers: Authorization: Bearer [Your API Key] Request https://lms.qintil.com/connect/v1/recruitment/credentials/list-documents?orgUserId=1699889 Response Example: [ { "id": 658437, "name": "ECS check", "credentialTypeId": 60, "documentUrl": "https://[path to document]/ecs-check.png", "issued": "2025-09-11T00:00:00", "expires": "2027-10-31T00:00:00", "inspected": "2025-09-19T00:00:00", "status": "valid" }, { "id": 658438, "name": "EU Settlement Status", "credentialTypeId": 11, "documentUrl": "https://[path to document]/eu-status.png", "issued": "2025-09-11T00:00:00", "expires": "2027-10-31T00:00:00", "inspected": "2025-09-19T00:00:00", "status": "pending_replacement" }, { "id": 658439, "name": "eVisa", "credentialTypeId": 5, "documentUrl": "https://[path to document]/e-visa.png", "issued": "2025-09-11T00:00:00", "expires": "2027-10-31T00:00:00", "inspected": "2025-09-19T00:00:00", "status": "valid" } ]
Add a new head to a document chain, or update an existing document that has failed inspection. This endpoint can also be used to complete a pending document request.
POST /credentials/update-document Query Parameters: This endpoint uses the same request body parameters as create-document.
This endpoint will fail if:
Use this endpoint to:
Headers: Authorization: Bearer [Your API Key] Request https://lms.qintil.com/connect/v1/recruitment/credentials/update-document Request Example: { "orgUserId": 1699889, "credentialTypeId": 16, "issued": "2025-09-11", "expires": "2030-10-31", "fileAttachment": { "fileName": "Passport.jpg", "documentUrl": "https://[path to document].jpg" } } Response Example: { "id": 658439, "success": true, "message": "Document updated successfully." }
Cancel the task related to a new credential document request (i.e., the placeholder task).
POST /credentials/cancel-document-request Query Parameters: INTEGER orgUserId INTEGER credentialTypeId
If the document is the top item of a chain, then the previous item gets bumped up to the current document. If there are no previous documents, then the task is cancelled and the credential type will not appear on this profile.
Returns an error if it's a document that has passed inspection. Only works for replacement requests or totally new document requests.
Headers: Authorization: Bearer [Your API Key] Request https://lms.qintil.com/connect/v1/recruitment/credentials/cancel-document-request Request Example: { "orgUserId": 1699889, "credentialTypeId": 13 } Response Example: { "success": true, "message": "Document request cancelled successfully." }
Archive an existing document on a profile.
POST /credentials/archive-document Query Parameters: INTEGER orgUserId INTEGER credentialTypeId
This endpoint will fail if:
Use the cancel-document-request endpoint to cancel a pending request, then archive the previous document in the timeline, if there is one.
Headers: Authorization: Bearer [Your API Key] Request https://lms.qintil.com/connect/v1/recruitment/credentials/archive-document Request Example: { "orgUserId": 1699889, "credentialTypeId": 13 } Response Example: { "success": true, "message": "Document request cancelled successfully." }