Setting up webhooks today? Start with the main Webhooks guide. This page documents behaviour specific to connectors on the legacy unified APIs - synthetic events, the unified event catalog, and the unified payload shape with
raw_event / event_data.Event types
When you subscribe a webhook to a unified resource, the event can be delivered to you in one of three ways depending on the underlying provider’s capabilities.- Programmatic native events - generated by the underlying provider and mapped to a StackOne unified resource event. When you subscribe, StackOne programmatically creates an event subscription in the provider’s system for every currently linked account, and for any future linked account.
- Manual native events - also provider-generated and mapped to a unified resource event, but the provider doesn’t expose an API to register subscriptions. StackOne gives you a URL and a secret per linked account, which you (or the account owner) register manually in the provider’s admin UI.
- Synthetic events - when a provider has no native webhooks at all, StackOne polls the provider on a schedule and emits an event when it detects a change. Default poll interval is 1 hour, configurable down to 5 minutes where the provider supports time-based filtering.
How synthetic webhooks work
Synthetic webhooks are generated through intelligent polling and change detection. No PII is stored - only a cryptographic hash of each resource state, so we can detect changes without persisting the underlying data.Polling
StackOne polls the provider for resource updates (default: every 1 hour, configurable down to 5 minutes).
How native webhooks work
Native webhooks (programmatic or manual) flow directly from the provider through StackOne to your endpoint, without polling.Event subscription lifecycle
- When a webhook is created, StackOne programmatically creates the relevant event subscriptions in the provider’s system for every currently linked account, and for any future linked account.
- When a webhook is deleted, StackOne cleans up those programmatic subscriptions.
- When a webhook is disabled, StackOne stops delivering events to your URL, but the subscriptions in the provider’s system remain active.
- When a webhook is enabled, delivery resumes.
Unified event catalog
These are the events emitted across the legacy unified APIs. Theevent value follows the pattern <resource>.<action>.
| Category | Resource | Events |
|---|---|---|
| Accounts | Accounts | account.created, account.updated, account.deleted |
| HRIS | Employees | hris_employees.created, hris_employees.updated, hris_employees.deleted |
| Employments | hris_employments.created, hris_employments.updated, hris_employments.deleted | |
| ATS | Assessments | ats_assessments.created, ats_assessments.updated, ats_assessments.deleted |
| Candidates | ats_candidates.created, ats_candidates.updated, ats_candidates.deleted | |
| Applications | ats_applications.created, ats_applications.updated, ats_applications.deleted | |
| Interviews | ats_interviews.created, ats_interviews.updated, ats_interviews.deleted | |
| Jobs | ats_jobs.created, ats_jobs.updated, ats_jobs.deleted | |
| Job Postings | ats_job_postings.created, ats_job_postings.updated, ats_job_postings.deleted | |
| Lists | ats_lists.created, ats_lists.updated, ats_lists.deleted | |
| Users | ats_users.created, ats_users.updated, ats_users.deleted | |
| CRM | Accounts | crm_accounts.created, crm_accounts.updated, crm_accounts.deleted |
| Contacts | crm_contacts.created, crm_contacts.updated, crm_contacts.deleted | |
| LMS | Assignments | lms_assignments.created, lms_assignments.updated, lms_assignments.deleted |
| Completions | lms_completions.created, lms_completions.updated, lms_completions.deleted | |
| Content | lms_content.created, lms_content.updated, lms_content.deleted | |
| Courses | lms_courses.created, lms_courses.updated, lms_courses.deleted | |
| Users | lms_users.created, lms_users.updated, lms_users.deleted | |
| Documents | Files | documents_files.created, documents_files.updated, documents_files.deleted |
| Folders | documents_folders.created, documents_folders.updated, documents_folders.deleted |
Account events
Account events fire when a linked account is created, updated, or deleted. They’re useful for kicking off an initial sync or reacting to a customer disconnecting.account.updated:
Unified resource event payload
Unified events cover a resource type - an employee, a job, a candidate, etc. Native events includeraw_event (the original payload from the provider) and event_data (as much of that payload as we could map). Synthetic events do not, because the hashing flow never has the underlying data in hand.
Synthetic event example
Native event example
What’s not in the payload
Webhook payloads identify which resource changed, not which fields changed. To see the change, fetch the current state via the unified API usingrecord_id and account_id, and diff against your stored copy. This keeps the payload provider-agnostic and avoids putting sensitive data on the wire.
Sample consumer (Node.js)
The signature header and verification logic are the same as on the current platform - what’s specific to the legacy world is just the shape ofreq.body.
Troubleshooting (unified specifics)
For general webhook troubleshooting (delivery failures, signature mismatches, 5xx loops), see the main webhooks guide. The items below are specific to unified connectors.- Synthetic event delays - if events are arriving up to an hour late, that’s the default poll cadence. Ask support about reducing the interval for your account if the provider supports time filtering.
- Missing
raw_event/event_data- expected on synthetic events. If you need the full provider payload, the underlying provider only supports synthetic delivery for that resource. - Provider subscription not created - happens when the linked account was made before the webhook existed, or when an API key used for the link lost a required scope. The Health tab on the legacy webhook view shows the status of each underlying provider subscription.
record_remote_idmissing - older webhook payloads predate that field. Userecord_id(the StackOne ID) and resolve to the remote ID via the API if you need it.