Offers

Update offer

Patch fields on an existing offer. Only the keys included in the request body are modified; omitted keys are left untouched. Updates to starts_on, opening_id (when your organization versions offers on opening changes), or version-triggering custom fields create a new offer version for the same application rather than mutating the prior row — fetch the updated offer with current_only=true to find the new current version. The date-typed created_at, sent_on, and resolved_at fields are intended for backfilling offers managed outside Greenhouse; resolved_at updates are normalized to noon UTC on the supplied date. opening_id must be an open opening on the application's job that no other unresolved offer holds, and can only be set to null when your organization doesn't require an opening on offers. custom_fields entries set values for the offer's offer custom fields (including compensation components); only fields configured on the application's hiring plan apply. Offers carry private compensation data, so writing them is gated separately from the harvest:offers:update 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, or the request is rejected with 403 Forbidden. Tokens issued without a sub claim act as your integration user and are not subject to it.

patch/v3/offers/{id}

Request

  • Base URL
    https://harvest.greenhouse.io
  • URL
    https://harvest.greenhouse.io/v3/offers/{id}
  • Auth
    • OAuth 2
      Authorization code: https://auth.greenhouse.io/authorize
      Client credentials
      Token URL: https://auth.greenhouse.io/token scopes: harvest:offers:update
    • or HTTP bearer

Path parameters

idinteger required

Request body

starts_onstring date

Candidate's proposed start date, in ISO 8601 (YYYY-MM-DD). Changing this on an existing offer typically creates a new offer version.

opening_idinteger nullable

Id of the opening this offer is for. Must be an open opening on the application's job that no other unresolved offer holds; otherwise the request fails with a 422. Send null to remove the opening, unless the organization requires an opening on offers. Changing the opening creates a new offer version when the organization is configured to version offers on opening changes. List the job's openings via GET /v3/openings?job_ids={id}&open=true.

sent_onstring date

Date the offer was sent to the candidate, in ISO 8601 (YYYY-MM-DD). Use to backfill the sent date for offers handled outside of Greenhouse.

created_atstring date

Date the offer was created, in ISO 8601 (YYYY-MM-DD). Use to backfill the original creation date for offers migrated from another system.

resolved_atstring date-time

Timestamp the offer was resolved (Accepted or Rejected), in ISO 8601. Updates are normalized to noon UTC on the date provided.

Response

Successful

idinteger
created_atstring date-time
updated_atstring date-time
versioninteger

Revision number of this offer within its application. Greenhouse creates a new offer row (incrementing version) whenever a tracked field on an existing offer changes — typically starts_on, opening_id, or a custom field configured to trigger a new version. Pair with current_only=true to filter the list endpoint down to the latest version per application.

application_idinteger

Id of the application this offer is extended on. Every offer belongs to exactly one application; the offer is voided if the application is rejected or deleted.

job_idinteger

Id of the job this offer's application is on.

candidate_idinteger

Id of the candidate (person) receiving this offer. Resolved through the offer's application.

opening_idinteger nullable

Id of the specific opening this offer is being extended for. null when the offer has not yet been linked to an opening.

status'Created' | 'Accepted' | 'Rejected' | 'Deprecated'

Lifecycle status of the offer. Created for offers still being drafted or pending approval, Accepted once the candidate accepts, Rejected if declined or withdrawn, and Deprecated for superseded prior versions (a new offer version replaces an earlier one with this status).

starts_onstring date nullable

Candidate's proposed start date, in ISO 8601 (YYYY-MM-DD). null when no start date has been set on the offer.

sent_onstring date nullable

Date the offer was sent to the candidate, in ISO 8601 (YYYY-MM-DD). null until the offer has been sent.

resolved_atstring date-time nullable

Timestamp the offer was resolved (Accepted or Rejected), in ISO 8601. Date updates submitted through PATCH /v3/offers/{id} are normalized to noon UTC on the supplied date. null while the offer is still Created or has been superseded as Deprecated without a resolution.

custom_fieldsobject nullable

Changes

No recorded changes to this operation across all 1 revision of this API.