Greenhouse Harvest API

The Harvest API is Greenhouse's primary REST API and source of truth for recruiting data: candidates, applications, jobs, openings, job posts, job stages, departments, offices, users, offers, approval flows, scheduled interviews, scorecards, sources, tags, custom fields, prospect pools, rejection reasons, and the per-candidate activity feed. HTTP Basic with a granular per-permission API key; RFC-5988 Link pagination; rate limits returned in X-RateLimit-Limit per 10s.

Greenhouse Harvest API is one of 8 APIs that Greenhouse publishes on the APIs.io network, described by a machine-readable OpenAPI specification.

This API exposes 6 machine-runnable capabilities that can be deployed as REST, MCP, or Agent Skill surfaces via Naftiko and 2 JSON Schema definitions.

Tagged areas include ATS, Recruiting, Candidates, Jobs, and Interviews. The published artifact set on APIs.io includes API documentation, an OpenAPI specification, a JSON-LD context, authentication docs, rate-limit docs, 6 Naftiko capability specs, and 2 JSON Schemas.

Documentation

Specifications

Schemas & Data

Other Resources

OpenAPI Specification

greenhouse-harvest-api-openapi.yml Raw ↑
openapi: 3.1.0
info:
  title: Greenhouse Harvest API
  description: |
    The Harvest API is Greenhouse's primary REST API for programmatic access to recruiting data:
    candidates, applications, jobs, openings, job posts, departments, offices, users, offers,
    approvals, scheduled interviews, scorecards, sources, tags, custom fields, prospect pools,
    and the activity feed. Harvest uses HTTP Basic authentication with a per-permission API key,
    RFC-5988 Link-header pagination (default 100, max 500 per page), and a per-token rate limit
    of N requests per 10 seconds returned in the X-RateLimit-Limit header.
  version: "1.0.0"
  contact:
    name: Greenhouse Software
    url: https://www.greenhouse.com
    email: [email protected]
  license:
    name: Greenhouse API Terms
    url: https://www.greenhouse.com/legal
servers:
  - url: https://harvest.greenhouse.io/v1
    description: Production Harvest API

security:
  - BasicAuth: []

tags:
  - name: Applications
    description: Candidate applications to specific jobs, including stage advancement, transfers, hires, rejections, and attachments.
  - name: Candidates
    description: Candidate profiles, notes, attachments, education, employment, prospect conversion, anonymization, and merging.
  - name: Jobs
    description: Job records and their hiring teams.
  - name: JobOpenings
    description: Individual openings under a Job.
  - name: JobPosts
    description: Public-facing job postings and their statuses.
  - name: JobStages
    description: The interview/pipeline stages a job uses.
  - name: Departments
    description: Organizational departments.
  - name: Offices
    description: Office locations.
  - name: Users
    description: Greenhouse users and their email addresses.
  - name: Offers
    description: Offers extended to candidates.
  - name: Approvals
    description: Approval flows for jobs and offers.
  - name: ScheduledInterviews
    description: Scheduled interview events on the calendar.
  - name: Scorecards
    description: Interview scorecards captured by interviewers.
  - name: Sources
    description: Candidate-source taxonomy (where the candidate came from).
  - name: Tags
    description: Candidate tags.
  - name: CustomFields
    description: Org-defined custom fields and their options.
  - name: ActivityFeed
    description: Per-candidate timeline of activity events.
  - name: ProspectPools
    description: Sourcing prospect pools.
  - name: RejectionReasons
    description: Configured rejection reasons.

