Greenhouse Job Board API

The Job Board API exposes a customer's public career site data — jobs, departments, offices — and accepts application submissions via POST /jobs/{id}. GET endpoints are unauthenticated; POST endpoints accept multipart/form-data or JSON. Used to power customer-owned career pages and third-party job-board syndication.

Greenhouse Job Board 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 JobBoard, Careers, Public, and Applications. The published artifact set on APIs.io includes API documentation, an OpenAPI specification, authentication docs, and 1 Naftiko capability spec.

OpenAPI Specification

greenhouse-job-board-api-openapi.yml Raw ↑
openapi: 3.1.0
info:
  title: Greenhouse Job Board API
  description: |
    The Job Board API exposes a customer's public career site data — jobs, departments,
    and offices — and accepts application submissions on POST. GET endpoints are
    unauthenticated; POST application endpoints accept multipart/form-data or JSON and
    require HTTP Basic auth with a Job Board API key.
  version: "1.0.0"
  contact:
    name: Greenhouse Software
    url: https://www.greenhouse.com
    email: [email protected]
servers:
  - url: https://boards-api.greenhouse.io/v1/boards/{board_token}
    description: Public Job Board API
    variables:
      board_token:
        default: example
        description: The customer's unique board token (e.g. "exampleco").

tags:
  - name: Jobs
    description: Public job listings.
  - name: Departments
    description: Public department listings.
  - name: Offices
    description: Public office listings.
  - name: Applications
    description: Submit applications to a job.

paths:
  /jobs:
    get:
      tags: [Jobs]
      summary: List Job Board Jobs
      description: Returns the list of public job listings for a board.
      operationId: listBoardJobs
      parameters:
        - name: content
          in: query
          description: When true, includes the full job description content.
          schema: { type: boolean }
      responses:
        '200':
          description: Job listings.
          content:
            application/json:
              schema:
                type: object
                properties:
                  jobs:
                    type: array
                    items: { $ref: '#/components/schemas/BoardJob' }
                  meta:
                    type: object
                    properties:
                      total: { type: integer }

  /jobs/{id}:
    get:
      tags: [Jobs]
      summary: Retrieve Job Board Job
      operationId: getBoardJob
      parameters:
        - name: id
          in: path
          required: true
          schema: { type: integer }
        - name: questions
          in: query
          schema: { type: boolean }
      responses:
        '200':
          description: Job listing.
          content:
            application/json:
              schema: { $ref: '#/components/schemas/BoardJob' }

    post:
      tags: [Applications]
      summary: Submit Application
      description: Submit a candidate application to a job posting. Accepts multipart/form-data or JSON. Requires Basic auth.
      operationId: submitApplication
      security:
        - BasicAuth: []
      parameters:
        - name: id
          in: path
          required: true
          schema: { type: integer }
      requestBody:
        required: true
        content:
          application/json:
            schema: { $ref: '#/components/schemas/ApplicationSubmission' }
          multipart/form-data:
            schema: { $ref: '#/components/schemas/ApplicationSubmission' }
      responses:
        '200':
          description: Application accepted.
          content:
            application/json:
              schema:
                type: object
                properties:
                  success: { type: string }

  /departments:
    get:
      tags: [Departments]
      summary: List Job Board Departments
      operationId: listBoardDepartments
      parameters:
        - name: render_as
          in: query
          schema: { type: string, enum: [list, tree], default: list }
      responses:
        '200':
          description: Departments.
          content:
            application/json:
              schema:
                type: object
                properties:
                  departments:
                    type: array
                    items: { $ref: '#/components/schemas/BoardDepartment' }

  /departments/{id}:
    get:
      tags: [Departments]
      summary: Retrieve Job Board Department
      operationId: getBoardDepartment
      parameters:
        - name: id
          in: path
          required: true
          schema: { type: integer }
      responses:
        '200':
          description: Department.
          content:
            application/json:
              schema: { $ref: '#/components/schemas/BoardDepartment' }

  /offices:
    get:
      tags: [Offices]
      summary: List Job Board Offices
      operationId: listBoardOffices
      parameters:
        - name: render_as
          in: query
          schema: { type: string, enum: [list, tree], default: list }
      responses:
        '200':
          description: Offices.
          content:
            application/json:
              schema:
                type: object
                properties:
                  offices:
                    type: array
                    items: { $ref: '#/components/schemas/BoardOffice' }

  /offices/{id}:
    get:
      tags: [Offices]
      summary: Retrieve Job Board Office
      operationId: getBoardOffice
      parameters:
        - name: id
          in: path
          required: true
          schema: { type: integer }
      responses:
        '200':
          description: Office.
          content:
            application/json:
              schema: { $ref: '#/components/schemas/BoardOffice' }

components:
  securitySchemes:
    BasicAuth:
      type: http
      scheme: basic
      description: HTTP Basic auth using the Job Board API key as the username with an empty password.

  schemas:
    BoardJob:
      type: object
      properties:
        id: { type: integer }
        title: { type: string }
        updated_at: { type: string, format: date-time }
        location:
          type: object
          properties:
            name: { type: string }
        absolute_url: { type: string, format: uri }
        internal_job_id: { type: integer }
        company_name: { type: string }
        first_published: { type: string, format: date-time }
        requisition_id: { type: string, nullable: true }
        data_compliance:
          type: array
          items:
            type: object
            properties:
              type: { type: string }
              requires_consent: { type: boolean }
              retention_period: { type: integer, nullable: true }
        metadata:
          type: array
          items: { type: object }
        departments:
          type: array
          items: { $ref: '#/components/schemas/BoardDepartment' }
        offices:
          type: array
          items: { $ref: '#/components/schemas/BoardOffice' }
        content: { type: string }

    BoardDepartment:
      type: object
      properties:
        id: { type: integer }
        name: { type: string }
        parent_id: { type: integer, nullable: true }
        child_ids: { type: array, items: { type: integer } }
        jobs:
          type: array
          items: { $ref: '#/components/schemas/BoardJob' }

    BoardOffice:
      type: object
      properties:
        id: { type: integer }
        name: { type: string }
        location: { type: string }
        parent_id: { type: integer, nullable: true }
        child_ids: { type: array, items: { type: integer } }
        departments:
          type: array
          items: { $ref: '#/components/schemas/BoardDepartment' }

    ApplicationSubmission:
      type: object
      required: [first_name, last_name, email]
      properties:
        first_name: { type: string }
        last_name: { type: string }
        email: { type: string, format: email }
        phone: { type: string }
        location:
          type: string
          description: City, State / Country.
        resume_text: { type: string }
        resume_text_file: { type: string, description: Base64-encoded resume file content. }
        resume_content_filename: { type: string }
        resume_content_type: { type: string }
        cover_letter_text: { type: string }
        cover_letter_content: { type: string, description: Base64-encoded cover letter. }
        cover_letter_content_filename: { type: string }
        question_id:
          type: string
          description: Greenhouse-defined custom question identifiers; multiple entries allowed.