Recruitment (Job boards)

Automating job applications. Please note, this is v1 of this API and we will be looking to improve features, interactions and schemas as we develop future versions.

Job posts are 'mined' for their questions, these questions are returned as JSON to create a form and the form is used to collect the data required for application

  1. Mining Job Application Questions: The process starts by sending an HTTP request to the UBIO API with the URL of the job post form and a unique jobPostId. This request "mines" the job application questions from the web page and adds them to the UBIO database.

  2. Retrieving Job Application Questions: Once the job post questions are mined and stored in the database, you can retrieve them using another API call. You provide the jobPostId to fetch the corresponding questions.

    • The service to mine job questions may have a few different states along its run: queued, processing, failed and mined answers/questions.

    • When status is failed, jobs should be recreated (possibly, with new params) manually, as the mining service doesn't have a mechanism for auto-retry.

    • When answers/questions are present in response retrieved, the service succeeded mining questions for job post.

  3. Creating a Job Post Application: To make a job post application on behalf of a user, you need to initiate an automation job using the AutomationCloud API. The inputs required for the application are obtained from the retrieved job application questions. These inputs should be passed to the API endpoint as key-value pairs.

  4. Submission: The application has been submitted, and you can confirm its status.

This process enables the automation of job applications by extracting application questions, retrieving them when needed, and using the obtained information to create job post applications through the AutomationCloud API.

Authentication

To access the API, authenticate your requests using either Basic HTTP authentication or Bearer Token authentication.

Basic Authentication

Include a APP_SECRET_KEY value as the username, which will be provided by UBIO.

Use the Base64 encoded format of APP_SECRET_KEY: (secret key value followed by colon) in the Basic HTTP Auth header, as follows:

curl <URL> \
    -H 'Authorization: Basic JEFQUF9TRUNSRVRfS0VZOg=='

Bearer Token Authentication

Use the JWT provided by UBIO as the token, as follows:

curl <URL> \
    -H 'Authorization: Bearer <JWT>'

More instructions for authentication.


v1: Mining a job post (gathering questions)

In order to allow your users to apply for job posts, they need to be added to the UBIO database. This process ensures that the job application questions are β€œmined” from the job post web page so that you are able to use them to build the application forms on your website.

The mining process is performed by sending an HTTP request to the UBIO API with the URL of the job post form on the ATS and your jobPostId, which you will use to refer to the job post going forward.

The jobPostId is confirmed in the response - as well as the status of the related mining job. When mining a new job this will be queued or processing.

Making a further submission with the same jobPostId will result in overriding the previous results once the mining is complete.

Code sample

POST/v1/recruitment/job-posts/mine/
curl -X POST 'https://services.automation.cloud/v1/recruitment/job-posts/mine/' \
    -H 'Authorization: Basic <credentials>' \
    -H 'Content-Type: application/json' \
    -L \
--data '{
  "jobPostId": "example123",
  "url": "https://careers.employer.com/jobs/EXAMPLE",
  "category": "test",
  "employer": "Company ABC",
  "jobTitle": "Software Engineer",
  "country": "gb"
}'

Success Responses

Status 200

{
  "status": "queued",
  "jobPostId": "example123"
}

πŸ‘† The "jobPostId" and "status" of the related mining job, confirmed in the response.


v1: Find the questions for a job post

Once a job post has been "mined", its questions can be retrieved from the database with the following API call. The jobPostId must be the same value as the jobPostId value used when initially mining the job post questions.

The response returned depends upon the status of the "mining" job. It may be queued, processing, failed or will return the complete list of questions when complete as per the example below.

Mining jobs with answers/questions/succeededAt or status failed in response, means they reached a final state. When status is failed, jobs should be recreated (possibly, with new params) manually, as the mining service doesn't have a mechanism for auto-retry.

The response includes a serviceId value. This will be used when making an automation - and is required to ensure the correct automation service is used when the job application is made.

Also included in the response are the answers used when 'mining' the job post. This can be useful when preparing test applications.

Each question will have a corresponding inputType based on the mined form, as below. Please note, that different question types may have a different expected format for the value field, see making a job post application.

inputTypeDescription
TextA text input field.
TextAreaA multiple line text input field.
TextLiteralWill include important text, often with indicative HTML tags on a key of value.
SelectOneWill include the available answers on a key of options, each with any conditional questions on a key of conditionalQuestions.
SelectMultipleWill include the available answers on a key of options, each with any conditional questions on a key of conditionalQuestions.
DateA date input field.
BooleanA boolean input field.
FileA file upload field.
ArrayOfObjectsAn array of objects relating to repeatable questions on the job post, for example a list of previous experience, each with repeatable questions.
FragmentedQuestionSimilar to ArrayOfObjects, but only expects one set of answers.

Code sample

GET/v1/recruitment/job-posts/find/
curl -X GET 'https://services.automation.cloud/v1/recruitment/job-posts/find/' \
    -H 'Authorization: Basic <credentials>' \
    -L \
    -G \
    -d 'jobPostId=example123' 

