NAV
json

Introduction

What is a webhook?

A webhook is a simple event-notification system. When an event occurs in Greenhouse, a payload of JSON data containing information about the event is sent via POST to a specified endpoint URL over HTTPS.

Each delivery will include a Greenhouse-Event-ID header. This will contain an unique id associated with this delivery.

Creating a webhook

Webhooks have three components. A name, an endpoint URL, and a secret key.

Advanced settings

Advanced settings allow customers with certain other security needs to use webhooks for their system. In most cases, users will not need to configure these.

Authentication

Signature: sha256 37d2725109df92747ffcee59833a1d1262d74b9703fa1234c789407218b4a4ef

To compute the HMAC digest in Ruby:

digest = OpenSSL::Digest.new('sha256')
signature = OpenSSL::HMAC.hexdigest(digest, secret_key, body)

To compute the HMAC digest in PHP:

<?php
  // Requires PHP >= 5.1.2 and PECL hash >= 1.1
  $signature = hash_hmac('sha256', $body, $secret_key);
?>

The body variable in the above code samples refers to the entire content of the JSON response. Not just the payload attribute.

Greenhouse uses a digital signature which is generated using the secret key entered when creating a webhook and the body of the webhook's request. This data is contained within the Signature header.

The header contains: the SHA algorithm used to generate the signature, a space, and the signature. To verify the request came from Greenhouse, compute the HMAC digest using your secret key and the body and compare it to the signature portion (after the space) contained in the header. If they match, you can be sure the webhook was sent from Greenhouse.

Important note on Unicode: Greenhouse will escape Unicode characters when they are encoded as JSON before computing the signature. For example, if the job post content is <p>hello</p>, the webhook body will represent it as \u003cp\u003ehello\u003c/p\u003e. When we compute the signature, we use the string exactly as it appears in the body, including the escaped unicode. Be sure to duplicate this process on the receiving end so the signatures match.

Common Attributes

Currently, Webhooks for all event types include these common attributes:

Attribute Note
application.id Unique Greenhouse identifier of the application. Information not included in the webhook can be retrieved via Harvest API - GET Applications
application.credited_to If populated and a Greenhouse user, the user's Greenhouse ID, e-mail address, and Employee ID (if available) will be provided. If populated and not a Greenhouse user, just the name will be provided.
application.status One of: rejected, hired, active
application.candidate.id Unique Greenhouse identifier of the candidate. Information not included in the webhook can be retrieved via Harvest API - GET Candidates
application.candidate.phone_numbers[].type One of: home, work, mobile, skype, other
application.candidate.addresses[].type Application Candidate Addresses Type
application.candidate.email_addresses[].type One of: personal, work, other
application.candidate.attachments[].type One of: cover_letter, offer_packet, resume, take_home_test, offer_letter, signed_offer_letter

Note: Attachments expire in 7 days.
application.candidate.external_id An arbitrary ID provided by an external source; does not map to another entity in Greenhouse.
application.prospect If true, this is a prospect application which means that the associated person is a prospect and has not yet applied for this job. (Only prospects will have non-null values for prospect_owner, prospect_pool, or prospect_stage under prospect_detail)
application.prospect_detail.prospect_owner The user responsible for keeping track of the prospect. Either null or a user's id and name
application.prospect_detail.prospect_pool The current prospect pool of a prospect. Either null or a pool's id and name
application.prospect_detail.prospect_stage The current prospect stage of a prospect. Either null or a stage's id and name
application.jobs[] Candidates will have one job. Prospects will have 0 or more jobs.
application.jobs[].id Unique Greenhouse identifier of the job. Information not included in the webhook can be retrieved via Harvest API - GET Jobs
application.jobs[].requisition_id An arbitrary ID provided by an external source; does not map to another entity in Greenhouse.
application.opening.opening_id This is an external opening id that may be defined for an HRIS system. This does not reference anything else in Greenhouse and may be blank.
custom_fields Contains a hash map/associative array. The key of the hash map is an immutable key; which is an underscore-slugged version of the custom field's name at creation time. The exported properties reflect the active values of the custom field at the time of the export. All custom fields, public and private, will be exported. If a field exists but does not have a value, it will be exported with a value of null for singular values and empty arrays for multiple values. Important Note: If a custom field is created with the name Salary the key will be salary. If later the name of this custom field is changed to Wage or Bonus, the key will remain salary.
custom_fields[].type One of: short_text, long_text, boolean, single_select, multi_select, currency, currency_range, number, number_range, date, url, or user.

Custom Fields

    {
        "custom_fields": {
            "short_text_field": {
                "name": "Short Text Field",
                "type": "short_text",
                "value": "A text string with fewer than 255 characters."
            },
            "long_text_field": {
                "name": "Long Text Field",
                "type": "long_text",
                "value": "A text string of any length."
            },
            "boolean_field": {
                "name": "Boolean Field",
                "type": "boolean",
                "value": true (or false)
            },
            "single_select": {
                "name": "Single Select Field",
                "type": "single_select",
                "value": "The text of selected custom field option."
            },
            "multi_select": {
                "name": "Multi Select Field",
                "type": "multi_select",
                "value": [
                    "An array containing the text of",
                    "all the selected",
                    "custom field options"
                ]
            },
            "currency_field": {
                "name": "Currency Field",
                "type": "currency",
                "value": {
                    "amount": 80000,
                    "unit": "USD"
                }
            },
            "compensation_field": {
                "name": "Compensation Field",
                "type": "currency",
                "value": {
                    "amount": 80000,
                    "unit": "USD"
                },
                "compensation_type": "base",
                "frequency": "annually",
                "rationale": "base rationale"
            },
            "currency_range_field": {
                "name": "Currency Range Field",
                "type": "currency_range",
                "value": {
                    "min_value": 80000,
                    "max_value": 150000,
                    "unit": "USD"
                }
            },
            "number_field": {
                "name": "Number Field",
                "type": "number",
                "value": 125
            },
            "number_range_field": {
                "name": "Number Range Field",
                "type": "number_range",
                "value": {
                    "min_value": 80000,
                    "max_value": 150000
                }
            },
            "date_field": {
                "name": "Date Field",
                "type": "date",
                "value": "YYYY-MM-DD"
            },
            "url_field": {
                "name": "URL Field",
                "type": "url",
                "value": "https://www.thisisjustatextvalue.com"
            },
            "user_field": {
                "name": "User Field",
                "type": "user",
                "value": {
                    "user_id": 94354,
                    "name": "Ben Smith",
                    "email": "ben@example.com",
                    "employee_id": "bs0615"
                }
            }
        }
    }

Custom fields may be attached to several objects within the Greenhouse Recruiting system. These fields may appear on candidates, applications, offers, and other objects in the system. These fields share several properties and are always indicated in webhooks by the "custom_fields" element. However, the "value" attribute of custom fields are different depending on the "type" attribute, so you must check the "type" attribute in order to predict what will be included in the value "attribute". As described in the previous section, the type attribute will be one of short_text, long_text, boolean, single_select, multi_select, currency, currency_range, number, number_range, date, url, or user. An example of each of these fields' expected value format are provided.

Compensation Field is a special type of currency custom field. If a currency field is marked as a compensation field, three additional fields will be included: compensation_type, rationale, frequency

Disabled webhooks

If a webhook is disabled, it will not trigger when the event occurs. Webhooks become disabled automatically if a ping event fails on create or update. They need to be manually re-enabled if this occurs.

Retry policy

In the event of a failed webhook request (due to timeout, a non HTTP 200 response, or network issues), Greenhouse will attempt a maximum of 6 retries according to the formula on the right:

This formula increases the amount of time between each retry, while assigning a random number of seconds to avoid consistent failures from overload or contention.

Greenhouse will attempt 6 retries over the course of 15 hours.

RETRY_DELAY_MINUTES = [1, 15, 60, 120, 240, 480]

sidekiq_retry_in do |index, _exception|
  seconds_delay = (RETRY_DELAY_MINUTES[index] || RETRY_DELAY_MINUTES.last) * 60
  offset = rand(30) * (index + 1)

  seconds_delay + offset
end

The table below outlines the estimated wait time for each retry request, assuming that rand(30) always returns 0.

Retry number Next Retry in Total waiting time
1 1m 0h 1m
2 15m 0h 16m
3 60m 1h 16m
4 120m 3h 16m
5 240m 7h 16m
6 480m 15h 16m

Application Events

Application created

