openapi: 3.1.0 info: title: Indeed Employer Candidates Jobs API description: 'The Indeed Employer API provides a RESTful interface for managing employers, candidates, and job postings on the Indeed platform. This API enables ATS partners and hiring platforms to programmatically create and update employer profiles, retrieve and manage candidate applications, and synchronize job postings with Indeed''s employment ecosystem. Indeed''s native APIs use GraphQL via the `https://apis.indeed.com/graphql` endpoint. This OpenAPI specification represents a RESTful abstraction of the key employer-facing operations available through Indeed''s partner APIs, covering the Employer Data API, Retrieve Candidates API, and Job Sync API. **Authentication**: All API requests require OAuth 2.0 Bearer Token authentication. Partners must register through the Indeed Partner Console to obtain client credentials. **Rate Limits**: API calls are subject to rate limiting. Consult the Indeed Partner documentation for current rate limit policies.' version: 1.0.0 contact: name: Indeed API Support url: https://docs.indeed.com/support/ email: opensource@indeed.com license: name: Proprietary url: https://docs.indeed.com/legal-terms/developer-agreement termsOfService: https://www.indeed.com/legal/api-terms x-logo: url: https://www.indeed.com/images/indeed-logo.png servers: - url: https://apis.indeed.com description: Indeed Production API Server security: - BearerAuth: [] tags: - name: Jobs description: Operations for creating, updating, expiring, and retrieving job postings on Indeed. Supports qualifications, working hours, salary, benefits, employer information, and Indeed Apply configuration. paths: /v1/jobs: post: operationId: createJobPostings summary: Indeed Create Job Postings description: Creates one or more job postings on Indeed. Requires a job title, description, location, benefits, and job source details. The underlying Indeed API uses the createSourcedJobPostings GraphQL mutation. To update an existing job posting, submit the same jobPostingId and sourceName values that were used at creation time. tags: - Jobs requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/CreateJobPostingInput' example: jobPostings: - jobPostingId: JOB-2024-001 title: Senior Software Engineer description: We are looking for a Senior Software Engineer with 5+ years of experience in distributed systems... location: city: Austin state: TX country: US salary: minimumAmount: 120000 maximumAmount: 180000 currency: USD period: YEARLY employmentType: FULL_TIME benefits: - type: HEALTH_INSURANCE - type: PAID_TIME_OFF - type: RETIREMENT_401K qualifications: - type: EXPERIENCE description: 5+ years of software development experience required: true - type: EDUCATION description: Bachelor's degree in Computer Science or related field required: false source: sourceName: my-ats-platform employer: id: ats-partner_employer-12345 responses: '201': description: Job postings created successfully. content: application/json: schema: $ref: '#/components/schemas/CreateJobPostingPayload' '400': description: Invalid input. One or more job postings failed validation. content: application/json: schema: $ref: '#/components/schemas/CreateJobPostingPayload' '401': description: Authentication credentials are missing or invalid. '403': description: Insufficient permissions to create job postings. '429': description: Rate limit exceeded. x-microcks-operation: delay: 0 dispatcher: FALLBACK /v1/jobs/{jobPostingId}: get: operationId: getJobPosting summary: Indeed Retrieve a Job Posting description: Retrieves the details of a specific job posting by its unique identifier. tags: - Jobs parameters: - name: jobPostingId in: path required: true description: The unique identifier of the job posting. schema: type: string example: JOB-2024-001 - name: sourceName in: query required: false description: The source name to scope the job posting lookup. Required when job posting IDs are not globally unique. schema: type: string responses: '200': description: Job posting retrieved successfully. content: application/json: schema: $ref: '#/components/schemas/JobPosting' '401': description: Authentication credentials are missing or invalid. '404': description: Job posting not found. x-microcks-operation: delay: 0 dispatcher: FALLBACK put: operationId: updateJobPosting summary: Indeed Update a Job Posting description: Updates an existing job posting on Indeed. The same jobPostingId and sourceName that were used during creation must be provided. Uses the createSourcedJobPostings mutation with updated fields. tags: - Jobs parameters: - name: jobPostingId in: path required: true description: The unique identifier of the job posting to update. schema: type: string requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/JobPosting' responses: '200': description: Job posting updated successfully. content: application/json: schema: $ref: '#/components/schemas/JobPosting' '400': description: Invalid input. '401': description: Authentication credentials are missing or invalid. '404': description: Job posting not found. '429': description: Rate limit exceeded. x-microcks-operation: delay: 0 dispatcher: FALLBACK delete: operationId: expireJobPosting summary: Indeed Expire a Job Posting description: Expires (closes) a job posting on Indeed, removing it from active search results. This operation cannot be undone; a new job posting must be created to relist the position. tags: - Jobs parameters: - name: jobPostingId in: path required: true description: The unique identifier of the job posting to expire. schema: type: string - name: sourceName in: query required: true description: The source name used when the job posting was created. schema: type: string responses: '204': description: Job posting expired successfully. '401': description: Authentication credentials are missing or invalid. '404': description: Job posting not found. '429': description: Rate limit exceeded. x-microcks-operation: delay: 0 dispatcher: FALLBACK /v1/employers/{employerId}/jobs: get: operationId: listEmployerJobPostings summary: Indeed List Job Postings for an Employer description: Retrieves a paginated list of job postings associated with a specific employer. tags: - Jobs parameters: - name: employerId in: path required: true description: The unique identifier of the employer. schema: type: string - name: status in: query required: false description: Filter job postings by status. schema: type: string enum: - ACTIVE - PAUSED - EXPIRED - CLOSED - name: after in: query required: false description: Cursor for forward pagination. schema: type: string - name: first in: query required: false description: Number of job postings to return (max 100). schema: type: integer minimum: 1 maximum: 100 default: 25 responses: '200': description: Job postings retrieved successfully. content: application/json: schema: $ref: '#/components/schemas/JobPostingList' '401': description: Authentication credentials are missing or invalid. '404': description: Employer not found. x-microcks-operation: delay: 0 dispatcher: FALLBACK components: schemas: IndeedApplyConfig: type: object description: Configuration for Indeed Apply integration on the job posting. properties: enabled: type: boolean description: Whether Indeed Apply is enabled for this job posting. example: true postUrl: type: string format: uri description: The URL where Indeed sends application data when a candidate applies through Indeed Apply. example: https://www.example.com screenerQuestions: type: array description: Screener questions to present to candidates during application. items: $ref: '#/components/schemas/ScreenerQuestion' example: [] eeoEnabled: type: boolean description: Whether EEO compliance questions are enabled. Available for US employers only. example: true JobLocation: type: object description: The location of the job. properties: streetAddress: type: string description: Street address of the job location. example: example_value city: type: string description: City where the job is located. example: Austin state: type: string description: State, province, or region. example: TX postalCode: type: string description: Postal or ZIP code. example: '78701' country: type: string description: ISO 3166-1 alpha-2 country code. example: US formattedAddress: type: string description: A human-readable formatted address string. example: Austin, TX 78701, US JobPostingList: type: object description: A paginated list of job postings. properties: jobPostings: type: array items: $ref: '#/components/schemas/JobPosting' example: [] totalCount: type: integer description: Total number of job postings matching the query. example: 10 pageInfo: $ref: '#/components/schemas/PageInfo' CreateJobPostingInput: type: object description: Input for creating one or more job postings on Indeed via the Job Sync API. required: - jobPostings properties: jobPostings: type: array items: $ref: '#/components/schemas/JobPosting' description: Array of job posting objects to create. example: [] JobSource: type: object description: Information about the source system for the job posting, used to identify the originating ATS or job board. required: - sourceName properties: sourceName: type: string description: The name of the source system. Must remain consistent across all job postings from the same source. example: my-ats-platform sourceUrl: type: string format: uri description: The URL of the original job posting on the source system. example: https://www.example.com WorkingHours: type: object description: Working hours and schedule information for the position. properties: hoursPerWeek: type: number format: double description: Expected number of hours per week. example: 40 schedule: type: string description: Description of the work schedule. example: Monday through Friday, 9 AM to 5 PM shiftType: type: string description: The type of shift. enum: - DAY - NIGHT - EVENING - ROTATING - FLEXIBLE example: DAY JobPosting: type: object description: A job posting on Indeed with all associated metadata including title, description, location, salary, benefits, qualifications, and application configuration. required: - jobPostingId - title - description - location properties: jobPostingId: type: string description: A unique identifier for the job posting within the source system. Used in combination with sourceName for upsert operations. example: JOB-2024-001 title: type: string description: The title of the job posting. Maximum length of 75 characters. maxLength: 75 example: Senior Software Engineer description: type: string description: The full description of the job posting including responsibilities, requirements, and other details. Must be between 30 and 20,000 characters. minLength: 30 maxLength: 20000 example: We are looking for a Senior Software Engineer to join our growing team... location: $ref: '#/components/schemas/JobLocation' salary: $ref: '#/components/schemas/Salary' benefits: type: array description: Benefits offered with the position. items: $ref: '#/components/schemas/Benefit' example: [] qualifications: type: array description: Required or preferred qualifications for the position. items: $ref: '#/components/schemas/Qualification' example: [] workingHours: $ref: '#/components/schemas/WorkingHours' employmentType: type: string description: The type of employment. enum: - FULL_TIME - PART_TIME - CONTRACT - TEMPORARY - INTERNSHIP - VOLUNTEER example: FULL_TIME remoteWorkPolicy: type: string description: The remote work policy for the position. enum: - ON_SITE - REMOTE - HYBRID example: HYBRID employer: type: object description: Reference to the employer posting this job. properties: id: type: string description: The employer's unique identifier on Indeed. employerName: type: string description: The employer's display name. example: example_value source: $ref: '#/components/schemas/JobSource' indeedApply: $ref: '#/components/schemas/IndeedApplyConfig' status: type: string description: The current status of the job posting on Indeed. enum: - ACTIVE - PAUSED - EXPIRED - CLOSED example: ACTIVE applicationUrl: type: string format: uri description: The URL where candidates can apply for the position. example: https://www.example.com createdAt: type: string format: date-time description: The timestamp when the job posting was created. example: '2026-01-15T10:30:00Z' updatedAt: type: string format: date-time description: The timestamp when the job posting was last updated. example: '2026-01-15T10:30:00Z' expiresAt: type: string format: date-time description: The timestamp when the job posting expires. example: '2026-01-15T10:30:00Z' Qualification: type: object description: A qualification required or preferred for the job position, such as education level, years of experience, certifications, or skills. properties: type: type: string description: The category of the qualification. enum: - EDUCATION - EXPERIENCE - CERTIFICATION - SKILL - LICENSE example: EXPERIENCE description: type: string description: Description of the qualification. example: 5+ years of software development experience required: type: boolean description: Whether this qualification is required or preferred. example: true Salary: type: object description: Salary or compensation details for the job posting. properties: minimumAmount: type: number format: double description: The minimum salary amount. example: 120000 maximumAmount: type: number format: double description: The maximum salary amount. example: 180000 currency: type: string description: ISO 4217 currency code. example: USD period: type: string description: The pay period for the salary. enum: - HOURLY - DAILY - WEEKLY - BIWEEKLY - MONTHLY - YEARLY example: YEARLY ScreenerQuestion: type: object description: A screener question configured on a job posting. properties: id: type: string description: Unique identifier for the screener question. example: abc123 question: type: string description: The text of the question. example: Are you authorized to work in the United States? type: type: string description: The type of expected response. enum: - TEXT - BOOLEAN - SINGLE_SELECT - MULTI_SELECT - NUMERIC example: BOOLEAN required: type: boolean description: Whether the candidate must answer this question. example: true options: type: array description: Available options for select-type questions. items: type: string example: [] PageInfo: type: object description: Pagination information for list responses. properties: hasNextPage: type: boolean description: Whether there are more results available. example: true hasPreviousPage: type: boolean description: Whether there are previous results available. example: true startCursor: type: string description: Cursor for the first item in the current page. example: example_value endCursor: type: string description: Cursor for the last item in the current page. example: example_value CreateJobPostingPayload: type: object description: Response payload from a job posting creation operation. properties: results: type: array items: type: object properties: jobPostingId: type: string description: The ID of the created or updated job posting. status: type: string enum: - CREATED - UPDATED - FAILED errors: type: array items: $ref: '#/components/schemas/ApiError' example: [] totalCreated: type: integer description: Total number of job postings successfully created. example: 10 totalFailed: type: integer description: Total number of job postings that failed to create. example: 10 ApiError: type: object description: An error returned by the Indeed API. properties: code: type: string description: A machine-readable error code. example: INVALID_INPUT message: type: string description: A human-readable description of the error. example: The employer name field is required. field: type: string description: The field that caused the error, if applicable. example: employerName Benefit: type: object description: A benefit offered with the job position. properties: type: type: string description: The type of benefit. enum: - HEALTH_INSURANCE - DENTAL_INSURANCE - VISION_INSURANCE - RETIREMENT_401K - PAID_TIME_OFF - PARENTAL_LEAVE - TUITION_REIMBURSEMENT - LIFE_INSURANCE - DISABILITY_INSURANCE - FLEXIBLE_SCHEDULE - REMOTE_WORK - RELOCATION_ASSISTANCE - EMPLOYEE_DISCOUNT - COMMUTER_BENEFITS - OTHER example: HEALTH_INSURANCE description: type: string description: Additional details about the benefit. example: A sample description. securitySchemes: BearerAuth: type: http scheme: bearer description: OAuth 2.0 Bearer Token authentication. Obtain access tokens through the Indeed OAuth 2.0 authorization flow using your partner client credentials. OAuth2: type: oauth2 description: Indeed OAuth 2.0 authentication for partner applications. flows: clientCredentials: tokenUrl: https://apis.indeed.com/oauth/v2/tokens scopes: employer_access: Access and manage employer data candidate_read: Read candidate and application data job_posting_write: Create and manage job postings externalDocs: description: Indeed Partner Documentation url: https://docs.indeed.com/