Skip to content

Setting Qualifications via the Feed (For Snagajob Easy Apply) EXTERNAL

Bailey Jennings edited this page Jan 13, 2022 · 10 revisions

Easy Apply / Enterprise ATS Integrations

This resource contains integration instructions for our ATS partners. Enabling Easy Apply lets applicants use their Snagajob profile to apply to jobs.

Brief Process Overview

  1. Your customers set up supported qualification/screener questions in your system.
  2. You pass us job postings via an XML feed with the qualifications per requisition.
  3. You pass us an application destination URL (per job) via your feed. (Example: <PostUrl>https://myapplicantapi.com/sajeasyapply</PostUrl>)
  4. We post your jobs and enable our Easy Apply application experience.
  5. We send the application data back to the POST URL each time a worker applies! (Here is an example of the JSON)

Setting the qualifications in the XML job feed

Qualifications are a collection of standardized screening questions we offer our employers to ask Workers. In the interest of creating the best possible Worker experience, Snagajob does not support asking custom questions at this time.

Most employers receive a 60-80% application completion rate when opting in to question standardization.

Supported Qualifications

Here is a list of our supported Qualification questions.

Important Notes when setting your Qualification (screening) questions in your XML Job Feed

  • For Boolean questions leave the "answer=" value out of the element.
  • All Items must have a required=”true/false” value within each element.
  • For non-boolean qualifications, reference the answer option spreadsheet for each supported qualification.
  • Postings with qualifications should not include an application URL (to enable Easy Apply).

XML value definitions

Value Required? Description Example
name Yes The field indicating which qualification Employers would like to add to the posting. name="q-basic-dob"
answer Yes for non-boolean qualifications Types 2 and Type 3

No for Type 1 qualifications
The field indicating which enumeration should apply to the question being asked. answer="1"
required Yes The field that designates if the qualification is required or preferred by the Employer. required="true"

Example XML Schema

This posting would require the Worker to be 14 years or older, require that they be eligible to work in the US, and they prefer that they can lift more than 40lbs.

<Qualifications>
    <Item name="q-basic-dob" answer="1" required="true" />
    <Item name="q-basic-auth" required="true" />
    <Item name="q-work-lift" answer="3" required="false" />
    <Item name="q-work-lift" answer="2" required="false" />
</Qualifications>

Qualification Type Explanations

The Type of qualification determines how it should be presented to the applicant, as well as how it will be evaluated. The recognized types of qualifications are as follows:

Type 1 (Select One):

This is a simple Yes/No Boolean qualification. There are no options for the applicant or employer to choose from, and no variable piece of the qualification. For example, "Do you have access to reliable transportation to and from work?".

Type 2 (Select Many):

This is a Yes/No question that has exactly one variable component (or "option") that can be swapped out based on the employer's preference. For example, a job may require both "Can you speak fluent English?" and "Can you speak fluent Spanish?". An applicant may answer YES to one, both, or neither. An employer should be able to specify ANY NUMBER of options per Select Many qualifications to a job posting.

Type 3 (Scaling):

This is a Yes/No question that has exactly one variable component (or "option"), and the options can be numerically ranked in such a way that answering YES to a higher-tier option implies that you also would answer YES to a lower-tier option. This works in reverse, too - if you answer NO to a lower-tier option, it is implied that you would answer NO to a higher-tier option as well. For example, if you answer YES to "Are you at least 18 years old?", we know that you would also answer YES to "Are you at least 17 years old?" and any other options below that. An employer should only specify ONE option per Scaling qualification to a job posting.

Candidate Data Delivery

Email

Full Easy Apply applications are emailed to users based on locations they have access to by default.

API

To accept candidate data via API, you must include a POST url on each posting in the XML feed you wish to accept programmatically.

PostUrl Example

<PostUrl>https://myapplicantapi.com/sajeasyapply</PostUrl>

This url should accept a JSON payload with the following format:

JSON Application Data

Qualification Field Descriptions

Value Description Type Example
displayText This is the question displayed to the worker. string "displayText": "At least associate's degree or higher"
isPass "isPass": true means the worker answered Yes to the question "isPass": false means the worker answered No to the question boolean "isPass": true
name The name of the qualification string "name": "q-exp-degree"
required This field signifies if the employer requires the worker to answer 'Yes' ("isPass": true) to be qualified for the role. boolean "required": false
option For Scaling (Type 3) questions, the employer can ask multiple variations of the same question (For example, asking if the worker has more than one type of food certification). This field indicates which answer the isPass answer corresponds to. int “option”: 2

Example JSON Candidate Data

{
    "applicantAddress": {
        "line1": "123 Main St.",
        "line2": "",
        "city": "Richmond",
        "stateProvCode": "VA",
        "postalCode": "23219"
    },
    "emailAddress": "[email protected]",
    "employment": [
        {
            "employerName": "We Paint Cars",
            "endDate": null,
            "jobTitle": "Automotive Painter",
            "startDate": "2019-01-01T05:00:00Z"
        },
        {
            "employerName": "Local Library",
            "endDate": "2018-05-01T04:00:00Z",
            "jobTitle": "Librarian",
            "startDate": "2015-01-01T05:00:00Z"
        },
        {
            "employerName": "Fast Food Chicken Chain",
            "endDate": "2014-12-01T05:00:00.00Z",
            "jobTitle": "Assistant Manager",
            "startDate": "2011-07-01T04:00:00Z"
        }
    ],
    "firstName": "First",
    "lastName": "Last",
    "fullName": "First Last",
    "isAuthorizedToWorkInUs": true,
    "phoneNumber": "8045551234",
    "qualifications": [
        {
            "displayText": "Background check",
            "isPass": true,
            "name": "q-basic-bgcheck",
            "required": false
        },
        {
            "displayText": "14 years or older",
            "isPass": true,
            "name": "q-basic-dob",
            "option": 1,
            "required": true
        },
        {
            "displayText": "Legally authorized to work in the United States",
            "isPass": true,
            "name": "q-basic-auth",
            "required": true
        },
        {
            "displayText": "At least associate's degree or higher",
            "isPass": true,
            "name": "q-exp-degree",
            "option": 2,
            "required": true
        }
    ],
    "requisitionId": "req12345"
}

Post Authenticity

The post request sent to your postUrl contains an HTTP header that can be used to verify the authenticity of the post. Using the shared API secret, Snagajob EasyApply computes a message signature using the HMAC-SHA1 algorithm. This signature is sent as an X-SAJ-Signature HTTP header. An X-SAJ-Date HTTP header is included and should be used to ignore any requests over 15 minutes old. The code examples below demonstrate how the message signature is generated.

using System.Globalization;
using System.Security.Cryptography;
using System.Text;
 
public class Program
{
    public static void Main(string[] args)
    {
        string requestBody = GetRequestBody();
        string apiSecret = "your api secret key";
        string requestXSAJDate = "Thu, 13 Jan 2022 17:21:07 GMT";
 
        string  signature = ComputeSignature($"{requestBody};{dateHeader}", apiSecret);
        if (signature.Equals("AIAvMLdPqjbNocJ4UHZpg3Axxzk="))
        {
            Console.WriteLine("B64 HMAC SHA1: " + signature);
        }
        else
        {
            Console.WriteLine("invalid value: " + signature);
        }
    }
 
    private static string ComputeSignature(string input, String key)
    {
        byte[] keyBytes = Encoding.UTF8.GetBytes(key);
        using(HMACSHA1 myhmacsha1 = new HMACSHA1(keyBytes))
        {
            byte[] inputBytes = Encoding.UTF8.GetBytes(input);
            byte[] hash = myhmacsha1.ComputeHash(inputBytes);
            return Convert.ToBase64String(hash);
        }
    }
 
    private static string GetRequestBody()
    {
        return "{\"firstName\":\"John\", \"lastName\":\"Doe\", \"fullName\":\"John Doe\", \"email\":\"[email protected]\"}";
    }
}