Create example job
Create and verify an example job on Indeed.
Before you begin
- Become an Indeed partner and, for Indeed PLUS only, receive
employerIdTypefrom Indeed. - Get an access token.
When you call the Indeed PLUS APIs, initiate a timeout after 5,000 milliseconds.
Call the API
To call a GraphQL API, POST to the https://apis.indeed.com/graphql endpoint with headers and the GraphQL query or mutation:
curl -X POST \ -L 'https://apis.indeed.com/graphql' \ -H 'Authorization: Bearer <access_token>' \ -H 'Content-Type: application/json' \ -d '{"query":"mutation SubmitJobPostingExample($employerIdType: String!) {\n jobsIngest {\n createSourcedJobPostings(\n input: {\n jobPostings: [\n {\n body: {\n title: \"Customer Support\"\n description: \"<h2 data-segment-type=\\\"header\\\" data-segment-label=\\\"JobDescription\\\">\\n Description\\n</h2>\\n<div data-segment-type=\\\"content\\\" data-segment-label=\\\"JobDescription\\\">\\n You will be responsible for supporting customers in this role.\\n</div>\\n<h2 data-segment-type=\\\"header\\\" data-segment-label=\\\"Pay\\\">\\n Pay\\n</h2>\\n<div data-segment-type=\\\"content\\\" data-segment-label=\\\"Pay\\\">\\n 2,000 yen per hour\\n</div>\\n<h2 data-segment-type=\\\"header\\\" data-segment-label=\\\"WorkHours\\\">\\n Working hours\\n</h2>\\n<div data-segment-type=\\\"content\\\" data-segment-label=\\\"WorkHours\\\">\\n 8 hours per day\\n At least 4 days per week\\n</div>\\n\"\n descriptionFormatting: RICH_FORMATTING\n benefits: []\n salary: {\n currency: \"JPY\"\n period: \"HOUR\"\n minimumMinor: 2000\n fineGrainedSalaryInformation: {\n totalSalaryMinor: 2000\n workingHours: 1\n fixedOvertimePay: false\n }\n }\n hasProbationaryPeriod: NO\n location: { country: \"JP\", streetAddress: \"108-0023 東京都港区芝浦3-1-21 田町ステーションタワーS18階\" }\n }\n metadata: {\n jobSource: {\n companyName: \"Example Company\"\n sourceName: \"Example Source Name\"\n sourceType: \"Employer\"\n employerIds: [{ type: $employerIdType, id: \"1\" }]\n }\n taxonomyClassification: { jobTypes: [\"75GKK\"], occupations: [\"N3YNG\"], attributes: [\"7ADHN\"] }\n jobPostingId: \"AtsJobPostingId1\"\n datePublished: \"2023-09-01T09:35:00+09:00\"\n url: \"https://example.com/jobs/aaabbbccc\"\n contacts: { contactType: \"contact\", contactInfo: { contactEmail: \"contact@career.example.com\" } }\n }\n }\n ]\n }\n ) {\n results {\n jobPosting {\n sourcedPostingId\n }\n }\n }\n }\n}","operationName":"SubmitJobPostingExample","variables":{"employerIdType": "<employerIdType>"}}'Request headers:
| Header | Value | Description |
|---|---|---|
Authorization | Bearer <token> | Use this header to authenticate with the server and access protected resources. Pass the access token in this header with the Bearer authentication scheme. For the oauth/v2/tokens endpoint, use the basic authentication scheme instead of passing client_id and client_secret in the request body. See Get an access token, Authorization header (opens in a new window), and Basic authentication scheme. |
Content-Type | application/json | The media type (opens in a new window) of the resource. See Content-Type header (opens in a new window). |
The -d parameter specifies the GraphQL query, where <employerIdType> is your employerIdType, for Indeed PLUS only.
mutation SubmitJobPostingExample($employerIdType: String!) { jobsIngest { createSourcedJobPostings(input: { jobPostings: [{ body: { title: "Customer Support" description: "<h2 data-segment-type=\"header\" data-segment-label=\"JobDescription\">\n Description\n</h2>\n<div data-segment-type=\"content\" data-segment-label=\"JobDescription\">\n You will be responsible for supporting customers in this role.\n</div>\n<h2 data-segment-type=\"header\" data-segment-label=\"Pay\">\n Pay\n</h2>\n<div data-segment-type=\"content\" data-segment-label=\"Pay\">\n 2,000 yen per hour\n</div>\n<h2 data-segment-type=\"header\" data-segment-label=\"WorkHours\">\n Working hours\n</h2>\n<div data-segment-type=\"content\" data-segment-label=\"WorkHours\">\n 8 hours per day\n At least 4 days per week\n</div>\n" descriptionFormatting: RICH_FORMATTING benefits: [] salary: { currency: "JPY" period: "HOUR" minimumMinor: 2000 fineGrainedSalaryInformation: { totalSalaryMinor: 2000 workingHours: 1 fixedOvertimePay: false } } hasProbationaryPeriod: NO location: { country: "JP", streetAddress: "108-0023 東京都港区芝浦3-1-21 田町ステーションタワーS18階" } } metadata: { jobSource: { companyName: "Example Company" sourceName: "Example Source Name" sourceType: "Employer" employerIds: [{ type: $employerIdType, id: "1" }] } taxonomyClassification: { jobTypes: ["75GKK"] occupations: ["N3YNG"] attributes: ["7ADHN"] } jobPostingId: "AtsJobPostingId1" datePublished: "2023-09-01T09:35:00+09:00" url: "https://example.com/jobs/aaabbbccc" contacts: { contactType: "contact" contactInfo: { contactEmail: "contact@career.example.com" } } } }] }) { results { jobPosting { sourcedPostingId } } } }When using Insomnia (opens in a new window) to send GraphQL requests, you can import a curl command into Insomnia. See Import Data (opens in a new window) in the Insomnia documentation.
A successful response is:
{ "data": { "jobsIngest": { "createSourcedJobPostings": { "results": [{ "jobPosting": { "sourcedPostingId": "ea81aaa2-e834-43f7-8cd9-75778c14c2d5" } }] } } }}Verify that the job is available
Indeed can take up to two hours to publish the job. Contact Indeed to confirm that the job is live.
Next steps
-
Update the job — for example, change title. Updates return the same response as job creation and can take up to two hours to take effect.
-
Post more jobs by changing
jobPostingId(for example,AtsJobPostingId2instead ofAtsJobPostingId1). -
Add
applyMethodto input. You need a public endpoint that acceptsPOSTrequests (postUrl) and the client ID of an Indeed Apply application (apiToken). To integrate Indeed Apply into your app, contact Indeed. -
To expire the job, call the
expireSourcedJobsBySourcedPostingIdmutation with thesourcedPostingIdfrom the job-creation response. -
For more information, see Employer Data, Job Sync, and the GraphQL API reference.