Greenhouse Candidate Ingestion (Partner) API

The Candidate Ingestion (Partner) API lets sourcing partners create candidates and prospects in a customer's Greenhouse account, list jobs visible to the integrated user, read prospect pools, retrieve the current user, and generate branded tracking links. Used by sourcing platforms, agencies, and recruitment marketing tools.

Greenhouse Candidate Ingestion (Partner) API is one of 8 APIs that Greenhouse publishes on the APIs.io network, described by a machine-readable OpenAPI specification.

This API exposes 1 machine-runnable capability that can be deployed as REST, MCP, or Agent Skill surfaces via Naftiko.

Tagged areas include Partner, Ingestion, Sourcing, Candidates, and Prospects. The published artifact set on APIs.io includes API documentation, an OpenAPI specification, authentication docs, and 1 Naftiko capability spec.

OpenAPI Specification

greenhouse-candidate-ingestion-api-openapi.yml Raw ↑
openapi: 3.1.0
info:
  title: Greenhouse Candidate Ingestion API
  description: |
    The Candidate Ingestion API (a.k.a. the Partner API) lets sourcing partners create
    candidates and prospects in a customer's Greenhouse account, list visible jobs and
    prospect pools, fetch the current user, and generate branded tracking links.
    Authentication is OAuth 2.0 (Authorization Code or Client Credentials) or HTTP Basic
    with a Partner API key plus an On-Behalf-Of header carrying a Greenhouse user email.
  version: "1.0.0"
  contact:
    name: Greenhouse Software
    url: https://www.greenhouse.com
    email: [email protected]
servers:
  - url: https://api.greenhouse.io/v1/partner
    description: Production Partner API

security:
  - OAuth2: [partner]
  - BasicAuth: []

tags:
  - name: Candidates
    description: Create or retrieve candidates / prospects in the customer's Greenhouse account.
  - name: Jobs
    description: List jobs visible to the integrated user.
  - name: ProspectPools
    description: Read configured prospect pools and their stages.
  - name: Users
    description: Inspect the current authenticated user.
  - name: TrackingLinks
    description: Generate branded tracking links for sourcing campaigns.

paths:
  /candidates:
    get:
      tags: [Candidates]
      summary: List Partner Candidates
      description: Retrieve candidates by partner-supplied external IDs or Greenhouse IDs.
      operationId: listPartnerCandidates
      parameters:
        - name: external_ids
          in: query
          schema:
            type: array
            items: { type: string }
          style: form
          explode: false
        - name: candidate_ids
          in: query
          schema:
            type: array
            items: { type: integer }
          style: form
          explode: false
        - $ref: '#/components/parameters/OnBehalfOf'
      responses:
        '200':
          description: Partner candidates.
          content:
            application/json:
              schema:
                type: array
                items: { $ref: '#/components/schemas/PartnerCandidate' }
    post:
      tags: [Candidates]
      summary: Create Partner Candidate
      description: Create a candidate or prospect on behalf of a Greenhouse user.
      operationId: createPartnerCandidate
      parameters: [ { $ref: '#/components/parameters/OnBehalfOf' } ]
      requestBody:
        required: true
        content:
          application/json:
            schema: { $ref: '#/components/schemas/PartnerCandidate' }
      responses:
        '201':
          description: Created.
          content:
            application/json:
              schema: { $ref: '#/components/schemas/PartnerCandidate' }

  /current_user:
    get:
      tags: [Users]
      summary: Retrieve Current Partner User
      operationId: getCurrentPartnerUser
      parameters: [ { $ref: '#/components/parameters/OnBehalfOf' } ]
      responses:
        '200':
          description: Current user.
          content:
            application/json:
              schema:
                type: object
                properties:
                  id: { type: integer }
                  name: { type: string }
                  email: { type: string, format: email }

  /jobs:
    get:
      tags: [Jobs]
      summary: List Partner Jobs
      description: List jobs visible to the integrated user.
      operationId: listPartnerJobs
      parameters: [ { $ref: '#/components/parameters/OnBehalfOf' } ]
      responses:
        '200':
          description: Visible jobs.
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  properties:
                    id: { type: integer }
                    name: { type: string }
                    requisition_id: { type: string, nullable: true }
                    departments:
                      type: array
                      items: { type: object }
                    offices:
                      type: array
                      items: { type: object }

  /prospect_pools:
    get:
      tags: [ProspectPools]
      summary: List Partner Prospect Pools
      operationId: listPartnerProspectPools
      parameters: [ { $ref: '#/components/parameters/OnBehalfOf' } ]
      responses:
        '200':
          description: Prospect pools.
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  properties:
                    id: { type: integer }
                    name: { type: string }
                    stages:
                      type: array
                      items:
                        type: object
                        properties:
                          id: { type: integer }
                          name: { type: string }
                          priority: { type: integer }

  /tracking_link:
    post:
      tags: [TrackingLinks]
      summary: Create Tracking Link
      description: Generate a branded tracking link tied to the partner and an optional job.
      operationId: createTrackingLink
      parameters: [ { $ref: '#/components/parameters/OnBehalfOf' } ]
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                job_id: { type: integer }
                source_id: { type: integer }
                external_id: { type: string }
      responses:
        '201':
          description: Tracking link.
          content:
            application/json:
              schema:
                type: object
                properties:
                  url: { type: string, format: uri }
                  expires_at: { type: string, format: date-time }

components:
  securitySchemes:
    OAuth2:
      type: oauth2
      flows:
        authorizationCode:
          authorizationUrl: https://app.greenhouse.io/oauth/authorize
          tokenUrl: https://app.greenhouse.io/oauth/token
          scopes:
            partner: Partner integration scope.
        clientCredentials:
          tokenUrl: https://app.greenhouse.io/oauth/token
          scopes:
            partner: Partner integration scope.
    BasicAuth:
      type: http
      scheme: basic
      description: HTTP Basic with the Partner API key as the username and an empty password.

  parameters:
    OnBehalfOf:
      name: On-Behalf-Of
      in: header
      required: true
      description: Email of the Greenhouse user the request is made on behalf of (Basic auth) or implied from the OAuth token.
      schema: { type: string, format: email }

  schemas:
    PartnerCandidate:
      type: object
      required: [external_id, first_name, last_name]
      properties:
        external_id:
          type: string
          description: Partner-system identifier for this candidate.
        first_name: { type: string }
        last_name: { type: string }
        company: { type: string }
        title: { type: string }
        emails:
          type: array
          items:
            type: object
            properties:
              value: { type: string, format: email }
              type: { type: string }
        phone_numbers:
          type: array
          items:
            type: object
            properties:
              value: { type: string }
              type: { type: string }
        social_media_addresses:
          type: array
          items:
            type: object
            properties:
              value: { type: string }
        application:
          type: object
          properties:
            job_id: { type: integer }
            initial_stage_id: { type: integer }
            source_id: { type: integer }
            referrer:
              type: object
              properties:
                type: { type: string }
                value: { type: string }
        prospect:
          type: object
          properties:
            prospect_pool_id: { type: integer }
            prospect_stage_id: { type: integer }
            prospect_owner_id: { type: integer }
        attachments:
          type: array
          items:
            type: object
            properties:
              filename: { type: string }
              type: { type: string, enum: [resume, cover_letter, admin_only, public, offer_letter] }
              content: { type: string }
              content_type: { type: string }
              url: { type: string, format: uri }