> ## Documentation Index
> Fetch the complete documentation index at: https://www.composer.id/llms.txt
> Use this file to discover all available pages before exploring further.

# Greenhouse

> Greenhouse (ATS): the API posture, publish target and field mapping composerID publishes a decision reference through.

This page records how composerID publishes into Greenhouse: the vendor's API posture, the publish target and field mapping, and the documentation each claim rests on. It is for anyone evaluating the connection or building against it.

Greenhouse is an ATS - the recruiting system of record on the permanent-hiring channel. composerID creates the Job from a tenant-designated template with its Openings, carries the Intent ID as the queryable requisition\_id plus custom fields, and back-syncs offer and hire events through signed webhooks.

<Info>
  Category: ATS. Coverage status: Specification mapped. Vendor documentation: public developer portal.
</Info>

## Integration path

How composerID connects to this destination, at a glance.

| Step                 | Detail                                                                                                                                                                                                                      |
| -------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Authentication       | Harvest API keys over HTTP Basic (key as username, blank password), created per-integration with per-endpoint permissions in Dev Center; every write requires an On-Behalf-Of header carrying an active Greenhouse user ID. |
| composerID publishes | Job: POST /v1/jobs (template\_job\_id)                                                                                                                                                                                      |
| Intent ID lands on   | `job` `requisition_id`, written into the destination record                                                                                                                                                                 |
| Back-sync            | Webhooks: the destination pushes events; composerID verifies each delivery and lands it on the intent's timeline.                                                                                                           |

## Vendor documentation

<Columns cols={2}>
  <Card title="Harvest API v3 (latest)" icon="external-link" href="https://harvestdocs.greenhouse.io" horizontal />

  <Card title="Harvest API reference (v1/v2)" icon="external-link" href="https://developers.greenhouse.io/harvest.html" horizontal />

  <Card title="Create or update a job via Harvest" icon="external-link" href="https://support.greenhouse.io/hc/en-us/articles/360029266072-Create-or-update-a-job-with-Harvest-API" horizontal />

  <Card title="Greenhouse API overview" icon="external-link" href="https://support.greenhouse.io/hc/en-us/articles/10568627186203-Greenhouse-API-overview" horizontal />
</Columns>

## API posture

| Aspect         | Detail                                                                                                                                                                                                                                                                                                                   |
| -------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| Authentication | Harvest API keys over HTTP Basic (key as username, blank password), created per-integration with per-endpoint permissions in Dev Center; every write requires an On-Behalf-Of header carrying an active Greenhouse user ID. Harvest v3 moves to OAuth 2.0 - v1/v2 are deprecated after 31 Aug 2026, so build against v3. |
| Style          | REST, JSON (Harvest v1/v2 today, v3 latest); separate public Job Board API for published posts                                                                                                                                                                                                                           |
| Base URL       | [https://harvest.greenhouse.io/v1](https://harvest.greenhouse.io/v1)  (v2/v3 for select endpoints; v3 docs at harvestdocs.greenhouse.io)                                                                                                                                                                                 |
| Webhooks       | UI-configured (Dev Center > Web Hooks); HMAC-SHA256 Signature header with a shared secret; events incl. job created/updated, offer created/approved, candidate hired.                                                                                                                                                    |
| Events posture | Webhooks                                                                                                                                                                                                                                                                                                                 |
| Rate limits    | 50 requests per 10 seconds per key; 429 with X-RateLimit-Limit/-Remaining headers (no Retry-After - back off client-side).                                                                                                                                                                                               |
| Objects        | jobs, openings, job\_posts, candidates, applications, offers, scorecards, users, departments, offices, custom\_fields                                                                                                                                                                                                    |

## Publish target and field mapping

Each object below pairs the canonical intent fields with the destination's own fields and operations. The mapping is indicative until it is confirmed against a tenant at onboarding.

<AccordionGroup>
  <Accordion title="Job" icon="arrow-right-left" description="Create the job from a template">
    | Mapping                  | Detail                                                                                        |
    | ------------------------ | --------------------------------------------------------------------------------------------- |
    | Canonical to destination | role\_title, department, office, openings count; requisition\_id = intent\_id                 |
    | Target                   | POST /v1/jobs (template\_job\_id)                                                             |
    | Requirement              | Required                                                                                      |
    | Notes                    | requisition\_id is queryable (GET /v1/jobs?requisition\_id=...) - a natural Intent ID carrier |
  </Accordion>

  <Accordion title="Openings" icon="arrow-right-left" description="Headcount to fill">
    | Mapping                  | Detail                                        |
    | ------------------------ | --------------------------------------------- |
    | Canonical to destination | opening\_ids (per-seat), cost\_center, budget |
    | Target                   | POST /v1/jobs/\{id}/openings                  |
    | Requirement              | Required                                      |
    | Notes                    | Opening custom fields carry per-seat data     |
  </Accordion>

  <Accordion title="Custom fields + hire back-sync" icon="arrow-right-left" description="Correlate and reconcile">
    | Mapping                  | Detail                                                           |
    | ------------------------ | ---------------------------------------------------------------- |
    | Canonical to destination | intent\_id/intent\_version (custom fields); offer + hire events  |
    | Target                   | PATCH job custom\_fields (immutable field key) + signed webhooks |
    | Requirement              | Required                                                         |
    | Notes                    | candidate\_hired / offer events update the intent timeline       |
  </Accordion>
</AccordionGroup>

<Note>
  Harvest keys are provisioned per integration with granular endpoint permissions - request only what publishing needs, and route writes On-Behalf-Of a real (integration system) user for audit attribution. Job creation copies a tenant-designated template job (scorecards and hiring teams cannot be set via API), and custom job field values need a follow-up PATCH. Sandbox and production have different object IDs and keys. Harvest v1/v2 sunset after 31 Aug 2026 - target v3 (OAuth 2.0).
</Note>

## Next steps

<Columns cols={3}>
  <Card title="How composerID connects" icon="plug-zap" href="/guides/connect">
    The five ways composerID reaches a destination, and the minimum a destination must offer.
  </Card>

  <Card title="Publishing" icon="send" href="/concepts/publishing">
    Plan, preflight and publish: how a decision becomes a valid record in a destination.
  </Card>

  <Card title="All destinations" icon="plug" href="/destinations">
    Every destination composerID documents, with its category and coverage status.
  </Card>
</Columns>
