Enterprise ATS Integration with Indeed
Integrate with Indeed Apply for Applicant Tracking System (ATS) Enterprise partners.
By using this API, this API documentation, and/or building the integration, you agree to the Additional API Terms and Guidelines.
This resource contains integration instructions for Indeed’s Enterprise Applicant Tracking Systems partners. Integration with Indeed will allow you to optimize the hiring process, improve the job seeker experience, and help employers make the right hires faster.
Note: While our integration documentation is publicly available as a reference to understand and plan your integration with Indeed, it is intended to be implemented only by ATS partners who have signed a Master Services Agreement with us.
How To Use This Resource
To successfully integrate with Indeed, please review this topic completely. Please ask your Marketplace Platforms manager if you have any questions. It's important that you complete your integration in the following order:
- XML Job Feed
- Adding Indeed Apply
- Application Data Delivery and Screener Questions
- Ensure you're returning disposition data for applications you receive.
- Test your integration end-to-end and make sure you have ongoing monitoring on your side for XML reliability, Indeed Apply delivery, and screener question retrieval.
XML Job Feed
The Indeed XML feed lists job information that will be displayed on Indeed. By maintaining an XML feed, you have greater control over how jobs are displayed. You can also choose to add the Indeed Apply label to jobs.
When your customers create jobs in your system, the listings are sent via XML feed directly to the Indeed XML feed. By maintaining XML feeds, you have greater control over how jobs are displayed.
Using the XML feed
Create and maintain an XML document containing all job information. Indeed monitors the file for changes in one of three ways:
- Crawling an XML URL
- Crawling a client-hosted FTP site (SFTP also supported)
- Receiving the file directly in an Indeed FTP server (zipped files recommended)
Important: You must include all jobs hosted on your career page in the XML feed. Indeed does not accept incomplete XML feeds and does not support partial opt-in of jobs. An XML file that does not include all jobs may be rejected or receive limited exposure to job seekers. All information available to job seekers from your website should be included in the XML, and the XML should not include jobs that are not available and actively hiring on your website. For example, if you list salaries on your jobs, then you must include an element for that piece of data, i.e., <salary>
. Salary information is not required for indexing if it is not available to job seekers on your website.
URLs provided in the XML must link to job detail pages where jobseekers can independently confirm all of the job details without being required to log in. All content provided in the XML should refer to current, actively hiring roles.
XML feed example
The following example shows a basic XML feed containing one job.
Example: Basic XML feed
<?xml version="1.0" encoding="utf-8"?>
<source>
<publisher>ATS Name</publisher>
<publisherurl>http://www.atssite.com</publisherurl>
<job>
<title>
<![CDATA[Sales Executive]]>
</title>
<date>
<![CDATA[Tue, 29 Jun 2021 22:49:39 GMT]]>
</date>
<referencenumber>
<![CDATA[unique123131]]>
</referencenumber>
<requisitionid>
<![CDATA[ab1212]]>
</requisitionid>
<url>
<![CDATA[http://www.examplesite.com/viewjob.cfm?jobid=unique123131&source=Indeed]]>
</url>
<company>
<![CDATA[ABC Hospital]]>
</company>
<sourcename>
<![CDATA[ABC Medical Group]]>
</sourcename>
<city>
<![CDATA[Phoenix]]>
</city>
<state>
<![CDATA[AZ]]>
</state>
<country>
<![CDATA[US]]>
</country>
<postalcode>
<![CDATA[85003]]>
</postalcode>
<streetaddress>
<![CDATA[123 fake street Phoenix AZ, 85003]]>
</streetaddress>
<email>
<![CDATA[example@abccorp.com]]>
</email>
<description>
<![CDATA[Do you have 1-3 years of sales experience? Are you
relentless at closing the deal? Are you ready for an exciting and
high-speed career in sales? If so, we want to hear from you! [...]
We provide competitive compensation, including stock options and a full
benefit plan. As a fast-growing business, we offer excellent opportunities
for exciting and challenging work. As our company continues to grow, you
can expect unlimited career advancement! ]]>
</description>
<salary>
<![CDATA[$50000 per year]]>
</salary>
<education>
<![CDATA[Bachelors]]>
</education>
<jobtype>
<![CDATA[fulltime, parttime]]>
</jobtype>
<category>
<![CDATA[Category1, Category2, CategoryN]]>
</category>
<experience>
<![CDATA[5+ years]]>
</experience>
<expirationdate>
<![CDATA[Mon, 08 Nov 2021]]>
</expirationdate>
<remotetype>
<![CDATA[COVID-19]]>
</remotetype>
<indeed-apply-data>COVERED IN A LATER SECTION</indeed-apply-data>
</job>
</source>
XML feed elements
The XML feed contains basic elements, used once per feed, and a set of job elements that are used for each job in the feed.
Basic elements
Element | Required | Description | Example value |
---|---|---|---|
<?xml ?> |
Yes | XML Declaration | <?xml version="1.0" encoding="utf-8"?> |
<source> |
Yes | The root node for the XML feed document. | — |
<publisher> |
No | The name of the ATS from which this job was published. | ATS Name |
<publisherurl> |
No | The URL for the ATS from which this job was published. | http://www.atssite.com/ |
<job> |
Yes | All metadata specific to a job. Include one <job> node for each job to be displayed on Indeed. |
See following section for details. |
Job elements
Note:
- Job descriptions must be provided inside
<![CDATA[]]>
sections as raw HTML, just as it would be on the original website. The HTML should be provided as raw characters(<,>,&)
and not as XML entities/ escaped characters (&lt;, &gt;, &amp;). - If clients do not adhere to the following guidance, their jobs may not be included in Indeed search results. Jobs that are missing required fields or that do not meet Indeed Quality rules may be discarded or hidden. Clients should review Indeed Quality rules if they have any concerns over their postings. Clients in need of assistance should contact Indeed via our employer pages.
Element | Required | Description | Example value |
---|---|---|---|
<title> |
Yes | The title of the job. Do not include other types of information, such as salary, employment type, job location, job descriptions, copies, or headlines. | <![CDATA[Sales Executive]]> |
<date> |
Yes | The date on which this job was first published. Note: If the publish date is posted on your site, the date on the site must match what's in the XML. |
<![CDATA[Fri, 19 Dec 2014 22:49:39 GMT]]> |
<referencenumber> |
Yes | A unique identifying number for this instance of the job. Indeed uses this element to identify each job. The same job posted in multiple locations must have a unique value for this element. Do not change the number once you've set it. | <![CDATA[unique123131]]> |
<requisitionid> |
Yes | The requisition id for a job (formerly `external job ID`). Your system likely uses it to track the original role and its applicants. Might be the identifier that shows up on your public-facing career page. Must be the same for each posting of a job across different feeds and different locations. Might not be unique. |
<![CDATA[ab1212]]> |
<apijobid> |
No | The job id used when performing API calls to your ATS. Only provide a value for this element when <apijobid> is different from <requisitionid> . |
<![CDATA[ab1212]]> |
<url> |
Yes | The URL for this job listing on your site. Use the URL for the job description page, not the application page. Include the source=Indeed token to track clicks from Indeed. |
<![CDATA[http://www.examplesite.com/viewjob.cfm?jobid=unique123131&source=Indeed]]> |
<company> |
Yes | The company name to be displayed in search results. For example, if there are subsidiaries or franchises with multiple branded locations under the same company, <company> should be the business unit or brand name in the simplest possible form that job seekers quickly understand. |
<![CDATA[[ABC Hospital]]> |
<sourcename> |
Yes | The parent organization hiring for the role. For example, if there are subsidiaries or franchises with multiple branded locations under the same company, all of those jobs should still have the same value in the <sourcename> node. |
<![CDATA[ABC Medical Group]]> |
<city> |
Yes | The city in which this job is located. | <![CDATA[Phoenix]]> |
<state> |
Yes | The state in which this job is located. Use the appropriate postal abbreviation. If your job is located outside the US, use the corresponding geographic designation such as province or region. | <![CDATA[AZ]]> |
<country> |
Yes | The country in which this job is located. | <![CDATA[US]]> |
<postalcode> |
Yes, if on the client's site. | The postal code in which this job is located. | <![CDATA[85003]]> |
<streetaddress> |
Yes, if on the client's site. | The street address of the job's primary work location. Please include the street name and number. If possible, provide the full address including city, state, and postal code. Street address may be used by Indeed to improve the precision of location-based job search and may also be displayed to job seekers. | <![CDATA[1234 Sunny LanePhoenix, AZ 85003]]> |
<email> |
Yes | The email account associated with the Indeed account for this client. We require the client's contact email address in order to verify the legitimacy of the business entity posting the job. This is required by our Search Quality team. | <![CDATA[example@abccorp.com]]> |
<description> |
Yes | The description for this job listing. Ensure the information in the <description> matches the details on the <url> page. The content should be an exact and complete match, including all job-related information in the same order as the source website. Indeed may apply filters to this information to omit items such as buttons or link text that does not make sense in the context of Indeed. This field will be the source of the raw text displayed to job seekers on Indeed, and should include all job-relevant information - including text that may also be provided in other fields in the XML, e.g., education, experience.Note: Job descriptions require HTML formatting. For a list of supported HTML elements, see Formatting Guidelines. |
<![CDATA[
Do you have 1-3 years of sales
experience? [...] ]]>
|
<salary> |
Yes, if on the client's site. | The salary offered for this job. Best practices are as follows:
|
<![CDATA[$50000 per year]]> OR <![CDATA[$4000 - $5000 per month]]> |
<education> |
Yes, if on the client's site. | The desired education level for this job. | <![CDATA[Bachelors]]> |
<jobtype> |
Yes, if on the client's site. | The type of job, full- or part-time.Indeed may also extract this information directly from other provided job content. | <![CDATA[fulltime, parttime]]> |
<category> |
No | A comma-delimited list of job categories. While this element is not required, it’s highly encouraged to include for job management or as a way to reflect additional information found on the job details page. For example, you may find it useful to include facility or department information in this element. | <![CDATA[Category1, Category2, CategoryN]]> |
<experience> |
Yes, if on the client's site. | The desired experience for this job. | <![CDATA[5+ years]]> |
<expirationdate> |
Yes, if on the client's site. | The date in which you will no longer be actively hiring for a role.After this date passes, Indeed may remove the job from search results. By default, data is interpreted using the CST timezone. | <![CDATA[Mon, 08 Nov 2021]]> |
<tracking_url> |
No | A unique URL for each job in order to track clicks on Indeed. Indeed creates a GET request to this URL each time the job is clicked. | <![CDATA[https://www.examplesite.com/trackjob1234]]> |
<remotetype> |
No | Specifies the type of remote work being offered. Please include one of the following:
Please see the FAQ below for additional text that can be included in job descriptions and how to properly send remote jobs. Note: The data collected from this field will not be used to determine location. Please see the XML Feed FAQ section for information on posting jobs remotely. |
<![CDATA[COVID-19]]> |
<lastactivitydate> |
No | The most recent timestamp of any action that was taken on this job within your system. This action could include reviewing candidates, modifying the job, etc. | <![CDATA[Fri, 19 Dec 2014 22:49:39 GMT]]> |
Formatting guidelines
Indeed expects the same HTML formatting from your website when you provide job descriptions in XML. Include your formatting in CDATA
tags. HTML content will be normalized and displayed to jobseekers in a standardized format, rather than strictly complying with HTML standards.
Note: We do not support escaped HTML entities. For example, use <
instead of &lt;
. Improper HTML can result in rejection and/or formatting issues for jobs on Indeed. Supported tags include but are not limited to the following examples:
Tag | Description |
---|---|
<b> |
Bold |
<h1> to <h6> |
Headers Note: Text in header tags transform to consistent sizes when displayed on Indeed pages. |
<br> |
Single line break |
<p> |
Paragraph. Indeed will automatically insert an empty line between paragraph tags. |
<ul> |
Unordered list (bullets) |
<li> |
List item |
<strong> |
Strong text (bold) |
<em> |
Emphasized text (italics) |
<table> , <tbody> , <th> , <tr> , <td> |
Simple tables. Each cell displays on a new line on Indeed. |
Additionally, we support computed style nodes like the following:
<font style="font-weight:bold">Some bold text</font>
will result in bold text.<div><h2 style="display:inline">Label: </h2> Text</div>
will display “Label: Text” in-line, despite the fact that<h2>
is a block element by default.- A paragraph tag must have positive top/bottom margin/padding. This is the
<p>
tag’s default behavior
Formatting example
Formatting for an example job description
<description>
<![CDATA[
<h2 id="job_description">Job Description:</h2><ul><li>Do you have 1-3 years of sales experience?</li><li> Are you relentless at closing the deal? </li><li>Are you ready for an exciting and high-speed career in sales? If so, we want to hear from you!</li></ul><font style="font-weight:bold">Benefits</font><p>We provide competitive compensation, including stock options and a full benefit plan. As a fast-growing business, we offer excellent opportunities for exciting and challenging work. As our company continues to grow, you can expect unlimited career advancement! </p>
]]>
</description>
How it looks on Indeed
Job Description:
- Do you have 1-3 years of sales experience?
- Are you relentless at closing the deal?
- Are you ready for an exciting and high-speed career in sales? If so, we want to hear from you!
Benefits
We provide competitive compensation, including stock options and a full benefit plan. As a fast-growing business, we offer excellent opportunities for exciting and challenging work. As our company continues to grow, you can expect unlimited career advancement!
Common issues
The following problems can cause Indeed to reject your XML feed or can cause jobs to not appear in Indeed search results.
Issue | Solution |
---|---|
Incorrect special character encoding | Check the feed URL using the “view source” function in your browser and ensure special characters such as brackets (< > ) show up correctly. Verify that the feed is using an XML Declaration like UTF-8 character encoding. Your file must have a header that declares encoding. You can use an encoding other than UTF-8, although UTF-8 is the most common. XMLs should use allowed character ranges from the XML standard. |
Jobs missing from the feed or job counts differing between the feed and career sites | Include every job in the feed for each client. Anything published and available on the web should be in the feed. Remember that Indeed is a search engine and indexes the more comprehensive source. |
Incomplete or empty job descriptions | Include all text related to the job. For example, “required qualifications” may be a separate category in your database, but for Indeed’s purposes, it should be included in the <description> field. |
Jobs that are scams or suspected scams | Indeed works to exclude suspected scams. Ensure that positions have well-written descriptions. If submitting jobs for another company, vet the company to ensure that it is legitimate and the listed jobs are actual open positions. |
Old jobs in the file | Do not include old or inactive jobs in the XML. Once a job has been filled, remove the role from the XML file. If Indeed notices old or inactive jobs, we’ll ask you to correct that behavior to continue utilizing the XML. |
The following are examples of what should not be included in each element.
Element | Incorrect Example |
---|---|
<title> |
Unnecessary text such as location, job type, shift, and catchphrases should not be included.<title><![CDATA[ Work with top clients! 2 days off per week! Sales) ]]></title> <title><![CDATA[ Sales ]]></title> |
<date> |
Make sure to include a date in the past. The job may not get visibility if a future date is given.A date in the future. |
<city> ,<streetaddress> |
<city> must contain only the city in which the job is located.<streetaddress> must contain the full address including the street name and number.Example: For "1234 Sunny Lane, Phoenix, AZ 85003"<city><![CDATA[ 1234 Sunny Lane, Phoenix, AZ 85003 ]]></city> <city><![CDATA[ Phoenix ]]></city><streetaddress><![CDATA[1234 Sunny Lane, Phoenix, AZ 85003 ]]></streetaddress> |
<description> |
The content and the order of the <description> tag must match the content on the page that the <url> tag directs to.The plain text version of the <description> tag is displayed on the Indeed search results page. Therefore, it should include all information that may be already included within other tags of the XML file.Note: The use of HTML formatting is highly recommended. |
<salary> |
Please provide only the salary. (Salary breakdown, examples, and bonuses should be included in the <description> tag.) Example: If the salary differs depending on experience:<salary><![CDATA[ $16.00-$17.00 per hour More than 5 years experience $18.00-$20.00 per hour]]></salary> <salary><![CDATA[ $16.00-$20.00 per hour]]></salary> Warning: The salary may be extracted from places other than the <salary> tag. |
Others | Other 1Please let us know if there are any major updates on the site after the XML was first created.Other 2Escaped characters (< > & etc.) are not permitted.Other 3A tag must be added to all jobs. For example, if a particular job doesn’t have a specific salary, the tag should still be added, but its content should be left blank. E.g. (<salary> </salary> , or <salary /> ). |
XML Feed FAQ
How often does Indeed index the XML feed?
For XML being crawled on a URL or ATS provided FTP site, Indeed will refresh the job data 4 times a day every 6 hours from the time of the last request. For Indeed hosted FTPs we'll refresh the XML feed when a new file is received up to every 2 hours. If more frequent file uploads occur, previous runs may cease and prevent job updates from occurring.
What metadata can be included?
You can include any fields you like (ex. <job_type>
, <branch_id>
) as long as the standard fields are present.
Will every job in the feed appear in Indeed search results?
Visibility in search results is based on Indeed’s visibility rules. Our Search Quality team prioritizes jobs that are legitimate, unique, have detailed descriptions and locations, and are easy to apply to. Jobs that do not meet these criteria may be hidden from search results. Make sure your clients follow our search quality team’s best practices for posting. If clients have issues finding their jobs on Indeed they should reach out to Indeed for assistance.
If I’m using Indeed Apply and allowing job seekers to apply directly from Indeed, why must I provide a URL?
We require a URL that points to the job description (not apply page), for 3 reasons:
- If Indeed Apply fails, we direct the job seeker back to the job URL.
- If a client opts out of Indeed Apply we need a method for job seekers to apply.
- Our aggregation engine needs an active URL to confirm job content and job activity.
What happens if I have the same job in multiple languages?
Provide the job in every language you currently have it as a unique job in the XML. If you duplicate the reference number in the XML, only the first appearance of the job appears on Indeed.
What happens if I have the same job in multiple countries?
Provide the job in every location where there is an open position. Region-wide postings that are not region-wide jobs are rejected for organic visibility on Indeed. Each job needs its own unique location, unique reference number, and should represent a unique job, otherwise it will lose visibility on Indeed.
What happens if I have a statewide/country-wide job?
Indeed requires city, state/province, country, and postal code elements. If these elements are not provided, the job does not receive organic visibility by default.
If you have legitimate region-wide postings or remote work opportunities, include them in the file and have your clients request organic visibility. If your client has an Indeed account, they can log in to get support. Clients without an account can submit questions to Indeed directly by visiting our website.
Why do you require an email for each job?
For companies that are new to Indeed, or for new job sources from companies already on Indeed, we require a contact email address to verify the account and enable organic syndication. In some cases the email address is not used, but we require it for all jobs.
What do we do if a client wishes to opt-out of distribution to Indeed?
Remove ALL <job>
elements for the clients jobs from the XML. Please note that clients can NOT opt out job by job and must completely opt out of distribution to Indeed. If a discrepancy in job volume between the XML and a client’s job portal appears the source with the largest job volume will be preferred for accuracy.
How do I specify that a job is a remote position?
Include the <remotetype>
element from the table above and indicate one of the three following options:
- Fully remote: Use “fully remote” when the employer intends all work for the job to be done remotely or from home.
- Hybrid remote: Use “hybrid remote” when work is done both in-office and remotely on a consistent basis.
- COVID-19: For jobs that are temporarily remote, use the “Temporarily remote due to COVID-19” option.
Employers can include one of these phrases in job descriptions to identify roles:
Fully remote
- “This is a remote position”
- “Remote work allowed”
- "100% remote"
Hybrid remote
- “Hybrid remote/in-office”
- “Partial remote”
- “Work from home [x] days per week”
COVID-19
- “Temporarily remote"
- “Remote initially"
- “Work remotely during the current outbreak"
How do I post a remote job and utilize the <remotetype> element?
To properly post remote jobs, you’ll need to utilize the elements that Indeed uses to capture location data: <city>
, <state>
, <country>
, and <postalcode>
.
To post a job remotely in the US, use this XML:
<city>
<![CDATA[Remote]]>
</city>
<state>
<![CDATA[]]>
</state>
<country>
<![CDATA[US]]>
</country>
<postalcode>
<![CDATA[]]>
</postalcode>
Please note in the example above that the <state>
and <postalcode>
elements are still present but contain no information. This is how you should provide the data in the <job>
element for jobs you’re posting remotely. If you do not leave the <state>
and <postalcode>
blank, jobs will not post as Remote positions.
To post a job that is temporarily remote due to COVID-19 statewide in Arizona, for example, take advantage of the <remotetype>
element. The example XML below illustrates how to post this information:
<city>
<![CDATA[Remote]]>
</city>
<state>
<![CDATA[AZ]]>
</state>
<country>
<![CDATA[US]]>
</country>
<postalcode>
<![CDATA[]]>
</postalcode>
<remotetype>
<![CDATA[COVID-19]]>
</remotetype>
Please note in the example above that the <postalcode>
element is still present but contains no information. This is how you should provide the data in the <job>
element for jobs you are posting remotely and due to the COVID-19 global pandemic. If you do not leave the <postalcode>
blank, the job will not post as a remote position.
Adding Indeed Apply
Use the Indeed Apply (IA) API to mark your jobs with the Easily Apply label on Indeed and allow job seekers to apply without leaving Indeed.
The IA API takes approximately two to three weeks to implement from start to deployment.
Generating an API token
Before implementing Indeed Apply, complete the following steps:
- Sign in to an existing Indeed account, or create a new account here: https://secure.indeed.com/account/login
- Once logged in, go to the "Manage app credentials" here: https://secure.indeed.com/account/apikeys
- Click on the "Register a new application" button.
- Enter the name of your application and your website.
- Choose Indeed Apply as the credential type and click Save.
Note: If you use OAuth elsewhere at Indeed, you must maintain a separate token specifically for your Indeed Apply integration.
You'll see a new credential saved in your account.
Use "Client ID" as your Indeed Apply API Token.
Adding IA using the XML feed
In your Indeed XML feed, add Indeed Apply configuration attributes to an <indeed-apply-data>
element in your existing feed.
Indeed Apply configuration attributes are outlined in the IA Configuration parameters table.
IA XML element example
The following example shows a basic XML feed containing one job and the Indeed Apply element.
Note: The basic job elements are omitted for clarity, but must be present in your feed.
Basic XML feed example
<?xml version="1.0" encoding="utf-8"?>
<source>
<publisher/>
<publisherurl/>
<job>
<title/>
<date/>
<referencenumber/>
<requisitionid/>
<url/>
<company/>
<sourcename/>
<city/>
<state/>
<country/>
<email/>
<postalcode/>
<description/>
<salary/>
<education/>
<jobtype/>
<category/>
<experience/>
<indeed-apply-data>
<![CDATA[indeed-apply-apiToken=1234ABCDE&indeed-apply-jobTitle=Professional+B
asket+Weaver&indeed-apply-jobId=Sample+ID&indeed-apply-jobCompanyName=My+Favo
rite+Company&indeed-apply-jobLocation=Austin+TX&indeed-apply-jobUrl=http%3A%2
F%2Fwww.indeed.com&indeed-apply-postUrl=https%3A%2F%2Fhookb.in%2FPxOjJqJELNH8
lZLZDkpz&indeed-apply-questions=https%3A%2F%2Fpastebin.com%2Fraw%2F0vXq9q9b%2
3]]>
</indeed-apply-data>
</job>
</source>
IA XML element restrictions
The following restrictions apply when configuring Indeed Apply using the XML feed:
- Attributes must be URL encoded.
- If an Indeed Apply field is included in the XML feed, it must not be blank. Leaving it blank will cause Indeed Apply for those jobs to go into error.
IA configuration parameters
If you currently use HTTP Post URLs, please migrate them to HTTPS immediately. Here is an article that provides instructions for how to convert HTTP → HTTPS.
Parameter name | Required | Description | Example |
---|---|---|---|
jobUrl |
No | The canonical URL to the complete job description. Encode this URL in XML files.
Note: For applications on Indeed, the joburl will be set in the apply button to the specific URL on Indeed where the apply is taking place. |
http%3A%2F%2Fwww.yourcompany.com%2F%0Acareers%2Fyourjob123.html |
jobId |
No | The ID of the job, used for your own internal tracking. Note: This field can contain a maximum of 256 ASCII characters. |
7775e2bc62b7f77e |
jobTitle |
Yes | The title of the job to display externally. Note: this should match the <title> field in the XML. |
Test Engineer |
jobCompanyName |
Yes | The name of the company. This should match the value provided in the <company> field in the xml. |
Your Company |
jobLocation |
Yes | The location of the job. | New York, NY 10110 |
jobMeta |
No | Any arbitrary information you want to provide. This information is not displayed externally, but it will be sent when using the apply via post URL. | right-rail-apply-button |
apiToken |
Yes | The "Client ID" value generated with your Indeed Apply credentials. See Generating an API Token. | your-api-token |
postUrl |
Yes | The URL to which Indeed will post the application data. Encode this URL in XML files. Must be HTTPS. | https%3A%2F%2Fwww.yourcompany.com%2Fprocess-applications |
phone |
No | A string value indicating whether the phone number field should be displayed on the job.
Acceptable values are optional , hidden , or required . The default value is optional . |
optional |
coverletter |
No | A string value indicating if the message or coverletter field is required.
Acceptable values are optional , hidden , or required . The default value is optional .
Note: This is a freeform text field. If an attachment is expected consider using a screener question to request a file upload. |
required |
resume |
No | Specifies whether to require a resume, make a resume optional, or to hide the resume upload option from the user. Acceptable values are optional , hidden , or required . If this parameter is not included, the value will be set to required by default. If you select optional or hidden , you must include screener questions.Note: You must support .pdf, .doc, .docx, .rtf, and .txt formats for resumes. |
Acceptable values are required |
name |
No | A string value indicating if the name field in the apply form should be split into first and last name (name="firstlastname" ) or if a single field for the full name is sufficient (name="fullname" ). The default value renders a single field for the full name. We recommend using name="firstlastname" . |
firstlastname |
questions |
No | A URL which returns a JSON-formatted string of questions to be asked during the Indeed Apply application process. Refer to Including screener questions for more information about creating questions. Encode this URL in XML files.Must be HTTPS. | https%3A%2F%2Fwww.yourcompany.com%2Fjob1234%2Fquestions.json |
Screener questions
Format screener questions in JSON and post them to a URL (HTTPS) that is included in each <job>
in the indeed-apply-questions
parameter. Indeed does not host screener questions on your behalf. If your system supports screener questions you must implement them on Indeed Apply to have your integration approved.
Before you begin
Considerations
- You can provide a maximum of 500 questions. However, our data indicates that a sharp drop-off in conversion occurs when more than 20 questions are asked.
- Questions files should be no larger than 1 MB.
- Questions files are cached server-side by unique question URLs and refreshed every 20 minutes. Note: Questions are ONLY cached when they are requested by Indeed when a jobseeker starts the Indeed Apply process.
- The format of
type=date
impacts how the application is passed to the third party as well as the parsing of min and max. The job seeker still enters the date based on their locale, not the specified format, and validation error messages are in their locale’s format. - For
type=date
, useyyyy
instead ofyy
in the format to prevent confusion.
Note: Verify the syntax of your JSON file and preview the look of your screener questions using the Indeed Apply Questions tool.
Best practices
- Only include questions that are relevant to the job.
- Include as few screener questions as possible. Remember that some job seekers will answer these questions on mobile devices.
- Use the “pagebreak” question type to split your application into logical sections. Indeed inserts pagebreaks by default if none are included in your JSON, but this can split your application up in unintended ways. Indeed will show up to 10 questions per page for both mobile and desktop.
- Do not repeat questions that can be answered from a job seeker’s resume, or have already been collected during the Indeed Apply application process, e.g., basic contact details.
- Follow local laws when determining which questions to ask. Consult your legal department about questions your local laws may prohibit.
- Provide guidance to job seekers when answers require a specific format.
- Indeed uses the SimpleDateFormat, so month must be formatted as MM. Using mm will result in misconfiguration.
JSON for screener questions
This section lists the parameters used in building all question types. For examples of specific question types, refer to Screener question types.
JSON screener question parameters
Name | Required? | Description | Allowed values | Example |
---|---|---|---|---|
id |
Yes | Unique ID for this question. | any string | strengths |
type |
Yes | Describes the type of question. Refer to the following sections for a full explanation of each question type. | textarea
text select hierarchical multiselect date file information pagebreak |
textarea |
question |
No for type=information and type=pagebreak
Yes for all other types |
The question text that applicants see. | any string | Veteran status? |
text |
Yes for type=information
Not supported for all other types. |
Text that applicants see. | any string | The following questions are optional. |
options |
Yes for type=select and type=multiselect |
The list of options available in the drop-down menu. | JSON | [{
"value":"1",
"label":"Female"
}] |
value |
Yes for type=select and type=multiselect |
The value corresponding to each option that will be returned for questions with drop-down menus. | any string | 1 |
label |
Yes for type=select and type=multiselect |
The text for options in any drop-down menus. | any string | Female |
required |
No | Allows you to set a question as required. When required:true is present, Indeed Apply forces a non-empty text field or a non-empty selection. When the required parameter is not present, questions are optional. If a question is optional, a possible answer value is "". |
true | "required":true |
format |
Yes for type=date
No for type=text |
The accepted format of the input.
If used with type:text , the question will accept only integer, decimal, or numeric_text validation answers. If used with type:date , the question will only accept SimpleDateFormat with MM.
|
Text formats:
|
integer, dd/MM/yyyy |
limit |
No | For type=text and type=textarea , the character limit for the answer. |
any integer | 100 |
min |
No | For format=integer or format=decimal , the minimum value for the answer. For type=date , the date that the answer must be on or after. |
any integer for format=integer
any decimal for format=decimal
any date for type=date (in the specified format) |
0 |
max |
No | For format=integer or format=decimal the maximum value for the answer. For type=date , the date the answer must be on or before. |
any integer for format=integer
any decimal for format=decimal
any date for type=date (in the specified format) |
100 |
condition |
No | Marks a question as conditional, depending on the answer to a previous select question. Specify the id of the previous question as well as the option value that activates this question.
For example, you might ask the applicant if they served in the military. If they answer yes, you display a conditional question that asks what branch they served in. |
JSON | "condition": {
"id": "parent1",
"value": 0} |
Screener question types
textarea
A question that displays a multi-line text entry field. Used for questions with long-form answers.
textarea example
{
"id": "envirotext",
"type": "textarea",
"question": "Describe your ideal work environment:"
}
text
A question that displays a single-line text entry field. Used for questions with shorter answers.
Note: Please see the examples below as well as the previous table for more information on the different formats available for text questions: integer, decimal, numeric_text.
text examples
No format specification:
{
"id": "city",
"type": "text",
"question": "What city are you located in?",
"required": true
}
Integer: Displays whole numbers; does not allow for decimals or leading zeroes
{
"id": "age",
"type": "text",
"question": "Age?",
"format": "integer",
"min": "16",
"max": "75"
}
Numeric text: Allows for numbers with leading zeroes; does not allow for decimals
{
"id": "ssn",
"type": "text",
"format": "numeric_text",
"question": "Enter last 4 digits of your SSN.",
"required": false
}
Decimal: Displays numbers with decimals; allows for leading zeroes
{
"id": "gpa",
"type": "text",
"format": "decimal",
"question": "What was your GPA?",
"required": true
}
select
A question that displays a drop-down menu that allows the applicant to select a single answer. Used for questions with multiple choice answers.
Note: If you include 5 or fewer answer options, they will appear as radio buttons. If you include more than 5 options, they will appear in a drop-down menu.
select example
{
"id": "gender",
"type": "select",
"question": "Gender?",
"options": [{
"value": "0",
"label": "Decline to answer"
},
{
"value": "1",
"label": "Male"
},
{
"value": "2",
"label": "Female"
}
]
}
multiselect
A question that displays a list of checkboxes that allows the applicant to select multiple answers. Used for questions with multiple answers.
multiselect example
{
"id": "favoritecolors",
"type": "multiselect",
"question": "Select your two favorite colors:",
"options": [{
"value": "0",
"label": "Maize"
},
{
"value": "1",
"label": "Blue"
},
{
"value": "2",
"label": "Green"
}
]
}
conditional
A question that is or is not displayed based on responses to previous questions. For example, you might ask an applicant if they are at least 18 years of age. If they answer no, you ask if they can provide required work documentation.
conditional example
[{
"id": "profile-atLeast18",
"question": "Are you at least 18 years of age?",
"required": true,
"options": [{
"value": "1",
"label": "Yes"
},
{
"value": "0",
"label": "No"
}
],
"type": "select"
},
{
"id": "profile-permit",
"question": "Can you provide a work permit?",
"required": true,
"condition": {
"id": "profile-atLeast18",
"value": "0"
},
"options": [{
"value": "1",
"label": "Yes"
},
{
"value": "0",
"label": "No"
}
],
"type": "select"
}
]
hierarchical
A question that displays additional questions and responses based on previously selected answers. For example, you might ask an applicant to choose a state. Then, depending on what they select, you could offer them a drop-down list of cities within that state. Each hierarchical question is limited to three levels, for example: state/city/county.
Note: Hierarchical questions are similar to conditional questions. However, hierarchical questions may be better suited to certain question types where an initial selection defines potential answers for subsequent questions. Using the hierarchical functionality reduces the total number of questions needed to obtain related information.
hierarchical example
[{
"id": "hierarchical",
"type": "hierarchical",
"question": "State",
"required": true,
"options": [{
"value": "0",
"label": "California"
}, {
"value": "1",
"label": "Texas"
}, {
"value": "2",
"label": "New York"
}],
"hierarchicalOptions": [{
"id": "cali_cities",
"options": [{
"value": "0",
"label": "San Francisco"
}, {
"value": "1",
"label": "Los Angeles"
}],
"condition": {
"id": "hierarchical",
"value": "0"
}
}, {
"id": "texas_cities",
"options": [{
"value": "0",
"label": "San Antonio"
}, {
"value": "1",
"label": "Austin"
}],
"condition": {
"id": "hierarchical",
"value": "1"
}
},
{
"id": "sa_zipcodes",
"options": [{
"value": "0",
"label": "78212"
}, {
"value": "1",
"label": "78209"
}],
"condition": {
"id": "texas_cities",
"value": "0"
}
}
]
}]
date
A question that displays a text field that only accepts date entry. Used for questions that must be answered with a date.
Note: format
is required when using this screener question type. The format must be dd/MM/yyyy or another locale specific format that meets Unicode CLDR formatting. Indeed uses the SimpleDateFormat, so month must be formatted as MM. Using mm will result in misconfiguration.
date example
{
"id": "startdate",
"required": true,
"type": "date",
"question": "Start date?",
"format": "dd/MM/yyyy",
"min": "01/02/2014",
"max": "03/04/2014"
}
file
A question that displays a file upload interface. Used for questions that require a file upload as an answer, such as certifications, portfolios, or example work. As detailed in Application data delivery options, the answer data returned in the JSON POST request will contain 3 fields: contentType,
data,
and fileName.
Accepted file types: doc, docx, gif, jfif, jif, jpe, jpeg, jpg, pdf, png, rtf, tif, tiff, txt
File size limit: 5 MB. The maximum combined limit per application is 15MB, including resume file.
Note: Do not use this question type to acquire resumes. Instead, use the “Resume” Indeed Apply configuration parameter.
file example
{
"id": "file2",
"type": "file",
"question": "Please attach a recent example of your work.",
"required": true,
"min": "1",
"max": "3"
}
information
A text display that does not require a response. Used to include explanatory text or provide section headings. You can include the following HTML elements in the text: <b>
, <p>
, <br>
, <li>
, <ul>
, <ol>
, <a href=" ">
. Only HTTP and HTTPS protocols are allowed in URLs. Links open in a new tab.
Note: Do not use <br>
to force line breaks after paragraphs. Indeed automatically inserts line breaks between paragraphs.
information example
[{
"id": "first_header",
"type": "information",
"text": "The next set of questions are <b>optional</b> and are for recording purposes only.
Make sure to view the < a href = 'http://www.eeoc.gov/employers/upload/poster_screen_reader_optimized.pdf' > EEO is the Law < /a> poster.",
"fontsize": 8
}]
pagebreak
Used to group questions on a page. All questions included between two pagebreak
types appear on the same page. You can group up to 20 questions on the same page. Indeed defaults to 3 questions per page on desktop and groups all questions onto a single page for mobile.
pagebreak example
[{
"id": "page1_open",
"type": "pagebreak"
},
{
"id": "question_sample",
"type": "text",
"question": "Age?"
},
{
"id": "page1_close",
"type": "pagebreak"
}
]
JSON post example
Note: This section describes the contents of the submitted application data that is delivered to the Employer. No changes are required to the format of the JSON question files provided to Indeed.
Currently, the JSON post contains ‘screener questions' and their 'answers’ in 2 formats:
- The Legacy* format
- The Current format
Both formats are described below. In the future, we will discontinue the "Legacy" format.
The Legacy* Format
In the Legacy format, the screener questions and their answers are a part of the 'questions' section in the JSON file.
- question:
- questions: the full questions list as described in the previous section
- answers: the full answers list
- url: the URL from which the questions were retrieved
- retrievedOnMillis: the datetime in milliseconds at which the questions were retrieved
The Current Format
In the Current format, the screener questions and their answers are a part of the 'questionsAndAnswers' section in the JSON file.
- questionsAndAnswers: (Improved format)
- questionsAndAnswers: A list of
- question: question as described in the previous section
- answer: the answer given to the above question
- url: the URL from which the questions were retrieved
- retrievedOnMillis: the datetime in milliseconds at which the questions were retrieved
Click this link to view or download a full example JSON post file. (Contains both the Legacy and Current formats.)
*Legacy format: We will discontinue the Legacy format in future. In case you use the Legacy format to read ‘Screener questions and their answers’, you are requested to make changes as soon as possible to ensure your Indeed Apply integration continues to receive the complete and correct information. If you are an existing Employer or ATS that uses the Legacy format and wants to migrate to the Current format - then you can refer to this additional guide for migration.
Testing your screener questions?
Verify the syntax of your JSON file and preview the look of your screener questions using the Indeed Apply Questions tool.
Test the entire Indeed Apply application flow by using our Apply XML Configuration Testing Tool. This can include the full screener question process. See more about the tool in the Testing IA section.
The legacy version of the testing tool can still be accessed, if needed.
Back to topApplication data delivery
PostUrl
If you process applications programmatically, specify a URL where Indeed Apply will send a POST request. The indeed-apply-postUrl
data attribute must be a string containing the URL where Indeed will POST the application data. The URL must be HTTPS.
If you currently use HTTP Post URLs, please migrate them to HTTPS immediately. Here is an article that provides instructions for how to convert HTTP → HTTPS.
PostUrl example
<indeed-apply-data>
<![CDATA[indeed-apply-apiToken=1234ABCDE&indeed-apply
-jobTitle=Professional+Basket+Weaver&indeed-apply-jobId=Sample+ID&indeed
-apply-jobCompanyName=My+Favorite+Company&indeed-apply-jobLocation=Austi
n+TX&indeed-apply-jobUrl=http%3A%2F%2Fwww.indeed.com&indeed-apply-postUr
l=https%3A%2F%2Fhookb.in%2FPxOjJqJELNH8lZLZDkpz&indeed-apply-questions=h
ttps%3A%2F%2Fpastebin.com%2Fraw%2F0vXq9q9b%23]]>
</indeed-apply-data>
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
{
"id": "2b806761c722b0bf431e67168a74bfaf4d67e6070d6ac0160cace3277f6b99df",
"job": {
"jobId": "123456",
"jobKey": "8q2w4e4r5t6y7u8i",
"jobTitle": "Test Engineer",
"jobCompany": "Your Company",
"jobLocation": "Austin TX",
"jobUrl": "http://www.yourcompany.com/careers/yourjob123",
"jobMeta": "job-meta"
},
"applicant": {
"fullName": "Indeed Tester",
"coverletter": "Cover Letter of Indeed Tester for Your Company",
"email": "Indeed.Tester@indeed.com",
"phoneNumber": "+123321-1111111",
"resume": {
"file": {
"id": "13ffsffc30b0737c5b2927c0sfqq24rr8a214ef4ca6cacded5dcaa3032e8fcd3",
"fileName": "Indeed_Tester-Upload-Resume.pdf",
"contentType": "application/pdf",
"data": "VBeead131ERi0x"
}
},
"verified": true
},
"questions": {
"url": "https://apply.qa.indeed.net/indeedapply/static/questions/basic.json",
"retrievedOnMillis": 0,
"questions": [{
"id": "automation_exp",
"question": "How many years of Automation experience do you have?",
"type": "text",
"required": true,
"format": "integer",
"min": "0",
"max": "99",
"limit": "300",
"options": [],
"hierarchicalOptions": []
},
{
"id": "japanese",
"question": "Do you speak Japanese?",
"type": "select",
"required": true,
"options": [{
"label": "Yes",
"value": "0"
},
{
"label": "No",
"value": "1"
}
],
"hierarchicalOptions": []
},
{
"id": "experience",
"question": "Describe your most favourite ice cream flavor",
"type": "textarea",
"required": false,
"options": [],
"hierarchicalOptions": []
},
{
"id": "extra",
"question": "Website Url",
"type": "text",
"required": false,
"options": [],
"hierarchicalOptions": []
},
{
"id": "multi",
"question": "Which countries would you relocate to? (you can select multiple)",
"type": "multiselect",
"required": false,
"options": [{
"label": "United States",
"value": "0"
},
{
"label": "Canada",
"value": "1"
},
{
"label": "Mexico",
"value": "2"
},
{
"label": "Belize",
"value": "3"
},
{
"label": "Other",
"value": "4"
}
],
"hierarchicalOptions": []
}
],
"answers": [{
"id": "automation_exp",
"value": "12"
},
{
"id": "japanese",
"value": "0"
},
{
"id": "experience",
"value": "Ice Cream"
},
{
"id": "extra",
"value": "www.testurl.com"
},
{
"id": "multi",
"values": [
"1",
"2",
"3"
]
}
]
},
"questionsAndAnswers": {
"url": "https://apply.qa.indeed.net/indeedapply/static/questions/basic.json",
"retrievedOnMillis": 0,
"questionsAndAnswers": [{
"question": {
"id": "automation_exp",
"question": "How many years of Automation experience do you have?",
"type": "text",
"required": true,
"format": "integer",
"min": "0",
"max": "99",
"limit": "300",
"options": [],
"hierarchicalOptions": []
},
"answer": "12"
},
{
"question": {
"id": "japanese",
"question": "Do you speak Japanese?",
"type": "select",
"required": true,
"options": [{
"label": "Yes",
"value": "0"
},
{
"label": "No",
"value": "1"
}
],
"hierarchicalOptions": []
},
"answer": {
"label": "Yes",
"value": "0"
}
},
{
"question": {
"id": "experience",
"question": "Describe your most favourite ice cream flavor",
"type": "textarea",
"required": false,
"options": [],
"hierarchicalOptions": []
},
"answer": "Ice Cream"
},
{
"question": {
"id": "extra",
"question": "Website Url",
"type": "text",
"required": false,
"options": [],
"hierarchicalOptions": []
},
"answer": "www.testurl.com"
},
{
"question": {
"id": "multi",
"question": "Which countries would you relocate to? (you can select multiple)",
"type": "multiselect",
"required": false,
"options": [{
"label": "United States",
"value": "0"
},
{
"label": "Canada",
"value": "1"
},
{
"label": "Mexico",
"value": "2"
},
{
"label": "Belize",
"value": "3"
},
{
"label": "Other",
"value": "4"
}
],
"hierarchicalOptions": []
},
"answer": [{
"label": "Canada",
"value": "1"
},
{
"label": "Mexico",
"value": "2"
},
{
"label": "Belize",
"value": "3"
}
]
}
]
},
"analytics": {
"ip": "0.0.0.0",
"advNum": "1212121212121",
"userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36",
"device": "desktop",
"sponsored": false
},
"appliedOnMillis": 1629153774243,
"locale": "nl"
}
JSON Indeed Resume example
{
"id": "2b806761c722b0bf431e67168a74bfaf4d67e6070d6ac0160cace3277f6b99df",
"job": {
"jobId": "123456",
"jobKey": "8q2w4e4r5t6y7u8i",
"jobTitle": "Test Engineer",
"jobCompany": "Your Company",
"jobLocation": "Austin TX",
"jobUrl": "http://www.yourcompany.com/careers/yourjob123",
"jobMeta": "job-meta"
},
"applicant": {
"fullName": "Indeed Tester",
"firstName": "Indeed",
"lastName": "Tester",
"coverletter": "Cover Letter of Indeed Tester for Your Company",
"email": "Indeed.Tester@indeed.com",
"phoneNumber": "+123321-1111111",
"resume": {
"file": {
"fileName": "Indeed_Tester.pdf",
"contentType": "application/pdf",
"data": "JVBERi0xL=="
},
"html": "<html><head></head><body>Resume Content</body></html>",
"json": {
"firstName": "Indeed",
"lastName": "Tester",
"email": "Indeed.Tester@indeed.com",
"headline": "headline",
"summary": "summary",
"additionalInfo": "additionalinfo",
"phoneNumber": "555-555-4321",
"location": {
"country": "US",
"city": "Austin, TX",
"postalcode": "12345"
},
"personalDetails": {},
"skills": "Skill 1, Skill 2, Skill 3",
"positions": {
"_total": 2,
"values": [{
"startDateMonth": "01",
"startDateYear": "2015",
"endCurrent": true,
"title": "Product Manager",
"company": "Indeed",
"location": "Austin, TX",
"description": "This is a job I had. This is a description of what I did there. Resume used for testing purposes only."
},
{
"startDateMonth": "04",
"startDateYear": "2010",
"endDateMonth": "01",
"endDateYear": "2015",
"endCurrent": false,
"title": "Software Engineer",
"company": "Indeed",
"location": "Austin, TX",
"description": "This is a job I had. This is the description of what I did. Used for testing purposes only."
}
]
},
"educations": {
"_total": 1,
"values": [{
"degree": "Bachelor of Arts",
"field": "Graphic Design",
"school": "University of Texas",
"location": "Austin, TX",
"startDate": "2014",
"endDate": "2019",
"startDateYear": "2014",
"endDateYear": "2019",
"startDateMonth": "01",
"endDateMonth": "02",
"endCurrent": false
}]
},
"languages": {
"_total": 1,
"values": [{
"language": "French",
"proficiency": "Fluent"
}]
},
"links": {
"_total": 1,
"values": [{
"url": "http://www.indeed.com"
}]
},
"awards": {
"_total": 1,
"values": [{
"dateMonth": "04",
"dateYear": "2020",
"title": "Award Title",
"description": "award description"
}]
},
"certifications": {
"_total": 0,
"values": []
},
"associations": {
"_total": 1,
"values": [{
"startDateMonth": "01",
"startDateYear": "2014",
"endDateMonth": "06",
"endDateYear": "2018",
"endCurrent": false,
"title": "Group Title",
"description": "group description"
}]
},
"patents": {
"_total": 1,
"values": [{
"dateMonth": "04",
"dateYear": "2012",
"title": "Patent Title",
"description": "patent description",
"patentNumber": "12345",
"url": "http://www.indeed.com"
}]
},
"publications": {
"_total": 1,
"values": [{
"dateMonth": "08",
"dateYear": "2019",
"title": "Publication Title",
"description": "publication description",
"url": "http://www.indeed.com"
}]
},
"militaryServices": {
"_total": 1,
"values": [{
"startDateMonth": "02",
"startDateYear": "2003",
"endDateMonth": "05",
"endDateYear": "2009",
"endCurrent": false,
"serviceCountry": "US",
"branch": "military branch",
"rank": "rank",
"commendations": "military commendations",
"description": "military service description"
}]
}
},
"text": "resume in text format"
},
"verified": true
},
"questions": {
"url": "https://apply.qa.indeed.net/indeedapply/static/questions/basic.json",
"retrievedOnMillis": 0,
"questions": [{
"id": "automation_exp",
"question": "How many years of Automation experience do you have?",
"type": "text",
"required": true,
"format": "integer",
"min": "0",
"max": "99",
"limit": "300",
"options": [],
"hierarchicalOptions": []
},
{
"id": "japanese",
"question": "Do you speak Japanese?",
"type": "select",
"required": true,
"options": [{
"label": "Yes",
"value": "0"
},
{
"label": "No",
"value": "1"
}
],
"hierarchicalOptions": []
},
{
"id": "experience",
"question": "Describe your most favourite ice cream flavor",
"type": "textarea",
"required": false,
"options": [],
"hierarchicalOptions": []
},
{
"id": "extra",
"question": "Website Url",
"type": "text",
"required": false,
"options": [],
"hierarchicalOptions": []
},
{
"id": "multi",
"question": "Which countries would you relocate to? (you can select multiple)",
"type": "multiselect",
"required": false,
"options": [{
"label": "United States",
"value": "0"
},
{
"label": "Canada",
"value": "1"
},
{
"label": "Mexico",
"value": "2"
},
{
"label": "Belize",
"value": "3"
},
{
"label": "Other",
"value": "4"
}
],
"hierarchicalOptions": []
}
],
"answers": [{
"id": "automation_exp",
"value": "12"
},
{
"id": "japanese",
"value": "0"
},
{
"id": "experience",
"value": "Ice Cream"
},
{
"id": "extra",
"value": "www.testurl.com"
},
{
"id": "multi",
"values": [
"1",
"2",
"3"
]
}
]
},
"questionsAndAnswers": {
"url": "https://apply.qa.indeed.net/indeedapply/static/questions/basic.json",
"retrievedOnMillis": 0,
"questionsAndAnswers": [{
"question": {
"id": "automation_exp",
"question": "How many years of Automation experience do you have?",
"type": "text",
"required": true,
"format": "integer",
"min": "0",
"max": "99",
"limit": "300",
"options": [],
"hierarchicalOptions": []
},
"answer": "12"
},
{
"question": {
"id": "japanese",
"question": "Do you speak Japanese?",
"type": "select",
"required": true,
"options": [{
"label": "Yes",
"value": "0"
},
{
"label": "No",
"value": "1"
}
],
"hierarchicalOptions": []
},
"answer": {
"label": "Yes",
"value": "0"
}
},
{
"question": {
"id": "experience",
"question": "Describe your most favourite ice cream flavor",
"type": "textarea",
"required": false,
"options": [],
"hierarchicalOptions": []
},
"answer": "Ice Cream"
},
{
"question": {
"id": "extra",
"question": "Website Url",
"type": "text",
"required": false,
"options": [],
"hierarchicalOptions": []
},
"answer": "www.testurl.com"
},
{
"question": {
"id": "multi",
"question": "Which countries would you relocate to? (you can select multiple)",
"type": "multiselect",
"required": false,
"options": [{
"label": "United States",
"value": "0"
},
{
"label": "Canada",
"value": "1"
},
{
"label": "Mexico",
"value": "2"
},
{
"label": "Belize",
"value": "3"
},
{
"label": "Other",
"value": "4"
}
],
"hierarchicalOptions": []
},
"answer": [{
"label": "Canada",
"value": "1"
},
{
"label": "Mexico",
"value": "2"
},
{
"label": "Belize",
"value": "3"
}
]
}
]
},
"analytics": {
"ip": "0.0.0.0",
"advNum": "1212121212121",
"userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36",
"device": "desktop",
"sponsored": false
},
"appliedOnMillis": 1629153774243,
"locale": "nl"
}
IA JSON fields
Top-level fields
Field name | Description | Example |
---|---|---|
id
|
Unique ID for the application as assigned by Indeed. 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 third-party website or if the job seeker was directed to apply through Indeed's Targeted Ads (ITA) product. Third-party sites cannot specify whether a job is sponsored. To track sponsored job clicks on third-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 third-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. |
|
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 |
---|---|---|
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
|
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 and 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 |
No | 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 that 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. |
languages
|
array-like | An array-like object of language 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 |
---|---|---|---|---|
highestLevelOfEducation |
Single Value | AE, AU, BE, BR, CA, CL, CO, CR, CZ, DK, EC, ES, GB, HK, HU, IE, IT, LU, MX, NG, NL, NO, PA, PE, PL, PT, RO, RU, SE, TR, TW, UA, UY, VE, VN,ZA | 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 |
employmentEligibility |
Single Value | AE, AU, BH, EG, GB, HK, IT, KW, MA, NZ, OM, QA, RU, SA, SG | Asks if job seekers are eligible to work in a country. | Yes |
highestCareerLevel |
Single value | FR, HK, IN, KR, VN, ZA | Job seekers can select their highest career level from 4 options. | New Grad |
industry |
Multi Value | AE, AR, BH, BR, CL, CN, CO, CR, EC, EG, ES, FR, GB, IE, IN, KR, KW, LU, MA, MX, NG, OM, PA, PE, QA, RU, SA, TR, TW, UA, UY, VE, ZA | A drop-down where job seekers can select the industry in which they work/specialize. | Arts & Entertainment |
driversLicense |
Multi Value | AR, BE, CL, CO, CR, CZ, EC, ES, GB, IT, JP, MX, NL, PA, PE, RU, TR, UY, VE, ZA | A dropdown with localized Driver License options for each corresponding market. | Light Vehicles |
dateOfBirth |
Date | AE, AR, BH, BR, CK, CN, CO, CR, EC, EG, ES, FR, HK, ID, IN, IT, JP, KR, KW, MA, MX, MY, NG, OM, PA, PE, PT, QA, RU, SA, SG, TR, TW, UA, UY, VE, VN, ZA | 3 dropdowns - date, month and year. Order is localized per market. | DD-MM-YYYY |
educationDescription |
Open text | CH, DE, NO, SE, UA, UY, VN, VN | Job seekers can describe their education. | Open text |
gender |
Single Value | JP | The job seeker’s gender. | Female |
disability |
Single Value | BR, IT, MX, ZA | A dropdown with different disability options (BR) or yes/no for remaining markets. | Cognitive OR Yes |
ethnicity |
Single Value | ZA | A dropdown with ethnicity options. | African |
veteranStatus |
Single Value | KR | A job seeker’s veteran status. | Applicable |
NYSCStatus |
Single Value | NG | A dropdown for a job seeker's NYSC status. | Ongoing |
employmentSupportStatus |
Single Value | KR | A job seeker’s employment support status. | Applicable |
willingToTravel |
Single Value | AR, CL, CO, CR, EC, ES, MX, PA, PE, UY, VE | A dropdown for a job seekers' willingness to travel. | Yes |
europeanUnionWorkPermit |
Single Value | IE | Asks job seekers if they have a European Work Permit. | Yes |
citizenship |
Single Value | PH, SG, ZA | A dropdown for a job seeker's citizenship. | South African Citizen |
IDP |
Checkbox | UA | Asks job seekers whether they are an internally displaced migrant. | IDP (Internally Displaced Migrants) |
employmentEligibilityMultiCountries |
Multi Value | ES, IN | A dropdown that asks job seekers which countries they are eligible to work in. | Afghanistan |
idNumber |
Numeric | BR, IT, TR, ZA | Asks job seekers to type in their ID Number. | Numeric value |
totalYearsOfExperience |
Numeric | ID, IN | Asks job seekers about their years of experience. | 3 |
hobbiesAndInterests |
Open text | CZ, HU, KR, LU, PL, RO | Asks job seekers about their hobbies and interests. | Open text |
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 |
string | A string containing a number (1-12) representing the starting month. | "09" |
startDateYear |
string | A string containing a number representing the year of the start date. | "2007" |
endDateMonth |
string | A string containing a number (1-12) representing the ending month. | "09" |
endDateYear |
string | A string containing a number representing the year of the end date. | "2007" |
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 |
startDateMonth |
string | A string containing a number (1-12) representing the starting month. | "09" |
startDateYear |
string | A string containing a number representing the year of the start date. | "2007" |
endDateMonth |
string | A string containing a number (1-12) representing the ending month. | "09" |
endDateYear |
string | A string containing a number representing the year of the end date. | "2007" |
endCurrent |
boolean | A flag indicating if this education is in progress. | true |
Indeed Resume language fields
Field name | Type | Description | Example |
---|---|---|---|
language |
string | A spoken, written, or signed language. | French |
proficiency |
string | The level of proficiency in a spoken, written, or signed language. | Fluent |
Indeed Resume link fields
Field name | Type | Description | Example |
---|---|---|---|
url |
string | The URL of the link. | https://www.indeed.com |
Indeed Resume award fields
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 |
string | A string containing a number (1-12) representing the month. | "09" |
dateYear |
string | A string containing a number representing the year. | "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 |
string | A string containing a number (1-12) representing the starting month. | "09" |
startDateYear |
string | A string containing a number representing the year of the start date. | "2007" |
endDateMonth |
string | A string containing a number (1-12) representing the ending month. | "09" |
endDateYear |
string | A string containing a number representing the year of the end date. | "2007" |
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 |
string | A string containing a number (1-12) representing the starting month. | "09" |
startDateYear |
string | A string containing a number representing the year of the start date. | "2007" |
endDateMonth |
string | A string containing a number (1-12) representing the ending month. | "09" |
endDateYear |
string | A string containing a number representing the year of the end date. | "2007" |
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 |
string | A string containing a number (1-12) representing the month. | "09" |
dateYear |
string | A string containing a number representing the year. | "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 |
string | A string containing a number representing the day of the month. | "03" |
dateMonth |
string | A string containing a number (1-12) representing the month. | "09" |
dateYear |
string | A string containing a number representing the year. | "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 |
string | A string containing a number (1-12) representing the starting month. | "09" |
startDateYear |
string | A string containing a number representing the year of the start date. | "2007" |
endDateMonth |
string | A string containing a number (1-12) representing the ending month. | "09" |
endDateYear |
string | A string containing a number representing the year of the end date. | "2007" |
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 6.0)
using System;
using System.Security.Cryptography;
using System.Text;
class MainClass
{
public static void Main(string[] args)
{
String message = getMessage();
// This is a sample api Secret for demonstration do not alter
String apiSecret = "Y0ur api secret key not shared &$%@";
String signature = computeSignature(message, apiSecret);
// Compare the message paylod signature hashed value to the pre-determined signature from the send...
if (signature.Equals("SGadPKocf3HD1LYXm3xGObB6hzk="))
{
Console.WriteLine("Successful signature validation using B64 HMAC SHA1: " + signature);
}
else
Console.WriteLine("Invalid Signature: " + 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()
{
string msg = "{'locale':'en_US','applicant':{'fullName':'John Doe','email':'john.doe@example.com'}}";
return msg;
}
}
Using Java (openjdk version 17.0.4.1)
import javax.crypto.Mac;
import javax.crypto.spec.*;
import javax.crypto.SecretKey;
import java.util.Base64;
public class App {
public static void main(String[] args) {
String message = getMessage();
String apiSecret = "Y0ur api secret key not shared &$%@";
String signature = computeSignature(message, apiSecret);
if(!signature.equals("SGadPKocf3HD1LYXm3xGObB6hzk="))
System.out.println("Invalid Signature: "+signature);
else
System.out.println("Successful signature validation using B64 HMAC SHA1: " + signature);
}
static String computeSignature(String message, String apiSecret) {
try{
byte[] keyBytes = apiSecret.getBytes();
SecretKey signingKey = new SecretKeySpec(keyBytes, "HmacSHA1");
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 secret key
$key = "Y0ur api secret key not shared &\$\%\@";
# test message
$message = get_message();
# compute signature
$signature = hmac_sha1_b64_string($key, $message);
if ($signature eq "SGadPKocf3HD1LYXm3xGObB6hzk=") {
print "Successful signature validation using B64 HMAC SHA1: " . $signature, "n";
} else{
print "Invalid Signature: ", $signature, "n";
}
sub hmac_sha1_b64_string {
$keybtes = encode("UTF8", $key);
$databytes = encode("UTF8", $message);
$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= "Y0ur api secret key not shared &$%@";
$message= "{'locale':'en_US','applicant':{'fullName':'John Doe','email':'john.doe@example.com'}}";
$signature= sign($message,$api_secret);
if( $signature!= "SGadPKocf3HD1LYXm3xGObB6hzk=")
print("Invalid Signature ". $signature);
else
print("Successful signature validation using B64 HMAC SHA1: " . $signature);
Using Python (version 3.10)
from hashlib import sha1
import hmac
import base64
# your secret key
secret = "Y0ur api secret key not shared &$%@".encode("utf-8")
# test message
message = "{'locale':'en_US','applicant':{'fullName':'John Doe','email':'john.doe@example.com'}}".encode('UTF-8')
print(message)
# 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 != b'SGadPKocf3HD1LYXm3xGObB6hzk=':
print("Invalid Signature: " + str(signature))
else:
print('Successful Signature Validation using B64 HMAC SHA1: ' + str(signature))
Using Node JS (LTS 16)
// Dependencies
const fs = require('fs');
const crypto = require('crypto');
const secret = "Your secret key - this the secret key associated with your Indeed Apply"
const xIndeedSignature = "This is the value of the X-Indeed-Signature return as part of the request headers";
/* Read data.json, this is the raw payload indeed send you in the body of the response.
create a data.json in the same directory with your index.js file
*/
const data = fs.readFileSync('data.json', {
encoding: 'utf8',
flag: 'r+'
});
// Encode data in base64
const encodedStr = new Buffer.from(data).toString('base64');
//compute the hash
const signature = crypto.createHmac('SHA1', secret).update(encodedStr, 'base64').digest('base64');
// check the computed signature against the X-Indeed-Signature provided in the request_headers of your application
if (signature !== xIndeedSignature) {
console.log(`invalid signature: ${signature}`, `\nX-Indeed-Signature: ${xIndeedSignature}`);
} else {
console.log(`Computed signature matches: ${signature}`);
}
Back to top
Using SSL
Please see the List of Trusted Root SSL Certificates for supported certificates. If your certificate is not listed please follow up with your Marketplace Platforms manager to test and verify your integration.
Back to topTesting and Monitoring Your IA Integration
We want to help you provide the best possible experience for job seekers and employers who use Indeed. Review the following sections to avoid issues with your integration.
Testing IA
In order to test your integration setup and make sure that everything is running smoothly prior to pushing a job or integration live, Indeed provides the Apply XML Configuration Testing Tool.
You can input your Indeed Apply XML metadata into the tool or the tool can generate XML metadata for you based on a number of configurable parameters. The tool will highlight errors in formatting and content, allowing you to quickly identify any issues.
If no errors are detected, the tool will generate a "Start testing" button. Click this button to see what the application process will look like to a prospective jobseeker and to submit a test application to ensure the process is working correctly.
Testing Your XML Metadata
The first tab of the Apply XML Configuration Testing Tool allows you to input the Indeed Apply metadata from your XML and see what it will look like in the apply flow. It will also list all of the parameters that are included in the XML under the “Configuration” section, so you can see your detected job elements.
For more information on the supported parameters, see the Configuration Parameters table.
Additionally, the tool will automatically identify any errors within your metadata that might cause Indeed Apply to malfunction. For example, the tool will detect if a required parameter is missing or if the file isn’t formatted correctly and display an alert.
Building Your XML Using Configurable Parameters
The second tab of the Apply XML Configuration Testing Tool allows you to fill in a variety of configurable parameters and generates XML metadata for Indeed Apply automatically. You can also see how the job will look in the apply flow with the provided information.
Once generated, you can add the metadata into your existing XML feed. See the Adding Indeed Apply using XML section of the documentation for an example.
Aside from the provided default parameters, you can also add additional parameters from a list of options. Once selected and filled in, these parameters will automatically add themselves to the generated XML.
Verify the syntax of your JSON file and preview the look of your screener questions using the Indeed Apply Questions tool.
Monitor integration health
When integrating with Indeed Apply, set up monitoring to ensure:
- The integration successfully delivers job applications
- Questions files are consistently available and valid
Indeed monitors whether applications are delivered successfully to our partners, along with other health indicators. If any problems arise, Indeed will contact you. In some cases, Indeed will disable the Apply feature for some or all of your jobs until issues are fixed.
Note: Undelivered applications are not lost. In case of failure, retry attempts are made automatically at periodic intervals after the original apply. If delivery is not possible, applications are retained for 60 days and retry attempts can be made on request.
To avoid integration issues, make sure you are returning HTTP status code 200 for all applications that are successfully received. Indeed Apply considers any other HTTP status codes, post timeouts or connect timeouts to be failures.
Additionally, return the following statuses in these conditions:
- 409 (Conflict): Use if there is a duplicate application already in your system. We define duplicate as an application from the same job seeker email, to the same jobid, within 120 days.
- 410 (Gone): Use if a job Indeed attempts to post to is expired or no longer available. if you respond with HTTP410 Indeed will expire the job from our search results. If the job is still present in the XML at the time of the next feed run we'll un-expire the position.
If your jobs use screener questions, also ensure the pages that host those files:
- are consistently available
- do not redirect
- are properly formed
Common integration issues
The following common issues may cause integration errors with POST or Question URLs:
Issue | Solution |
---|---|
Redirecting to another location, e.g., via 301 redirects |
Ensure the POST and Question URLs do not include redirects. If you must include a protocol change (i.e. HTTP to HTTPS), be sure to:
|
Expired SSL certificate | Renew your SSL certificate. For more information, see the List of Trusted Root SSL Certificates. |
Misconfigured SSL |
Use an SSL server test to analyze and help diagnose the problem, e.g., https://www.ssllabs.com/ssltest/ Make sure to:
|
Question’s JSON is invalid or doesn’t follow Indeed’s requirements definition | Review the screener question requirements. Use the Test Indeed Apply Questions tool to preview changes. |
Other issues accessing the resource (404, 500 errors, timeouts) | Implement strategies to ensure your resources reliably scale to accommodate high-traffic periods. Additionally, use appropriate HTTP response codes to help us investigate any issues that may occur. As Indeed does not have a post size limit, please ensure you're able to handle any size post from Indeed. If you are unable to accommodate this request, please return an HTTP 413 error to indicate the post was too large. |
Integration Checklist
Review the following checklist before submitting your XML feed to your Marketplace Platforms Manager. Following this checklist ensures the submission process is efficient for you and Indeed.
- Check the top of the XML file to make sure version, encoding, and publisher information are present.
<?xml version=”1.0” encoding=”utf-8”?> <source> <publisher> Example Job Site</publisher> <publisherurl>http://www.examplejobsite.com</publisherurl>
- Include all companies in the XML file. Indeed already has a list of most jobs, so any missing companies will prevent the file from going live.
- Ensure you have included all jobs available on your website; this includes jobs from sub-brands or subsidiaries of the parent company. Discrepancies in job volume between career portals and what's in the XML may result in lowered visibility for jobs coming through the provided XML. Note: Every job needs to have a unique URL in the
<url>
tag. - Confirm that all the following required fields are present and properly formatted as outlined in the XML Feed Elements section.
- Remove all TEST jobs from the file. Otherwise it will be rejected.
- Make sure you test the Indeed Apply data you’re including in the feed. If you have any trouble, contact your Marketplace Platforms Manager and they’ll troubleshoot with you.
- Use the Apply XML Configuration Testing Tool and the IA code in the XML to confirm the feed is working properly. See more about the tool in the Testing IA section.
- Ensure that all URLs (joburl, posturl, questions) included in metadata are fully URL encoded.
- Verify that your
analytics
field can categorize applications as organic, sponsored, or Indeed Targeted Ad.
For more information, refer to Indeed Apply top-level JSON fields. - Make sure every job has Indeed Apply included in the
<job>
node. - Ensure you've properly encrypted the email address if you use email as your delivery method.
- Check that your SSL certificate is valid and up-to-date.
- Verify your question JSON using the question test tool. Note: The test tool does not provide sponsored data information.
- Make sure your screener questions are in line with our best practices.
- Deliver screenshots to your Marketplace Platforms manager of the Opt Out process for Indeed Apply. We require all partners to develop Indeed Apply opt out within their system for clients to use.
- After completing all of the preceding steps, you can either:
- Upload the XML to Indeed’s FTP. (If you need an account, let your Marketplace Platforms Manager know.)
- Update the file hosted on either an FTP or a URL get request.
- Contact your Marketplace Platforms Manager so they can review before submission and provide you with a tool to review any quality issues that may be present.