---
title: "Configure Greenhouse Native Candidate Webhooks"
img: https://s3.us-east-2.amazonaws.com/unified-article-images/configure_greenhouse_native_candidate_webhooks-icon.png
date: 2026-07-15T15:38:00.000Z
tag: Guides
description: "Greenhouse Recruiting requires native webhooks to be created manually in its Dev Center."
url: "https://unified.to/blog/configure_greenhouse_native_candidate_webhooks"
---

# Configure Greenhouse Native Candidate Webhooks
------
_July 15, 2026_

Greenhouse Recruiting requires native [webhooks](/blog/replacing_polling_with_unified_webhooks_and_virtual_streams) to be created manually in its **Dev Center**.


This guide explains how to connect Greenhouse candidate events to a Unified webhook subscription.


---


## Before you begin


You need:

- An active Greenhouse connection in Unified
- The Greenhouse connection ID
- A public HTTPS endpoint in your application that can receive Unified webhook payloads
- Greenhouse's **Manage and configure webhooks** developer permission
- A [Unified API](/technology) key

---


## How the webhook flow works

1. Greenhouse sends a candidate event to Unified.
2. Unified converts the event into the unified `ats_candidate` format.
3. Unified sends the normalized webhook payload to your application's webhook URL.
> **Note**
>
> For `created` and `updated` events, Unified retrieves the latest candidate record from Greenhouse before sending the payload to your application.
>
>
> For `deleted` events, the payload contains the deleted candidate ID.
>
>

---


## Step 1: Create Unified webhook subscriptions


Create one native Unified webhook subscription for each event type you need:

- `created`
- `updated`
- `deleted`

### Example: Created candidate subscription


```plain text
curl --request POST \
  --url 'https://api.unified.to/unified/webhook' \
  --header 'Authorization: Bearer YOUR_UNIFIED_API_KEY' \
  --header 'Content-Type: application/json' \
  --data '{
    "connection_id": "YOUR_GREENHOUSE_CONNECTION_ID",
    "object_type": "ats_candidate",
    "event": "created",
    "webhook_type": "native",
    "hook_url": "https://your-app.example.com/webhooks/unified"
  }'
```


The `hook_url` is your application's endpoint. Unified sends normalized webhook payloads to this URL.


Repeat the request with `event` set to `updated` and `deleted` when those events are required.


Save the `id` returned for each webhook subscription.


