Webhooks
A webhook is a URL on your side that Deeper Signals calls with an HTTP POST and a JSON body when something happens on your account. Use webhooks instead of polling to learn when someone has completed an assessment.
Setup
- Webhooks are a feature Deeper Signals enables per account. Ask your customer success contact if you do not see them.
- An account administrator registers the URL in the admin app under Settings → Integrations → Webhooks. Up to 5 webhooks per account.
- Each webhook can be limited to specific events and specific user groups. Leaving either empty means "all".
Your endpoint must accept POST with Content-Type: application/json over HTTPS and answer with any 2xx status.
Events
event | When |
|---|---|
UserCreated | A user was created on the account, by any means (admin app, API, SSO, SCIM, CSV import, campaign). |
UserDeleted | A user was deleted. |
AssignedAssessmentFinished | A user completed an assessment. The payload includes the scores. |
UserCreated and UserDeleted
{
"event": "UserCreated",
"id": 15768,
"email": "jane.doe@example.com",
"first_name": "Jane",
"last_name": "Doe",
"created_at": "2026-10-01 14:42:42",
"account": { "name": "Example Corp", "index_name": "examplecorp" }
}
UserDeleted has the same shape with "event": "UserDeleted". Store id: it is the ds_id you can later send in an SSO JWT and the {user_id} of every user endpoint.
AssignedAssessmentFinished
{
"event": "AssignedAssessmentFinished",
"id": 28663,
"full_name": "Jane Doe",
"email": "jane.doe@example.com",
"employee_id": "EMP-1042",
"groups": ["sales"],
"company": "N/A",
"country": "N/A",
"ethnicity": "Prefer not to say",
"locale": "en",
"age": "N/A",
"gender": "N/A",
"account": { "name": "Example Corp", "indexName": "examplecorp" },
"assessment": {
"name": "Core Drivers",
"id": 49344,
"assessment_library_id": 24,
"status": "completed",
"retake": false,
"score_type": "core_drivers_leadership",
"user_reports": [
{ "assigned_user_report": { "id": 33005, "userReportName": "Core Drivers Pro" } }
]
},
"scales": {
"Drive": 74.83,
"Drive//Leading": 72.54,
"Drive//Confident": 79.94,
"Openness": 38.26,
"Openness//Artistic": 30.44,
"Stability": 43.06,
"Extraversion": 36.8,
"Agreeableness": 34.86,
"Conscientiousness": 11.43,
"Candid": 65.14,
"Driven": 74.83
}
}
idis the user id;assessment.idis the id of this user's assessment instance;assessment.assessment_library_ididentifies the assessment product (seeGET /assessment_libraries).scalescontains the scores. Keys are scale names;Parent//Childkeys are sub-scales. Scales differ per assessment: the example above is Core Drivers. Usescore_typeto know which set to expect.assessment.user_reportslists the reports the user can see for this assessment. Useassigned_user_report.idwithPOST /share/v2/token/user-report/{locale}or the PDF endpoints to fetch the report.
Delivery
- One
POSTper webhook per event, sent from a background worker shortly after the event. - There is no signature header today. Protect your endpoint by keeping the URL unguessable (for example include a long random path segment) and validating
account.index_name. - If your endpoint is down the delivery is not retried. Fetch the current state with
GET /users/{user_id}/assessmentsorGET /users/{user_id}/resultswhen you recover. - Reply quickly (
2xxwithin a few seconds) and process the payload asynchronously.
Testing
Point a webhook at a request-capture service, create a user through POST /user and watch UserCreated arrive. For AssignedAssessmentFinished, complete an assessment with a test user on the platform.