Application data delivery
You can choose to receive Indeed Apply applications from job seekers through email
or postUrl
.
If you choose to receive applications via email, you must set the email configuration attribute in your button’s configuration. Note: This is NOT permitted for ATS integrations, this is only permitted for direct client integrations. When a user completes the application, Indeed sends an email containing user’s full name, email address, and cover letter as well as their resume as an attachment. If the user applies with an Indeed Resume, the version of the resume is directly included in the email and a pdf version is attached. The email address must be encrypted; see Encryption and decryption for more information.
Encrypted email example
<span class="indeed-apply-widget" data-indeed-apply-apiToken="8f57d522dc544a737f70ad5828d5ace1" data-indeed-apply-jobLocation="New York, NY 10110" data-indeed-apply-jobCompanyName="Your Company" data-indeed-apply-jobTitle="Test Engineer" data-indeed-apply-email="b18d0be4c173dfa2b7cb7856e7c7b6f02a563867a9df67ca208c8b9654966299"> </span>
PostUrl
If you process applications programmatically, specify a URL where Indeed Apply will send a POST request. The data-indeed-apply-postUrl
data attribute must be a string containing the URL where Indeed will POST the application data.
PostUrl example
<span class="indeed-apply-widget" data-indeed-apply-apiToken="8f57d522dc544a737f70ad5828d5ace1" data-indeed-apply-jobLocation="New York, NY 10110" data-indeed-apply-jobCompanyName="Your Company" data-indeed-apply-jobTitle="Test Engineer" data-indeed-apply-postUrl="http://www.yourcompany.com/process-applications?jobId=12345"> </span>
Because Indeed sends the application data as the raw body of the HTTP POST request, the request cannot be processed like a typical form. The body of the request contains a JSON document that must be read and parsed. Not all JSON fields are provided, so you should use a robust JSON parser that treats missing fields as empty and ignores unrecognized fields.
Note: There is no maximum size for JSON data payload.
The post body is encoded as UTF-8 and contains an authenticity header that is used to verify that Indeed is sending you the application.
A file portion of the Applicant field contains 3 fields: contentType, data, and fileName.
- ContentType is determined based on the fileName.
- The data field contains the raw resume file, which is Base64 encoded.
- The following filetypes must be supported by the third party: txt, pdf, doc, docx, rtf.
Note: Do not redirect the POST to another URL (e.g. via a 301/302 redirect). Indeed Apply does not handle redirects.
JSON application data
JSON Resume upload example
{ "applicant":{ "email":"john.doe@indeed.com", "fullName":"John Doe", "phoneNumber":"555-555-4321", "verified":true, "resume":{ "file":{ "contentType":"text/plain", "data":"SGVsbG8h", "fileName":"resume.txt" } } }, "appliedOnMillis":1325276227653, "job":{ "jobCompany":"Your Company", "jobId":"7775e2bc62b7f77e", "jobLocation":"New York, NY 10110", "jobMeta":"", "jobTitle":"Test Engineer", "jobUrl":"http://www.yourcompany.com/careers/yourjob123.html" }, "locale":"en_US" }
JSON Indeed Resume example
{ "locale":"en_US", "appliedOnMillis":1324051581711, "job":{ "jobId":"7775e2bc62b7f77e", "jobTitle":"Test Engineer", "jobCompany":"Your Company", "jobLocation":"New York, NY 10110", "jobUrl":"http://www.yourcompany.com/careers/yourjob123.html", "jobMeta":"" }, "applicant":{ "fullName":"John Doe", "email":"john.doe@indeed.com", "phoneNumber":"555-555-4321", "coverletter":"coverletter - text", "verified":true, "resume":{ "text":"resume - text", "html":"resume - html", "json":{ "firstName":"John", "lastName":"Doe", "headline":"headline", "summary":"summary", "publicProfileUrl":"http://www.indeed.com/r/123456", "additionalInfo":"me-additionalinfo", "phoneNumber":"555-555-4321", "location":{ "city":"Austin, TX" }, "skills":"HTML, JavaScript", "positions":{ "_total":1, "values":[ { "title":"Product Manager", "company":"Indeed", "location":"Austin, TX", "startDateMonth":"09", "startDateYear":"2007", "endDateMonth":"-1", "endDateYear":"-1", "endCurrent":true, "description":"I am the current product manager for Indeed Apply." } ] }, "educations":{ "_total":1, "values":[ { "degree":"B.A.", "field":"Computer Science", "school":"University of Texas, Austin", "location":"Austin, TX", "startDate":"2002", "endDate":"2006", "endCurrent":false } ] }, "links":{ "_total":1, "values":[ { "url":"http://www.indeed.com" } ] }, "awards":{ "_total":1, "values":[ { "title":"Best PM at Indeed", "dateMonth":"04", "dateYear":"2008", "description":"Best PM is voted on by Indeed employees and given to the PM with the most votes." } ] }, "certifications":{ "_total":1, "values":[ { "title":"cert-title", "startDateMonth":"02", "startDateYear":"2007", "endDateMonth":"02", "endDateYear":"2008", "endCurrent":false, "description":"cert-description" } ] }, "associations":{ "_total":1, "values":[ { "title":"group-title", "startDateMonth":"01", "startDateYear":"2009", "endDateMonth":"-1", "endDateYear":"-1", "endCurrent":true, "description":"group-description" } ] }, "patents":{ "_total":1, "values":[ { "patentNumber":"patent-number", "title":"patent-title", "url":"patent-url", "dateMonth":"02", "dateYear":"2009", "description":"patent-description" } ] }, "publications":{ "_total":1, "values":[ { "title":"pub-title", "url":"pub-url", "dateDay":"14", "dateMonth":"10", "dateYear":"2004", "description":"pub-description" } ] }, "militaryServices":{ "_total":1, "values":[ { "serviceCountry":"mil-country", "branch":"mil-branch", "rank":"mil-rank", "startDateMonth":"02", "startDateYear":"2003", "endDateMonth":"12", "endDateYear":"2008", "endCurrent":false, "commendations":"mil-commendations", "description":"mil-description" } ] } }, "file":{ "contentType":"application/octet-stream", "data":"SGVsbG8h=", "fileName":"John_Doe.pdf" } } } }
IA JSON fields
Top-level fields
Field name | Description | Example |
---|---|---|
id
|
Unique ID for the application as assigned by Indeed. Please include this ID with the application status when sharing disposition data with Indeed. |
5156eb63c9a0a8ac
|
appliedOnMillis
|
The date and time the user applied expressed in standard Unix time. |
1324051581711
|
job
|
A job object representing the data provided by your button’s HTML data attributes. | See Job object fields |
applicant
|
An applicant object representing the applicant. | See Applicant object fields |
analytics
|
An object containing the following information:
Note: sponsored returns empty/absent if the job click did not originate on Indeed, such as when a user applies from a 3rd-party website or if the job seeker was directed to apply through Indeed’s Targeted Ads (ITA) product. 3rd-party sites cannot specify whether a job is sponsored. To track sponsored job clicks on 3rd-party sites, enable URL tracking. Because JSON responses do not include the “sponsored” parameter, you must also enable XML-only responses. Sponsored job tracking from 3rd-party websites must be configured per job in your client’s Advertiser accounts and appended to the joburls, which can then be tracked by the ATS. Refer to the Sponsored Jobs documentation for more information. |
|
locale
|
The locale that was used when applying to the job. | en_US |
Job object fields
Note: These fields are based on the button configuration.
Field name | Description | Example |
---|---|---|
jobUrl
|
The canonical URL to the complete job description. Note: For applications on Indeed, the jobUrl received in the application JSON will be set to the specific URL on Indeed where the apply happened. |
http://www.yourcompany.com/ careers/yourjob123.html
|
jobId
|
The ID of the job, useful for your own internal tracking. |
7775e2bc62b7f77e
|
jobTitle
|
The title of the job to display. |
Test Engineer
|
jobCompany
|
The name of the company.
Note: This is called jobCompanyName in the data-attributes. |
Your Company
|
jobLocation
|
The location of the job. |
New York, NY 10110
|
jobMeta |
Arbitrary information provided in the original button configuration. |
right-rail-apply-button
|
Applicant fields
Name | Always provided? | Description | Example |
---|---|---|---|
fullName |
Yes | The name of the applicant. If the user is using their Indeed Resume, this will be their firstName + lastName . |
John Doe |
email |
Yes | The email of the applicant. |
john.doe@indeed.com
|
phoneNumber |
No | The phoneNumber if provided by the applicant. |
555-555-4321
|
coverletter |
No | The cover letter of the applicant. If a user did not provide a cover letter, this field will not be present in the JSON object. | My cover letter |
resume |
Yes | An object representing the user’s resume. | See the Resume fields section |
verified |
Yes |
A flag indicating whether a job seeker’s email address is verified. Will display
All other cases, the flag will be set to |
true |
Resume fields
Field name | Resume upload | Indeed Resume | Description |
---|---|---|---|
file |
Yes | Yes | An object containing the binary resume file. |
text |
No | Yes | A text representation of the resume. Only provided if the user is using their Indeed Resume. |
html |
No | Yes | A representation of the resume. Only provided if the user is using their Indeed Resume. |
json |
No | Yes | A JSON structured representation of the resume data. See Indeed resume below. |
Resume file fields
Name | Description | Example |
---|---|---|
data |
The file’s raw binary bytes encoded using base 64. |
SGVsbG8h=
|
fileName |
The filename of the uploaded resume. The filename will be auto generated when using the Indeed Resume. | resume.txt |
contentType |
The content type identified using the resume file’s extension. |
application/octet-stream
|
Indeed resume fields
An array-like object contains a _total
field and a values
field. The _total
field is an integer indicating the length of the array. The values
field is a JSON array containing the _total
objects.
Field name | Type | Description |
---|---|---|
firstName |
string | The applicant’s first name. |
lastName |
string | The applicant’s last name. |
headline |
string | The applicant’s resume headline. |
summary |
string | The applicant’s resume summary. |
publicProfileUrl |
url | If the Indeed Resume is public, the URL to view the user’s public resume. |
additionalInfo |
string | Any additional info. |
phoneNumber |
string | The phone number of the user if included on the user’s Indeed Resume. |
location |
object | JSON object representing the user’s location if provided. |
location.city |
string | The applicant’s city. |
location.country |
string | The applicant’s country. |
location.postalCode |
string | The applicant’s postal code. |
Personal details |
object | Personal details supplied by applicant. Note: These are only applicable in certain markets as noted on each field. |
skills |
string | The applicant’s skills. |
positions
|
array-like | An array-like object of position objects. |
educations
|
array-like | An array-like object of education objects. |
links
|
array-like | An array-like object of link objects. |
awards
|
array-like | An array-like object of award objects. |
certifications |
array-like | An array-like object of certification objects. |
associations
|
array-like | An array-like object of association objects. |
patents
|
array-like | An array-like object of patent objects. |
publications
|
array-like | An array-like object of publication objects. |
militaryServices
|
array-like | An array-like object of military service objects. |
Personal details fields
Field name | Type | Applicable Markets | Description | Example |
---|---|---|---|---|
Highest level of education |
string | CA, GB, NL | This field shows a dropdown with localized levels of education for each corresponding market, where a job seeker can select their highest level. | GCSE or equivalent Diploma of Higher Education |
Employment Eligibility |
string | GB | This question asks if job seekers are eligible to work in a country. | Yes |
Highest Career Level |
string | FR | In this field, job seekers can select their highest career level from 4 options. | New Grad |
Industry |
string | GB, FR | In this drop-down, job seekers can select the industry in which they work/specialize. | Arts & Entertainment |
Drivers License |
string | GB, NL | This field shows a dropdown with localized Driver License options for each corresponding market. | Light Vehicles |
Date of birth |
string | FR, JP | This field consists of 3 dropdowns – date, month and year. Order is localized per market. | DD-MM-YYYY |
Gender |
string | JP | This field represents the job seeker’s gender. | Female |
Indeed resume position fields
Field name | Type | Description | Example |
---|---|---|---|
title |
string | The title of the job. | Product Manager |
company |
string | The company’s name. | Indeed |
location |
string | The location of the position. | Austin, TX |
description |
string | The description of the position. | ——– |
startDateMonth |
integer | An integer (1-12) representing the starting month (-1 if not provided). | 9 |
startDateYear |
integer | The year of the start date ( -1 if not provided). | 2007 |
endDateMonth |
integer | 1-12 integer representing the starting month (-1 if not provided). | -1 |
endDateYear |
integer | The year of the end date (-1 if not provided). | -1 |
endCurrent |
boolean | A flag indicating if this is a current position. | true |
Indeed resume education fields
Field name | Type | Description | Example |
---|---|---|---|
degree |
string | The degree level attained for this education listing. | B.A. |
field |
string | The degree field studied for this education listing. | Computer Science |
school |
string | The institution for this education listing. | University of Texas |
location |
string | The institution location. | Austin, TX |
startDateYear |
integer | The year of the start date ( -1 if not provided). | 2007 |
endDateYear |
integer | The year of the end date (-1 if not provided). | -1 |
endCurrent |
boolean | A flag indicating if this education is in progress. | true |
Indeed resume link fields
Field name | Type | Description | Example |
---|---|---|---|
url |
string | The URL of the link. | https://www.indeed.com |
Indeed resume award
Field name | Type | Description | Example |
---|---|---|---|
title |
string | The title of this award. | Best PM at Indeed |
description |
string | The description for this award. | Awarded for being the best PM in my company. |
dateMonth |
integer | An integer (1-12) representing the starting month (-1 if not provided). | 9 |
dateYear |
integer | The year of the start date ( -1 if not provided). | 2007 |
Indeed resume certification fields
Field name | Type | Description | Example |
---|---|---|---|
title |
string | The title of this certification. | PMP |
description |
string | The description of this certification. | Project Management Professional certification |
startDateMonth |
integer | An integer (1-12) representing the starting month (-1 if not provided). | 9 |
startDateYear |
integer | The year of the start date ( -1 if not provided). | 2007 |
endDateMonth |
integer | An integer (1-12) representing the ending month (-1 if not provided). | -1 |
endDateYear |
integer | The year of the end date (-1 if not provided). | -1 |
endCurrent |
boolean | A flag indicating if this is a current certification. | true |
Indeed resume association groups fields
Field name | Type | Description | Example |
---|---|---|---|
title |
string | The title of this association. | Society for Technical Communication |
description |
string | A description of this association. | A professional association for technical communication professionals. |
startDateMonth |
integer | An integer (1-12) representing the starting month (-1 if not provided). | 9 |
startDateYear |
integer | The year of the start date ( -1 if not provided). | 2007 |
endDateMonth |
integer | An integer (1-12) representing the ending month (-1 if not provided). | -1 |
endDateYear |
integer | The year of the end date (-1 if not provided). | -1 |
endCurrent |
boolean | A flag indicating if this is a current association. | true |
Indeed resume patent fields
Field name | Type | Description | Example |
---|---|---|---|
title |
string | The title of this patent. | ——– |
description |
string | The description of this patent. | ——– |
patentNumber |
string | The patent number. | ——– |
url |
string | The URL for this patent. | ——– |
dateMonth |
integer | An integer (1-12) representing the starting month (-1 if not provided). | 9 |
dateYear |
integer | The year of the start date ( -1 if not provided). | 2007 |
Indeed resume publication fields
Field name | Type | Description | Example |
---|---|---|---|
title |
string | The title of this publication | ——– |
description |
string | A description of this publication. | ——– |
url |
string | A URL for this publication. | ——– |
dateDay |
integer | The day of the month (-1 if not provided). | 9 |
dateMonth |
integer | An integer (1-12) representing the month (-1 if not provided). | 9 |
dateYear |
integer | The year of the date ( -1 if not provided). | 2007 |
Indeed resume military service fields
Field name | Type | Description | Example |
---|---|---|---|
serviceBranch |
string | The service branch for this service entry. | ——– |
branch |
string | The branch for this service entry. | ——– |
rank |
string | The rank for this service entry. | ——– |
description |
string | A description for this service entry. | ——– |
commendations |
string | Any commendations earned for this service entry. | ——– |
startDateMonth |
integer | An integer (1-12) representing the starting month (-1 if not provided). | 9 |
startDateYear |
integer | The year of the start date ( -1 if not provided). | 2007 |
endDateMonth |
integer | An integer (1-12) representing the starting month (-1 if not provided). | -1 |
endDateYear |
integer | The year of the end date (-1 if not provided). | -1 |
endCurrent |
boolean | A flag indicating if this is a current position. | true |
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, Indeed Apply computes a message signature using the HMAC-SHA1 algorithm. This signature is sent as an X-Indeed-Signature HTTP header. The code examples below demonstrate how the message signature is generated.
Using C# (version 4.0)
using System; using System.Diagnostics; using System.Security.Cryptography; using System.Text; class MainClass { public static void Main (string[] args) { String message = getMessage(); String apiSecret = "your api secret key"; String signature = computeSignature(message, apiSecret); if(signature.Equals("m7I9OcotC2GxmVEVAufv5TD7lEk=")) { Console.WriteLine("B64 HMAC SHA1: "+signature); } else Console.WriteLine("invalid value: "+signature); } static string computeSignature(string input, String key) { byte[] keyBytes = Encoding.UTF8.GetBytes(key); HMACSHA1 myhmacsha1 = new HMACSHA1(keyBytes); byte[] inputBytes = Encoding.UTF8.GetBytes(input); byte[] hash = myhmacsha1.ComputeHash(inputBytes); return System.Convert.ToBase64String(hash); } static string getMessage() { return "{"locale":"en_US","applicant":{"fullName":"John Doe","email":"john.doe@example.com"}}"; } }
Using Java (version 1.8)
import javax.crypto.Mac; import javax.crypto.spec.*; import javax.crypto.SecretKey; import java.util.Base64; public class Main { public static void main(String[] args) { String message = getMessage(); String apiSecret = "your api secret key"; String signature = computeSignature(message, apiSecret); if(!signature.equals("m7I9OcotC2GxmVEVAufv5TD7lEk=")) System.out.println("invalid value "+signature); else System.out.println("B64 HMAC SHA1: "+signature); } static String computeSignature(String message, String apiSecret) { try { final byte[] keyBytes = apiSecret.getBytes(); final SecretKey signingKey = new SecretKeySpec(keyBytes, "HmacSHA1"); final Mac mac = Mac.getInstance("HmacSHA1"); mac.init(signingKey); return new String(Base64.getEncoder().encode(mac.doFinal(message.getBytes("UTF-8")))); } catch (Exception e) { System.out.println(e.getMessage()); throw new RuntimeException(e); } } public static String getMessage() { return "{"locale":"en_US","applicant":{"fullName":"John Doe","email":"john.doe@example.com"}}"; } }
Using Perl (version 5.0)
use Digest::SHA qw(hmac_sha1_base64); use Encode qw(encode); # your secrete key my $key = "your api secret key"; # test message my $message = get_message(); # compute signature my $signature = hmac_sha1_b64_string($key, $message); if ($signature eq "m7I9OcotC2GxmVEVAufv5TD7lEk=") { print "B64 HMAC SHA1: " . $signature, "n"; } else { print "invalid value! ", $signature, "n"; } sub hmac_sha1_b64_string { my ($key, $data) = @_; my $keybtes = encode("UTF8", $key); my $databytes = encode("UTF8", $message); my $b64digest = hmac_sha1_base64($databytes, $keybtes); # Perl does not pad b64 output, so we have to do it manually while (length($b64digest) % 4) { $b64digest .= '='; } return $b64digest; } sub get_message { return "{"locale":"en_US","applicant":{"fullName":"John Doe","email":"john.doe@example.com"}}"; }
Using PHP (version 7.0)
function sign($str, $key) { $opts = OPENSSL_RAW_DATA; $digest = hash_hmac("sha1", $str, $key, $raw_output = TRUE); $signature = base64_encode($digest); return $signature; } $api_secret = "your api secret key"; $message = "{"locale":"en_US","applicant":{"fullName":"John Doe","email":"john.doe@example.com"}}"; $signature = sign($message,$api_secret); if( $signature != "m7I9OcotC2GxmVEVAufv5TD7lEk=") print("invalid value " . $signature); else print("B64 HMAC SHA1: " . $signature);
Using Python (version 2.7)
from hashlib import sha1 import hmac import base64 # your secret key secret = "your api secret key".encode("utf-8") # test message message = "{"locale":"en_US","applicant":{"fullName":"John Doe","email":"john.doe@example.com"}}".encode('UTF-8') # compute the hash message_hashed = hmac.new(secret, message, sha1) digest = message_hashed.digest() # b64 encode the hash...this is the message authentication value signature = base64.b64encode(digest) if signature != "m7I9OcotC2GxmVEVAufv5TD7lEk=": print "invalid value "+signature else: print 'B64 HMAC SHA1: ' + signature
Using Python (version 3.6)
from hashlib import sha1 import hmac import base64 # your secret key secret = "your api secret key".encode("utf-8") # test message message = "{"locale":"en_US","applicant":{"fullName":"John Doe","email":"john.doe@example.com"}}".encode("UTF-8") # compute the hash message_hashed = hmac.new(secret, message, sha1) # b64 encode the hash...this is the message authentication value signature = base64.b64encode(message_hashed.digest()).decode("UTF-8") if signature != "m7I9OcotC2GxmVEVAufv5TD7lEk=": print("invalid value "+signature) else: print("B64 HMAC SHA1: " + signature)
Next steps
- Review configuration tasks in Setting up your IA integration.
- Consider implementing additional IA features as described in Indeed Apply options.
- Provide updates about application statuses by setting up a Disposition Data integration.