Skip to content
Last updated

Webhook Configuration

Overview

When a Clearspeed assessment result is published, Clearspeed sends the result payload as an HTTP POST to a webhook URL you configure. This eliminates the need to poll for results — your system is notified in real time.

Each questionnaire has its own webhook URL configured independently from within the webapp.

This page covers:


Configuring Your Webhook URL

  1. Open the questionnaire in the Clearspeed web app.
  2. In the questionnaire-specific left navigation bar, click Integration.
  3. In the Webhook Integration section, enter your endpoint URL in the Web Hook URL field.
  4. Configure the authentication method (see below).

Integration page showing the Webhook Integration section with Web Hook URL field and Authentication Method button Screenshot placeholder — Integration page, Webhook Integration section

Your endpoint must be reachable from Clearspeed's servers over HTTPS. It does not need to be publicly exposed without authentication — Clearspeed will authenticate to your endpoint using the method you configure.


Securing Your Webhook Endpoint

Click Modify API Key Or Client Credentials to open the Authentication Method dialog. Two options are available:

Option 1 — API Key

Select API Key and enter the key value your endpoint expects. Clearspeed will include this value as a header on every webhook request, allowing your endpoint to verify the request is genuinely from Clearspeed.

Authentication Method dialog with API Key option selected Screenshot placeholder — Authentication Method dialog, API Key selected

Option 2 — Client Credentials (OAuth2)

Select Client Credentials and provide the following values from your identity provider:

FieldDescription
Token URLThe OAuth2 token endpoint Clearspeed uses to obtain a bearer token
AudienceThe audience claim for the token (if required by your IdP)
Client IDThe client ID issued by your IdP
Client SecretThe client secret issued by your IdP

Clearspeed will perform the client credentials flow before each delivery and send the resulting bearer token as an Authorization: Bearer <token> header with each webhook request.

Authentication Method dialog with Client Credentials option selected, showing Token URL, Audience, Client ID and Client Secret fields Screenshot placeholder — Authentication Method dialog, Client Credentials selected

Click Save to apply the configuration.


Acknowledging Receipt

Your endpoint must return HTTP 200 to acknowledge successful receipt of the webhook payload. Any other status code (or a connection timeout) is treated as a delivery failure.

Clearspeed does not retry automatically on failure — see Retrying failed deliveries below.

Keep your endpoint response fast. Perform any heavy processing asynchronously after returning 200.


Retrying Failed Deliveries

If a webhook delivery fails (non-200 response or timeout), the original payload is stored. A Retry Webhook button appears in the Webhook Delivery Failed row on the Integration page — but only when there are failures from the past 15 days. If no recent failures exist, this row is not shown.

Clicking Retry Webhook resends all failed payloads from the past 15 days to your currently configured endpoint. Failures older than 15 days cannot be retried.

Integration page showing the Webhook Delivery Failed row with the Retry Webhook button Screenshot placeholder — Integration page, Retry Webhook button


Webhook Payload

Clearspeed sends a POST request with a JSON body. See the Integration API reference for the full payload schema and examples covering all result types (Result Published, Attempted - Incomplete, Attempted - Partial, Under Review, and Precision evaluations).

A representative payload looks like this:

{
  "project_uuid": "fd9690b0-9050-4acd-ad74-7f906c07fe93",
  "callback_type": "Result Update",
  "interview_ref_num": "7858934895810",
  "access_code": "71360059",
  "status": "Result Published",
  "overall_evaluation": "HR",
  "summary": "HR",
  "summary_bgcolor": "#dc3545",
  "clear": false,
  "is_admission": false,
  "is_counter_measure": false,
  "is_not_complete": false,
  "participant_language": "English",
  "questions_risk_rating": [
    { "sequence": "1", "risk_level": "HR", "text": "Question 1" },
    { "sequence": "2", "risk_level": "LR", "text": "Question 2" }
  ]
}