{
  "action": "new_candidate_application",
  "payload": {
    "application": {
      "id": 71980812,
      "rejected_at": null,
      "prospect": false,
      "status": "active",
      "applied_at": "2017-10-27T14:44:43Z",
      "last_activity_at": "2017-10-27T14:44:42Z",
      "url": "http://app.greenhouse.io/people/60304594?application_id=71980812",
      "source": {
        "id": 16,
        "name": "LinkedIn (Prospecting)"
      },
      "credited_to": {
        "id": 92120,
        "email": "test123@example.com",
        "name": "Greenhouse Admin",
        "employee_id": "123ABC"
      },
      "rejection_reason": null,
      "rejection_details": null,
      "current_stage": {
        "id": 2944102,
        "name": "Preliminary Phone Screen",
        "interviews": [
          {
            "id": 4368004,
            "name": "Preliminary Screening Call",
            "status": "to_be_scheduled",
            "interview_kit": {
              "url": "http://app.greenhouse.io/guides/4368142/people/60304594?application_id=71980812",
              "content": "<p>Directions on how to conduct this interview.</p>",
              "questions": [
                {
                  "id": 3136352,
                  "question": "Could you tell me about your previous experience?"
                },
                {
                  "id": 3136353,
                  "question": "Why do you want to work with us?"
                }
              ]
            },
            "interviewers": []
          }
        ]
      },
      "prospect_detail": {
        "prospect_pool": null,
        "prospect_stage": null,
        "prospect_owner": null
      },
      "custom_fields": {
        "application_custom_test": {
          "name": "Application Custom Test",
          "type": "single_select",
          "value": null
        },
        "custom_boolean_test": {
          "name": "Custom Boolean Test",
          "type": "boolean",
          "value": null
        }
      },
      "candidate": {
        "id": 60304594,
        "first_name": "Jane",
        "last_name": "Smith",
        "title": "Manager",
        "company": "Current Company Co.",
        "created_at": "2017-10-27T14:44:42Z",
        "external_id": null,
        "photo_url": null,
        "url": "http://app.greenhouse.io/people/60304594",
        "is_private": false,
        "can_email": true,
        "phone_numbers": [
          {
            "value": "555-555-5555",
            "type": "mobile"
          }
        ],
        "email_addresses": [
          {
            "value": "person@work.com",
            "type": "work"
          },
          {
            "value": "person@example.com",
            "type": "personal"
          }
        ],
        "addresses": [
          {
            "value": "123 Test Street\nNew York, NY 10001",
            "type": "home"
          }
        ],
        "website_addresses": [
          {
            "value": "mysite.com",
            "type": "personal"
          }
        ],
        "social_media_addresses": [
          {
            "value": "socialmedia.com"
          }
        ],
        "educations": [
          {
            "school_name": "Stanford University",
            "degree": "Bachelor's Degree",
            "discipline": "Computer Science",
            "start_date": "09/15/2007",
            "end_date": "05/15/2011"
          }
        ],
        "employments": [],
        "recruiter": {
          "id": 92121,
          "email": "employee@test.com",
          "name": "Betty Smith",
          "employee_id": "123ABC"
        },
        "coordinator": {
          "id": 92427,
          "email": "user@example.com",
          "name": "Bonnie Bonnet",
          "employee_id": "456DEF"
        },
        "attachments": [
          {
            "filename": "Test Cover Letter.docx",
            "url": "https://prod-heroku.s3.amazonaws.com/...",
            "type": "cover_letter"
          },
          {
            "filename": "Test Resume.docx",
            "url": "https://prod-heroku.s3.amazonaws.com/...",
            "type": "resume"
          }
        ],
        "tags": [
          "Ruby",
          "Comp Sci"
        ],
        "custom_fields": {
          "date_test": {
            "name": "Date Test",
            "type": "date",
            "value": ""
          },
          "desired_salary": {
            "name": "Desired Salary",
            "type": "short_text",
            "value": null
          },
          "graduation_year_1": {
            "name": "Graduation Year",
            "type": "single_select",
            "value": null
          },
          "work_remotely": {
            "name": "Work Remotely",
            "type": "boolean",
            "value": null
          }
        }
      },
      "jobs": [
        {
          "id": 274075,
          "name": "Data Scientist",
          "requisition_id": "ABC",
          "notes": null,
          "confidential": false,
          "job_post_id": 263533,
          "status": "open",
          "created_by_id": 273555,
          "created_at": "2016-07-14T17:21:30Z",
          "opened_at": "2016-07-20T16:00:00Z",
          "closed_at": null,
          "url": "http://app.greenhouse.io/sdash/274075",
          "departments": [
            {
              "id": 8717,
              "name": "Data Science",
              "external_id": "ex-dept-1"
            }
          ],
          "offices": [
            {
              "id": 16478,
              "name": "London",
              "location": "London, United Kingdom",
              "external_id": "ex-office-1"
            }
          ],
          "hiring_team": {
            "hiring_managers": [
              {
                "user_id": 92913,
                "employee_id": "123ABC"
              }
            ],
            "sourcers": [
              {
                  "user_id": 92427,
                "employee_id": null
              }
            ],
            "recruiters":  [
              {
                  "user_id": 92427,
                "employee_id": null
              }
            ],
            "coordinators": [
              {
                "user_id": 92427,
                "employee_id": "DEFG123"
              }
            ]
          },
          "custom_fields": {
            "date_test": {
              "name": "Date Test",
              "type": "date",
              "value": "2017-10-27"
            },
            "employment_type": {
              "name": "Employment",
              "type": "single_select",
              "value": "Full-time"
            },
            "replacement_role_": {
              "name": "Replacement Role",
              "type": "boolean",
              "value": true
            },
            "salary_range_2": {
              "name": "Salary Range",
              "type": "currency_range",
              "value": {
                "unit": null,
                "min_value": "10000.0",
                "max_value": "10000.0"
              }
            },
            "test_field_1": {
              "name": "Test Short Text Field",
              "type": "short_text",
              "value": "test"
            },
            "test_user_field": {
              "name": "Test User Field",
              "type": "user",
              "value": {
                "user_id": 117730,
                "name": "Job Admin",
                "email": "asegal+jobadmin@greenhouse.io",
                "employee_id": "user-abc"
              }
            }
          }
        }
      ]
    }
  }
}

The New Candidate Application event occurs when a new application is created for a candidate.

See webhook common attributes.

Application deleted

This webhook only fires when individual applications are destroyed. This occurs when the Harvest API delete endpoint is used, when a candidate is removed from a specific job, or when two duplicate candidates on the same job are merged together. This will not fire when a candidate is deleted. A candidate being deleted implies all their applications have been deleted with them.

{
  "action": "delete_application",
  "payload": {
    "application": {
        "id": 46194062,
        "candidate_id": 37031511,
        "job_id": 371417,
        "created_at": "2013-03-22T00:00:00Z",
        "source_id": 2,
        "candidate_rejection_reason_id": null,
        "rejection_note_id": 123,
        "rejected_at": "2014-04-22T01:00:00Z",
        "referrer_id": 158104,
        "prospect": false,
        "rejected_by_user_id": 158103
        }
    }
}

Noteworthy response attributes

Attribute Note
rejected_by_user_id The Greenhouse user who rejected this application, if the application is rejected.

Application updated

{
  "action": "application_updated",
  "payload": {
    "application": {
      "id": 22202940,
      "rejected_at": null,
      "prospect": false,
      "prospect_detail": {
        "prospect_owner": null,
        "prospect_pool": null,
        "prospect_stage": null
      },
      "status": "active",
      "applied_at": "2015-12-03T06:31:26Z",
      "last_activity_at": "2015-12-03T06:31:26Z",
      "url": "https://app.greenhouse.io/people/13857579?application_id=22202940",
      "source": {
        "id":2,
        "name": "Jobs page on your website"
      },
      "credited_to": {
        "id": 3695,
        "email": "beauregard.blacksmith.3695@example.com",
        "name": "Beauregard Blacksmith",
        "employee_id": "123ABC"
      },
      "rejection_reason": null,
      "rejection_details": null,
      "current_stage": {
        "id": 711020,
        "name": "Application Review",
        "interviews": [
          {
            "id": 1063685,
            "name": "Application Review",
            "status": "collect_feedback",
            "interview_kit": {
              "url": "http://app.greenhouse.io/guides/1063859/people/13857579",
              "content": "",
              "questions":[]
            },
            "interviewers": []
          }
        ]
      },
      "custom_fields": {
        "custom_application_field": {
          "name": "Custom Application Field",
          "type": "short_text",
          "value": "Example"
        }
      },
      "candidate": {
        "id": 13857579,
        "first_name": "Hank",
        "last_name": "Von Diablo",
        "title": null,
        "company": null,
        "created_at": "2015-12-03T06:31:26Z",
        "external_id": null,
        "photo_url": null,
        "url": "https://app.greenhouse.io/people/13857579",
        "is_private": false,
        "can_email": true,
        "phone_numbers": [
          {
            "value": "330-281-8004",
            "type": "other "
          }
        ],
        "email_addresses": [
          {
            "value": "hank.von diablo.13857579@example.com",
            "type": "personal"
          }
        ],
        "addresses": [],
        "website_addresses": [
          {
            "value": "http://www.example.com/",
            "type": "other"
          }
        ],
        "social_media_addresses": [
          {
            "value": "https://twitter.com/TheRock"
          }
        ],
        "educations": [],
        "recruiter":null,
        "coordinator": null,
        "attachments":[],
        "tags":[],
        "custom_fields": {
          "current_salary": {
            "name": "Current Salary",
            "type": "short_text",
            "value": null
          },
          "desired_salary": {
            "name": "Desired Salary",
            "type": "short_text",
            "value":null
          }
        }
      },
      "jobs": []
    }
  }
}


