Simulated GraphQL environment
Test your code during integration.
Indeed is discontinuing the GraphQL simulated environment on June 30, 2026. Transition away from this environment before this date.
Overview
Indeed offers a simulated GraphQL environment to test the Disposition Sync, Job Sync, and Employer Data APIs. Each operation simulates key aspects of production GraphQL API behavior. This includes input validation, managing jobs and employers, verifying the status of submitted jobs within the simulated environment, and sending job application disposition data. Some asynchronous processes that occur in the production Indeed system run in near real time in the simulated environment to help speed up integration without sending data to the production system.
The management of employer and job data within Indeed production APIs involves additional tasks and processes that are not simulated. For example, jobs are checked for quality and duplicate postings. While many of these tasks and processes are not currently enabled in the simulated environment, using it should give you confidence that your integration is set up correctly.
Use the simulated GraphQL environment to verify your integration before calling Indeed's production GraphQL APIs.
Before you start
Indeed's simulated GraphQL APIs have a separate endpoint at https://simulated-apis.indeed.com/graphql, which differs from the production GraphQL endpoint. To use Indeed's simulated GraphQL APIs, provide the same information as you would for production GraphQL APIs, only replacing the endpoint.
For the requirements for the simulated environment, see [Integrate with Indeed and call APIs](Integrate with Indeed and call APIs.). You must use the same token, POST method, and headers. All responses follow the same format as Indeed's production APIs with an additional _simulatedMessage field, which indicates the use of the simulated APIs:
{ "data": { "_simulatedMessage": "This is a simulated response"... }, "errors": [...]}Usage
Employer Data
Simulate creating and updating an employer. See Create Employer and Update Employer. Each call requires an authenticated 2-legged OAuth access token, when using the simulated GraphQL APIs at https://simulated-apis.indeed.com/graphql. All Employer data is scoped to the Client Id used in the authorization process.
Job Sync
Simulate creating, updating, and expiring jobs. See Create job posting, Upsert job posting, and Expire job posting. All Job Sync data is scoped to the Client Id used in the authorization process. An additional Job Status operation exists only in the simulated GraphQL APIs that allows you to check the status of a simulated job.
Job Status
Simulate checking the status of a job by providing the sourcedPostingId generated from a simulated job posting call. Some additional asynchronous checks are performed on simulated jobs that would occur in production GraphQL APIs. These checks help identify common validation issues and support the integration process. Not all checks and processes are run in the simulated environment, so behavior may differ from production APIs.
The Job Status operation shows a simulated job's active or expired status, visibility, and any relevant tags. Tags indicate invalid or improper parts of the simulated job payload.
Disposition Sync
Simulate sending job application disposition data. See Disposition Sync API. Each API call requires an authenticated 2-legged OAuth access token when using the simulated GraphQL APIs at https://simulated-apis.indeed.com/graphql. All Employer data is scoped to the Client Id used in the authorization process.
Reference
Employer data examples
An example request to create an employer in the simulated GraphQL API environment:
mutation CreateEmployerExample{ patchEmployer(input: { id: { type: "SAMPLE_TYPE" id: "EMPLOYER_ID_IN_ATS" } 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" headquarterAddress: "Minato-ku, Tokyo" leader: { name: "Leader name" } }] } }) { responseCode }}An example request to update an employer in the simulated GraphQL API environment:
mutation UpdateDescription{ patchEmployer(input: { id: { type: "SAMPLE_TYPE" id: "EMPLOYER_ID_IN_ATS" } employerAttributes: { localeSpecificAttributes: [ { country: "JP" language: "ja" description: "Updated employer description" }] } }) { attributeUpdated }}Job posting examples
This example call creates a job posting in the simulated GraphQL API environment:
mutation{ jobsIngest { createSourcedJobPostings(input: { jobPostings: [ { body: { title: "title 1" description: "description 1" location: { country: "US" cityRegionPostal: "Syracuse, New York 13209" } benefits: [] } metadata: { jobSource: { companyName: "Company" sourceName: "Source" sourceType: "Employer" } jobPostingId: "JobId1" datePublished: "2023-01-02T12:00Z" url: "http://example.com/careers/job1.html" contacts: [ { contactType: ["contact", "recruiter"] contactInfo: { contactEmail: "songdatadrop2@gmail.com" contactPhone: "+10001112223" contactName: "SL1" } }] } }] }) { results { jobPosting { sourcedPostingId } } } }}This example call upserts to a job posting in the simulated GraphQL API environment:
mutation { jobsIngest { createSourcedJobPostings(input: { jobPostings: [{ body: { title: "title 1" description: "description 1" location: { country: "US" cityRegionPostal: "Syracuse, New York 13209" } benefits: [] } metadata: { jobSource: { companyName: "Company" sourceName: "Source" sourceType: "Employer" } jobPostingId: "JobId1" datePublished: "2023-01-02T12:00Z" url: "http://example.com/careers/job1.html" contacts: [{ contactType: ["contact", "recruiter"] contactInfo: { contactEmail: "songdatadrop2@gmail.com" contactPhone: "+10001112223" contactName: "SL1" } }] } }] }) { results { jobPosting { sourcedPostingId } } } }}This example call expires a job posting in the simulated GraphQL API environment:
mutation { jobsIngest { expireSourcedJobsBySourcedPostingId( input: { jobs: [{ sourcedPostingId: "YOUR_SOURCED_POSTING_ID" }] } ) { results { trackingKey } } }}Job status example
This example call gets a simulated job status in the simulated GraphQL API environment:
query CheckJobStatus { findSimulatedJobStatuses(input: { sourcedPostingIds: ["YOUR_SOURCED_POSTING_ID"] }) { results { isActive simulatedModerationMessages sourcedPostingId visibilityLevel } }}Helpful links
This example call sends disposition data in the simulated GraphQL API environment:
mutation ExampleSimulatedDisposition { partnerDisposition { send( input: { dispositions: [ { atsName: "ExampleATS" dispositionStatus: LIKED identifiedBy: { indeedApplyID: "1234567890" } rawDispositionDetails: "Job liked on portal" rawDispositionStatus: "Like job" statusChangeDateTime: "2025-02-25T10:00:00Z" } ] } ) { numberGoodDispositions failedDispositions { identifiedBy { indeedApplyID ittk universalApplyId alternateIdentifier { jobIdentifier { indeedJobKey employerJobId atsApplicationIdentifier { requisitionId companyName applicationId } indeedJobKey } jobSeekerIdentifier { indeedJobSeekerKey emailAddress } } } rationale } } }}