ATS JavaScript Plugin
Add Indeed features to your ATS site with front-end changes only.
See Indeed Plugin Terms.
Feature overview
#The Applicant Tracking System (ATS) JavaScript Plugin lets you add Indeed features to your ATS site with front-end changes only.
Supported features
#The plugin supports these features:
- Job visibility — Let employers see how their jobs appear on Indeed and other Indeed PLUS-connected job boards, including why jobs fail moderation checks and how to fix them.
- Sponsored jobs — Let employers sponsor jobs on Indeed from your ATS.
Browser support
#You must render all plugin buttons on HTTPS pages. HTTP isn't supported.
The plugin supports these browsers:
| Operating system | Chrome | Firefox | Safari | Edge (Chromium) |
|---|---|---|---|---|
| Linux | Supported | Supported | N/A | Not supported |
| macOS | Supported | Supported | Supported | Supported |
| Windows | Supported | Supported | N/A | Supported |
| Android | Not supported | Not supported | Not supported | Not supported |
| iOS | Not supported | Not supported | Not supported | Not supported |
Feature steps
#1. Before you begin
#Before you add plugin features to your ATS site, set up your account and OAuth app.
Set up your Indeed account
#You need an Indeed account linked to your ATS, and these ATS keys from your Indeed representative:
- Sponsor ATS key
- Aggregation ATS key (required only for web interviews, which are deprecated)
Set up your OAuth application
#The plugin uses 3-legged OAuth 2.0 to authenticate and authorize clients. Create a 3-legged OAuth app and set it as a public client.
2. Load the plugin script
#To add the ATS JavaScript Plugin to your ATS site, add this <script> tag:
<script src="https://plugins.indeed.com/ats-plugin/main.js" data-indeed-locale="<LOCALE>" data-indeed-enabled-plugins="<ENABLED-PLUGINS>" data-indeed-oauth-client-id="<CLIENT-ID>" data-indeed-redirect-url="<REDIRECT-URL>" data-indeed-ats-key="<ATS-KEY>" data-indeed-ats-user-id="<ATS-USER-ID>" data-indeed-ats-company-id="<ATS-COMPANY-ID>" data-indeed-plugin-z-index="<Z-INDEX>" data-indeed-allow-employer-creation="<true|false>" crossorigin defer></script>Replace the values in angle brackets (<>) with your values.
This table describes the data-indeed-* attributes:
| Attribute | Description |
|---|---|
| Required. The locale of the plugin UI text. The plugin supports English and Japanese.
|
| Required. A comma-separated list of feature IDs to activate in the ATS site. Supported feature ID values:
Examples:
|
| Required. The app's client ID. To get your client ID, see Get your OAuth credentials. |
| Required. One of the app's redirect URLs that runs the plugin. It must have the same origin (opens in a new window) as every page that runs the plugin.
In this example, On the page at You can define up to five redirect URLs for your app in Partner Console. |
| Required. The Indeed account's ATS key. To get your ATS key, see Set up your Indeed account. |
| Required. A unique string that identifies the current user on the ATS site. You create this string. Use UTF-8 alphanumeric characters, hyphens ( |
| Required. A unique string that identifies the current user's company. You create this string. Use UTF-8 alphanumeric characters, hyphens ( |
| Optional. The z-index (opens in a new window) of the plugin's side panel. The default value is 999. Example: |
| Optional. Turns employer creation on or off during initial user setup. Example: |
Configure the data-indeed-allow-employer-creation parameter
#The optional data-indeed-allow-employer-creation attribute controls whether users can create an Indeed employer account during setup. Choose one of these options:
| Option | Description | Use this option when |
|---|---|---|
| Leave unset | During setup, users see an extra screen where they identify their user type and account status. | You don't know the user type (direct employer or agency) in advance. |
Set to true | Lets users create employer accounts on Indeed through the plugin. | You know users are direct employers who need to create accounts. |
Set to false | Prevents users from creating employer accounts through the plugin. The plugin tells users to contact their ATS, Indeed, or their agency for support. | You know users are agencies that manage multiple advertisers, or employers that use agencies. |
For agency employers and employers using an agency, set data-indeed-allow-employer-creation to false to prevent duplicate employer accounts.
For direct employers, set data-indeed-allow-employer-creation to true. This skips the self-identification screen and speeds up setup.
Visual guide
#This image shows the user setup flow. The self-identification screen (How do you manage jobs?) appears if you don't set data-indeed-allow-employer-creation.
This self-identification screen appears only when data-indeed-allow-employer-creation is not set. The question identifies the user's type and determines whether account creation is allowed.
3. Toggle visibility
#When the script loads, the ATS JavaScript Plugin provides a global IndeedAtsPlugin variable with these functions:
| Function | Visibility |
|---|---|
renderPlugins(): void | Renders all plugin UIs (buttons and side panel) on the page. Unmounts existing UIs before rendering. Called automatically on script load. |
unmountPlugins(): void | Unmounts all plugin UIs (buttons and side panel) from the page. Does nothing if no UIs exist. |
renderButton(root: HTMLElement): void | Renders a plugin button on a root HTML element. Does nothing if the element lacks the required |
unmountButton(root: HTMLElement): void | Unmounts a plugin button from a root HTML element. Does nothing if no button exists. |
Use these functions to control plugin UI visibility. In single-page applications, you might need to render buttons in elements that don't exist when the script loads. Call renderButton when the mount point becomes visible.
4. Display job visibility status
#The job visibility feature lets employers on your ATS site view the status of the jobs they've posted.
You can display a job visibility button for each job. If you make the button dynamic, it shows the job's visibility status.
Users can select the button to see more details about the job's visibility status.
Enable job visibility in the plugin
#In the <script> tag for the ATS JavaScript Plugin, include job-visibility in the data-indeed-enabled-plugins attribute.
Display a job visibility button
#Each job visibility button shows a single job. It can't show the status of all jobs or a group of jobs.
To display a job visibility button, add this <div> element:
<div data-indeed-plugin="job-visibility" data-indeed-employer-job-id="<INDEED-EMPLOYER-JOB-ID>" data-indeed-is-dynamic="false" data-indeed-job-title="<JOB-TITLE>" data-indeed-button-size="<sm|md>"></div>Replace the values in angle brackets (<>) with your values.
This table describes the data-indeed-* attributes:
| Attribute | Description |
|---|---|
data-indeed-plugin | Required. Set to |
data-indeed-employer-job-id | Required. The employer job ID returned when your ATS posts the job through the Job Sync API. Store this value in your database and associate it with the job identifier in your system. |
data-indeed-is-dynamic | Optional. Either If If |
data-indeed-job-title | Optional. The title of the posted job. The plugin UI uses it as the title. |
data-indeed-button-size | Optional. The size of the job visibility button. Supported values:
Example: |
Job visibility button variants
#The job visibility button behaves differently when it's dynamic (data-indeed-is-dynamic="true") or static (data-indeed-is-dynamic="false").
Dynamic buttons are in beta. They might be unstable or slow down the page.
When you embed the HTML code from Display a job visibility button, the plugin generates the button for that job with predefined styles.
The plugin renders the button based on its current state. The job visibility feature supports these states:
| State | Image | Description |
|---|---|---|
| Loading | The plugin is loading the button's state. | |
| Awaiting | The plugin is processing the job in a queue. | |
| Ineligible | The job has unresolved issues and isn't visible on Indeed and Indeed PLUS job boards. | |
| Eligible* | The job is visible on Indeed but not on Indeed PLUS job boards. | |
| Eligible | The job is visible on Indeed and Indeed PLUS job boards. | |
| Expired | The job has expired. | |
| Fallback | The button is static, or its state couldn't load. |
Where to display job visibility buttons
#Place job visibility buttons where employers are most likely to want to check job visibility status.
Keep the page balanced so the buttons don't make it look busy or complicated.
These are recommended places for job visibility buttons:
Job list page
#On the job list page, the buttons let employers quickly check the visibility status of all jobs.
If a page lists many jobs, use static buttons (data-indeed-is-dynamic="false") so the buttons render faster.
Job detail page
#On the job detail page, the button lets employers quickly check the visibility status of that job.
Place the button near related information so employers see it in context.
Job visibility best practices
#Follow these guidelines when you display job visibility buttons:
-
The button renders automatically with predefined Indeed branding styles. Don't modify it.
-
The button is 164px wide. Its visible width depends on its state.
-
The button is 40px tall (
data-indeed-button-size="md") or 32px tall (data-indeed-button-size="sm"). -
The button works best on a light background.
-
Keep at least an 8px margin on all sides of the button.
Job visibility troubleshooting
#The job visibility button doesn't show the status
#To use the dynamic button, confirm that you set data-indeed-is-dynamic="true".
5. Enable sponsored jobs
#The sponsored jobs feature lets employers on your ATS site sponsor jobs on Indeed.
Enable sponsored jobs in the plugin
#In the <script> tag for the ATS JavaScript Plugin, include sponsored-jobs in the data-indeed-enabled-plugins attribute.
Display a sponsored job button
#After you turn on sponsored jobs, you can use the Sponsor button in your ATS site. When employers select a Sponsor button, they can sponsor that job or view the sponsored job's details.
To display a Sponsor button, add this <div> element:
<div data-indeed-plugin="sponsored-jobs" data-indeed-ref-num="<REF-NUM>" data-indeed-source-name="<SOURCE-NAME>" data-indeed-job-title="<JOB-TITLE>"></div>Replace the values in angle brackets (<>) with your values. This table describes the data-indeed-* attributes:
| Attribute | Description |
|---|---|
data-indeed-plugin | Required. Set this to |
data-indeed-ref-num | Required. The employer's unique job ID. The job must already be available on Indeed. Use the job ID from your source system:
|
data-indeed-source-name | Required. The parent organization hiring for the job. Use the source name from your source system:
|
data-indeed-job-title | Optional. The job title. Indeed uses it to fill in the campaign name. If you don't provide it, the campaign name defaults to New Campaign. |
Sponsored job button variants
#The Sponsor button's appearance depends on the sponsored job's status.
| Status | Description | Image |
|---|---|---|
| None | The job isn't sponsored, or the sponsorship was deleted. | |
| Scheduled | The job is scheduled to be sponsored. | |
| Spending | The job sponsorship is active and the employer is spending their budget. | |
| Not spending | The campaign is active, but the employer isn't spending their budget. In this state, the job's visibility isn't boosted, so it's the same as an unsponsored job. For reasons an employer might not spend their budget, see List employer campaigns and statuses. | |
| Paused | The job sponsorship is paused. | |
| Unavailable | The job can't be sponsored because it isn't available on Indeed. |
Where to display sponsored job buttons
#Place sponsored job buttons where employers are most likely to want to sponsor jobs.
Keep the page balanced so the buttons don't make it look busy or complicated.
These are recommended places for sponsored job buttons:
Job list page
#On the job list page, the buttons let employers quickly check sponsored job statuses and manage sponsorships.
After posting a job
#Showing a sponsored job button right after an employer posts a job encourages them to sponsor it.
Sponsored jobs best practices
#Follow these guidelines when you display a sponsored job button:
| Best practice | Examples |
|---|---|
Keep at least an 8px margin on all sides of the button. | ✅ Correct example: ❌ Incorrect example: |
The button is 40px tall. Its width depends on its state. Make sure your site layout adapts to each button state. | ✅ Correct example: ❌ Incorrect example: |
The button works best on a light background. | ✅ Correct example: ❌ Incorrect example: |
The button renders with predefined Indeed branding styles. Use it without modification. | ✅ Correct example: ❌ Incorrect example: |
6. Troubleshoot errors
#The plugin shows "Unable to connect to the server"
#Confirm that:
data-indeed-oauth-client-idis set to the correct client ID.data-indeed-redirect-urlis set to a redirect URL that's registered in Partner Console and has the same origin as the page running the plugin.
If the problem continues, contact Indeed.
A plugin button doesn't show the correct status
#Plugin buttons take several hours to update after you change a job posting.
See also
#Guides
#- Authorization code grant type (3-legged OAuth) — Authorize your app to act on behalf of Indeed user accounts and associated employer accounts.
- Become an Indeed partner — How to become an Indeed partner.
- Sponsored Jobs API — View and manage an employer's sponsored jobs.
REST API reference
#- List employer campaigns and statuses — Lists an employer's campaigns and their statuses.