Employer Data API
Create and update employer entities on Indeed and the Indeed PLUS platform. Not available for direct employers.
API overview
Use the Employer Data API to create and update employers on Indeed and the Indeed PLUS platform. The API is available to ATS partners only. Employer Data API key concepts are:
- Employer — A company or organization that posts jobs on Indeed. Every employer has a unique ID, a name, and attributes that tell job seekers what it is like to work there.
- Employer entities — Employers you create through the API have no relationship with Indeed employer accounts.
- Order of operations — Create an employer before you create a job for that employer.
- Moderation — Indeed reviews all employer data for completeness and appropriateness.
API steps
1. Authenticate
Every Employer Data API operation requires a 2-legged OAuth token:
- Get a 2-legged OAuth token.
- Confirm that your OAuth app can create and update employers. Indeed grants these permissions when you become an Indeed partner.
For more information, see GraphQL at Indeed.
Employer data
Tell your employer clients what data you send to Indeed and how Indeed uses it.
Indeed might overwrite the employer data you send if a more authoritative source sends different data.
Scopes of employer attributes
Indeed might display employer data differently by country and locale. The attributes you pass to patchEmployer have different scopes, so Indeed can choose the best combination to show job seekers.
Employer data has three scopes:
- Global scope — The value is the same in every country where the employer operates.
- The global attributes are
employerNameandemployerType.
- The global attributes are
- Country scope — The value can differ by country.
countrySpecificAttributescontains every country-scope attribute.- To update a country-scope attribute, set its
countryfield to an ISO 3166-1 two-letter country code.
- Locale scope — The value can differ by country and language.
localeSpecificAttributescontains every locale-scope attribute.- To update a locale-scope attribute, set its
countryfield to an ISO 3166-1 two-letter country code and itslanguagefield to an ISO 639-1 two-letter language code. For valid combinations, see Supported locales. - The
isGlobalDefaultoption defaults totrue, which makes the attributes you update the global default. Indeed returns that global default when a query asks for a locale that has no translation. For example, if you request a description infr-CAand the employer has nofr-CAtranslation, Indeed returns the global default.
2. Create an employer
To create an employer, use the GraphQL patchEmployer mutation.
For authentication requirements, see Authenticate.
Request
Call patchEmployer with a PatchEmployerInput object.
id— An object that uniquely identifies the employer across Indeed. It contains these fields:type— Identifies your ATS across the Indeed system. Indeed creates this value during setup and provides it to you. Use the same value in everypatchEmployercall.id— Uniquely identifies this employer within your ATS. Some partners prefer to encrypt or hash it. Use the same value in every call that updates this employer.
employerName— Required when you create an employer, even thoughPatchEmployerInputlists it as optional. Indeed copies this value to the globallocalizedNamefield unless the request sets that field explicitly.employerAttributes— Optional employer data. Omit this field if you have no attributes to set; you can add or update attributes after you create the employer. For the rules that govern each attribute, see Update an employer.
Indeed might display employer data differently by country and locale. For more information, see Scopes of employer attributes.
Example request
The following example creates an employer in Japan with common fields:
mutation CreateEmployerExample { patchEmployer( input: { id: { type: "YOUR_ATS_TYPE_FROM_INDEED" id: "EMPLOYER_123" } employerName: "Example employer" employerAttributes: { employerType: JURIDICAL_PERSON countrySpecificAttributes: [ { country: "JP" websiteUrl: "https://example.com" phoneNumber: "+81123456789" } ] localeSpecificAttributes: [ { country: "JP" language: "ja" isGlobalDefault: true description: "Free text to describe the employer" localizedName: "ローカルネーム" headquarterAddress: "Minato-ku, Tokyo" leader: { name: "Leader name" } } ] } } ) { responseCode }}Response
patchEmployer returns a PatchEmployerPayload object. For more information about error responses, see Troubleshoot GraphQL errors.
3. Update an employer
To update employer attributes, call the patchEmployer mutation. Create the employer before you update it.
For authentication requirements, see Authenticate.
Request
Pass a PatchEmployerInput object with these fields:
id— An object that uniquely identifies the employer across Indeed. Use the sametypeandidvalues you used to create the employer. For field details, see Request.employerName— Optional. Include it only to change the employer's name. Indeed copies the new value to the globallocalizedNamefield unless the request sets that field explicitly.employerAttributes— Optional employer data.
Indeed might display employer data differently by country and locale. For more information, see Scopes of employer attributes.
Update behavior
Each attribute supports three behaviors:
- Ignore — Omit the attribute and its stored value does not change.
- Update — Provide a new value for the attribute in the request. If the value differs from the stored value, Indeed applies the update.
- Delete — Set the attribute to
null. You cannot deleteemployerName.
Response
The response is the same as the create employer response.
Examples
The following examples show how to update different employer data.
Update description
The following example updates the employer description for the ja-JP locale:
mutation UpdateDescription { patchEmployer(input: { id: { type: "TYPE_FROM_INDEED" id: "EMPLOYER_ID_IN_ATS" } employerAttributes: { localeSpecificAttributes: [{ country: "JP" language: "ja" description: "Updated employer description" }] } }) { attributeUpdated }}Delete description
The following example deletes the employer description for the ja-JP locale by setting it to null:
mutation DeleteDescription { patchEmployer(input: { id: { type: "TYPE_FROM_INDEED" id: "EMPLOYER_ID_IN_ATS" } employerAttributes: { localeSpecificAttributes: [{ country: "JP" language: "ja" description: null }] } }) { attributeUpdated }}Update multiple employer attributes
You can update multiple attributes for one employer in a single request. Each request updates exactly one employer, so use a separate request for each employer.
Do not update multiple countries or locales in a single request, because the results can be unpredictable.
mutation UpdateMultipleAttributes { patchEmployer(input: { id: { type: "TYPE_FROM_INDEED" id: "EMPLOYER_ID_IN_ATS" } employerName: "Example employer" employerAttributes: { employerType: JURIDICAL_PERSON countrySpecificAttributes: [{ country: "JP" websiteUrl: "https://example.co.jp" phoneNumber: null taxId: "000000" }] localeSpecificAttributes: [{ country: "JP" language: "ja" isGlobalDefault: true description: "Japanese employer description" localizedName: "Japanese local name" headquarterAddress: "Minato-ku, Tokyo" leader: { name: "Leader name" } }] } }) { attributeUpdated }}4. Troubleshoot errors
Common issues
- Authentication errors — Verify your OAuth token and confirm that your app can create and update employers.
- Validation errors — Confirm that you provided every field your target country requires.
- Rate limiting — Retry with exponential backoff.
For more information, see:
Requirements for Japan partners
All partners must include the fields that the schema requires when they create or update an employer with the patchEmployer mutation.
Japan partners must also send additional fields when they create an employer, to comply with Indeed PLUS policies and the law. These fields are not required when you update an employer, unless their values change.
Required fields
This table lists the fields that patchEmployer requires in PatchEmployerInput.
| Attribute | Required | Notes |
|---|---|---|
type | ✔ Create and update employer | Use the value that Indeed provides you. |
id | ✔ Create and update employer | Uniquely identifies this employer within your ATS. |
employerName | ✔ Create employer | Indeed copies this value to the global localizedName field unless the request sets that field explicitly. |
countrySpecificAttributes.country | ✔ Create and update employer | Set to JP. |
countrySpecificAttributes.phoneNumber | ✔ Create employer | |
countrySpecificAttributes.sectorSUIDs | ✔ Create employer | Provide applicable SUID values from Company sector. |
employerAttributes.employerType | ✔ Create and update employer | Provide the appropriate enum value. For entities identified as |
localeSpecificAttributes.country | ✔ Create and update employer | Set to JP. |
localeSpecificAttributes.language | ✔ Create and update employer | |
localeSpecificAttributes.isGlobalDefault | ✔ Create and update employer | |
localeSpecificAttributes.headquarterAddress | ✔ Create employer | |
localeSpecificAttributes.localizedName | Setting isGlobalDefault: true and localizedName: null in the same request deletes the default name. |
Employer posting examples
The following examples show how to post employers with patchEmployer.
Example 1: Post a new employer
Post the required fields plus any optional fields you have.
mutation CreateEmployerExample { patchEmployer(input: { id: { type: "YOUR_ATS_TYPE_FROM_INDEED" id: "EMPLOYER_123" } employerName: "株式会社テストその1" employerAttributes: { countrySpecificAttributes: [{ country: "JP" phoneNumber: "+810312345678" sectorSUIDs: ["CS9YK"] }] localeSpecificAttributes: [{ country: "JP" language: "ja" isGlobalDefault: true headquarterAddress: "東京都千代田区丸の内1-9-2" }] } }) { responseCode }}Example 2: Add or update employer information
After you post employer data as in Example 1, you can add new fields and update existing ones. For details, see Update behavior.
The following example reuses the id.type and id.id values from Example 1, so it updates the same employer. It changes countrySpecificAttributes.phoneNumber and adds localeSpecificAttributes.description.
mutation PatchEmployerPhoneNumberAndDescription { patchEmployer(input: { id: { type: "YOUR_ATS_TYPE_FROM_INDEED" id: "EMPLOYER_123" } # Same id as in Example 1 employerAttributes: { countrySpecificAttributes: [{ country: "JP" #(phoneNumber) Modify an already - populated field phoneNumber: "+810323456789" }] localeSpecificAttributes: [{ country: "JP" language: "ja" isGlobalDefault: true #(description) Add a new field description: "2004年に創業してから、世界中の人々の生活をサポートし続けてきました。人種・国籍問わず活躍できる職場を実現するための数々の施策に取り組ん でおります。" }] } }) { attributeUpdated responseCode }}Visible fields requirements for Japan partners
Job board UX can and does change, so this list might not be up to date. Some fields also appear only behind a button rather than in plain sight.
Job seekers on Indeed PLUS job boards in Japan can see these PatchEmployerInput fields:
employerNameemployerAttributescountrySpecificAttributeswebsiteUrlphoneNumbersectorSUIDs— the label that corresponds to the SUID value
localeSpecificAttributes