[Create webhook subscription](https://docs.unified.to/unified/webhook/Create_webhook_subscription)


---


## Step 2: Build the Greenhouse endpoint URLs


Build a separate Greenhouse endpoint URL using each Unified webhook subscription ID.


| Unified region | Greenhouse endpoint                                               |
| -------------- | ----------------------------------------------------------------- |
| US             | `https://api.unified.to/webhook/greenhouse/UNIFIED_WEBHOOK_ID`    |
| EU             | `https://api-eu.unified.to/webhook/greenhouse/UNIFIED_WEBHOOK_ID` |
| Australia      | `https://api-au.unified.to/webhook/greenhouse/UNIFIED_WEBHOOK_ID` |
Use:

- The `created` subscription ID for Greenhouse creation triggers
- The `updated` subscription ID for Greenhouse update triggers
- The `deleted` subscription ID for Greenhouse deletion triggers
> **Important**
>
> Do not enter your application's `hook_url` in Greenhouse.
>
>
> Greenhouse must send its payload to the Unified endpoint shown above. Unified will then normalize the event and forward it to your application.
>
>

---


## Step 3: Open Greenhouse webhook settings


In Greenhouse Recruiting:

1. Select **Configure**.
2. Select **Dev Center**.
3. Select **Web Hooks**.
4. Select **Web Hooks** again.
5. Select the option to create a new webhook.
> **Permission required**
>
> If you cannot access this page, ask a Greenhouse administrator to grant you the **Manage and configure webhooks** developer permission.
>
>

---


## Step 4: Create the Greenhouse webhooks


Greenhouse allows only one trigger per webhook.


Create a separate Greenhouse webhook for every trigger you want to receive.


For each webhook, enter the following:


| Field                     | Value                                                                  |
| ------------------------- | ---------------------------------------------------------------------- |
| **Name this webhook**     | A descriptive name, such as `Unified – Candidate hired`                |
| **When**                  | One of the supported triggers listed below                             |
| **Endpoint URL**          | The Unified endpoint for the corresponding Unified event               |
| **Secret Key**            | A unique, randomly generated secret stored securely                    |
| **Error recipient email** | A Greenhouse administrator who should receive delivery failure notices |
| **Disabled?**             | `No`                                                                   |
| **Advanced settings**     | Leave blank unless your organization has additional requirements       |
### Created candidate events


Point the following Greenhouse triggers to the endpoint containing your Unified `created` webhook ID:

- Application created
- Prospect created

### Updated candidate events


Point the following Greenhouse triggers to the endpoint containing your Unified `updated` webhook ID:

- Candidate/Prospect updated
- Candidate hired
- Candidate/Prospect rejected
- Candidate stage change
- Candidate unhired
- Candidate/Prospect unrejected

### Deleted candidate events


Point the following Greenhouse triggers to the endpoint containing your Unified `deleted` webhook ID:

- Candidate deleted
- Candidate merged
> **Important**
>
> Use the correct Unified endpoint for each trigger group.
>
>
> For example, do not send a **Candidate hired** trigger to the endpoint associated with a Unified `created`subscription.
>
>

---


## Trigger mapping reference


| Greenhouse trigger            | Unified event |
| ----------------------------- | ------------- |
| Application created           | `created`     |
| Prospect created              | `created`     |
| Candidate/Prospect updated    | `updated`     |
| Candidate hired               | `updated`     |
| Candidate/Prospect rejected   | `updated`     |
| Candidate stage change        | `updated`     |
| Candidate unhired             | `updated`     |
| Candidate/Prospect unrejected | `updated`     |
| Candidate deleted             | `deleted`     |
| Candidate merged              | `deleted`     |
---


## Step 5: Confirm that each webhook is active


When a Greenhouse webhook is created, Greenhouse sends a test ping to the configured endpoint.

- If the ping succeeds, Greenhouse activates the webhook.
- If the ping fails, Greenhouse saves the webhook in a disabled state.

### Retry a failed webhook

1. Open the webhook in Greenhouse.
2. Confirm that the endpoint contains the correct Unified webhook subscription ID.
3. Set **Disabled?** to **No**.
4. Save the webhook again.

---


## Test the integration


Perform a Greenhouse action matching one of the configured triggers.


For example, update a test candidate after configuring the **Candidate/Prospect updated** trigger.


Confirm that your application receives a Unified webhook payload containing:

- `type` set to `NATIVE`
- `webhook.object_type` set to `ats_candidate`
- `webhook.event` set to the expected Unified event
- The normalized candidate record in the `data` array

Deleted candidate events contain an object with the deleted candidate's `id`.


---


## Remove the webhooks


Deleting a Unified webhook subscription does not delete the manually configured Greenhouse webhooks.


To fully remove the integration:

1. Disable or delete each corresponding webhook in Greenhouse.
2. Delete the Unified webhook subscriptions.

---


## Troubleshooting


### The Greenhouse webhook is disabled immediately


The initial endpoint ping failed.


Check that:

- The endpoint starts with `https://`.
- The Unified webhook ID is correct.
- The endpoint uses the API hostname for the correct Unified region.
- The Unified webhook subscription still exists.

### No webhook arrives after a candidate change


Check that:

- You configured the specific Greenhouse trigger for that action.
- The trigger points to the Unified endpoint for the correct `created`, `updated`, or `deleted` subscription.
- The Greenhouse webhook is not disabled.
- The Greenhouse connection still has permission to retrieve candidates.
- The configured error recipient has not received a Greenhouse delivery failure email.

### Duplicate deliveries


Check that the same Greenhouse trigger was not created more than once.


Greenhouse may also retry failed deliveries, so your application should process webhook deliveries idempotently.


---


## Additional documentation

- [Greenhouse: Create a webhook](https://support.greenhouse.io/hc/en-us/articles/360005574531-Create-a-webhook)
- [Greenhouse Recruiting webhooks](https://developers.greenhouse.io/webhooks.html)
- [Unified: Introduction to webhooks](https://docs.unified.to/reference/webhooks)
- [Unified: Create webhook subscription](https://docs.unified.to/unified/webhook/Create_webhook_subscription)