Recruitment API

Getting Started

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.

Authorization

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.

I. Applicants

Submit New Applications

        
    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

Usage

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"
    }
    

List Active Applications

        
    GET /applicants/active

    Query Parameters:
    
    INTEGER page (optional)

Usage

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 Application Details

        
    GET /applicants/details

    Query Parameters:
    
    INTEGER id

Usage

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"
            }
        ],
    }
    

II. Credentials

List Credential Types

        
    GET /credentials/get-types

Usage

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 Profile Status

        
    GET /credentials/get-profile-status

    Query Parameters:

    INTEGER orgUserId
          

Usage

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"
    }
    

Add a New Credential Type to a Profile

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:

  1. There is already a document of this type for this user
  2. There is already a pending document for this user and credential type
  3. The specified user is not an active candidate or employee
  4. The credential type does not exist

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)
          

Usage

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 Active Documents

List all active credential documents for a given user.

        
    GET /credentials/list-documents

    Query Parameters:

    INTEGER orgUserId

Usage

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"
        }
    ]
    

Update a Credential Type on a Profile

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.
          

Usage

This endpoint will fail if:

  1. The credential type does not already exist on the user's profile
  2. The specified user is not an active candidate or employee

Use this endpoint to:

  1. Add a new head to the document chain if the doc is valid (or expired)
  2. Update an existing document that has failed inspection
  3. Completes the existing document request if pending upload
  4. Mark the task completed if inspection details are included

    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 a Document Request

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
          

Usage

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 a Document

Archive an existing document on a profile.

        
    POST /credentials/archive-document

    Query Parameters:

    INTEGER orgUserId
    INTEGER credentialTypeId
          

Usage

This endpoint will fail if:

  1. The document is already archived
  2. If the document is a pending request.

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."
    }