- Job Update API workflow
- Job Update API references
- Authentication
- Update job posting
- Workflow
- Request – Update job posting
- Confirm your updates
- Partial updates
- Response – Update job posting
- Choose the query method to get job posting information
- Get job posting status by ID
- Authentication
- Single job query (node)
- Batch job query (nodes)
- Work with webhooks
- List job postings by criteria
- Clear job posting updates
- Workflow
- Request – Clear job posting updates
- Response – Clear job posting updates
- Job status
- Organic non-sponsored jobs
- Sponsored jobs
- Rate limits
- Troubleshoot errors
- FORBIDDEN: Advertiser is in a restricted moderation status
- FORBIDDEN: You are missing permissions for this action
- FORBIDDEN: Advertiser is requesting an update to EJ
- UNAUTHENTICATED
- BAD_USER_INPUT
- NOT_FOUND
- DOWNSTREAM_SERVICE_ERROR or INTERNAL_SERVER_ERROR
Job Update API guide
Update, clear updates, get details for, and list job postings on Indeed.
By using this API and its documentation and building an integration, you agree to the Additional API Terms and Guidelines.
Job Update API workflow
Update, clear updates, get details for, and list job postings on Indeed. Calls are free and excluded from Sponsored Jobs API usage policy limits.
- 1.Before you start - Under the single-source policy, ATSs are the source of truth for employer jobs.
- 2.Authenticate.
- 3.Update job posting - Ad agencies call
updateSourcedJobPostingsto update job posting fields. - 4.Choose the query method to get job posting information.
- 5.Get job posting status by ID. When you have job IRIs, call the GraphQL
nodeornodesquery. - 6.List job postings by criteria. For bulk retrieval of jobs, call
findEmployerJobsPartner. - 7.Clear job posting updates - Ad agencies can clear job posting updates.
- 8.Job status.
- 9.Rate limits.
- 10.Troubleshoot GraphQL errors - Resolve GraphQL errors.
Job Update API references
updateSourcedJobPostings- Ad agencies can update fields in a job posting.node- Get job posting status by ID.nodes- List job postings by IDs.findEmployerJobsPartner- Lists job postings for an employer.clearSourcedJobPostingUpdates- Ad agencies can clear job posting updates.
The ATS controls the creation and expiration of job postings.
Authentication
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.
See Integrate with Indeed and call APIs.
The findEmployerJobsPartner, node, and nodes queries require one of these OAuth token types:
| Token type | Description |
|---|---|
| 2‑legged OAuth token that specifies an advertiser | If you are an ad agency that uses the Sponsored Jobs API with the client credentials grant type (2-legged OAuth), you already have this token type. |
| 3-legged OAuth token | If you already have a 3-legged OAuth token, this token works as an alternative. |
The OAuth access token must have these scopes:
employer_accessemployer.hosted_job
For more information about adding scopes to OAuth tokens, see Scopes.
After you get an access token, include this token in the query. 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.
Update job posting
This feature is in beta and is not available in Japan. Contact Indeed for more information.
- If you submitted the job posting to Indeed, upsert it.
- If another partner submitted it, update the posting. Updates are primarily for ad agencies.
Japan only: All partners except ad agencies and Indeed PLUS Publisher Network partners can update the posting.
See also:
Enables ad agencies to update job posting fields on Indeed and Indeed PLUS.
Update only jobs authorized by your client. Unauthorized updates can prevent the client from using other Indeed tools on that job. To add a location the ATS does not have, use your XML or API integration.
Workflow
To update a job posting you did not send to Indeed:
| # | Description | See |
|---|---|---|
| 1. | Choose clients to add: Contact Indeed. | |
| 2. | List job postings by criteria: Call | |
| 3. | Update job posting: To update a field such as tracking URL or job URL, call | |
| 4. | Confirm your updates: To confirm your updates, call one of these methods:
List sponsored jobs for a campaign To list sponsored jobs for a campaign, set | |
For information about rate limits on this call, see Rate limits.
Request – Update job posting
To update select fields in a job posting, ad agencies can call the jobsIngest.updateSourcedJobPostings mutation.
This operation requires an access token that represents the advertiser.
The OAuth access token must have these scopes:
employer_accessemployer.hosted_job
See Get access token that represents employer. Instead of an employer ID, associate the token with an advertiser ID.
Provide only the fields to update. To leave a field unchanged, set it to null or omit the field.
This example calls the updateSourcedJobPostings mutation to update several fields of a job posting:
mutation UpdateSourcedJobPostings { jobsIngest { updateSourcedJobPostings( input: { updates: [ { sourcedPostingId: "<SOURCED POSTING ID OF JOB POSTING>" metadata: { url: "https://www.example.com/jobs/123" campaignCategories: ["springCampaign"] trackingUrl: "https://www.example.com/jobs/123?utm_source=indeed" } body: { title: "Software Developer" description: "Come build the future with us!" jobLocation: { general: { cityRegionPostal: "Phoenix, AZ 85003" streetAddress: "1234 Sunny Lane, Phoenix, AZ 85003" } } salary: { currency: "USD" maximumMinor: 1000 minimumMinor: 1000 period: "HOUR" } } } ] } ) { results { jobPosting { sourcedPostingId employerJobId } } } }}mutation UpdateSourcedJobPostings { jobsIngest { updateSourcedJobPostings(input: { updates: [{ sourcedPostingId: "<SOURCED POSTING ID OF JOB POSTING>" body: { description: "<h2>About the role</h2><p>Join our team as a software engineer. You will design and build scalable backend services.</p><ul><li>Competitive salary</li><li>Remote-friendly</li><li>Health and dental benefits</li></ul>" descriptionFormatting: HTML } }] }) { results { jobPosting { sourcedPostingId employerJobId } } } }}updateSourcedJobPostings takes one argument: input, of type UpdateSourcedJobPostingsInput.
input takes one field: updates, an array of UpdateSourcedJobPostingInput objects. Each UpdateSourcedJobPostingInput object represents updates to make to a particular job posting.
Each UpdateSourcedJobPostingInput object takes these fields:
| Field | Type | Description |
|---|---|---|
sourcedPostingId | ID! | Required. For each job posting, provide one of the following:
|
metadata.url | WebUrl | URL supplied by the ad agency through which a job seeker can apply for the job if they cannot apply through Indeed Apply. |
metadata.campaignCategories | [String!] | Category tags to add to the job to group related jobs together for the purposes of job selection in campaigns. Write Sponsored Jobs API queries with ad_campaign_category:{category} for the campaignCategories that you provide. |
metadata.trackingUrl | WebUrl | Job tracking URL. When a job seeker views the job on Indeed, Indeed makes an HTTP request to this URL. |
body.title | String | Title of the job posting. |
body.description | String | Job description:
|
body.descriptionFormatting | DescriptionFormatting | Format of the job description. Set to |
body.jobLocation .general.cityRegionPostal | String! | Required if updating location. City and administrative region of the job, such as the state, county, or prefecture, and the postal code. If you set this field on a remote job, the job is considered a regional remote job. |
body.jobLocation .general.streetAddress | String | Street address of the primary location of the job. Include the full address, including street name and number. Indeed might use the street address to improve the precision of location-based job search and to show to job seekers. |
body.salary.currency | CurrencyCode | The currency code for the salary, in ISO 4217 format. |
body.salary.maximumMinor | Int64 | Maximum salary in the local minor currency. For example, the minor currency of USD is cents, so 1,000 represents $10. Set to |
body.salary.minimumMinor | Int64 | Minimum salary in the local minor currency. For example, the minor currency of USD is cents, so 1,000 represents $10. Set to |
body.salary.period | JobSalaryPeriod! | Required if updating salary. The rate at which the salary is calculated—for example, hourly, daily, or weekly. |
body.companyName | String | Updates the company name for the job posting. To make no changes, set to |
For more information about each of the fields to provide, see the API reference.
Confirm your updates
To verify changes, the updateSourcedJobPostings response includes job IRIs. Use the node query with returned IRIs.
See Get job posting status by ID.
Partial updates
Updates to fields are not atomic. Updating more than one field in one request can, on rare occasions, result in partial updates to the job posting. A partial update is always accompanied by an error in the response; however, an error in the response does not always mean that a partial update did occur. If a request to update multiple fields returns an error, you can view the updated job posting to see which fields, if any, were updated successfully. For how to handle errors, see Troubleshoot GraphQL errors.
Response – Update job posting
updateSourcedJobPostings returns an UpdateSourcedJobPostingsPayload object. This object includes a results field, which is an array of UpdateSourcedJobPostingResult objects corresponding to the results of updates made to each job posting.
Each UpdateSourcedJobPostingResult object includes a jobPosting field of type SourcedJobPostingUpdate. If Indeed did not accept the updates to the job posting, the field is null; otherwise, it contains this information about the job posting:
sourcedPostingId: Universal Unique Identifier (UUID) of the job posting. This is the same as theSourcedJobPosting.sourcedPostingIdthat Indeed generated for the job posting when it was created. You use this value to expire or update the job posting.employerJobId: Indeed Resource Identifier (IRI) of the job posting. This is the same as theEmployerJob.idof the job posting.
Choose the query method to get job posting information
Use one of these methods to get job posting information (all methods are valid):
| Method | Description |
|---|---|
Get job posting status by ID (node or nodes query) | Direct lookup by job IRI ( Faster than Use cases:
|
List job postings by criteria (findEmployerJobsPartner) | Search-based. Lists all jobs. Use for bulk-catalog retrieval. Use case:
|
Get job posting status by ID
To get job posting status by ID by IRI (EmployerJob ID), call the GraphQL node or nodes query. These queries are more efficient than list job postings by criteria.
Authentication
Use the same authentication and authorization as for findEmployerJobsPartner. See Authentication. The OAuth access token must have these scopes:
employer_accessemployer.hosted_job
Single job query (node)
Get a single job by its IRI (EmployerJob ID) using the Relay Node pattern:
query GetJob($id: ID!) { node(id: $id) { ...on EmployerJob { id jobData { title description company dateCreated datePostedOnIndeed jobLocation { city countryCode fullAddress } salary { max min period } externalPostingMetadata { jobPostingId jobRequisitionId } } managementUrls { viewJob } } }}Variables:
{ "id": "dXJuOmluZGVlZDplbXBsb3llcmpvYjphMWIyYzNkNC1lNWY2LTc4OTAtYWJjZC1lZjEyMzQ1Njc4OTA="}Job IRIs (EmployerJob IDs) are base64-encoded values. The id field in the response is the encoded IRI.
See EmployerJob.
POST https://apis.indeed.com/graphqlAuthorization: Bearer YOUR_ACCESS_TOKENContent-Type: application/json
{ "query": "query GetJob($id: ID!) { node(id: $id) { ... on EmployerJob { id jobData { title description company } } } }", "variables": { "id": "dXJuOmluZGVlZDplbXBsb3llcmpvYjphMWIyYzNkNC1lNWY2LTc4OTAtYWJjZC1lZjEyMzQ1Njc4OTA=" }}Batch job query (nodes)
Get status for multiple jobs by their IRIs (EmployerJob IDs).
Use to confirm multiple job updates, processing batches, of webhook events.
query GetMultipleJobs($ids: [ID!] !) { nodes(ids: $ids) { ... on EmployerJob { id jobData { title description company datePostedOnIndeed jobLocation { city countryCode } } } }}Variables:
{ "ids": [ "dXJuOmluZGVlZDplbXBsb3llcmpvYjphMWIyYzNkNC1lNWY2LTc4OTAtYWJjZC1lZjEyMzQ1Njc4OTA=", "dXJuOmluZGVlZDplbXBsb3llcmpvYjpiMmMzZDRlNS1mNmE3LTg5MDEtYmNkZS1mMjM0NTY3ODkwMTI=", "dXJuOmluZGVlZDplbXBsb3llcmpvYjpjM2Q0ZTVmNi1hN2I4LTkwMTItY2RlZi0zNDU2Nzg5MDEyMzQ=" ]}Job IRIs (EmployerJob IDs) are base64-encoded values. The id fields in the response are the encoded IRIs.
See EmployerJob.
Work with webhooks
Webhook payload includes job IRI:
{ "eventType": "job.updated", "jobIri": "dXJuOmluZGVlZDplbXBsb3llcmpvYjphMWIyYzNkNC1lNWY2LTc4OTAtYWJjZC1lZjEyMzQ1Njc4OTA=", "timestamp": "2025-12-10T15:30:00Z"}Use node query with IRI to get job posting status. See Get job posting status by ID for query examples.
Benefits:
- Real-time updates
- Fast IRI-based retrieval
- Pre-visibility enrichment window
List job postings by criteria
To use this feature, contact Indeed for additional requirements.
Lists job postings for an employer.
This call is rate limited.
If you make one call to list job postings by criteria each hour per client, you might never reach the rate limit. However, the HTTP 429 error can occur. In that case, reduce your request rate. See 429 error code.
For information about rate limits on this call, see Rate limits.
Request – List job postings by criteria
To list an employer's job postings, call the findEmployerJobsPartner query:
This example calls the findEmployerJobsPartner query to list job postings by criteria in descending order by date posted on Indeed:
query FindEmployerJobsPartner { findEmployerJobsPartner(input: { filters: { legacySourceId: "60a9614a5d973a21", jobFeedType: ["INTEGRATED_FROM_PARTNER"] }, sort: [{ sortDirection: DESC, sortField: datePostedOnIndeed }] }, first: 10, before: null, after: null) { employerJobs { id jobData { title datePostedOnIndeed dateCreated description company jobLocation { countryCode city postalCode fullAddress } externalJobPageUrl externalPostingMetadata { jobPostingId jobRequisitionId campaignCategories trackingUrls rawInputLocation isIntegratedJob } } managementUrls { viewJob } seatsConnection { pageInfo { endCursor hasNextPage hasPreviousPage startCursor } seats { jobPost { id externalPartnerCallToAction(input: { locale: "en-us" }) { imageAltText imageUrl } status { globalStatus { isIndeedApplyActive } surfaceStatuses { isRejected isSponsorshipRequired isMissingRequiredSponsorship } } } } } } estimatedTotalResultsCount pageInfo { endCursor hasNextPage hasPreviousPage startCursor } }}findEmployerJobsPartner finds job postings by source ID or lists an employer's job postings. It takes these input fields:
| Field | Description |
|---|---|
input.filters.jobFeedType | Filters jobs by their feed type, or source. If feed type is Valid values are:
Default: note If your client's jobs come from web crawling or are hosted on Indeed (Scenario 2), you must specify the appropriate See Scenario 2 details for more information. |
input.sort | Array of objects that specify how to sort the job postings in the response. Each object contains these fields:
|
first | Number of job postings to return.
|
before | Gets items with a cursor value before this value. You can get pagination information from the PageInfo object in the response. |
after | Gets items with a cursor value after this cursor value. You can get pagination information from the PageInfo object in the response. |
Response – List job postings by criteria
findEmployerJobsPartner lists job postings for the employer associated with the access token with which you call the API.
If you specify the FindEmployerJobsPartnerInput.filter or FindEmployerJobsPartnerInput.sort fields in the request, the API filters and sorts the job postings in the response.
If your API token doesn't return the jobs you expect, direct your user to contact their Indeed support representantive through their Indeed employer account page. The representative helps you connect the jobs on Indeed to your advertiser or the user's Indeed account if appropriate.
The API returns the FindEmployerJobsPartnerConnection response object, which contains these fields:
| Field | Type | Description |
|---|---|---|
employerJobs | [EmployerJob]! | Array of objects that represent job postings. For the list of fields that each object includes, see the table in Response - View job posting. |
estimatedTotalResultsCount | Int! | The total number of job postings estimated to be in the response. |
pageInfo | PageInfo! | Pagination information. |
This example response lists job postings.
The API returns only one item in seats, so startCursor and endCursor are the same, and hasNextPage and hasPreviousPage are false.
{ "data": { "node": { "id": "aXJpOi8vYXBpcy5pbmRlZWQuY29tL0VtcGxveWVySm9iLzkxZGU0ZjVhLWE1MWYtNGQ1Ni1iOWI0LWNhMDQzZWVjNDAzMQ==", "jobData": { "title": "Certified Nursing Assistant CNA", "datePostedOnIndeed": "2022-03-22T20:33:28Z", "dateCreated": "2022-03-22T20:33:28Z", "description": "Anytown Health and Rehabilitation Center in Anytown, USA is a 186-bed center offering a variety of individualized, health care services for our patients and residents. We are seeking a qualified and committed team member to join our team.", "company": "Anytown Health and Rehabilitation Center", "jobLocation": { "countryCode": "US", "city": "Cambridge", "postalCode": null, "fullAddress": null }, "externalJobPageUrl": "http://www.indeed.com/job/certified-nursing-assistant-cna-9354ed892ad3a1b6", "externalPostingMetadata": { "jobPostingId": "CBA-Anytown-Posting-Id", "jobRequisitionId": "CBA-Anytown-Req-Id", "campaignCategories": [], "trackingUrls": [], "isIntegratedJob": false } }, "managementUrls": { "viewJob": "https://employers.indeed.com/jobs/view?employerJobId=aXJpOi8vYXBpcy5pbmRlZWQuY29tL0VtcGxveWVySm9iLzkxZGU0ZjVhLWE1MWYtNGQ1Ni1iOWI0LWNhMDQzZWVjNDAzMQ==" }, "seatsConnection": { "pageInfo": { "endCursor": "YVhKcE9pOHZZWEJwY3k1cGJtUmxaV1F1WTI5dEwwcHZZbEJ2YzNRdk5EQXhOVFkxTW1OaFpEYzJZVFF4TlE9PQ==", "hasNextPage": false, "hasPreviousPage": false, "startCursor": "YVhKcE9pOHZZWEJwY3k1cGJtUmxaV1F1WTI5dEwwcHZZbEJ2YzNRdk5EQXhOVFkxTW1OaFpEYzJZVFF4TlE9PQ==" }, "seats": [ { "jobPost": { "id": "aXJpOi8vYXBpcy5pbmRlZWQuY29tL0pvYlBvc3QvNDAxNTY1MmNhZDc2YTQxNQ==", "externalPartnerCallToAction": [ { "imageUrl": "https://dlogqfjusi9uq.cloudfront.net/cta/en_US/not_searchable.svg", "imageAltText": "Update needed on Indeed" } ], "status": { "globalStatus": [ { "lifecycleStatus": "INACTIVE", "isIndeedApplyActive": false } ], "surfaceStatuses": [ { "isRejected": false, "isSponsorshipRequired": false, "isMissingRequiredSponsorship": false } ] } } } ] } } }}To troubleshoot validation errors, see Troubleshoot GraphQL errors. For more information about validation errors, see Validation in the GraphQL docs.
Clear job posting updates
- This feature is in beta. Contact Indeed for more information.
- This feature is not available in Japan.
An ad agency that updated a job posting for a client can subsequently clear those job posting updates.
Workflow
An ad agency can call this operation to clear any updates they have made to their job postings.
For example, if you no longer plan to work with a client, use this operation to clear any updates you have made to their job postings. This operation reverts changes you have made to a job posting to the latest ATS data. Then, your clients can use other Indeed tools to manage their job posting again.
| # | Description | See |
|---|---|---|
| 1. | Update job postings: Add clients and update job postings for them. | Update job postings |
| 2. | List job postings by criteria: Call | |
| 3. | Clear job posting updates: Clear updated fields in a job posting. Call | |
| 4. | List job postings by criteria: Call |
For information about rate limits on this call, see Rate limits.
Request – Clear job posting updates
To clear fields in a job posting that were previously updated by updateSourcedJobPostings, ad agencies can call the jobIngest.clearSourcedJobPostingUpdates mutation.
This operation requires an access token that represents the advertiser that originally made the updates.
The OAuth access token must have these scopes:
employer_accessemployer.hosted_job
See Get access token that represents employer. Instead of an employer ID, associate the token with an advertiser ID.
This example calls the clearSourcedJobPostingUpdates mutation to clear updates to a job posting:
mutation ClearSourcedJobPostingUpdates { jobsIngest { clearSourcedJobPostingUpdates(input: { updates: [{ sourcedPostingId: "<SOURCED POSTING ID OF JOB POSTING>" }] }) { results { jobPosting { sourcedPostingId employerJobId } } } }}clearSourcedJobPostingUpdates takes one argument: input, of type ClearSourcedJobPostingUpdatesInput.
input takes one field: updates, an array of ClearSourcedJobPostingUpdateInput objects. Each ClearSourcedJobPostingUpdateInput object represents a job posting for which to clear updates.
To clear multiple job posting updates in one request, include multiple ClearSourcedJobPostingUpdateInput objects.
Each ClearSourcedJobPostingUpdateInput object takes these fields:
| Field | Type | Description |
|---|---|---|
sourcedPostingId | ID! | Required. For each job posting, provide one of the following:
|
Response – Clear job posting updates
clearSourcedJobPostingUpdates returns a ClearSourcedJobPostingUpdatesPayload object. This object includes a results field, which is an array of ClearSourcedJobPostingUpdateResult objects corresponding to the results of clearing the updates for each job posting.
Each ClearSourcedJobPostingUpdateResult object includes a jobPosting field of type SourcedJobPostingUpdate. If Indeed did not accept the clearing of updates to the job posting, the field is null; otherwise, it contains this information about the job posting:
sourcedPostingId: Universal Unique Identifier (UUID) of the job posting. This value is the same as theSourcedJobPosting.sourcedPostingIdthat Indeed generated for the job posting when it was created. You use this value to expire or update the job posting.employerJobId: Indeed Resource Identifier (IRI) of the job posting. This value is the same as theEmployerJob.idof the job posting.
Job status
Due to changes in feed policy, most jobs that you manage on Indeed do not come from your feeds. Previously, you might have captured organic traffic data from job seekers who navigated to your career pages.
| Job status | Booleans | See |
|---|---|---|
| Organic |
| Organic non-sponsored jobs |
| Sponsored only with spend |
| Sponsored jobs |
| Sponsored only without spend |
| |
| Nowhere |
|
Organic non-sponsored jobs
To get organic traffic data for jobs that are not sponsored, use one of these approaches:
| Approach | Description | |
|---|---|---|
| 1. | Add the trackingUrl field | To receive HTTP requests for each click on a job, add this field to your jobs whether or not:
See |
| 2. | Use custom job URLs | Replace the job URL with a career page you own, or work with ATS partners to append your tracking metadata to the job URL. If a job does not have Indeed Apply, job seekers navigate to this URL. If a job does have Indeed Apply, job seekers do not navigate to this URL. See |
| 3. | Collaborate with client ATS | Partner with your clients and their ATS to gather organic performance insights. |
| 4. | Have clients sign in to Indeed Analytics interface | Your clients can sign in to the Indeed Analytics interface to view comprehensive organic performance for all jobs, sponsored or not. This interface provides a complete view of account data. |
Sponsored jobs
To get sponsored job traffic data, call the Sponsored Jobs API v8 or later to get employer job IDs that match the IDs that the Job Update API returns.
Rate limits
The Job Update API enforces rate limits on calls to these queries and mutations:
findEmployerJobsPartnerquery to list job postings by criteriajobsIngest.updateSourcedJobPostingsmutation to update job postingsjobsIngest.clearSourcedJobPostingUpdatesmutation to clear job posting updates
These rate limits align with best practices that ensure API availability. Indeed has configured these limits to be above normal everyday usage of the Job Update API, but large volumes of requests over short durations are throttled and require retrying. To avoid reaching these rate limits, spread your API requests over 10 minutes.
If you exceed the rate limit, you receive the HTTP 429 status code, either at the HTTP level or in the errors array in the JSON response to the GraphQL request.
No action is needed. If you need help working around these rate limits, request support.
You are notified if you exceed these rate limits:
| Query or mutation | Rate limit |
|---|---|
findEmployerJobsPartner query | 5 requests every second |
| 20 requests every second total between both mutations |
See also:
Troubleshoot errors
To troubleshoot OAuth errors that can occur before you access GraphQL, see Troubleshoot OAuth errors.
To troubleshoot GraphQL errors, see Troubleshoot GraphQL errors.
These errors can occur:
- FORBIDDEN: Advertiser is in a restricted moderation status
- FORBIDDEN: You are missing permissions for this action
- FORBIDDEN: Advertiser is requesting an update to EJ
- UNAUTHENTICATED
- BAD_USER_INPUT
- NOT_FOUND
- DOWNSTREAM_SERVICE_ERROR or INTERNAL_SERVER_ERROR
FORBIDDEN: Advertiser is in a restricted moderation status
Example error message
{ "errors": [ { "extensions": { "code": "FORBIDDEN", "message": "Advertiser is in a restricted moderation status" } } ]}What it means
The advertiser associated with the OAuth token has been restricted as a spam protection measure.
What to do
This error is unlikely to occur. If it does occur, contact your partner manager to lift this restriction.
FORBIDDEN: You are missing permissions for this action
Example error message
{ "errors": [ { "extensions": { "code": "FORBIDDEN", "message": "You are missing permissions for this action. Ask your administrator for the permissions [Hosted_Job Create, Hosted_Job Update, Hosted_Job Read]" } } ]}What it means
The user associated with the OAuth token does not have the necessary permissions to update jobs.
What to do
If the OAuth client was not created with an admin user, then you must grant permission to manage jobs to the user associated with the OAuth client. Any admin user can grant this permission in the UI. See Indeed account settings.
FORBIDDEN: Advertiser is requesting an update to EJ
Example error message
{ "errors": [ { "extensions": { "code": "FORBIDDEN", "message": "Advertiser is requesting an update to EJ (id=<EJID>), but the job is claimed by a different advertiser." } } ]}What it means
This advertiser cannot update this job because a different advertiser has already updated it. Only one advertiser can update a job at a time.
Make sure the OAuth token was requested with the correct advertiser.
What to do
If another advertiser updated the job, then this error occurs until the updates made by the other advertiser are cleared. See the clear job posting updates mutation.
This situation can occur because either:
-
The agency has access to the job from more than one advertiser.
After the agency updates the job from one advertiser, if they try to update the job from a different advertiser, they get this error.
-
The employer edited the job in the UI.
The employer must undo these edits in the UI before the agency can update the job through the API.
UNAUTHENTICATED
Example error message
"extensions.code": "UNAUTHENTICATED"What it means
Your request was not able to be authenticated. Your OAuth token has expired or is malformed.
What to do
See Troubleshoot OAuth errors.
BAD_USER_INPUT
Example error message
"extensions.code": "BAD_USER_INPUT" What it means
Something about the request is malformed. See the message field for details.
What to do
Fix the request fields that are malformed.
Check API references for examples of correctly formatted requests:
NOT_FOUND
Example error message
"extensions.code": "NOT_FOUND"What it means
The job is not found.
What to do
Make sure the sourcedPostingId is correct and the OAuth token is requested with the correct advertiser. If the requesting advertiser does not have permission to view the job, this error occurs.
DOWNSTREAM_SERVICE_ERROR or INTERNAL_SERVER_ERROR
Example error message
"extensions.code": "DOWNSTREAM_SERVICE_ERROR"Or:
"extensions.code": "INTERNAL_SERVER_ERROR"What it means
An internal server occurred.
What to do
Try the request again at a later time. If the error persists, contact your partner manager.