Error reference
Look up error codes, messages, and HTTP status codes for Indeed APIs.Each entry lists the error code or message, a description, and whether you can retry the request without modification.
For step-by-step troubleshooting, see Troubleshooting.
GraphQL error codes
BAD_REQUEST
Input is invalid or cannot be processed. See the error message for details.
BAD_USER_INPUT
Exception while fetching dataInput is invalid or cannot be processed. See the error message, then modify the query and retry.
A validation error of the BAD_USER_INPUT type occurs when the client sends invalid data. This example shows a validation error:
{ "errors": [{ "message": "Exception while fetching data (/patchEmployer) : EmployerIdentifiersInput contains invalid type or id", "path": [ "patchEmployer" ], "extensions": { "code": "BAD_USER_INPUT", "classification": { "type": "ExtendedValidationError", "validatedPath": [ "patchEmployer", "input", "employerAttributes", "countrySpecificAttributes", 0, "websiteUrl" ], "constraint": "@DossierUrlConstraint" }, "serviceName": "company-data-api" } }], "data": { "patchEmployer": null }}FORBIDDEN
Client is not authorizedAuthentication credentials lack sufficient permissions. Equivalent to HTTP 403 Forbidden.
You can receive the Client is not authorized message with the FORBIDDEN code when your OAuth client is not registered with the Indeed API gateway.
{ "data": null, "errors": [{ "extensions": { "code": "FORBIDDEN" }, "message": "Client is not authorized." }]}To register your OAuth client with the Indeed API gateway, contact Support.
GRAPHQL_PARSE_FAILED
Syntax Error: Invalid number, expected digit but got: "a".A GraphQL operation string contains a syntax error. Usually occurs if HTML tags are not escaped in the description field.
This payload does not escape the HTML in the description field:
mutation { createSourcedJobPostings( input: { jobPostings: [{ body: { title: "Server" description: "<h4 style="text - align: left;">Responsibilities include:</h4> <ul> <li style="text-align: left;"> Customer interaction </li> <li style="text-align: left;"> Taking orders and closing checks </li> </ul>" location: { country: "US", cityRegionPostal: "Clio, MI 48420" } } }] } ) { results { jobPosting { sourcedPostingId } } }}The following error occurs:
{ "errors": [{ "message": "Syntax Error: Invalid number, expected digit but got: \"a\".", "locations": [{ "line": 7, "column": 33 }], "extensions": { "code": "GRAPHQL_PARSE_FAILED" } }]}To correct this error, escape the quotes in the description field:
Escape the quotes. You can use HTML tags like <h4>, <ul>, and <li> as-is.
mutation { createSourcedJobPostings( input: { jobPostings: [{ body: { title: "Server" description: "<h4 style=\"text - align: left;\">Responsibilities include:</h4> <ul> <li style=\"text-align: left;\"> Customer interaction </li> <li style=\"text-align: left;\"> Taking orders and closing checks </li> </ul>" location: { country: "US", cityRegionPostal: "Clio, MI 48420" } } }] } ) { results { jobPosting { sourcedPostingId } } }}INTERNAL_SERVER_ERROR
The server encountered an unexpected error and did not respond. Retry the request.
QUERY_TOO_COMPLEX
Query exceeded the allowed complexity. Modify the query and retry.
QUERY_TOO_NESTED
Query is too deeply nested. Modify the query and retry.
UNAUTHENTICATED
Request lacks authentication credentials. Equivalent to HTTP 401 Unauthorized. For details, see Integrate with Indeed and call APIs. Modify the query and retry.
GraphQL error messages
Data Integrity or Validation Error
Can occur when the fields passed as input to the API cannot be processed successfully. Verify that the input values are valid. If the issue continues, contact Indeed.
Internal Error
Can occur for various reasons. Indeed closely monitors this error. For more information, contact Indeed Support.
Internal server error
While Indeed aims to have services run with 100% uptime, errors can occur and service calls can fail.
These services or components can fail:
- A back-end service within the Indeed infrastructure.
- The network between the client and the server.
- Anything in between.
In general, implement basic retry logic for these errors. If the error is intermittent, it might resolve on retry. If the problem persists, the server might have a real issue. In such cases, reach out to Indeed Support.
When you call the Indeed PLUS APIs, initiate a timeout after 5,000 milliseconds.
JobIdentifierInput must specify one of indeedJobKey, employerJobId, or atsApplicationIdentifier
To ensure that dispositions can be processed, provide at least one of these identifiers:
indeedJobKeyemployerJobIdatsApplicationIdentifier
JobSeekerIdentifierInput must specify either indeedJobSeekerKey or emailAddress
To ensure that dispositions can be processed, provide at least one of these identifiers:
indeedJobSeekerKeyemailAddress
PartnerDispositionIdentifierInput must specify one of indeedApplyID, ittk, universalApplyId, or alternateIdentifier
To ensure that dispositions can be processed, provide at least one of these identifiers:
indeedApplyIDittkuniversalApplyIdalternateIdentifier
Unable to parse statusChangeDateTime
The server received your request, but could not parse the provided statusChangeDateTime. Verify that you are sending the correct statusChangeDateTime.
This error can occur if the statusChangeDateTime value in your request does not follow the RFC 3339 standard or is correctly formatted but specifies a future date.
validation-errors-in-batch
When you send a batch request that contains multiple jobs, the Job Sync API can reject the entire request even though some jobs succeed and other jobs fail. This behavior is due to the underlying behavior of GraphQL.
In batch calls, the API lists sourcedPostingIds values in the order that you created the job postings.
Depending on the classification of the error, the Job Sync API handles validation errors differently:
| Error classification | The Job Sync API |
|---|---|
ExtendedValidationError | Continues to process the jobs in the batch request even when one or more jobs in the batch request fail. |
Other than ExtendedValidationError | Rejects the entire batch request when one or more jobs in the batch request fail. |
Example of a batch validation error:
{ "errors": [{ "extensions": { "code": "BAD_USER_INPUT", "classification": "ValidationError" }, "locations": [{ "line": 1, "column": 46 }], "message": "Validation error (WrongType@[jobsIngest/createSourcedJobPostings]) : argument 'input.jobPostings[1].metadata.contacts[0].contactInfo.contactPhone' with value 'StringValue{value='***********'}' is not a valid 'PhoneNumber' - String value `10001212223` is not a valid E.164 phone number" }]}Variable 'input' has an invalid value: String value is not a valid web URL. Relative paths are not allowed. Value must be an absolute URL.
When you use variables to provide values for a mutation or query and they do not pass validation checks, GraphQL identifies which variable is at fault and why, but, by default, it does not include path information about where the variable is used in the mutation or query.
HTTP status codes
HTTP 200
The GraphQL operation succeeded. No errors array is present in the response.
HTTP 200
An error occurred. The response includes an errors array. See Common error codes.
HTTP 400
Apollo Server cannot parse the request into a valid GraphQL document and validate it against your schema. This behavior can also occur with other request problems, such as when a client tries to send a batched HTTP request when allowBatchedHttpRequests is not enabled, or when CSRF prevention blocks a request.
HTTP 401
The request lacks valid authentication. The access token is missing, malformed, or has expired.
HTTP 403
The access token is valid but the requesting account lacks permission for the operation. Check the user's permissions and the OAuth scopes granted to the app.
HTTP 404
The requested resource does not exist or is not visible to the requesting account. Verify identifiers (such as job IDs or advertiser IDs) and that the access token represents an account with access to the resource.
HTTP 405
Request used an HTTP method that is not valid, such as GET with a mutation, or an HTTP method other than GET or POST.
HTTP 409
The request conflicts with the current state of the resource. For Job Sync API, this often indicates a duplicate or concurrent update; resolve the conflict and retry.
HTTP 410
The resource is no longer available, such as a job that has been removed or expired. The condition is permanent; do not retry the same request.
HTTP 429
Client sent too many requests in a time period. The rate limit was exceeded. Decrease the number of retries or increase the latency between them.
For more information, see:
HTTP 500
Possible causes for this error include:
- The Apollo Server did not start or is shutting down.
- Your
contextfunction threw an error. - An unexpected error occurred during the processing of the request, such as an Apollo Server bug or a plugin hook threw an error.
OAuth errors
invalid_client
Client ID or client secret is incorrect, expired, or revoked.
Common causes:
- Incorrect client ID or client secret
- Credentials expired or revoked
- Using wrong environment (QA vs Production)
To resolve:
- Verify credentials in Partner Console.
- Ensure you are using the correct environment.
- Generate new credentials if needed.
- Check for extra spaces or hidden characters.
invalid_grant
Invalid grantClient ID, client secret, authorization code, or refresh token is incorrect. The error_description field contains a generic Invalid grant message.
Review the following causes and resolutions:
| Cause | Resolution |
|---|---|
| Incorrect client ID or secret — You copy a credential incorrectly from the Manage app credentials page. | Verify your client ID and secret. |
| Incorrect client secret — You add a secret and delete the original secret for your client ID but do not update all your credential stores. | Verify that your credential stores contain the latest client secret. |
| Disabled client credentials grant type — You use the Client credentials grant type (2-legged OAuth) and the client credentials grant type is not enabled. | On the Manage app credentials page, select Client credentials in Allowed grant types. |
| Disabled authorization code grant type — You use the Authorization code grant type (3-legged OAuth), but the authorization code grant type is not enabled. | On the Manage app credentials page, select Authorization code in Allowed grant types. |
Mismatched redirect_uri parameter values — You use the Authorization code grant type (3-legged OAuth) and the redirect_uri parameter value sent to https://apis.indeed.com/oauth/v2/tokens does not match the value sent to https://secure.indeed.com/oauth/v2/authorize. | Ensure that the two redirect_uri parameter values match. |
| Expired or already-used authorization code — You use the Authorization code grant type (3-legged OAuth) and you used an expired or already-used authorization code. You can use an authorization code only one time. | To renew access tokens without reauthorization, request the offline_access scope and store the refresh token with the first access token. |
| Refresh token is not valid — The refresh token expired (60 days after last usage) or the user revoked authorization. | Ask the user to request another refresh token through the Authorization code grant type (3-legged OAuth). |
| Authorization code or refresh token issued to a different app — The authorization code or refresh token is valid but was issued to a different app. | Use the same client ID and secret through all stages of the authorization process. |
invalid_request
Request parameter has an issue. The error_description field describes the issue.
Review the following causes and resolutions:
| Cause | Resolution |
|---|---|
| Incorrect or missing parameter — Required parameter is missing or its value is not valid. | Include or correct the parameter. |
Misplaced query string parameters — Query string parameters in the request URL in the https://apis.indeed.com/oauth/v2/tokens request. | Include query string parameters in the HTTP request body, by using the application/x-www-form-urlencoded format. |
Incorrect employer parameter value — App's account (2-legged OAuth) or user (3-legged OAuth) does not have permission to access the employer, or the employer parameter did not contain a valid employer ID. | To list valid employer values: for 2-legged OAuth, call the appinfo endpoint (see Get access token that represents employer); for 3-legged OAuth, call the v2/api/userinfo endpoint (see userinfo endpoint). Then, update the value of the employer parameter. |
unsupported_grant_type
Grant type is not supported. The requested grant_type must be one of these values:
client_credentialsauthorization_coderefresh_token
Indeed Apply errors
BAD_USER_INPUT
The request contains invalid input. The message and subCode in extensions describe the specific cause.
Possible subCode values:
JOB_NOT_FOUND— The job is not found with the providedsourceJobPostingId.JOB_NOT_INDEEDAPPLYABLE— The job is not Indeed Apply enabled.JOB_EXPIRED— The job expired.PARTNER_INTEGRATION_DISABLED— The partner is disabled or cannot use this integration method. Contact Indeed to enable Apply with Indeed for yourpartnerApiToken.INVALID_PARAMETER— Input URLs or decrypted string is null or empty.PARTNER_DATA_NOT_FOUND— Partner data was not found for the requesting partner.FEED_NOT_FOUND— A feed ID does not exist with the provided inputs for XML Feed.MULTIPLE_MATCHING_FEEDS_FOUND— A unique feed ID cannot be identified with the provided inputs for XML Feed.
GRAPHQL_PARSE_FAILED
A GraphQL operation string contains a syntax error.
INTERNAL_SERVER_ERROR
An issue occurred with the Indeed Apply service. Retry the request. If the error persists after several attempts, contact Indeed.
ia-awi-javascript-errors
JavaScript-specific errors that occur when implementing Apply with Indeed (AWI) using the JavaScript integration method.
Common errors and solutions:
sourceJobPostingIdis not found — Double-check thesourceJobPostingIdin your request.- Missing/empty or invalid parameters — Verify that
sourceJobPostingId,encryptedFeedUrl,partnerApiToken, andencryptedJobUrlare provided correctly. - No partner data available for the client — The Partner API Token is not registered or incorrect. Contact Indeed to register the token.
- Partner is not allowed to use this method — The Partner API token is registered, but AWI is not enabled. Contact Indeed to enable Apply with Indeed.
- Hex string length must be a multiple of 2 — Verify the hex string length for encrypted parameters.
Job Sync API errors
All jobs on this feed must have seats
You are using a multi-seat feed but did not include seats. Add a seats array with at least one seat.
Add a seats array with at least one seat:
body: { title: "Software Engineer" location: { country: "US" } seats: [{ seatPostingId: "SEAT-001" seatLocation: { country: "US" cityRegionPostal: "Dallas, TX 75201" } }]}No jobs on this feed may have seats
You are using a standard feed but included seats. Remove the seats array and specify location at the job level.
Remove the seats array and specify location at the job level:
body: { title: "Software Engineer" location: { country: "US" cityRegionPostal: "Austin, TX 78701" streetAddress: "100 Congress Ave" }}No contacts found with type 'contact'
Your request is missing a contact with "contact" in contactType. Include exactly one contact with "contact" in its contactType array.
Include exactly one contact with "contact" in its contactType array:
contacts: [{ contactType: ["contact", "hiring manager"] contactInfo: { email: "hr@example.com" }}]Multiple contacts with type 'contact' found
More than one contact has "contact" in its contactType array. Only one contact can have the "contact" type. Use types like "recruiter" or "hiring manager" for other contacts.
Maximum amount cannot be less than minimum amount
The maximumMinor value is less than minimumMinor. Ensure maximumMinor is greater than or equal to minimumMinor, or omit maximumMinor for minimum-only salary. Salary values are in minor currency units (cents for USD).
Ensure maximumMinor is greater than or equal to minimumMinor, or omit maximumMinor for minimum-only salary. Salary values are in minor currency units (cents for USD). For example, $50,000 = 5000000.
salary: { currency: "USD" minimumMinor: 5000000 maximumMinor: 7500000 period: "YEAR"}The request contains duplicate job entries
Each job must have a unique sourceName and jobPostingId pair. The same pair appears more than once in the request.
The request contains duplicate seat entries
Each job must have a unique sourceName and seatPostingId pair. The same pair appears more than once in the request.
All seats must be located in the same country
Seat locations have different countries than the top-level job location. All seats must use the same country code as the job's top-level location.
All seats must use the same country code as the job's top-level location:
body: { location: { country: "US" } seats: [{ seatPostingId: "SEAT-001" seatLocation: { country: "US" cityRegionPostal: "Dallas, TX 75201" } }, { seatPostingId: "SEAT-002" seatLocation: { country: "US" cityRegionPostal: "Austin, TX 78701" } }]}cityRegionPostal cannot be null when remote type is not 'Fully Remote'
Non-remote jobs require cityRegionPostal. Provide cityRegionPostal or set the job as fully remote by setting remoteType to "Fully Remote".
Provide cityRegionPostal or set the job as fully remote:
# Option 1: Provide locationlocation: { country: "US" cityRegionPostal: "Austin, TX 78701"}
# Option 2: Set as fully remotelocation: { country: "US"}taxonomyClassification: { remoteType: "Fully Remote"}job-not-appearing
Created job does not appear on Indeed. Possible causes: job is still processing (allow 1-2 hours), job was rejected during processing, or incorrect sourceName.
To resolve:
- Wait 1-2 hours for jobs to become searchable.
- Query job status using the
employerJobId. - Check
lifecycleStatusandisRejectedfields. - Verify
sourceNamematches your registered feed.
job-wont-reactivate
Jobs can only be reactivated within 30 days of expiration.
- Within 30 days: Call
createSourcedJobPostingswith the originaljobPostingIdandsourceName, and updatedatePublished. - Beyond 30 days: Create as a new job (might receive a new
sourcedPostingId).
jobs-dont-auto-expire
Jobs do not automatically expire. You must explicitly call expireSourcedJobsBySourcedPostingId to expire them.
Job Update API errors
FORBIDDEN
The access token lacks permissions for the requested Job Update API operation. The message field describes the specific cause.
Common variants:
- Advertiser is in a restricted moderation status — The advertiser has been restricted as a spam protection measure. Contact your partner manager to lift the restriction.
- You are missing permissions for this action — The user associated with the OAuth token does not have
Hosted_Job Create,Hosted_Job Update, orHosted_Job Readpermissions. An admin user can grant these permissions in Indeed account settings. - Advertiser is requesting an update to EJ claimed by a different advertiser — Another advertiser already updated this job. Only one advertiser can update a job at a time. Use the clear job posting updates mutation to resolve.
BAD_USER_INPUT
The request is malformed. See the message field for details.
To resolve, verify the request fields are correctly formatted. See API references for examples:
NOT_FOUND
The job is not found. The sourcedPostingId is incorrect, or the requesting advertiser does not have permission to view the job.
DOWNSTREAM_SERVICE_ERROR
An internal server error occurred. This error can also appear as INTERNAL_SERVER_ERROR. Retry the request later.
Send Candidates API errors
sc-upload-validation-errors
S3 rejects file uploads that fail validation during the attachment upload step.
Error codes returned by S3:
SignatureDoesNotMatch— Missing or incorrect headers or content. Verify that all headers match initialization values.BadDigest— File content does not match the MD5 checksum. Verify file integrity and checksum calculation.AccessDenied— The pre-signed URL expired (URLs expire after 5 minutes). Reinitialize the application to get a new URL.
sc-integration-errors
Common errors that occur during Send Candidates API integration, including partner app configuration, employer registration, and application submission issues.
Common scenarios and resolutions:
- Invalid Partner App — Invalid partner app configuration. Contact your Indeed partner representative.
- Invalid registration ID — The specified employer registration does not exist. Verify the registration ID using the Employer Registration API guide.
- Employer not opted in — The employer registration does not have the send applications feature enabled. Update employer features using the Employer Registration API.
- GraphQL validation — Missing required fields. Review schema requirements.
- Large application files — The total size of all attachments must not exceed 15 MB. Exclude non-essential or large files.
- Duplicate application files — Attachments must not be duplicated. Exclude duplicated files.
- Multiple resumes — Include only one resume with type
RESUME. - Multiple cover letters — Include only one cover letter with type
COVER_LETTER. - Publishing deleted application — The application was already deleted. Do not re-initialize or submit a deleted application.
Sponsored Jobs API errors
INSUFFICIENT_SCOPE
Access token is valid but your app did not request or was not granted the scope required to call this API endpoint.
NOT_EMPLOYER_ACCESS_TOKEN
Call this API endpoint with an access token that represents an employer. When you get the access token, use the employer parameter to specify the employer.
EMPLOYER_ACCESS_TOKEN_NOT_ALLOWED
Call this API endpoint with an access token that does not represent a particular employer. Do not specify any employer when you get the access token for this API.
LEGACY_ACCESS_TOKEN_NOT_ALLOWED
The Sponsored Jobs API supports only the new OAuth authorization endpoints. Update to the latest OAuth endpoint.
UNACCEPTED_PARAMETER
This API no longer accepts the advertiserId parameter. Remove the advertiserId parameter, and pass the employer ID to the oauth/v2/tokens endpoint to get an access token for that employer.
General errors
access-token-expired
Access token exceeded its lifetime (typically 1 hour) or was revoked. API calls fail with 401 Unauthorized.
To resolve:
- Implement token refresh logic.
- Request a new access token using a refresh token.
- Cache tokens and refresh proactively before expiration.
Employer not found
Job creation fails because the employer entity does not exist or the employer ID is incorrect.
Common causes:
- Employer entity not created via Employer Data API
- Using incorrect employer ID
- Employer ID from wrong environment
To resolve:
- Create the employer entity using Employer Data API first.
- Verify the employer ID matches the one returned by the API.
- Ensure you are using the correct environment.