Offers are the formal job offers extended to a candidate's application. Each offer belongs to one application and carries a status (Created, Accepted, Rejected, or Deprecated), a proposed start date, an optional opening_id, and a custom_fields map that holds compensation components (base pay, equity, bonus, etc.) alongside any other offer custom fields configured on the hiring plan. Greenhouse versions offers — changing the start date, opening, or a version-triggering custom field creates a new offer row with an incremented version for the same application; pass current_only=true to filter the list down to the latest version per application. Filter by parent with application_ids, job_ids, candidate_ids, or opening_ids; combine status=Accepted with the resolved_at filter as a hire-date filter. Offer approvals flow through a separate approval_flow — see /v3/approval_flows for status. Offers carry private compensation data, so reading them is gated separately from the harvest:offers:list scope: when the access token includes a sub claim, the Site Admin it names must also hold the "See private notes, private fields, salary info, manage offers, request approval, and approve jobs/offers" advanced permission. Without that permission the endpoint returns an empty list rather than an error, even though the token holds the scope. Tokens issued without a sub claim act as your integration user and are not subject to it.
| Time | Status | User Agent | |
|---|---|---|---|
Retrieving recent requests… | |||