openapi: 3.1.0 info: title: Indeed Employer Candidates 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: Candidates description: Operations for retrieving and managing candidate applications. Part of the Candidate Sync APIs, these endpoints enable ATS partners to fetch candidate and application data from Indeed on behalf of registered employers. paths: /v1/employers/{employerId}/candidates: get: operationId: listCandidates summary: Indeed List Candidates for an Employer description: Retrieves a paginated list of candidates who have applied to jobs posted by the specified employer. Part of the Candidate Sync APIs, this endpoint returns candidate and application information including the most recent unacknowledged applications. tags: - Candidates 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 candidates by application status. schema: type: string enum: - NEW - CONTACTED - INTERVIEWED - OFFERED - HIRED - REJECTED - name: jobPostingId in: query required: false description: Filter candidates by job posting ID. schema: type: string - name: after in: query required: false description: Cursor for forward pagination. schema: type: string - name: first in: query required: false description: Number of candidates to return (max 100). schema: type: integer minimum: 1 maximum: 100 default: 25 - name: since in: query required: false description: Return only candidates who applied after this timestamp. schema: type: string format: date-time responses: '200': description: Candidates retrieved successfully. content: application/json: schema: $ref: '#/components/schemas/CandidateList' '401': description: Authentication credentials are missing or invalid. '403': description: Insufficient permissions. The employer may not be registered for Candidate Sync. '404': description: Employer not found. x-microcks-operation: delay: 0 dispatcher: FALLBACK /v1/employers/{employerId}/candidates/{candidateId}: get: operationId: getCandidate summary: Indeed Retrieve a Candidate description: Retrieves the full details of a specific candidate application, including personal information, resume, screener question responses, and EEO data if applicable. tags: - Candidates parameters: - name: employerId in: path required: true description: The unique identifier of the employer. schema: type: string - name: candidateId in: path required: true description: The unique identifier of the candidate application. schema: type: string responses: '200': description: Candidate retrieved successfully. content: application/json: schema: $ref: '#/components/schemas/Candidate' '401': description: Authentication credentials are missing or invalid. '403': description: Insufficient permissions to access this candidate. '404': description: Candidate or employer not found. x-microcks-operation: delay: 0 dispatcher: FALLBACK /v1/employers/{employerId}/candidates/{candidateId}/disposition: put: operationId: updateCandidateDisposition summary: Indeed Update Candidate Disposition description: Updates the disposition (application status) of a candidate for a specific job posting. This syncs the hiring pipeline status from the ATS back to Indeed, enabling accurate reporting and analytics. tags: - Candidates parameters: - name: employerId in: path required: true description: The unique identifier of the employer. schema: type: string - name: candidateId in: path required: true description: The unique identifier of the candidate application. schema: type: string requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/DispositionUpdate' example: applicationId: app-123456 status: INTERVIEWED statusUpdatedAt: '2026-03-01T14:30:00Z' responses: '200': description: Disposition updated successfully. '400': description: Invalid disposition status. '401': description: Authentication credentials are missing or invalid. '404': description: Candidate or employer not found. x-microcks-operation: delay: 0 dispatcher: FALLBACK components: schemas: Resume: type: object description: A candidate's resume in multiple formats. The file field contains the uploaded resume document, while text, html, and json fields provide parsed representations. properties: file: $ref: '#/components/schemas/ResumeFile' text: type: string description: Plain text representation of the resume content. example: example_value html: type: string description: HTML-formatted representation of the resume content. example: example_value json: type: object description: Structured JSON representation of the parsed resume, including sections for work experience, education, skills, and other fields. additionalProperties: true example: example_value DispositionUpdate: type: object description: An update to the disposition (application status) of a candidate for a specific job posting. Used to sync hiring pipeline status changes back to Indeed. required: - applicationId - status properties: applicationId: type: string description: The unique identifier for the application. example: '500123' status: type: string description: The new disposition status for the application. Must be one of Indeed's predefined categories. enum: - NEW - CONTACTED - INTERVIEWED - OFFERED - HIRED - REJECTED example: NEW statusUpdatedAt: type: string format: date-time description: The timestamp when the status change occurred. example: '2026-01-15T10:30:00Z' rejectionReason: type: string description: The reason for rejection, if the status is REJECTED. example: example_value ScreenerQuestionResponse: type: object description: A candidate's response to a screener question on the job posting. properties: questionId: type: string description: The unique identifier of the screener question. example: '500123' question: type: string description: The text of the screener question. example: Do you have a valid driver's license? answer: type: string description: The candidate's answer to the question. example: 'Yes' Candidate: type: object description: A job candidate with personal details, resume information, and application data retrieved from Indeed. required: - id - name - email properties: id: type: string description: A unique candidate identifier. For Indeed Apply applications, this corresponds to the apply_id, a unique 64-character identifier linking the employer, candidate, and job posting. example: a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9t0u1v2w3x4y5z6a7b8c9d0e1f2 name: type: string description: The candidate's full name. example: Jane Smith firstName: type: string description: The candidate's first name. example: Jane lastName: type: string description: The candidate's last name. example: Smith email: type: string format: email description: The candidate's email address. example: jane.smith@example.com phoneNumber: type: string description: The candidate's phone number. example: +1-555-987-6543 location: type: string description: The candidate's location as a freeform string. example: Austin, TX resume: $ref: '#/components/schemas/Resume' coverLetter: type: string description: The candidate's cover letter text, if provided. example: example_value applicationStatus: type: string description: The current status of the candidate's application. Must map to one of Indeed's predefined disposition categories. enum: - NEW - CONTACTED - INTERVIEWED - OFFERED - HIRED - REJECTED example: NEW screenerQuestionResponses: type: array description: Responses to screener questions configured on the job posting. items: $ref: '#/components/schemas/ScreenerQuestionResponse' example: [] eeoResponses: $ref: '#/components/schemas/EeoResponses' appliedAt: type: string format: date-time description: The timestamp when the candidate submitted the application. example: '2026-01-15T10:30:00Z' source: type: string description: The source of the application, such as Indeed Apply, organic application, or other channels. example: indeed_apply jobPostingId: type: string description: The identifier of the job posting the candidate applied to. example: '500123' EeoResponses: type: object description: Equal Employment Opportunity (EEO) compliance responses provided by the candidate. Available only for US employers with EEO questions enabled. properties: gender: type: string description: The candidate's self-reported gender identity. example: example_value race: type: string description: The candidate's self-reported race or ethnicity. example: example_value veteranStatus: type: string description: The candidate's veteran status. example: example_value disabilityStatus: type: string description: The candidate's disability status. example: example_value 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 CandidateList: type: object description: A paginated list of candidates. properties: candidates: type: array items: $ref: '#/components/schemas/Candidate' example: [] totalCount: type: integer description: Total number of candidates matching the query. example: 42 pageInfo: $ref: '#/components/schemas/PageInfo' ResumeFile: type: object description: An uploaded resume file. properties: fileName: type: string description: The original filename of the uploaded resume. example: jane_smith_resume.pdf contentType: type: string description: The MIME type of the resume file. example: application/pdf data: type: string format: byte description: The raw binary content of the resume file, Base64-encoded. example: example_value 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/