The Application Updated event occurs when an application is updated.

See webhook common attributes.

Offer created

This webhook fires when creating a new offer in Greenhouse. This may also fire when changing an offer if the change causes a new version to be created. When bulk creating offers, this will fire per offer created.

{
    "action": "offer_created",
    "payload": {
        "id": 12345,
        "application_id": 234556,
        "job_id": 45678,
        "user_id": 67890,
        "version": 1,
        "sent_on": "2013-03-22",
        "resolved_at": "2013-03-25T00:00:00Z",
        "start_date": "04/15/2013",
        "notes": "Vacation scheduled 4/20 - 4/23",
        "offer_status": "Accepted",
        "custom_fields": {
            "custom_application_field": {
                "name": "Custom Application Field",
                "type": "short_text",
                "value": "Example"
            }
        }
    }
}

Offer approved

This webhook fires when an offer requires approval and the approval is received.

{
    "action": "offer_approved",
    "payload": {
        "id": 12345,
        "application_id": 234556,
        "job_id": 45678,
        "user_id": 67890,
        "version": 1,
        "sent_on": "2013-03-22",
        "resolved_at": "2013-03-25T00:00:00Z",
        "start_date": "04/15/2013",
        "notes": "Vacation scheduled 4/20 - 4/23",
        "offer_status": "Accepted",
        "custom_fields": {
            "custom_application_field": {
                "name": "Custom Application Field",
                "type": "short_text",
                "value": "Example"
            }
        }
    }
}

Offer updated

This webhook fires when an offer is updated. In some cases, an offer may be changed without generating a new version. In that case, this will fire by itself. If a change causes a new offer version to be generated, this will fire on the old version with the update to deprecate this offer and also a new "create" webhook will fire for the new version. This webhook should also fire when a person is hired, which marks the offer as "accepted."

{
    "action": "offer_updated",
    "payload": {
        "id": 12345,
        "application_id": 234556,
        "job_id": 45678,
        "user_id": 67890,
        "version": 2,
        "sent_on": "2013-03-22",
        "resolved_at": "2013-03-25T00:00:00Z",
        "start_date": "04/15/2013",
        "notes": "Vacation scheduled 4/20 - 4/23",
        "offer_status": "Deprecated",
        "custom_fields": {
            "custom_application_field": {
                "name": "Custom Application Field",
                "type": "short_text",
                "value": "Example"
            }
        }
    }
}

Offer deleted

This webhook only fires when offers are deleted from the Greenhouse system. This only happens when the "Delete" link is clicked on an individual offer or when the anonymize candidate process is run with the "all_offer_versions" option selected. This will not fire individually when an application is deleted.