Success Responses

Status 200

{
  "status": "queued"
}

πŸ‘† Mining in queued state

{
  "status": "processing"
}

πŸ‘† Mining in processing state

{
  "status": "failed",
  "errorCode": "GenericWebsiteError"
}

πŸ‘† Mining failed. Note that, error code may be "JobErrorEarlyFail" which is temporary, and a definitive code will be placed soon.

{
  "jobPostId": "example123",
  "serviceId": "50730bd2-fe6c-4c16-9650-249b2bb6460d",
  "answers": [
    {
      "value": "Yes",
      "id": "do-you-have-right-to-work-in-the-uk"
    },
    {
      "value": "No",
      "id": "are-you-resident-in-the-uk"
    },
    {
      "value": "No",
      "id": "do-you-have-a-car-that-you-can-use-for-w"
    },
    "...",
    {
      "value": "90210",
      "id": "what-is-your-postcode"
    }
  ],
  "questions": [
    {
      "key": "availableDynamicQuestions:682df196b4b5e860e2ee842ea38415085f46cefd",
      "data": [
        {
          "question": "Do you have β€˜right to work’ in the UK?",
          "id": "do-you-have-right-to-work-in-the-uk",
          "inputType": "SelectOne",
          "options": [
            {
              "answer": "Yes",
              "conditionalQuestions": []
            },
            {
              "answer": "No",
              "conditionalQuestions": []
            }
          ],
          "label": "Apply now",
          "mandatory": true
        },
        {
          "question": "Are you resident in the UK?",
          "id": "are-you-resident-in-the-uk",
          "inputType": "SelectOne",
          "options": [
            {
              "answer": "Yes",
              "conditionalQuestions": []
            },
            {
              "answer": "No",
              "conditionalQuestions": []
            }
          ],
          "label": "Apply now",
          "mandatory": true
        },
        {
          "question": "Do you have a car that you can use for work?",
          "id": "do-you-have-a-car-that-you-can-use-for-w",
          "inputType": "SelectOne",
          "options": [
            {
              "answer": "Yes",
              "conditionalQuestions": []
            },
            {
              "answer": "No",
              "conditionalQuestions": []
            }
          ],
          "label": "Apply now",
          "mandatory": true
        },
        "..."
      ]
    },
    {
      "key": "availableDynamicQuestions:25e8dbc7a4cef3b2f5a85ad9b36557e9ffb01338",
      "data": [
        {
          "question": "What is your postcode?",
          "id": "what-is-your-postcode",
          "inputType": "Text",
          "label": "New form",
          "mandatory": true
        }
      ]
    }
  ],
  "succeededAt": 1721315141741
}

πŸ‘† Response after mined questions for Job Post


v2: Find the questions for a job post

This endpoint is used for the same purpose as /v1/recruitment/job-posts/find/, but returns a slightly different format.

Notable changes include:

  • The questions field is now a single array.
  • Where possible we will deduce the question's category to help group questions together. For example, if the job post asks for an applicant's supporting certificate, it will be categorised under certifications.

Code sample

GET/v2/recruitment/job-posts/find/
curl -X GET 'https://services.automation.cloud/v2/recruitment/job-posts/find/' \
    -H 'Authorization: Basic <credentials>' \
    -L \
    -G \
    -d 'jobPostId=example123' 

Success Responses

Status 200

{
  "status": "queued"
}

πŸ‘† Mining in queued state

{
  "status": "processing"
}

πŸ‘† Mining in processing state

{
  "status": "failed",
  "errorCode": "GenericWebsiteError"
}

πŸ‘† Mining failed. Note that, error code may be "JobErrorEarlyFail" which is temporary, and a definitive code will be placed soon.

{
  "jobPostId": "example123",
  "answers": [
    {
      "value": "Yes",
      "id": "do-you-have-right-to-work-in-the-uk"
    },
    {
      "value": "No",
      "id": "are-you-resident-in-the-uk"
    },
    {
      "value": "No",
      "id": "do-you-have-a-car-that-you-can-use-for-w"
    },
    "...",
    {
      "value": "90210",
      "id": "what-is-your-postcode"
    }
  ],
  "questions": [
    {
      "question": "Do you have β€˜right to work’ in the UK?",
      "id": "do-you-have-right-to-work-in-the-uk",
      "inputType": "SelectOne",
      "options": [
        {
          "answer": "Yes",
          "conditionalQuestions": []
        },
        {
          "answer": "No",
          "conditionalQuestions": []
        }
      ],
      "label": "Apply now",
      "mandatory": true
    },
    {
      "question": "Are you resident in the UK?",
      "id": "are-you-resident-in-the-uk",
      "inputType": "SelectOne",
      "options": [
        {
          "answer": "Yes",
          "conditionalQuestions": []
        },
        {
          "answer": "No",
          "conditionalQuestions": []
        }
      ],
      "label": "Apply now",
      "mandatory": true,
      "category": "country"
    },
    {
      "question": "Do you have a car that you can use for work?",
      "id": "do-you-have-a-car-that-you-can-use-for-w",
      "inputType": "SelectOne",
      "options": [
        {
          "answer": "Yes",
          "conditionalQuestions": []
        },
        {
          "answer": "No",
          "conditionalQuestions": []
        }
      ],
      "label": "Apply now",
      "mandatory": true
    },
    {
      "question": "What is your postcode?",
      "id": "what-is-your-postcode",
      "inputType": "Text",
      "label": "New form",
      "mandatory": true,
      "category": "zip"
    }
  ],
  "succeededAt": 1721315141741
}

