Configure Greenhouse Native Candidate Webhooks

Updated:


July 15, 2026

Greenhouse Recruiting requires native webhooks 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 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

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


Step 2: Build the Greenhouse endpoint URLs

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

Unified regionGreenhouse endpoint
UShttps://api.unified.to/webhook/greenhouse/UNIFIED_WEBHOOK_ID
EUhttps://api-eu.unified.to/webhook/greenhouse/UNIFIED_WEBHOOK_ID
Australiahttps://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:

FieldValue
Name this webhookA descriptive name, such as Unified – Candidate hired
WhenOne of the supported triggers listed below
Endpoint URLThe Unified endpoint for the corresponding Unified event
Secret KeyA unique, randomly generated secret stored securely
Error recipient emailA Greenhouse administrator who should receive delivery failure notices
Disabled?No
Advanced settingsLeave 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 triggerUnified event
Application createdcreated
Prospect createdcreated
Candidate/Prospect updatedupdated
Candidate hiredupdated
Candidate/Prospect rejectedupdated
Candidate stage changeupdated
Candidate unhiredupdated
Candidate/Prospect unrejectedupdated
Candidate deleteddeleted
Candidate mergeddeleted

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

For creating the webhook in Unified, see How to create and configure webhooks.

Share
All guidesWebhooksWebhook modelVirtual webhooksATS APIsATS Candidate modelAdvertising Report Metrics by IntegrationATS to Vector DB: How to Power Talent Intelligence with Real-Time DataBuilding AI applications with Unified and LangbaseConcur & Concur (Company) — Connection GuideConnect Amazon Seller Central to Unified.toConnecting BambooHR via OAuth 2Connecting Google Workspace Integrations with a Service AccountCorrect WelcomeKit Scopes for Jungle IntegrationCreating Ads using the Unified Ads APICreating Walmart Items via UnifiedEnd-Users, Integrations, and ConnectionsEnriching Unified Objects with Custom MetadataEnterprise-managed authorization (EMA) with a static keyEnterprise-managed authorization (EMA) with a workspace secretEnterprise-managed authorization (EMA) with Microsoft Entra IDExtended observability — pushing API logs to ClickHouseExtended observability — pushing API logs to Grafana / LokiExtended Observability - Pushing API Logs to your Datadog InstanceFacebook Messenger Webhook SetupFireflies Integration GuideGetting started with WorkableHandling Delegated vs. Application Scopes in Microsoft IntegrationsHiBob & Unified: connection and time off guideHow long are logs retainedHow to access employees and usersHow to add API support for the Create Activity in CrelateHow to Associate a Connection ID with Your End-UserHow to build a Candidate Assessment product with Unified.toHow to build a candidate sourcing or job board app with Unified.toHow to build a Discord support bot with Unified.to and LangbaseHow to Build a Fintech Application with Unified's Payments APIHow to Build an E-Commerce Product Integration with UnifiedHow to build an invoicing system with Unified.toHow to build Enterprise Search using RAGHow to configure Bullhorn Redirect URI for creating a connectionHow to configure webhooks in HubSpotHow to configure webhooks in Thrive LearningHow to configure webhooks in Toast for UnifiedHow to Connect Anthropic to Real-Time SaaS Data with Unified.to MCP ServerHow to Connect Cohere to Real-Time SaaS Data with Unified.to MCP ServerHow to Connect Google Gemini to Real-Time SaaS Data with Unified.to MCP ServerHow to Connect LLMs to Real-Time SaaS Data with Unified.to MCP ServerHow to Connect OpenAI to Real-Time SaaS Data with Unified.to MCP ServerHow to Connect Zoom and Zoom PhoneHow to create a Connection In Microsoft TeamsHow to create a token-based connection in HighlevelHow to Create a Unified.to Connection to HighLevelHow to Create a Xero Connection in Unified.toHow to create and configure webhooksHow to create Connection with HubspotHow to customize portal URLs for Stripe and GoCardlessHow to filter webhook eventsHow-to Get a Private Support Channel for Your Unified IntegrationHow to get your 8x8 Connect API Key and Account ID: Step-by-step guideHow to get your ADP Workforce Now Oauth2 client ID, Oauth2 client secret, Oauth2 PEM certificate and Oauth2 private key: Step-by-step guideHow to get your Amazon S3 AWS Region, AWS S3 Key and AWS S3 Secret: Step-by-step guideHow to get your Ashby API Key: Step-by-step guideHow to get your Brex API token: Step-by-step guideHow to get your Bullhorn OAuth2 Client ID, OAuth2 Client Secret, API Username and API Password: Step-by-step guideHow to get your Ceridian Dayforce Username, Password and Client Namespace: Step-by-step guideHow to get your Crelate API key: Step-by-step guideHow to get your Dashlane API Key: Step-by-step guideHow to get your Deel Access Token: Step-by-step guideHow to get your Dialpad API Key: Step-by-step guideHow to get your Discord OAuth 2 credentials and bot tokenHow to get your ELMO client ID and client secret: Step-by-step guideHow to get your Gainsight Client ID, Client Secret and Gainsight API Domain: Step-by-step guideHow to get your Greenhouse API Key and Job board token: Step-by-step guideHow to get your Helpscout API Key: Step-by-step guideHow to get your HiBob Service User ID and Service User Token: Step-by-step guideHow to get your HighLevel API Key and Location ID: Step-by-step guideHow to get your HubSpot developer key and OAuth 2 credentials (Legacy Apps)How to get your Humaans API Key: Step-by-step guideHow to get your iCIMS API Username, API Password and Customer ID: Step-by-step guideHow to get your JobDiva Client ID, Username/email and Password: Step-by-step guideHow to get your Jobvite API Key, API Key Secret and Email: Step-by-step guideHow to get your Lever API Key: Step-by-step guideHow to get your Loxo Agency slug, API Key and Agency ID: Step-by-step guideHow to get your Microsoft Active Directory / Entra ID Client ID, Client Secret and Tenant ID: Step-by-step guideHow to get your Microsoft Azure AD OAuth 2 credentialsHow to get your OAuth 2 credentials for GmailHow to get your OAuth 2 credentials for Microsoft Dynamics 365How to get your OAuth 2 credentials in PipeDriveHow to get your OpenAI API Key: Step-by-step guideHow to get your Paycom SID/Username and Token/Password: Step-by-step guideHow to get your PCRecruiter Username, Password, Database ID, App Key and App ID: Step-by-step guideHow to get your SAP SuccessFactors (OpenID Connect) Username, Password, Client ID, Client Secret, Dependency Name, IAS Host and API URL: Step-by-step guideHow to get your SAP SuccessFactors Username, Company ID, Password and API URL: Step-by-step guideHow to get your Shopify Admin API access token and Store ID: Step-by-step guideHow to get your Wayfair Client ID, Client Secret and Vendor Encrypted Key: Step-by-step guideHow to get your Workable API Token and Subdomain: Step-by-step guideHow to get your yotpo APP Key / Store ID and Secret Key: Step-by-step guideHow to Handle Attachments in Invoice, Bill and Credit MemoHow to migrate or import your integrations into Unified.toHow to obtain your GitHub OAuth2 credentialsHow to Power Claude with Live Customer Data Using Unified MCPHow to register a Google developer app and get OAuth 2 credentialsHow to register a Salesforce developer app and get OAuth 2 credentialsHow to register a Slack developer account and get OAuth 2 credentialsHow to Register a Workday Developer App and Get OAUTH2 CredentialsHow to Register a Workday Developer App and Get OAUTH2/ SOAP CredentialsHow to Register a ZendeskSell Developer App and Get OAUTH2 CredentialsHow to Register a Zoho Developer App and Get OAUTH2 CredentialsHow to Register an ADP Developer App and Get OAUTH2 CredentialsHow to Register an Atlassian Developer App and Get OAUTH2 CredentialsHow to Register your Facebook OAuth2 ApplicationHow to Register your Google Ads OAuth2 ApplicationHow to Register your MetaAds OAuth2 applicationHow To Request & Write Raw Integration DataHow to Retrieve Microsoft Dynamics 365 Business Central CredentialsHow to set up a custom API URL with a CNAMEHow to Set Up a Microsoft Teams Bot with UnifiedHow to set up and configure NotionHow to set up Google Business Profile API access and get OAuth 2 credentialsHow to Set Up LinkedIn Webhooks with UnifiedHow to set up native webhooks for QuickBooks Online with UnifiedHow to set up Slack webhooks using event subscriptionsHow to set up Telegram (bot) with Unified.toHow to set up your scopes in HubSpotHow to setup a Freshbooks developer appHow to setup a TikTok Shop applicationHow to Setup AWS Assume Role for AWS Secret ManagerHow to setup Oracle JD EdwardsHow to Setup Quickbooks DesktopHow to setup Sage 100 with Unified.toHow to troubleshoot unhealthy connectionsHow to troubleshoot unhealthy webhooksHow to use SCIM with the Unified APIHow to use the Passthrough APIHow to Use Unified.to's Generative AI API with OpenAI and ClaudeHow to use User Provisioning and Verification with UnifiedHow virtual webhook retry and recovery worksIntegration set-up guide for LeverManaging custom validation rules in SalesforceNetSuite Authentication Setup for UnifiedNotice of Deprecation of Fields and Objects (Nov 2025)Oracle HCM / Taleo OAuth Credentials GuideRetrieval-Augmented Generation (RAG)SalesForce (External Client Apps) on Multiple OrganizationsSAML Single-Sign-OnScaling MCP Tools with Anthropic's (& OpenAI's) Defer LoadingSet Environments for your Unified.to WorkspaceSetting up a Slack Bot Connection with Unified.toSetting up OAuth 2 Credentials for Greenhouse's APIsTrello Connection Guide in UnifiedUnderstanding OAuth2 Authorization flowsUnderstanding Response Time Headers in the Unified APIUnified Assessment API: Embed Assessments Inside ATS PlatformsUnified's MCP ServerUnified MCP Server with LangChain and LangGraphUnlock real-time data with virtual webhooksUse Unified to sign in your users into your applicationWorkable: Creating candidates and attaching them to jobsWorkday vs Workday Legacy — Why Unified.to Supports BothWorking with hierarchical tree data in Storage, Messaging, and KMS APIs
Are we missing anything? Let us know
Was this page helpful?