{
  "action": "offer_deleted",
  "payload": {
    "offer": {
      "id": 506406,
      "application_id": 46194062,
      "offering_user_id": 158104,
      "offer_status": "Created",
      "version": 1,
      "sent_on": "2013-03-22",
      "resolved_at": "2013-03-25T00:00:00Z",
      "notes": "These are notes on the offer.",
      "job_id": 371417
  }
}

Noteworthy response attributes

Attribute Note
offer_status One of Created, Accepted, Rejected, or Deprecated.
version This is the version of the offer in Greenhouse. New versions are triggered when certain fields are updated.
sent_on When the offer was sent to the candidate
resolved_at When this version was either accepted, rejected, or deprecated (a new version was made)

Prospect created

{
  "action": "new_prospect_application",
  "payload": {
    "application": {
      "id": 979554,
      "rejected_at": null,
      "prospect": true,
      "status": "active",
      "applied_at": "2014-12-02T23:10:16Z",
      "last_activity_at": "2014-12-02T23:10:16Z",
      "url": "https://app.greenhouse.io/people/968190?application_id=979554",
      "source": {
        "id": 13,
        "public_name": "Referral"
      },
      "credited_to": {
        "id": 2622,
        "email": "carl.buddha.2622@example.com",
        "name": "Carl Buddha",
        "employee_id": "123ABC"
      },
      "rejection_reason": null,
      "rejection_details": null,
      "current_stage": null,
      "custom_fields": {
        "custom_application_field": {
          "name": "Custom Application Field",
          "type": "short_text",
          "value": null
        }
      },
      "candidate": {
        "id": 968190,
        "first_name": "Trisha",
        "last_name": "Troy",
        "title": null,
        "company": null,
        "created_at": "2014-12-02T23:10:16Z",
        "external_id": null,
        "photo_url": null,
        "is_private": false,
        "can_email": true,
        "phone_numbers": [
          {
            "value": "123456",
            "type": "other"
          }
        ],
        "email_addresses": [
          {
            "value": "t.troy@example.com",
            "type": "personal"
          }
        ],
        "addresses": [],
        "website_addresses": [],
        "social_media_addresses": [],
        "educations": [
          {
            "school_name": "Harvard University",
            "degree": "Bachelor's Degree",
            "discipline": "Information Systems",
            "start_date": "01/01/2012",
            "end_date": "01/01/2016"
          }
        ],
        "employments": [
          {
            "company_name": "Greenhouse",
            "title": "Engineer",
            "start_date": "01/01/2012",
            "end_date": "01/01/2016"
          }
        ],
        "recruiter": {
          "id": 3128,
          "email": "alicia.flopple.3128@example.com",
          "name": "Alicia Flopple",
          "employee_id": "456DEF"
        },
        "coordinator": null,
        "attachments": [
          {
            "filename": "resume.pdf",
            "url": "https://prod-heroku.s3.amazonaws.com/...",
            "type": "resume"
          }
        ],
        "tags": [
          "Import from Previous ATS"
        ],
        "custom_fields": {
          "favorite_color": {
            "name": "Favorite Color",
            "type": "short_text",
            "value": "Blue"
          }
        }
      },
      "jobs": [
        {
          "id": 371417,
          "name": "Designer",
          "requisition_id": null,
          "notes": "Digital and print",
          "confidential": false,
          "job_post_id": 54321,
          "status": "open",
          "created_by_id": 273555,
          "created_at": "2013-10-02T22:59:29Z",
          "opened_at": "2015-01-23T00:25:04Z",
          "closed_at": null,
          "departments": [
            {
              "id": 237,
              "name": "Community",
              "external_id": "ex-dept-1"
            }
          ],
          "offices": [
            {
              "id": 54,
              "name": "New York",
              "location": "New York, NY",
              "external_id": "ex-office-1"
            }
          ],
          "custom_fields": {
            "employment_type": {
              "name": "Employment Type",
              "type": "single_select",
              "value": "Full Time"
            }
          }
        }
      ]
    }
  }
}

The New Prospect Application event occurs when a new prospect application is created.

See webhook common attributes.

Candidate Events

Candidate deleted

This webhook will fire when a candidate or prospect is deleted from Greenhouse. This occurs when the Harvest delete candidate methods are used, when a candidate is merged into another candidate, when a candidate is deleted in the application, and once for each candidate in a bulk delete operation. Deleting a candidate will cause other deletes within Greenhouse but we will not fire an individual webhook for those deletions. In the case of the applications that this delete causes, we will include an array of those Application IDs that will be removed from Greenhouse.

{
  "action": "delete_candidate",
  "payload": {
    "person": {
        "id": 37031511,
        "first_name": "Jack",
        "last_name": "Sparrow",
        "company": "Pirate Shipping",
        "title": "Captain",
        "created_at": "2013-03-22T00:00:00Z",
        "headline": "Eager to find a new commission",
        "is_private": false,
        "recruiter_user_id": 123,
        "coordinator_user_id": 456,
        "can_email": false,
        "deleted_application_ids": [
                46196263,
                46196258
            ]
        }
    }
}

Noteworthy response attributes

Attribute Note
is_private True or false; if this candidate has been marked private in Greenhouse.
recruiter_user_id The Greenhouse user_id of this candidate's recruiter
coordinator_user_id The Greenhouse user_id of this candidate's coordinator
can_email True or false; if this candidate can be e-mailed.
application_ids This is an array containing the Greenhouse application IDs that will be deleted as a consequence of this candidate being deleted
deleted_application_ids In many merge cases, this section will be blank, as applications will have been merged into the new candidate.

Candidate hired

{
  "action": "hire_candidate",
  "payload": {
    "application": {
      "id": 46194062,
      "opening": {
        "opening_id": "1234-56",
        "custom_fields": []
      },
      "credited_to": {
        "id": 158104,
        "email": "bob_johnson1@localhost.com",
        "name": "Robert Johnson",
        "employee_id": "123ABC"
      },
      "source": {
        "id": 25,
        "public_name": "Monster"
      },
      "url": "https://app.greenhouse.io/people/35897443?application_id=46194062",
      "candidate": {
        "id": 35897443,
        "first_name": "Johnny",
        "last_name": "Smith",
        "title": "Previous Title",
        "external_id": "12345",
        "url": "https://app.greenhouse.io/people/35897443",
        "is_private": false,
        "can_email": true,
        "phone_numbers": [
          {
            "value": "518-555-1212",
            "type": "work"
          },
          {
            "value": "212-555-1212",
            "type": "home"
          }
        ],
        "email_addresses": [
          {
            "value": "personal@example.com",
            "type": "personal"
          },
          {
            "value": "work@example.com",
            "type": "work"
          }
        ],
        "addresses": [
          {
            "value": "455 Broadway New York, NY 10280",
            "type": "home"
          }
        ],
        "educations": [
          {
            "school_name": "Harvard University",
            "degree": "Bachelor's Degree",
            "discipline": "Information Systems",
            "start_date": "01/01/2012",
            "end_date": "01/01/2016"
          }
        ],
        "employments": [
          {
            "company_name": "Greenhouse",
            "title": "Engineer",
            "start_date": "01/01/2012",
            "end_date": "01/01/2016"
          }
        ],
        "recruiter": {
          "id": 55,
          "email": "bob_johnson@localhost.com",
          "name": "Bob Johnson",
          "employee_id": "456DEF"
        },
        "coordinator": {
          "id": 56,
          "email": "bob_johnson_approver1@localhost.com",
          "name": "Robert J Approver",
          "employee_id": "789GHI"
        },
        "attachments": [
          {
            "filename": "resume.pdf",
            "url": "https://prod-heroku.s3.amazonaws.com/...",
            "type": "resume"
          }
        ],
        "custom_fields": {
          "desired_level": {
            "name": "Desired Level",
            "type": "short_text",
            "value": "Senior"
          },
          "favorite_programming_language": {
            "name": "Favorite Programming Language",
            "type": "short_text",
            "value": "Rails"
          }
        }
      },
      "job": {
        "id": 323753,
        "name": "Developer",
        "open_date": "2014-11-20T22:49:14Z",
        "close_date": "2014-11-25T22:49:14Z",
        "requisition_id": null,
        "departments": [
          {
            "id": 7,
            "name": "Technology",
            "external_id": "ex-dept-1"
          }
        ],
        "offices": [
          {
            "id": 13,
            "name": "New York City",
            "location": "New York, NY",
            "external_id": "ex-office-1"
          },
          {
            "id": 14,
            "name": "St. Louis",
            "location": null,
            "external_id": null
          }
        ],
        "custom_fields": {
          "approved": {
            "name": "Approved",
            "type": "boolean",
            "value": true
          },
          "employment_type": {
            "name": "Employment Type",
            "type": "single_select",
            "value": "Full-time"
          },
          "salary_range": {
            "name": "SalaryRange",
            "type": "currency_range",
            "value": {
              "unit": "USD",
              "min_value": "10000.0",
              "max_value": "20000.0"
            }
          }
        }
      },
      "jobs": [
        {
          "id": 323753,
          "name": "Developer",
          "requisition_id": null,
          "confidential": false,
          "opened_at": "2014-11-20T22:49:14Z",
          "closed_at": "2014-11-25T22:49:14Z",
          "departments": [
            {
              "id": 7,
              "name": "Technology",
              "external_id": "ex-dept-1"
            }
          ],
          "offices": [
            {
              "id": 13,
              "name": "New York City",
              "location": "New York, NY",
              "external_id": "ex-office-1"
            },
            {
              "id": 14,
              "name": "St. Louis",
              "location": null,
              "external_id": null
            }
          ],
          "custom_fields": {
            "approved": {
              "name": "Approved",
              "type": "boolean",
              "value": true
            },
            "employment_type": {
              "name": "Employment Type",
              "type": "single_select",
              "value": "Full-time"
            },
            "salary_range": {
              "name": "SalaryRange",
              "type": "currency_range",
              "value": {
                "unit": "USD",
                "min_value": "10000.0",
                "max_value": "20000.0"
              }
            }
          }
        }
      ],
      "custom_fields": {
        "custom_application_field": {
          "name": "Custom Application Field",
          "type": "short_text",
          "value": "Example123"
        }
      },
      "offer": {
        "id": 506409,
        "version": 2,
        "created_at": "2014-11-20T22:49:14Z",
        "sent_at": "2014-11-10",
        "resolved_at": "2014-11-20T22:49:14Z",
        "starts_at": "2015-01-23",
        "custom_fields": {
          "salary": {
            "name": "Salary",
            "type": "currency",
            "value": {
              "amount": 80000,
              "unit": "USD"
            }
          },
          "seasons": {
            "name": "Seasons",
            "type": "multi_select",
            "value": [
              "Season 1",
              "Season 2"
            ]
          }
        }
      }
    }
  }
}

The Hire Candidate event occurs when an offer is accepted. This is triggered by clicking the "Accept Offer" button on the candidate's Private tab.

Noteworthy attributes

See webhook common attributes.

Attribute Note
application.offer.id Unique Greenhouse identifier of the offer. Information not included in the webhook can be retrieved via Harvest API - GET Offers
application.offer.created_at Date when this offer was drafted.
application.offer.sent_on Date when this offer was sent to the candidate.
application.offer.resolved_at Date the offer was accepted.
application.offer.starts_at The candidate's start date. Expected format is YYYY-MM-DD
application.job Deprecated. Use application.jobs[] instead
application.job.close_date Deprecated. Use application.jobs[].closed_at instead.
application.job.open_date Deprecated. Use application.jobs[].opened_at instead.
application.opening.custom_fields This element may be omitted if the organization does not have custom fields for openings enabled.

Candidate merged

This webhook will fire when a candidate or prospect is merged with another candidate. This process should fire for regular manual merges and auto-merges. It will also fire per candidate for a bulk merge. This webhook supersedes the candidate deleted webhook. If both candidate deleted and candidate merged are configured on your site, only the candidate merged webhook will fire when candidate records are removed via merge. If a candidate deleted webhook is configured but candidate merged is not, then the candidate deleted webhook will fire when a candidate record is deleted via merge. The payload for a candidate merged webhook matches the payload for candidate deleted except it contains the ID of the winning candidate record.

{
  "action": "merge_candidate",
  "payload": {
    "person": {
        "id": 37031511,
        "first_name": "Jack",
        "last_name": "Sparrow",
        "company": "Pirate Shipping",
        "title": "Captain",
        "created_at": "2013-03-22T00:00:00Z",
        "headline": "Eager to find a new commission",
        "is_private": false,
        "recruiter_user_id": 123,
        "coordinator_user_id": 456,
        "can_email": false,
        "new_candidate_id": 457456
    }
  }
}

Noteworthy response attributes

Attribute Note
new_candidate_id The ID of the candidate to whom this candidate has been merged

Candidate stage change

{
  "action": "candidate_stage_change",
  "payload": {
    "application": {
      "id": 265277,
      "rejected_at": null,
      "prospect": false,
      "status": "active",
      "applied_at": "2013-03-22T00:00:00Z",
      "last_activity_at": "2015-02-09T16:38:36Z",
      "url": "https://app.greenhouse.io/people/265772?application_id= 265277",
      "source": {
        "id": 31,
        "name": "Agency"
      },
      "credited_to": {
        "id": 15,
        "email": "ada@example.com",
        "name": "Ada Lacey",
        "employee_id": "123ABC"
      },
      "rejection_reason": null,
      "rejection_details": null,
      "current_stage": {
        "id": 71416,
        "name": "Assessment",
        "interviews": [
          {
            "id": 113101,
            "name": "Assessment",
            "status": "to_be_scheduled",
            "interview_kit": {
              "url": "https://app.greenhouse.io/guides/113153/people/265772",
              "content": "Assess their skills",
              "questions": []
            },
            "interviewers": [
              {
                "id": 2622,
                "display_name": "Carl Buddha",
                "status": "tentative"
              }
            ]
          }
        ]
      },
      "custom_fields": {
        "custom_application_field": {
          "name": "Custom Application Field",
          "type": "short_text",
          "value": "Example"
        }
      },
      "candidate": {
        "id": 265772,
        "first_name": "Giuseppe",
        "last_name": "Hurley",
        "title": "Great Person",
        "company": null,
        "created_at": "2013-10-04T01:24:44Z",
        "external_id": "241b399ce4b0fd1c84e5528d",
        "photo_url": null,
        "url": "https://app.greenhouse.io/people/265772",
        "is_private": false,
        "can_email": true,
        "phone_numbers": [
          {
            "value": "330-281-8004",
            "type": "home"
          }
        ],
        "email_addresses": [
          {
            "value": "giuseppe.hurley@example.com",
            "type": "personal"
          }
        ],
        "addresses": [
          {
            "value": "123 Fake St.",
            "type": "home"
          }
        ],
        "website_addresses": [
          {
            "value": "ghurley.example.com",
            "type": "personal"
          }
        ],
        "social_media_addresses": [
          {
            "value": "linkedin.example.com/ghurley"
          }
        ],
        "educations": [
          {
            "school_name": "Harvard University",
            "degree": "Bachelor's Degree",
            "discipline": "Information Systems",
            "start_date": "01/01/2012",
            "end_date": "01/01/2016"
          }
        ],
        "employments": [
          {
            "company_name": "Greenhouse",
            "title": "Engineer",
            "start_date": "01/01/2012",
            "end_date": "01/01/2016"
          }
        ],
        "recruiter": {
          "id": 3128,
          "email": "alicia.flopple.3128@example.com",
          "name": "Alicia Flopple",
          "employee_id": "789GHI"
        },
        "coordinator": {
          "id": 3128,
          "email": "alicia.flopple.3128@example.com",
          "name": "Alicia Flopple",
          "employee_id": "789GHI"
        },
        "attachments": [
          {
            "filename": "resume.pdf",
            "url": "https://prod-heroku.s3.amazonaws.com/...",
            "type": "resume"
          },
          {
            "filename": "cover_letter.pdf",
            "url": "https://prod-heroku.s3.amazonaws.com/...",
            "type": "cover_letter"
          },
          {
            "filename": "portfolio.pdf",
            "url": "https://prod-heroku.s3.amazonaws.com/...",
            "type": "attachment"
          }
        ],
        "tags": [
          "Import from Previous ATS"
        ],
        "custom_fields": {
          "favorite_color": {
            "name": "Favorite Color",
            "type": "short_text",
            "value": "Blue"
          }
        }
      },
      "jobs": [
        {
          "id": 3485,
          "name": "Designer",
          "requisition_id": null,
          "notes": "Digital and print",
          "confidential": false,
          "job_post_id": 553282,
          "status": "open",
          "created_by_id": 273555,
          "created_at": "2013-10-02T22:59:29Z",
          "opened_at": "2015-01-23T00:25:04Z",
          "closed_at": null,
          "departments": [
            {
              "id": 237,
              "name": "Community",
              "external_id": "ex-dept-1"
            }
          ],
          "offices": [
            {
              "id": 54,
              "name": "New York",
              "location": "New York, NY",
              "external_id": "ex-office-1"
            }
          ],
          "custom_fields": {
            "employment_type": {
              "name": "Employment Type",
              "type": "single_select",
              "value": "Full Time"
            }
          }
        }
      ]
    }
  }
}

Noteworthy response attributes

See webhook common attributes.

Attribute Note
application.current_stage.interviews[].interviewers.status One of: needs_action, declined, tentative, accepted
application.current_stage.interviews[].status One of: to_be_scheduled, scheduled, awaiting_feedback, complete, skipped, collect_feedback, to_be_sent, sent, received

Candidate unhired

{
  "action": "unhire_candidate",
  "payload": {
    "application": {
      "id": 265293,
      "rejected_at": null,
      "prospect": false,
      "status": "active",
      "applied_at": "2013-03-22T00:00:00Z",
      "last_activity_at": "2015-03-18T20:28:09Z",
      "url": "https://app.greenhouse.io/people/265788?application_id=265293",
      "source": {
        "id": 27,
        "public_name": "LinkedIn"
      },
      "credited_to": null,
      "rejection_reason": null,
      "rejection_details": null,
      "current_stage": {
        "id": 678901,
        "name": "Application Review",
        "interviews": [
          {
            "id": 989099,
            "name":"Application Review",
            "status": "collect_feedback",
            "interview_kit": {
              "url": "http://app.greenhouse.io/guides/67656/people/265788",
              "content": "",
              "questions": []
            },
            "interviewers": []
          }
        ]
      },
      "custom_fields": {
        "custom_application_field": {
          "name": "Custom Application Field",
          "type": "short_text",
          "value": null
        }
      },
      "candidate": {
        "id": 265788,
        "first_name": "Hector",
        "last_name": "Porter",
        "title": null,
        "company": null,
        "created_at": "2013-10-04T01:24:48Z",
        "external_id": null,
        "photo_url": null,
        "url": "https://app.greenhouse.io/people/265788",
        "is_private": false,
        "can_email": true,
        "phone_numbers": [
          {
            "value": "330-281-8004",
            "type": "home"
          }
        ],
        "email_addresses": [
          {
            "value": "hector.porter.265788@example.com",
            "type": "personal"
          }
        ],
        "addresses": [],
        "website_addresses": [],
        "social_media_addresses": [],
        "educations": [
          {
            "school_name": "Harvard University",
            "degree": "Bachelor's Degree",
            "discipline": "Information Systems",
            "start_date": "01/01/2012",
            "end_date": "01/01/2016"
          }
        ],
        "employments": [
          {
            "company_name": "Greenhouse",
            "title": "Engineer",
            "start_date": "01/01/2012",
            "end_date": "01/01/2016"
          }
        ],
        "recruiter": null,
        "coordinator": null,
        "attachments": [
          {
            "filename": "resume.pdf",
            "url": "https://prod-heroku.s3.amazonaws.com/...",
            "type": "resume"
          }
        ],
        "tags": [
          "Import from Previous ATS"
        ],
        "custom_fields": {
          "favorite_color": {
            "name": "Favorite Color",
            "type": "short_text",
            "value": "Blue"
          }
        }
      },
      "jobs": [
        {
          "id": 371417,
          "name": "Designer",
          "requisition_id": null,
          "notes": "Digital and print",
          "confidential": false,
          "job_post_id": 54321,
          "status": "open",
          "created_by_id": 273555,
          "created_at": "2013-10-02T22:59:29Z",
          "opened_at": "2015-01-23T00:25:04Z",
          "closed_at": null,
          "departments": [
            {
              "id": 14501,
              "name": "Community",
              "external_id": "ex-dept-1"
            }
          ],
          "offices": [
            {
              "id": 9099,
              "name": "New York",
              "location": "New York, NY",
              "external_id": "ex-office-1"
            }
          ],
          "custom_fields": {
            "employment_type": {
              "name": "Employment Type",
              "type": "single_select",
              "value": "Full Time"
            }
          }
        }
      ]
    }
  }
}

This webhook only fires when the "Unhire" button is clicked in Greenhouse. This button is only available on the candidate profile page after a candidate has been hired.

See webhook common attributes.

Candidate/Prospect rejected

{
  "action": "reject_candidate",
  "payload": {
    "application": {
      "id": 265293,
      "rejected_at": "2015-02-11T15:50:41Z",
      "prospect": false,
      "status": "rejected",
      "applied_at": "2013-03-22T00:00:00Z",
      "last_activity_at": "2015-02-11T15:50:41Z",
      "url": "https://app.greenhouse.io/people/265788?application_id=265293",
      "source": {
        "id": 27,
        "public_name": "LinkedIn"
      },
      "credited_to": null,
      "rejection_reason": {
        "id": 14,
        "name": "Too Junior",
        "type": {
          "id": 3,
          "name": "Wrong skill set"
        }
      },
      "rejection_details": {
        "custom_fields": {
          "custom_rejection_question_field": {
            "name": "Custom Rejection Question Field",
            "type": "short_text",
            "value": "Example"
          }
        }
      },
      "current_stage": {
        "id": 2708728,
        "name": "Offer",
        "interviews": []
      },
      "custom_fields": {
        "custom_application_field": {
          "name": "Custom Application Field",
          "type": "short_text",
          "value": "Example123"
        }
      },
      "candidate": {
        "id": 265788,
        "first_name": "Hector",
        "last_name": "Porter",
        "title": null,
        "company": null,
        "created_at": "2013-10-04T01:24:48Z",
        "external_id": null,
        "photo_url": null,
        "is_private": false,
        "can_email": true,
        "phone_numbers": [
          {
            "value": "330-281-8004",
            "type": "home"
          }
        ],
        "email_addresses": [
          {
            "value": "hector.porter.265788@example.com",
            "type": "personal"
          }
        ],
        "addresses": [],
        "website_addresses": [],
        "social_media_addresses": [],
        "educations": [
          {
            "school_name": "Harvard University",
            "degree": "Bachelor's Degree",
            "discipline": "Information Systems",
            "start_date": "01/01/2012",
            "end_date": "01/01/2016"
          }
        ],
        "employments": [
          {
            "company_name": "Greenhouse",
            "title": "Engineer",
            "start_date": "01/01/2012",
            "end_date": "01/01/2016"
          }
        ],
        "recruiter": null,
        "coordinator": null,
        "attachments": [
          {
            "filename": "resume.pdf",
            "url": "https://prod-heroku.s3.amazonaws.com/...",
            "type": "resume"
          }
        ],
        "tags": [
          "Imported"
        ],
        "custom_fields": {
          "favorite_color": {
            "name": "Favorite Color",
            "type": "short_text",
            "value": "Blue"
          }
        }
      },
      "jobs": [
        {
          "id": 371417,
          "name": "Designer",
          "requisition_id": null,
          "notes": "Digital and print",
          "confidential": false,
          "job_post_id": 54321,
          "status": "open",
          "created_by_id": 273555,
          "created_at": "2013-10-02T22:59:29Z",
          "opened_at": "2015-01-23T00:25:04Z",
          "closed_at": null,
          "departments": [
            {
              "id": 237,
              "name": "Community",
              "external_id": "ex-dept-1"
            }
          ],
          "offices": [
            {
              "id": 9099,
              "name": "New York",
              "location": "New York, NY",
              "external_id": "ex-office-1"
            }
          ],
          "custom_fields": {
            "employment_type": {
              "name": "Employment Type",
              "type": "single_select",
              "value": "Full Time"
            }
          }
        }
      ]
    }
  }
}

The Reject Candidate event occurs when a prospect or candidate is rejected for a position. When candidates are rejected via a bulk action, a webhook will fire once for each candidate or prospect rejected.

See webhook common attributes.

Candidate/Prospect unrejected

{
  "action": "unreject_candidate",
  "payload": {
    "application": {
      "id": 265293,
      "rejected_at": null,
      "prospect": false,
      "status": "active",
      "applied_at": "2013-03-22T00:00:00Z",
      "last_activity_at": "2015-02-11T15:50:41Z",
      "url": "https://app.greenhouse.io/people/265788?application_id=265293",
      "source": {
        "id": 27,
        "public_name": "LinkedIn"
      },
      "credited_to": null,
      "rejection_reason": null,
      "rejection_details": null,
      "current_stage": {
        "id": 2708728,
        "name": "Offer",
        "interviews": []
      },
      "custom_fields": {
        "custom_application_field": {
          "name": "Custom Application Field",
          "type": "short_text",
          "value": "Example123"
        }
      },
      "candidate": {
        "id": 265788,
        "first_name": "Hector",
        "last_name": "Porter",
        "title": null,
        "company": null,
        "created_at": "2013-10-04T01:24:48Z",
        "external_id": null,
        "photo_url": null,
        "is_private": false,
        "can_email": true,
        "phone_numbers": [
          {
            "value": "330-281-8004",
            "type": "home"
          }
        ],
        "email_addresses": [
          {
            "value": "hector.porter.265788@example.com",
            "type": "personal"
          }
        ],
        "addresses": [],
        "website_addresses": [],
        "social_media_addresses": [],
        "educations": [
          {
            "school_name": "Harvard University",
            "degree": "Bachelor's Degree",
            "discipline": "Information Systems",
            "start_date": "01/01/2012",
            "end_date": "01/01/2016"
          }
        ],
        "employments": [
          {
            "company_name": "Greenhouse",
            "title": "Engineer",
            "start_date": "01/01/2012",
            "end_date": "01/01/2016"
          }
        ],
        "recruiter": null,
        "coordinator": null,
        "attachments": [
          {
            "filename": "resume.pdf",
            "url": "https://prod-heroku.s3.amazonaws.com/...",
            "type": "resume"
          }
        ],
        "tags": [
          "Imported"
        ],
        "custom_fields": {
          "favorite_color": {
            "name": "Favorite Color",
            "type": "short_text",
            "value": "Blue"
          }
        }
      },
      "jobs": [
        {
          "id": 371417,
          "name": "Designer",
          "requisition_id": null,
          "notes": "Digital and print",
          "confidential": false,
          "job_post_id": 54321,
          "status": "open",
          "created_by_id": 273555,
          "created_at": "2013-10-02T22:59:29Z",
          "opened_at": "2015-01-23T00:25:04Z",
          "closed_at": null,
          "departments": [
            {
              "id": 237,
              "name": "Community",
              "external_id": "ex-dept-1"
            }
          ],
          "offices": [
            {
              "id": 9099,
              "name": "New York",
              "location": "New York, NY",
              "external_id": "ex-office-1"
            }
          ],
          "custom_fields": {
            "employment_type": {
              "name": "Employment Type",
              "type": "single_select",
              "value": "Full Time"
            }
          }
        }
      ]
    }
  }
}

The Unreject Candidate event occurs when a prospect or candidate is unrejected.

See webhook common attributes.

Candidate/Prospect updated

{
  "action": "update_candidate",
  "payload": {
    "candidate": {
      "id": 15696179,
      "first_name": "Ronald",
      "last_name": "Ronnie",
      "title": "Director of Strategic Initiatives",
      "company": "Example",
      "created_at": "2016-08-23T17:51:27Z",
      "external_id": "946aa514658",
      "photo_url": null,
      "url": "https://app.greenhouse.io/people/15696179",
      "phone_numbers": [
        {
          "value": "911",
          "type": "mobile"
        }
      ],
      "email_addresses": [
        {
          "value": "123456email@email.com",
          "type": "work"
        }
      ],
      "addresses": [
        {
          "value": "99-99 5th Ave.\nNew York, NY 101-11",
          "type": "home"
        }
      ],
      "website_addresses": [
        {
          "value": "google.com",
          "type": "personal"
        }
      ],
      "social_media_addresses": [
        {
          "value": "@ronaldronnie99999"
        }
      ],
      "educations": [
        {
          "school_name": "Harvard University",
          "degree": "Bachelor's Degree",
          "discipline": "Information Systems",
          "start_date": "01/01/2012",
          "end_date": "01/01/2016"
        }
      ],
      "employments": [
        {
          "company_name": "Greenhouse",
          "title": "Engineer",
          "start_date": "01/01/2012",
          "end_date": "01/01/2016"
        }
      ],
      "recruiter": {
        "id": 169779,
        "email": "hank.hollandaise.169779@example.com",
        "name": "Hank Hollandaise",
        "employee_id": "123ABC"
      },
      "coordinator": {
        "id": 83637,
        "email": "sterling.kang.83637@example.com",
        "name": "Sterling Kang",
        "employee_id": "456DEF"
      },
      "attachments": [
        {
          "filename": "resumeA.pdf",
          "url": "https://prod-heroku.s3.amazonaws.com/...",
          "type": "resume"
        },
        {
          "filename": "resumeB.pdf",
          "url": "https://prod-heroku.s3.amazonaws.com/...",
          "type": "resume"
        }
      ],
      "tags": [
        "foo",
        "File Import"
      ],
      "custom_fields": {
        "current_salary": {
          "name": "Current Salary",
          "type": "short_text",
          "value": null
        },
        "desired_salary": {
          "name": "Desired Salary",
          "type": "short_text",
          "value": null
        }
      }
    }
  }
}

The Candidate or Prospect Updated event occurs when a candidate or prospect's standard field or custom field is updated. For instance, an update to a candidate's first name would trigger this event.

See webhook common attributes.

Candidate anonymized

This webhook will fire when a particular candidate receives an anonymize event. Anonymize events may occur from the Anonymize Endpoint in Harvest or may be configured in the GDPR page in the Greenhouse application. An anonymize webhook consists of the action type, the id of the candidate who had properties anonymized, and the information that was anonymized.

{
  "action": "candidate_anonymized",
  "payload": {
    "candidate_id": 37031511,
    "anonymized_fields": ["full_name", "current_title"]
  }
}

Anonymized Fields

A list of possible anonymized fields are provided. If the item in "attribute" is received in the anonymized_fields array, the corresponding changes in notes have been applied in Greenhouse. Note that some of these fields may not be accessible via other webhooks or via Harvest.

Attribute Anonymize Process
activity_items Destroy all items in the candidate's activity feed of type "activity". In Harvest's Activity Feed endpoint, these are items in the activities section.
addresses Destroy all values from candidate.addresses
all_offer_versions For each of this candidate's applications, destroy all offers. (For legacy reasons, this will also raise an Offer Deleted webhook if one is configured.)
application_questions For each of this candidate's applications, destroy all values from application.answers.
attachments Destroy all attachments on this candidate and all their associated applications.
candidate_stage_data For each of this candidate's applications, set the created_at time to now, remove the candidate from the current stage, destroy all stage transition information, and set the candidate back to the first stage.
coordinator Set candidate.coordinator to null
credited_to For each of this candidate's application, destroy application.credited_to.
custom_application_fields For each of this candidate's applications, destroy application.custom_fields.
custom_candidate_fields Destroy all values from candidate.custom_fields
custom_rejection_question_fields For each of this candidate's application, destroy all custom fields on rejection details.
current_company Set candidate.company to null.
current_title Set candidate.title to null.
education Remove all values from candidate.educations
email_addresses Destroy all values from candidate.email_addresses
employment Remove all values from candidate.employments
emails Destroy record of any e-mails sent to this candidate via Greenhouse.
follow_up_reminders Destroy any follow-up reminders configured on this person.
full_name Set candidate.first_name to "Anonymized" and candidate.last_name to the candidate.id.
headline Set the candidate's headline to null.
inmails Destroy record of any LinkedIn Inmails synced to this candidate from LinkedIn.
innotes Destroy record of any LinkedIn Innotes synced to this candidate from LinkedIn.
location For each of this candidate's applications, set application.location to null.
notes Destroy all notes on this candidate.
offers Destroy all information on all offers on any of this candidate's applications without destroying that an offer was made.
phone_numbers Remove all values from candidate.phone_numbers
prospect_jobs Remove all associations between this prospect and jobs.
prospect_offices Remove all associations between this prospect and offices.
prospect_offices_and_departments Remove all associations between this prospect and departments.
prospect_owner For each of this candidate's prospect applications, destroy the prospect owner.
prospect_pool_and_stage For each of this candidate's application, destroy the prospect pool and the prospect pool stage.
recruiter Set candidate.recruiter to null
referral_questions Destroy all referral answers for this candidate.
rejection_notes Destroy all notes specifically related to this candidate's rejection.
rejection_reasons Set rejection_reason on all candidate applications to null.
scorecards_and_interviews Destroy all scorecards with this candidate id and all interviews with any application from this candidate id
social_media_links Remove all values from candidate.social_media_addresses
source Remove application.source in all this candidate's applications.
tags Remove all values from candidate.tags
third_party_integrations Disconnect the candidate's profile from the LinkedIn CSA and RSC integrations.
touchpoints Destroy all touchpoints on the candidate, all the candidate's applications, and any notes associated with touchpoints.
websites Remove all values from candidate.website_addresses

Interview Events

Interview deleted

This webhook fires when a scheduled interview is cancelled or the interview is deleted directly. This webhook will not fire if an interview is deleted because a candidate, application, or hiring plan is deleted.

{
  "action": "interview_deleted",
  "payload": {
    "interview": {
      "id": 31087450
    }
  }
}

Scorecard deleted

This webhook only fires when individual scorecards are destroyed. This occurs when the Harvest API delete endpoint is used, or when the delete scorecard link is used in the application. This will not fire when a candidate or application is deleted. A candidate being deleted implies all their scorecards have been deleted with them. An application being deleted does not cause scorecards to be deleted.

{
  "action": "scorecard_deleted",
  "payload": {
    "scorecard": {
      "id": 6036088,
      "candidate_id": 29843272,
      "interviewed_at": "2016-12-28T17:00:00.000Z",
      "created_at": "2016-12-28T22:58:03.552Z",
      "updated_at": "2016-12-28T22:58:03.552Z",
      "scorecard_status": "complete"
    }
  }
}

Job Events

Job created

{
  "action": "job_created",
  "payload": {
    "job": {
      "id": 371417,
      "name": "Software Engineer",
      "requisition_id": null,
      "notes": "Looking for the best!",
      "confidential": false,
      "job_post_id": 2154,
      "status": "open",
      "created_by_id": 273555,
      "created_at": "2016-10-20T18:16:32Z",
      "opened_at": "2016-10-20T18:16:32Z",
      "closed_at": null,
      "departments": [
        {
          "id": 7,
          "name": "Technology",
          "external_id": "ex-dept-1"
        }
      ],
      "offices": [
        {
          "id": 13,
          "name": "New York City",
          "location": "New York, NY",
          "external_id": "ex-office-1"
        },
        {
          "id": 14,
          "name": "St. Louis",
          "location": null,
          "external_id": null
        }
      ],
      "hiring_team": {
        "hiring_managers": [
          {
            "user_id": 1234,
            "employee_id": "abc-123"
          }
        ],
        "sourcers": [],
        "recruiters": [
          {
            "user_id": 2345,
            "employee_id": null
          },
          {
            "user_id": 3456,
            "employee_id": "abc-234"
          }
        ],
        "coordinators": []
      },
      "openings": [
        {
          "id": 1234,
          "opening_id": "abc-1",
          "custom_fields": []
        },
        {
          "id": 1235,
          "opening_id": "abc-2",
          "custom_fields": []
        }
      ],
      "custom_fields": {
        "approved": {
          "name": "Approved",
          "type": "boolean",
          "value": true
        },
        "employment_type": {
          "name": "Employment Type",
          "type": "single_select",
          "value": "Full-time"
        },
        "salary_range": {
          "name": "SalaryRange",
          "type": "currency_range",
          "value": {
            "unit": "USD",
            "min_value": "10000.0",
            "max_value": "20000.0"
          }
        }
      }
    }
  }
}

The Job Created event is triggered when a new job is created from scratch or copied from another job.

Attribute Note
hiring_team Field contains the Greenhouse users responsible for this job. Each field contains the user's Greenhouse user id and the user's external employee id from the customer's system. The employee id will be null if it has not been set in Greenhouse.
openings Field contains all the openings in this job. The custom field element on each opening may be omitted if the organization does not have custom fields on openings enabled.

Job deleted

This webhook only fires when jobs are deleted from the Greenhouse system. This only happens when a job is closed and then the "Delete" button is clicked from the Job Dashboard.

{
  "action": "job_deleted",
  "payload": {
    "job": {
      "id": 209256,
      "name": "Project Manager"
    }
  }
}

Noteworthy response attributes

Attribute Note
id The internal Greenhouse Job id
name The name of the job that was deleted

Job updated

{
  "action": "job_updated",
  "payload": {
    "job": {
      "id": 100445,
      "name": "Assistant Store Manager, NYC",
      "requisition_id": null,
      "notes": "<p>Looking for the best!<\/p>",
      "confidential": false,
      "job_post_id": 88010,
      "status": "open",
      "created_by_id": 273555,
      "created_at": "2015-08-11T23:02:09Z",
      "opened_at": "2015-08-11T23:02:09Z",
      "closed_at": null,
      "departments": [
        {
          "id": 74,
          "name": "Guideshops",
          "external_id": "ex-dept-1"
        }
      ],
      "offices": [
        {
          "id": 104,
          "name": "New York",
          "location": "New York, NY",
          "external_id": "ex-office-1"
        }
      ],
      "hiring_team": {
        "hiring_managers": [
          {
            "user_id": 1234,
            "employee_id": "abc-123"
          }
        ],
        "sourcers": [],
        "recruiters": [
          {
            "user_id": 2345,
            "employee_id": null
          },
          {
            "user_id": 3456,
            "employee_id": "abc-234"
          }
        ],
        "coordinators": []
      },
      "openings": [
        {
          "id": 1234,
          "opening_id": "abc-1",
          "custom_fields": []
        },
        {
          "id": 1235,
          "opening_id": "abc-2",
          "custom_fields": []
        }
      ],
      "custom_fields": {
        "bonus": {
          "name": "Bonus",
          "type": "short_text",
          "value": null
        },
        "employment_type": {
          "name": "Employment Type",
          "type": "single_select",
          "value": null
        },
        "options": {
          "name": "Options",
          "type": "short_text",
          "value": null
        },
        "salary": {
          "name": "Salary",
          "type": "short_text",
          "value": null
        }
      }
    }
  }
}

The Job Updated event is triggered any time one or more of the following fields are changed for a job: Internal Job Name, Department, Office, Level, Open Date, Status, Notes, Team and Responsibilities, and How To Sell This Job. Changes to custom fields on a job will also trigger this webhook.

Attribute Note
hiring_team Field contains the Greenhouse users responsible for this job. Each field contains the user's Greenhouse user id and the user's external employee id from the customer's system. The employee id will be null if it has not been set in Greenhouse.
openings Field contains all the openings in this job. The custom field element on each opening may be omitted if the organization does not have custom fields on openings enabled.

Job Approved

{
  "action": "job_approved",
  "payload": {
    "approval_flow": {
      "approval_flow_type": "open_job"
    },
    "job": {
      "id": 100445,
      "name": "Assistant Store Manager, NYC",
      "requisition_id": null,
      "notes": "<p>Looking for the best!<\/p>",
      "confidential": false,
      "job_post_id": 88010,
      "status": "open",
      "created_by_id": 273555,
      "created_at": "2015-08-11T23:02:09Z",
      "opened_at": "2015-08-11T23:02:09Z",
      "closed_at": null,
      "departments": [
        {
          "id": 74,
          "name": "Guideshops",
          "external_id": "ex-dept-1"
        }
      ],
      "offices": [
        {
          "id": 104,
          "name": "New York",
          "location": "New York, NY",
          "external_id": "ex-office-1"
        }
      ],
      "hiring_team": {
        "hiring_managers": [
          {
            "user_id": 1234,
            "employee_id": "abc-123"
          }
        ],
        "sourcers": [],
        "recruiters": [
          {
            "user_id": 2345,
            "employee_id": null
          },
          {
            "user_id": 3456,
            "employee_id": "abc-234"
          }
        ],
        "coordinators": []
      },
      "openings": [
        {
          "id": 1234,
          "opening_id": "abc-1",
          "custom_fields": []
        },
        {
          "id": 1235,
          "opening_id": "abc-2",
          "custom_fields": []
        }
      ],
      "custom_fields": {
        "bonus": {
          "name": "Bonus",
          "type": "short_text",
          "value": null
        },
        "employment_type": {
          "name": "Employment Type",
          "type": "single_select",
          "value": null
        },
        "options": {
          "name": "Options",
          "type": "short_text",
          "value": null
        },
        "salary": {
          "name": "Salary",
          "type": "short_text",
          "value": null
        }
      }
    }
  }
}

The Job Approved event is triggered when the final approval is received in a Greenhouse job's approval flow. "Approvals to start recruiting" will be identified as "approval_flow_type": "open_job" while "Official job approval" will be identified as "approval_flow_type": "offer_job".

Job Post created

This webhook fires when a job post or prospect post is created. This occurs when a new job post or prospect post is added from the job set up.

If job_id is present in the payload, the payload represents a new job post.

If job_id is not present, the payload represents a new prospect post.

{
  "action": "job_post_created",
  "payload": {
    "id": 1815002,
    "title": "A Cool Job",
    "location": "New York, NY",
    "content": "<p>Hey, this is a neat job. You should apply!</p>",
    "internal_content": null,
    "updated_at": "2017-10-12T15:06:32.691Z",
    "job_id": 1842002,
    "external": true,
    "internal": false,
    "live": false,
    "questions": [
      {
        "required": false,
        "private": false,
        "label": "LinkedIn Profile",
        "type": "input_text",
        "values": []
      },
      {
        "required": false,
        "private": false,
        "label": "Website",
        "type": "input_text",
        "values": []
      },
      {
        "required": false,
        "private": false,
        "label": "How did you hear about this job?",
        "type": "input_text",
        "values": []
      }
    ]
  }
}

Job Post updated

This webhook fires when a job post or prospect post is updated via the "Edit Job Post" page. It also fires when the live status of the job changes from on to off or vice-versa.

If job_id is present in the payload, the payload represents an updated job post.

If job_id is not present, the payload represents an updated prospect post.

{
  "action": "job_post_updated",
  "payload": {
    "id": 1813002,
    "title": "A Cool Job",
    "location": "At a Cool Place",
    "content": "<p>Come work for us!</p>",
    "internal_content": null,
    "updated_at": "2017-10-12T18:29:08.399Z",
    "job_id": 1842002,
    "external": true,
    "internal": false,
    "live": false,
    "questions": [
      {
        "required": false,
        "private": false,
        "label": "LinkedIn Profile",
        "type": "input_text",
        "values": []
      },
      {
        "required": false,
        "private": false,
        "label": "Website",
        "type": "input_text",
        "values": []
      },
      {
        "required": false,
        "private": false,
        "label": "How did you hear about this job?",
        "type": "input_text",
        "values": []
      }
    ]
  }
}

Job Post deleted

This webhook fires when a job post or prospect post is deleted. This occurs when the delete link is clicked on a post. Only posts that are not live may be deleted. This will not fire if a job itself is deleted; a job being deleted implies all of its posts have been deleted with them.

If job_id is present in the payload, the payload represents a deleted job post.

If job_id is not present, the payload represents a deleted prospect post.

{
  "action": "job_post_deleted",
  "payload": {
    "job_post": {
      "id": 258341,
      "job_id": 284999,
      "title": "Software Engineer",
      "location": "Dallas",
      "content": "<p>A pretty interesting job post!</p>",
      "updated_at": "2017-01-19T20:01:53.146Z",
      "internal_content": null,
      "questions": [
        {
          "required": false,
          "private": false,
          "label": "LinkedIn Profile",
          "type": "input_text",
          "values": []
        },
        {
          "required": false,
          "private": false,
          "label": "Website",
          "type": "input_text",
          "values": []
        },
        {
          "required": false,
          "private": false,
          "label": "How did you hear about this job?",
          "type": "input_text",
          "values": []
        },
        {
          "required": true,
          "private": true,
          "label": "Are you a cool engineer?",
          "type": "multi_value_single_select",
          "values": [
            "Yes",
            "No",
            "As a cucumber"
          ]
        }
      ],
      "external": true,
      "internal": false,
      "live": false
    }
  }
}

Job Stage deleted

This webhook only fires when interview stages on a job are removed. This occurs when the remove stage link is used in the Job Setup section of the application. This will not fire when a job is deleted. A job being deleted implies all of its stages have been deleted with them.

{
  "action": "job_interview_stage_deleted",
  "payload": {
    "job_interview_stage": {
      "id": 430608,
      "job_id": 60453,
      "created_at": "2015-03-11T13:25:25.313Z",
      "updated_at": "2016-08-16T09:29:33.650Z",
      "name": "Phone Screen",
      "active": true
    }
  }
}

Organization Events

Department deleted

This webhook fires when departments are deleted from the Greenhouse system from the Configure » Organization screen. This only happens when the "Remove" button is clicked after clicking the "X" next to an office name.

{
  "action": "department_deleted",
  "payload": {
    "department": {
      "id": 106,
      "name": "Creative",
      "child_ids": [
        23328
      ],
      "parent_id": 5,
      "external_id": "ex-office-1"
    }
  }
}

Noteworthy response attributes

Attribute Note
id The Greenhouse id for the department
name The name of the department deleted
child_ids Any former child department ids (this includes all descendants); will be [] if empty
parent_id The department's parent department id; will be null if empty

Office deleted

This webhook fires when offices are deleted from the Greenhouse system from the Configure » Organization screen. This only happens when the "Remove" button is clicked after clicking the "X" next to an office name.

{
  "action": "office_deleted",
  "payload": {
    "office": {
      "id": 16492,
      "name": "New York",
      "location": {
        "name": "New York, NY"
      },
      "child_ids": [
        123,
        456
      ],
      "parent_id": 789,
      "external_id": "ex-dep-1"
    }
  }
}

Noteworthy response attributes

Attribute Note
id The Greenhouse id for the office
name The name of the office deleted
location The location for the office
child_ids Any former child office ids; will be [] if empty
parent_id The office's parent office id; will be null if empty