πŸ‘† Response after mined questions for Job Post


v1: Making a job post application

Using the questions fetched in the previous step you will build a applicant facing form for the user to provider answers to complete the job application.

The answers to these questions are then submitted to the Automation Cloud API and are used to complete the application process on the third-party website.

The response will include the status and importantly the applicationId.

The applicationId is used to check and confirm the status of the application.

Most question types will require a string value, but for other question types, see the expected format below:

inputTypeExpected format for value
Text, TextArea, SelectOnestring
SelectMultiplestring[]
Datestring for example: "2025-01-23"
Booleanboolean
File{ "url": "https://example.com/file.pdf", "filename": "file.pdf", "type": "File" }
ArrayOfObjects{ id: string, value: (depends on the question type) }[][]
FragmentedQuestion{ id: string, value: (depends on the question type) }[]

Code sample

POST/v1/recruitment/job-posts/apply/
curl -X POST 'https://services.automation.cloud/v1/recruitment/job-posts/apply/' \
    -H 'Authorization: Basic <credentials>' \
    -H 'Content-Type: application/json' \
    -L \
--data '{
  "jobPostId": "example123",
  "candidate": {
    "email": "janedoe548453@gmail.com",
    "password": "123QWEasd-",
    "phone": {
      "number": "7123456789",
      "countryCode": "gb"
    },
    "firstName": "John",
    "lastName": "Doe",
    "middleName": ""
  },
  "files": {
    "cv": {
      "url": "https://mag.wcoomd.org/uploads/2018/05/blank.pdf",
      "filename": "My_CV.pdf",
      "type": "File"
    }
  },
  "answers": [
    {
      "value": "Yes",
      "id": "do-you-have-right-to-work-in-the-uk"
    },
    {
      "value": "No",
      "id": "are-you-resident-in-the-uk"
    },
    {
      "value": "No",
      "id": "do-you-have-a-car-that-you-can-use-for-w"
    },
    {
      "value": "No",
      "id": "do-you-have-a-full-uk-driving-licence"
    },
    {
      "value": "No",
      "id": "do-you-have-experience-working-in-health"
    },
    {
      "value": "No",
      "id": "do-you-have-experience-working-with-chil"
    },
    {
      "value": "90210",
      "id": "what-is-your-postcode"
    }
  ],
  "submit": false,
  "country": "gb"
}'

Success Responses

Status 200

{
  "status": "processing",
  "applicationId": "d5bd3534-a7cb-44c7-822b-2ef7dbb6c7f3"
}

πŸ‘† Application in "processing" state


v1: Check Application Status

Once an application has been submitted the automation process begin in Automation Cloud. We navigate to the job post URL and fill in the application with the details provided in the application payload.

Applications will vary in the time that they take to complete based upon factors such as length and complexity.

Using applicationId you can query the status of an application (likely on a polling basis) to check if it is processing, has ended in success or in some instances resulted in a failed status.

Code sample

GET/v1/recruitment/job-posts/find/application/
curl -X GET 'https://services.automation.cloud/v1/recruitment/job-posts/find/application/' \
    -H 'Authorization: Basic <credentials>' \
    -L \
    -G \
    -d 'applicationId=9904d53d-9767-4f8b-9ad7-5756a309b736' 

Success Responses

Status 200

{
  "status": "processing"
}

πŸ‘† Application in "processing" state

{
  "status": "success"
}

πŸ‘† Application in "success" state


Troubleshooting

Failed to mine job post

  • When status is failed, a mine request should be reissued (possibly, with new params), as the mining service doesn't have a mechanism for auto-retry.
  • When error code is JobExpired, most likely it's not worth to retry mining the same job post, as it means its application page is unreachable (e.g. link is expired) or that is not possible to mine its data.

Failed to apply to job post

  • We will retry the job post application up to five times before returning a failed status. It is still possible to submit another application after this and if the employer shows that the application has already been submitted, we will forward this error.

Known limitations

We always aim to improve this service to its best shape. Although, there are some limitations that we're aware of and they might change overtime (whether it's up to us or not).

Possibly slow service availability

  • Job boards might get lot of traffic at some point which can slow down mining/application service
  • Mining queue takes a maximum (global) amount of 100 requests per minute

Mined applications forms

  • We mirror the exact data/inputs available in the job board application page. Which means, non extra modifications are applied to mined questions.

GDPR

  • We delete all data that is considered PII (email, credentials, files references, etc.) after 2 weeks.

Development tools