- Retrieve Candidates API workflow
- Retrieve Candidates API reference
- Authenticate
- Register employer
- Request – Register employer
- Response – Register employer
- Get unacknowledged assets
- Request – Get unacknowledged assets
- Response – Get unacknowledged assets
- Get assets by time range
- Request – Get assets by time range
- Response – Get assets by time range
- Create test assets
- Requirements
- Request – Create test assets
- Troubleshoot errors
Retrieve Candidates API guide
Get candidate information from Indeed for employers.
By using this API and its documentation and building an integration, you agree to the Additional API Terms and Guidelines.
Call the Retrieve Candidates API to get candidate information from Indeed for employers.
Retrieve Candidates API workflow
After you integrate with the Retrieve Candidates API, you can call these operations:
- 1.Authenticate.
- 2.Register employer: Register an employer and return information about the registration.
- 3.Get unacknowledged assets: Get unacknowledged assets in the order you staged them, from oldest to newest.
- 4.Get assets by time range: Get acknowledged assets in a time range.
- 5.Create test assets: Create test assets for integration testing.
- 6.Troubleshoot GraphQL errors: Resolve GraphQL errors.
Retrieve Candidates API reference
registerEmployer: Registers an employer and returns information about the registration.fetchAssets: Returns unacknowledged assets in the order you staged them, from oldest to newest.assetsByTimeRange: Returns acknowledged assets in a time range.stageAssets: Creates test assets for integration testing.
Authenticate
When you become an Indeed partner, Indeed sets up an app for your integration. Sign in to Partner Console to view your app and OAuth credentials (client ID, secret, and authorization code for 3-legged OAuth). Exchange credentials for an access token to authenticate API calls.
Each Candidate Sync API operation requires an OAuth token:
| API and operations | OAuth token type |
|---|---|
| Authenticate with a 3-legged OAuth token that represents an employer and has the |
| Authenticate with a 2-legged OAuth token.. Your application authenticates directly with Indeed's authorization server without user interaction. |
Securely store access tokens in your ATS, and don't share them between users. Indeed trusts that your system is the source of truth for a job. If you use a user's access token for a job that another user posted, Indeed might grant that user access to the other user's job on Indeed.
After you get an access token, include this token in the query or mutation. Indeed recommends that you refresh your access tokens before they expire to avoid asking users to sign in every time they need to view updated job statuses.
See Integrate with Indeed and call APIs and Scopes.
Register employer
Use the Employer Registration API to register an employer.
Request – Register employer
To register an employer and return registration information, call registerEmployer.
Authenticate with a 3-legged OAuth token that represents an employer and has the employer.ats_candidate.sync scope. This token links the employer's Indeed account to their ATS account. An Indeed administrator or owner must create it. If registerEmployer returns a missing scope error, the token might not be associated with an employer.
Provide these input fields:
| Field | Required | Description |
|---|---|---|
Type: | ✅ | An ID you provide to uniquely identify the employer. You can register one |
Type: | ✅ | The name you provide for the employer. Employers see this name on Indeed. |
Response – Register employer
The API returns an EmployerRegistration. Store its id to use in later Candidate Sync API calls, or query findRegisteredEmployers with the partnerEmployerId to retrieve it.
Get unacknowledged assets
Call fetchAssets to get unacknowledged assets in the order you staged them, from oldest to newest.
Authenticate with a 2-legged OAuth token.. Your application authenticates directly with Indeed's authorization server without user interaction.
The Retrieve Candidates API currently supports interested candidates from Smart Sourcing. Indeed might add new asset types in future updates, so handle unexpected asset types in the response. Not every asset is an AtsSyncCandidateSyncInterestedCandidateAsset.
The employerIdentifier in the response matches the ID that you sent to Indeed when you created the registration. Use it to identify which employer receives the candidate.
Request – Get unacknowledged assets
This mutation gets unacknowledged assets.
Get unacknowledged assets:
mutation FetchAssets($input: FetchAssetsAtsSyncCandidateSyncInput) { atsSyncCandidateSync { fetchAssets(input: $input) { token assets { id metadata { stagedAt stagedTest employerIdentifier completeSourceAttribution { enumKey name } } ...on AtsSyncCandidateSyncInterestedCandidateAsset { contact { candidate { email location name phone resume { pdf { name url } } } job { sourcedPostingId } tracking { recruiterEmail } } } } } }}Provide these input fields:
Response – Get unacknowledged assets
The API returns a FetchAssetsAtsSyncCandidateSyncPayload object with these fields:
| Field | Type | Description |
|---|---|---|
assets | [AtsSyncCandidateSyncAsset]! | Next available |
token | String | Acknowledgment token for this batch. Pass the token in the next fetchAssets call to acknowledge receipt and request the next batch. If the token is null or empty, Indeed has delivered all assets. Wait the standard polling interval before you call again. |
Get assets by time range
After you acknowledge assets, call assetsByTimeRange to fetch them again from Indeed. Use this query to recover from data loss. Persist asset data in your data store. For pagination best practices, see the GraphQL Cursor Connections Specification.
Authenticate with a 2-legged OAuth token.. Your application authenticates directly with Indeed's authorization server without user interaction.
To retrieve new assets, use fetchAssets.
Request – Get assets by time range
If you omit a start or end date, the query uses the earliest and latest acknowledgment dates as defaults.
Gets acknowledged assets in a time range.
query AssetsByTimeRange($input: AtsSyncCandidateSyncAssetsByTimeRangeInput!, $after: String) { atsSyncCandidateSync { assetsByTimeRange(input: $input, after: $after) { assets { id metadata { employerIdentifier stagedAt stagedTest completeSourceAttribution { enumKey name } } ... on AtsSyncCandidateSyncInterestedCandidateAsset { contact { candidate { email location name phone resume { pdf { name url } } } job { sourcedPostingId } tracking { recruiterEmail } } } } pageInfo { hasNextPage endCursor } } }}Response – Get assets by time range
assetsByTimeRange returns the same asset data as fetchAssets, but only for acknowledged assets. See Response – Get unacknowledged assets.
Mock assets expire after 14 days and stop appearing in assetsByTimeRange responses. See Create test assets.
Create test assets
Call stageAssets to create test candidate assets in sandbox mode. Test assets behave like real candidate assets. Use fetchAssets to retrieve them and test your workflow.
Authenticate with a 2-legged OAuth token.. Your application authenticates directly with Indeed's authorization server without user interaction.
Requirements
Before you stage test assets:
- The
employerIdentifiermust match theemployerIdentifierof an employer registration that you created throughregisterEmployer. - The
sourcedPostingIdmust be a UUID, but does not need to match an existing job posting. - Indeed removes mock asset data 14 days after you stage it.
Request – Create test assets
To create test assets:
-
Call
stageAssetswith test candidate details such as name, email, phone, and location.To include a test resume, set
includeResumetotrue.The API returns a unique ID for each staged asset.
-
Call
fetchAssetsto retrieve the staged candidates. -
Verify that your integration processes the candidate data.
To identify mock assets, check the
stageTestfield on themetadataof eachassetsentry.
Creates test candidate assets for integration testing:
mutation { atsSyncCandidateSync { stageAssets(input: { assets: [{ smartSourcingContact: { metadata: { employerIdentifier: "employer-123" } contact: { candidate: { name: "Jane Smith" email: "jsmith@example.com" location: "Syracuse, New York 13209" phone: "+10001112223" includeResume: true } job: { sourcedPostingId: "e29aaba8-2cef-447f-a1e0-bcb7ec3fa730" } tracking: { recruiterEmail: "recruiter@example.com" } } } }] }) { ids } }}Troubleshoot errors
For OAuth errors that occur before you reach GraphQL, see Troubleshoot OAuth errors.
For GraphQL errors, see Troubleshoot GraphQL errors.