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.
- Name: The name is simply a reference for you. It can contain any string value.
- Endpoint URL: This is the URL to which we will send the POST data when the event occurs. This must be a valid URL and must be https. When the webhook is saved or updated, we will attempt to ping this URL with a payload containing some configuration settings for the webhook. If this ping fails, we will create the webhook in a disabled state and notify you that the ping has failed.
- Secret Key: This secret key will be used to generate a signature header that you may use to verify the hook data was sent from Greenhouse. The secret key will be used in conjunction with the webhook's payload to generate a digital signature.
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.
- Basic authentication username / password: These credentials are supplied if the webhook request needs to authenticate at the destination with HTTP Basic Authorization. These credentials will be encoded in to a HTTP Authorization header. See RFC 2617 for additional details.
- Additional Headers: This textarea should contain any additional HTTP headers that will allow the POST request access to your environment. These headers will be included exactly as pasted, but may not include the following headers already reserved by Greenhouse: Content-Type, Content-Length, Greenhouse-Event-ID, Authorization, User-Agent, and Signature. Please consult with your technology department before including anything in this field.
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 thepayload
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 make up to 7 attempts over the course of 15 hours.
The table below outlines the estimated wait time for each attempt.
Approx. Total waiting time | Attempt number | Next Attempt in |
---|---|---|
0h 0m | 1 | 1m |
0h 1m | 2 | 15m |
0h 16m | 3 | 60m |
1h 16m | 4 | 120m |
3h 16m | 5 | 240m |
7h 16m | 6 | 480m |
15h 16m | 7 | -- |
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 |