paths:
  /applications:
    get:
      tags: [Applications]
      summary: List Applications
      description: Returns a paginated list of all applications across the organization.
      operationId: listApplications
      parameters:
        - $ref: '#/components/parameters/Page'
        - $ref: '#/components/parameters/PerPage'
        - $ref: '#/components/parameters/CreatedAfter'
        - $ref: '#/components/parameters/CreatedBefore'
        - $ref: '#/components/parameters/UpdatedAfter'
        - $ref: '#/components/parameters/UpdatedBefore'
        - name: job_id
          in: query
          schema: { type: integer }
        - name: status
          in: query
          schema:
            type: string
            enum: [active, rejected, hired, converted]
        - $ref: '#/components/parameters/OnBehalfOf'
      responses:
        '200':
          description: Array of applications.
          content:
            application/json:
              schema:
                type: array
                items: { $ref: '#/components/schemas/Application' }
        '4XX': { $ref: '#/components/responses/ErrorResponse' }

  /applications/{id}:
    parameters:
      - $ref: '#/components/parameters/Id'
    get:
      tags: [Applications]
      summary: Retrieve Application
      operationId: getApplication
      responses:
        '200':
          description: A single application.
          content:
            application/json:
              schema: { $ref: '#/components/schemas/Application' }
        '4XX': { $ref: '#/components/responses/ErrorResponse' }
    patch:
      tags: [Applications]
      summary: Update Application
      operationId: updateApplication
      parameters:
        - $ref: '#/components/parameters/OnBehalfOf'
      requestBody:
        required: true
        content:
          application/json:
            schema: { $ref: '#/components/schemas/ApplicationUpdate' }
      responses:
        '200':
          description: Updated application.
          content:
            application/json:
              schema: { $ref: '#/components/schemas/Application' }
        '4XX': { $ref: '#/components/responses/ErrorResponse' }
    delete:
      tags: [Applications]
      summary: Delete Application
      operationId: deleteApplication
      parameters:
        - $ref: '#/components/parameters/OnBehalfOf'
      responses:
        '204': { description: Deleted. }
        '4XX': { $ref: '#/components/responses/ErrorResponse' }

  /candidates/{id}/applications:
    post:
      tags: [Applications]
      summary: Add Application to Candidate
      operationId: addCandidateApplication
      parameters:
        - $ref: '#/components/parameters/Id'
        - $ref: '#/components/parameters/OnBehalfOf'
      requestBody:
        required: true
        content:
          application/json:
            schema: { $ref: '#/components/schemas/ApplicationCreate' }
      responses:
        '201':
          description: Created application.
          content:
            application/json:
              schema: { $ref: '#/components/schemas/Application' }
        '4XX': { $ref: '#/components/responses/ErrorResponse' }

  /applications/{id}/advance:
    post:
      tags: [Applications]
      summary: Advance Application
      description: Move the application to the next interview stage.
      operationId: advanceApplication
      parameters:
        - $ref: '#/components/parameters/Id'
        - $ref: '#/components/parameters/OnBehalfOf'
      responses:
        '200': { description: Advanced. }
        '4XX': { $ref: '#/components/responses/ErrorResponse' }

  /applications/{id}/move:
    post:
      tags: [Applications]
      summary: Move Application
      description: Move the application to a specific stage.
      operationId: moveApplication
      parameters:
        - $ref: '#/components/parameters/Id'
        - $ref: '#/components/parameters/OnBehalfOf'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required: [from_stage_id, to_stage_id]
              properties:
                from_stage_id: { type: integer }
                to_stage_id: { type: integer }
      responses:
        '200': { description: Moved. }
        '4XX': { $ref: '#/components/responses/ErrorResponse' }

  /applications/{id}/transfer_to_job:
    post:
      tags: [Applications]
      summary: Transfer Application To Job
      operationId: transferApplicationToJob
      parameters:
        - $ref: '#/components/parameters/Id'
        - $ref: '#/components/parameters/OnBehalfOf'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required: [new_job_id]
              properties:
                new_job_id: { type: integer }
                new_job_stage_id: { type: integer }
      responses:
        '200': { description: Transferred. }
        '4XX': { $ref: '#/components/responses/ErrorResponse' }

  /applications/{id}/convert_prospect:
    patch:
      tags: [Applications]
      summary: Convert Prospect To Candidate
      operationId: convertProspect
      parameters:
        - $ref: '#/components/parameters/Id'
        - $ref: '#/components/parameters/OnBehalfOf'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                job_id: { type: integer }
                job_stage_id: { type: integer }
      responses:
        '200': { description: Converted. }
        '4XX': { $ref: '#/components/responses/ErrorResponse' }

  /applications/{id}/attachments:
    post:
      tags: [Applications]
      summary: Add Application Attachment
      operationId: addApplicationAttachment
      parameters:
        - $ref: '#/components/parameters/Id'
        - $ref: '#/components/parameters/OnBehalfOf'
      requestBody:
        required: true
        content:
          application/json:
            schema: { $ref: '#/components/schemas/Attachment' }
      responses:
        '201': { description: Attached. }
        '4XX': { $ref: '#/components/responses/ErrorResponse' }

  /applications/{id}/hire:
    post:
      tags: [Applications]
      summary: Hire Application
      operationId: hireApplication
      parameters:
        - $ref: '#/components/parameters/Id'
        - $ref: '#/components/parameters/OnBehalfOf'
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                start_date: { type: string, format: date }
                opening_id: { type: integer }
      responses:
        '200': { description: Hired. }
        '4XX': { $ref: '#/components/responses/ErrorResponse' }

  /applications/{id}/reject:
    post:
      tags: [Applications]
      summary: Reject Application
      operationId: rejectApplication
      parameters:
        - $ref: '#/components/parameters/Id'
        - $ref: '#/components/parameters/OnBehalfOf'
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                rejection_reason_id: { type: integer }
                notes: { type: string }
      responses:
        '200': { description: Rejected. }
        '4XX': { $ref: '#/components/responses/ErrorResponse' }
    patch:
      tags: [Applications]
      summary: Update Rejection
      operationId: updateApplicationRejection
      parameters:
        - $ref: '#/components/parameters/Id'
        - $ref: '#/components/parameters/OnBehalfOf'
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                rejection_reason_id: { type: integer }
                notes: { type: string }
      responses:
        '200': { description: Updated rejection. }
        '4XX': { $ref: '#/components/responses/ErrorResponse' }

  /applications/{id}/unreject:
    post:
      tags: [Applications]
      summary: Unreject Application
      operationId: unrejectApplication
      parameters:
        - $ref: '#/components/parameters/Id'
        - $ref: '#/components/parameters/OnBehalfOf'
      responses:
        '200': { description: Unrejected. }
        '4XX': { $ref: '#/components/responses/ErrorResponse' }

  /candidates:
    get:
      tags: [Candidates]
      summary: List Candidates
      operationId: listCandidates
      parameters:
        - $ref: '#/components/parameters/Page'
        - $ref: '#/components/parameters/PerPage'
        - $ref: '#/components/parameters/CreatedAfter'
        - $ref: '#/components/parameters/CreatedBefore'
        - $ref: '#/components/parameters/UpdatedAfter'
        - $ref: '#/components/parameters/UpdatedBefore'
        - name: email
          in: query
          schema: { type: string }
      responses:
        '200':
          description: Array of candidates.
          content:
            application/json:
              schema:
                type: array
                items: { $ref: '#/components/schemas/Candidate' }
        '4XX': { $ref: '#/components/responses/ErrorResponse' }
    post:
      tags: [Candidates]
      summary: Create Candidate
      operationId: createCandidate
      parameters:
        - $ref: '#/components/parameters/OnBehalfOf'
      requestBody:
        required: true
        content:
          application/json:
            schema: { $ref: '#/components/schemas/CandidateCreate' }
      responses:
        '201':
          description: Created candidate.
          content:
            application/json:
              schema: { $ref: '#/components/schemas/Candidate' }
        '4XX': { $ref: '#/components/responses/ErrorResponse' }
    delete:
      tags: [Candidates]
      summary: Delete Candidates Bulk
      operationId: deleteCandidates
      parameters:
        - $ref: '#/components/parameters/OnBehalfOf'
      responses:
        '204': { description: Deleted. }
        '4XX': { $ref: '#/components/responses/ErrorResponse' }

  /candidates/{id}:
    parameters: [ { $ref: '#/components/parameters/Id' } ]
    get:
      tags: [Candidates]
      summary: Retrieve Candidate
      operationId: getCandidate
      responses:
        '200':
          description: A single candidate.
          content:
            application/json:
              schema: { $ref: '#/components/schemas/Candidate' }
        '4XX': { $ref: '#/components/responses/ErrorResponse' }
    patch:
      tags: [Candidates]
      summary: Update Candidate
      operationId: updateCandidate
      parameters:
        - $ref: '#/components/parameters/OnBehalfOf'
      requestBody:
        required: true
        content:
          application/json:
            schema: { $ref: '#/components/schemas/CandidateUpdate' }
      responses:
        '200':
          description: Updated.
          content:
            application/json:
              schema: { $ref: '#/components/schemas/Candidate' }
        '4XX': { $ref: '#/components/responses/ErrorResponse' }

  /candidates/{id}/attachments:
    post:
      tags: [Candidates]
      summary: Add Candidate Attachment
      operationId: addCandidateAttachment
      parameters:
        - $ref: '#/components/parameters/Id'
        - $ref: '#/components/parameters/OnBehalfOf'
      requestBody:
        required: true
        content:
          application/json:
            schema: { $ref: '#/components/schemas/Attachment' }
      responses:
        '201': { description: Attached. }
        '4XX': { $ref: '#/components/responses/ErrorResponse' }

  /candidates/{id}/notes:
    post:
      tags: [Candidates]
      summary: Add Candidate Note
      operationId: addCandidateNote
      parameters:
        - $ref: '#/components/parameters/Id'
        - $ref: '#/components/parameters/OnBehalfOf'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required: [user_id, body, visibility]
              properties:
                user_id: { type: integer }
                body: { type: string }
                visibility: { type: string, enum: [admin_only, private, public] }
      responses:
        '201': { description: Note added. }
        '4XX': { $ref: '#/components/responses/ErrorResponse' }

  /candidates/{id}/email_notes:
    post:
      tags: [Candidates]
      summary: Add Candidate Email Note
      operationId: addCandidateEmailNote
      parameters:
        - $ref: '#/components/parameters/Id'
        - $ref: '#/components/parameters/OnBehalfOf'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                user_id: { type: integer }
                to: { type: string }
                from: { type: string }
                subject: { type: string }
                body: { type: string }
      responses:
        '201': { description: Email note recorded. }
        '4XX': { $ref: '#/components/responses/ErrorResponse' }

  /candidates/{id}/education:
    post:
      tags: [Candidates]
      summary: Add Candidate Education
      operationId: addCandidateEducation
      parameters:
        - $ref: '#/components/parameters/Id'
        - $ref: '#/components/parameters/OnBehalfOf'
      requestBody:
        required: true
        content:
          application/json:
            schema: { $ref: '#/components/schemas/Education' }
      responses:
        '201': { description: Education added. }
        '4XX': { $ref: '#/components/responses/ErrorResponse' }

  /candidates/{id}/education/{education_id}:
    delete:
      tags: [Candidates]
      summary: Delete Candidate Education
      operationId: deleteCandidateEducation
      parameters:
        - $ref: '#/components/parameters/Id'
        - name: education_id
          in: path
          required: true
          schema: { type: integer }
        - $ref: '#/components/parameters/OnBehalfOf'
      responses:
        '204': { description: Deleted. }
        '4XX': { $ref: '#/components/responses/ErrorResponse' }

  /candidates/{id}/employment:
    post:
      tags: [Candidates]
      summary: Add Candidate Employment
      operationId: addCandidateEmployment
      parameters:
        - $ref: '#/components/parameters/Id'
        - $ref: '#/components/parameters/OnBehalfOf'
      requestBody:
        required: true
        content:
          application/json:
            schema: { $ref: '#/components/schemas/Employment' }
      responses:
        '201': { description: Employment added. }
        '4XX': { $ref: '#/components/responses/ErrorResponse' }

  /candidates/{id}/employment/{employment_id}:
    delete:
      tags: [Candidates]
      summary: Delete Candidate Employment
      operationId: deleteCandidateEmployment
      parameters:
        - $ref: '#/components/parameters/Id'
        - name: employment_id
          in: path
          required: true
          schema: { type: integer }
        - $ref: '#/components/parameters/OnBehalfOf'
      responses:
        '204': { description: Deleted. }
        '4XX': { $ref: '#/components/responses/ErrorResponse' }

  /candidates/{id}/prospect:
    post:
      tags: [Candidates]
      summary: Convert Candidate To Prospect
      operationId: candidateToProspect
      parameters:
        - $ref: '#/components/parameters/Id'
        - $ref: '#/components/parameters/OnBehalfOf'
      responses:
        '200': { description: Converted to prospect. }
        '4XX': { $ref: '#/components/responses/ErrorResponse' }

  /candidates/{id}/anonymize:
    put:
      tags: [Candidates]
      summary: Anonymize Candidate
      operationId: anonymizeCandidate
      parameters:
        - $ref: '#/components/parameters/Id'
        - $ref: '#/components/parameters/OnBehalfOf'
      responses:
        '200': { description: Anonymized. }
        '4XX': { $ref: '#/components/responses/ErrorResponse' }

  /candidates/{id}/merge:
    put:
      tags: [Candidates]
      summary: Merge Candidate
      operationId: mergeCandidate
      parameters:
        - $ref: '#/components/parameters/Id'
        - $ref: '#/components/parameters/OnBehalfOf'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required: [primary_candidate_id]
              properties:
                primary_candidate_id: { type: integer }
                duplicate_candidate_id: { type: integer }
      responses:
        '200': { description: Merged. }
        '4XX': { $ref: '#/components/responses/ErrorResponse' }

  /candidates/{id}/activity_feed:
    get:
      tags: [ActivityFeed]
      summary: List Candidate Activity Feed
      operationId: getCandidateActivityFeed
      parameters:
        - $ref: '#/components/parameters/Id'
      responses:
        '200':
          description: Activity feed.
          content:
            application/json:
              schema: { $ref: '#/components/schemas/ActivityFeed' }
        '4XX': { $ref: '#/components/responses/ErrorResponse' }

  /jobs:
    get:
      tags: [Jobs]
      summary: List Jobs
      operationId: listJobs
      parameters:
        - $ref: '#/components/parameters/Page'
        - $ref: '#/components/parameters/PerPage'
        - name: status
          in: query
          schema: { type: string, enum: [open, closed, draft] }
        - $ref: '#/components/parameters/UpdatedAfter'
      responses:
        '200':
          description: Array of jobs.
          content:
            application/json:
              schema:
                type: array
                items: { $ref: '#/components/schemas/Job' }
        '4XX': { $ref: '#/components/responses/ErrorResponse' }
    post:
      tags: [Jobs]
      summary: Create Job
      operationId: createJob
      parameters: [ { $ref: '#/components/parameters/OnBehalfOf' } ]
      requestBody:
        required: true
        content:
          application/json:
            schema: { $ref: '#/components/schemas/JobCreate' }
      responses:
        '201':
          description: Created.
          content:
            application/json:
              schema: { $ref: '#/components/schemas/Job' }
        '4XX': { $ref: '#/components/responses/ErrorResponse' }

  /jobs/{id}:
    parameters: [ { $ref: '#/components/parameters/Id' } ]
    get:
      tags: [Jobs]
      summary: Retrieve Job
      operationId: getJob
      responses:
        '200':
          description: A single job.
          content:
            application/json:
              schema: { $ref: '#/components/schemas/Job' }
        '4XX': { $ref: '#/components/responses/ErrorResponse' }
    patch:
      tags: [Jobs]
      summary: Update Job
      operationId: updateJob
      parameters: [ { $ref: '#/components/parameters/OnBehalfOf' } ]
      requestBody:
        required: true
        content:
          application/json:
            schema: { $ref: '#/components/schemas/JobUpdate' }
      responses:
        '200':
          description: Updated.
          content:
            application/json:
              schema: { $ref: '#/components/schemas/Job' }
        '4XX': { $ref: '#/components/responses/ErrorResponse' }

  /jobs/{id}/hiring_team:
    parameters: [ { $ref: '#/components/parameters/Id' } ]
    get:
      tags: [Jobs]
      summary: Retrieve Job Hiring Team
      operationId: getJobHiringTeam
      responses:
        '200':
          description: Hiring team.
          content:
            application/json:
              schema: { $ref: '#/components/schemas/HiringTeam' }
        '4XX': { $ref: '#/components/responses/ErrorResponse' }
    put:
      tags: [Jobs]
      summary: Replace Job Hiring Team
      operationId: replaceJobHiringTeam
      parameters: [ { $ref: '#/components/parameters/OnBehalfOf' } ]
      requestBody:
        required: true
        content:
          application/json:
            schema: { $ref: '#/components/schemas/HiringTeam' }
      responses:
        '200':
          description: Replaced.
          content:
            application/json:
              schema: { $ref: '#/components/schemas/HiringTeam' }
        '4XX': { $ref: '#/components/responses/ErrorResponse' }

  /jobs/{id}/hiring_team_members:
    post:
      tags: [Jobs]
      summary: Add Hiring Team Member
      operationId: addHiringTeamMember
      parameters:
        - $ref: '#/components/parameters/Id'
        - $ref: '#/components/parameters/OnBehalfOf'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required: [user_id, role]
              properties:
                user_id: { type: integer }
                role: { type: string, enum: [hiring_manager, recruiter, coordinator, sourcer, interviewer] }
      responses:
        '201': { description: Added. }
        '4XX': { $ref: '#/components/responses/ErrorResponse' }

  /jobs/{id}/hiring_team_members/{user_id}:
    delete:
      tags: [Jobs]
      summary: Remove Hiring Team Member
      operationId: removeHiringTeamMember
      parameters:
        - $ref: '#/components/parameters/Id'
        - name: user_id
          in: path
          required: true
          schema: { type: integer }
        - $ref: '#/components/parameters/OnBehalfOf'
      responses:
        '204': { description: Removed. }
        '4XX': { $ref: '#/components/responses/ErrorResponse' }

  /openings:
    get:
      tags: [JobOpenings]
      summary: List Openings
      operationId: listOpenings
      parameters:
        - $ref: '#/components/parameters/Page'
        - $ref: '#/components/parameters/PerPage'
      responses:
        '200':
          description: Array of openings.
          content:
            application/json:
              schema:
                type: array
                items: { $ref: '#/components/schemas/Opening' }
        '4XX': { $ref: '#/components/responses/ErrorResponse' }
    post:
      tags: [JobOpenings]
      summary: Create Opening
      operationId: createOpening
      parameters: [ { $ref: '#/components/parameters/OnBehalfOf' } ]
      requestBody:
        required: true
        content:
          application/json:
            schema: { $ref: '#/components/schemas/Opening' }
      responses:
        '201': { description: Created. }
        '4XX': { $ref: '#/components/responses/ErrorResponse' }
    delete:
      tags: [JobOpenings]
      summary: Delete Openings Bulk
      operationId: deleteOpenings
      parameters: [ { $ref: '#/components/parameters/OnBehalfOf' } ]
      responses:
        '204': { description: Deleted. }
        '4XX': { $ref: '#/components/responses/ErrorResponse' }

  /openings/{id}:
    parameters: [ { $ref: '#/components/parameters/Id' } ]
    get:
      tags: [JobOpenings]
      summary: Retrieve Opening
      operationId: getOpening
      responses:
        '200':
          description: Opening.
          content:
            application/json:
              schema: { $ref: '#/components/schemas/Opening' }
        '4XX': { $ref: '#/components/responses/ErrorResponse' }
    patch:
      tags: [JobOpenings]
      summary: Update Opening
      operationId: updateOpening
      parameters: [ { $ref: '#/components/parameters/OnBehalfOf' } ]
      requestBody:
        required: true
        content:
          application/json:
            schema: { $ref: '#/components/schemas/Opening' }
      responses:
        '200': { description: Updated. }
        '4XX': { $ref: '#/components/responses/ErrorResponse' }

  /job_posts:
    get:
      tags: [JobPosts]
      summary: List Job Posts
      operationId: listJobPosts
      parameters:
        - $ref: '#/components/parameters/Page'
        - $ref: '#/components/parameters/PerPage'
        - name: live
          in: query
          schema: { type: boolean }
        - name: active
          in: query
          schema: { type: boolean }
      responses:
        '200':
          description: Array of job posts.
          content:
            application/json:
              schema:
                type: array
                items: { $ref: '#/components/schemas/JobPost' }
        '4XX': { $ref: '#/components/responses/ErrorResponse' }

  /job_posts/{id}:
    parameters: [ { $ref: '#/components/parameters/Id' } ]
    get:
      tags: [JobPosts]
      summary: Retrieve Job Post
      operationId: getJobPost
      responses:
        '200':
          description: Job post.
          content:
            application/json:
              schema: { $ref: '#/components/schemas/JobPost' }
        '4XX': { $ref: '#/components/responses/ErrorResponse' }
    patch:
      tags: [JobPosts]
      summary: Update Job Post
      operationId: updateJobPost
      parameters: [ { $ref: '#/components/parameters/OnBehalfOf' } ]
      requestBody:
        required: true
        content:
          application/json:
            schema: { $ref: '#/components/schemas/JobPost' }
      responses:
        '200': { description: Updated. }
        '4XX': { $ref: '#/components/responses/ErrorResponse' }

  /job_posts/{id}/custom_locations:
    get:
      tags: [JobPosts]
      summary: List Job Post Custom Locations
      operationId: listJobPostCustomLocations
      parameters: [ { $ref: '#/components/parameters/Id' } ]
      responses:
        '200':
          description: Custom locations.
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  properties:
                    name: { type: string }
                    region: { type: string }
        '4XX': { $ref: '#/components/responses/ErrorResponse' }

  /job_posts/{id}/status:
    patch:
      tags: [JobPosts]
      summary: Update Job Post Status
      operationId: updateJobPostStatus
      parameters:
        - $ref: '#/components/parameters/Id'
        - $ref: '#/components/parameters/OnBehalfOf'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required: [status]
              properties:
                status: { type: string, enum: [live, offline] }
      responses:
        '200': { description: Status changed. }
        '4XX': { $ref: '#/components/responses/ErrorResponse' }

  /jobs/{job_id}/job_posts:
    get:
      tags: [JobPosts]
      summary: List Job Posts For Job
      operationId: listJobJobPosts
      parameters:
        - name: job_id
          in: path
          required: true
          schema: { type: integer }
      responses:
        '200':
          description: Job posts for a job.
          content:
            application/json:
              schema:
                type: array
                items: { $ref: '#/components/schemas/JobPost' }
        '4XX': { $ref: '#/components/responses/ErrorResponse' }

  /jobs/{job_id}/job_posts/{id}:
    get:
      tags: [JobPosts]
      summary: Retrieve Job Job Post
      operationId: getJobJobPost
      parameters:
        - name: job_id
          in: path
          required: true
          schema: { type: integer }
        - $ref: '#/components/parameters/Id'
      responses:
        '200':
          description: Job post.
          content:
            application/json:
              schema: { $ref: '#/components/schemas/JobPost' }
        '4XX': { $ref: '#/components/responses/ErrorResponse' }

  /job_stages:
    get:
      tags: [JobStages]
      summary: List Job Stages
      operationId: listJobStages
      responses:
        '200':
          description: Job stages.
          content:
            application/json:
              schema:
                type: array
                items: { $ref: '#/components/schemas/JobStage' }
        '4XX': { $ref: '#/components/responses/ErrorResponse' }

  /job_stages/{id}:
    get:
      tags: [JobStages]
      summary: Retrieve Job Stage
      operationId: getJobStage
      parameters: [ { $ref: '#/components/parameters/Id' } ]
      responses:
        '200':
          description: Job stage.
          content:
            application/json:
              schema: { $ref: '#/components/schemas/JobStage' }
        '4XX': { $ref: '#/components/responses/ErrorResponse' }

  /jobs/{job_id}/stages:
    get:
      tags: [JobStages]
      summary: List Job Stages For Job
      operationId: listJobStagesForJob
      parameters:
        - name: job_id
          in: path
          required: true
          schema: { type: integer }
      responses:
        '200':
          description: Stages.
          content:
            application/json:
              schema:
                type: array
                items: { $ref: '#/components/schemas/JobStage' }
        '4XX': { $ref: '#/components/responses/ErrorResponse' }

  /departments:
    get:
      tags: [Departments]
      summary: List Departments
      operationId: listDepartments
      responses:
        '200':
          description: Departments.
          content:
            application/json:
              schema:
                type: array
                items: { $ref: '#/components/schemas/Department' }
        '4XX': { $ref: '#/components/responses/ErrorResponse' }
    post:
      tags: [Departments]
      summary: Create Department
      operationId: createDepartment
      parameters: [ { $ref: '#/components/parameters/OnBehalfOf' } ]
      requestBody:
        required: true
        content:
          application/json:
            schema: { $ref: '#/components/schemas/Department' }
      responses:
        '201': { description: Created. }
        '4XX': { $ref: '#/components/responses/ErrorResponse' }

  /departments/{id}:
    parameters: [ { $ref: '#/components/parameters/Id' } ]
    get:
      tags: [Departments]
      summary: Retrieve Department
      operationId: getDepartment
      responses:
        '200':
          description: Department.
          content:
            application/json:
    

# --- truncated at 32 KB (71 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/greenhouse-io/refs/heads/main/openapi/greenhouse-harvest-api-openapi.yml