Skip to content
Last updated

Webhooks

Use webhooks to receive updates on objects created with the API and to kick off additional workflows based on these events. Each time an event that you subscribed to occurs, Checkr submits a POST request to the designated webhook URL with information about the event. When the include_object option is ON, it also includes the related object.

The User-Agent for the requests will have the prefix Checkr-Webhook/.

To receive webhooks, use the Checkr Dashboard to configure a Webhook URL in the Developer Settings. A maximum of two webhook URLs may be configured. For more information about setting up webhooks, see the Account Settings article in the Checkr Help Center.

Any webhook URL that fails to accept with a 2XX status code at least one request over a period of 60 days will be removed automatically - e.g. webhooks failing for 100% of the requests during 60 or more days. However if no requests have reached into a webhook URL, over the same period of time, it won't be removed.

Webhook payload structure

{
  "id": "1002d6bca6acdfcbb8442178",
  "object": "event",
  "type": "object.event",
  "created_at": "2018-08-17T01:12:43Z",
  "webhook_url": "https://notify.company.com/checkr",
  "data": {
    "object": {
      "id": "a13f4827d8711ddc75abc56ct",
      "object": "object",
      "uri": "/v1/objects/a13f4827d8711ddc75abc56ct"
    }
  }
}

When include_object is ON, the full related object is included in data.object.

Attributes

ParameterTypeDescription
idstringID of the event.
objectstringDefines the object type: event.
typestringThe type of event. Values include: candidate.created, report.completed.
created_attimestamp iso 8601 formatTimestamp for the event.
webhook_urlstringWebhook URL.
datahashObject associated with the event.
include_objectbooleanShould the related object be attached to webhook payload.

Supported webhook URL formats

TypeFormatDescription
HTTPShttps://(<user>:<password>@)<hostname>/<path>
E.g.: https://notify.company.com/checkr
Notes: The endpoint to be reached must be public.
Webhook URLs must be HTTPS.
Basic Auth is supported by adding username:password@ in front of the hostname, credentials must be URL escaped.
SNSsns://<key_id>:<access_key>@<region>/<topic_owner>/<topic_name>
E.g.: sns://AKI95AMUAD5K:a2n66fVKX7%2BYJKid3@us-east-1/12048/checkr
AWS Simple Notification System (SNS)
Notes: Access Key must have only the Publish to SNS right in IAM.
Credentials must be URL escaped.

Responding to webhooks

Your endpoint should respond to webhooks as quickly as possible. To acknowledge receipt of a webhook, your endpoint must return a 2xx HTTP status code. This status code should only indicate receipt of the message, not acknowledgment that it was successfully processed by your system. Any other information returned in the response headers or response body is ignored.

If a webhook is not successfully received for any reason, Checkr will continue trying to send it every minute for 10 minutes, then every hour for 24 hours.

Webhook logs can be found on the dashboard: https://dashboard.checkr.com/webhook_logs

Order of events

Checkr does not guarantee the delivery of events in the order in which they are generated. For example, a report with a result of consider might generate the follow events:

report.completed
report.engaged

Your integration should not expect the delivery of these events to be in this order and should handle this accordingly. For example, you can fetch the report object, and look at report.assessment if you happen to receive the report.completed event later.

Securing webhooks

For greater security, verify that the requests you receive come from Checkr.

We pass along a hash signature with each request in the header X-Checkr-Signature. The hash signature is generated with the HMAC algorithm, using your API key as a key and SHA256 digest mode. When you receive a request, you can compute a hash and ensure that the one from Checkr matches.

Checkr does not issue a dedicated webhook signing secret. Payloads are signed with the oldest Secret API key on your account. Use that same key as the HMAC secret when verifying signatures.

Do not delete your oldest Secret API key. Because it is the key used to sign webhooks, deleting it will break signature verification for all incoming events. If you must rotate it, update your verification logic to the new signing key first.

Example hash signature computation:

printf "$compact_json" | openssl sha256 -hmac "$YOUR_API_KEY"

In this example, $compact_json is the "non-pretty print" version of a JSON object. For example, you can get the compact version of a json file with the jq tool with: compact_json=$(jq -c < example_response.json).

Note: Accounts without an API key will have X-Checkr-Signature set to "Please create an API key to check the authenticity of our webhooks."

Code examples on how to do this can be found here.

Guarding against duplicate and missed report notifications

While webhooks are helpful for updates, they are not foolproof. In some cases, report updates can be sent in rapid succession based on multiple events within the Checkr environment, and may be "mis-heard". For robust webhook handling, we recommend that you account for the following:

  • Duplicate reports (idempotency)
  • Webhook misses

As a best practice, Checkr recommends that you build a safety net to account for duplicate reports. One option might be to build in a function ahead of the status tracker, which copies only one report.completed update per Candidate or Report. This works well with an additional time threshold assigned. (For example, a report is only considered a duplicate if it's within 60 minutes of a previous iteration of that report.)

To address missed webhook updates, you may also consider adding a function to send an alert if no report.completed update is sent within a certain number of days.


Event types

Candidate events

{
  "type": "candidate.created",
  "data": { "object": { "id": "c373384e71a9a02098cb7421", "object": "candidate", ... } }
}
EventDescription
candidate.createdA new Candidate has been created.
candidate.id_requiredAn exception has been raised requiring a copy of the Candidate's identification.
candidate.driver_abstract_requiredAn exception has been raised requiring a Candidate's driver abstract.
candidate.driver_license_requiredAn exception has been raised requiring a copy of the Candidate's driver license.
candidate.updatedA Candidate has been updated.
candidate.pre_adverse_actionAn Adverse Action has been initiated on the Candidate.
candidate.post_adverse_actionAn Adverse Action has been completed on the Candidate.

Invitation events

EventDescription
invitation.createdAn Invitation has been created.
invitation.completedAn Invitation has been completed.
invitation.expiredAn Invitation has expired.
invitation.deletedAn Invitation has been canceled.

Verification events

Verification events are issued during the Exception process when a candidate is issued or has responded to a request to verify submitted PII.

Verification events are issued for exceptions which occur to ask candidates to confirm their Social Security Number, Driver License information, or Education and Employment Verification information.

The list of possible verification types that are in the webhook payload (verification_type inside the data object) can be found here.

EventDescription
verification.createdA verification is created and a request to upload a document or enter the data is forwarded to the candidate.
verification.completedA document is uploaded or data is entered by the candidate.
verification.processedThe data gathered by the verification is processed manually or automatically and a decision is made for the continuation of the background check.

When verifications are automatically processed, and do not require manual input, the verification.processed webhook is sent immediately after the verification.completed webhook. These two webhooks may not arrive "in order".

Report events

{
  "type": "report.completed",
  "data": {
    "object": {
      "id": "4722c07dd9a10c3985ae432a",
      "status": "complete",
      "result": "clear",
      "package": "driver_pro"
    }
  }
}
EventDescription
report.createdA new Report has been created.
report.updatedA Report has been updated while the background check is run. This event is triggered on select update events, which include:
  • Report Estimated Completion Time changed
  • Drug Screening update status event created
report.canceledA Report has been canceled.
report.upgradedA Report has been upgraded. Upgrades can be triggered either from an API call or from the Dashboard ("Upgrade" button). This is useful if you want to run a package (such as an MVR) and then upgrade it on completion (for example: add a County Criminal Search).
report.completedA Report has been completed.
report.suspendedA Report has been suspended. Checkr is waiting for the candidate to provide additional documentation.
report.resumedA Report has resumed. (The candidate has provided documentation to a previously "suspended" Report.)
report.pausedA Report has been paused. The report is awaiting a Review Action decision to continue or skip remaining screenings. For Enterprise Progressive reports, poll Retrieve progressive checkpoint status to see which checkpoint is waiting.
report.disputedA Report has been disputed by a candidate. Once a dispute has been completed, Checkr will trigger the report.dispute_completed webhook to communicate outcomes of the dispute.
report.dispute_completedA Dispute has been completed. The report object includes a dispute_summary object with:
  • unresolved_disputes (boolean): whether any disputes remain unresolved
  • disputes: array of dispute objects, each with:
    • id (string): the dispute ID
    • status (string): the dispute status
    • changes_made (boolean): whether the dispute resulted in changes to the report
    • resolved_at (datetime): when the dispute was resolved
report.pre_adverse_actionThe Pre-Adverse Action notice has been sent to the candidate of that report.
report.post_adverse_actionThe Post-Adverse Action notice has been sent to the candidate of that report.
report.engagedA Report has been adjudicated as "engaged". Use this event to track either all candidates you have officially engaged, or simply those candidates with a "consider" background check report that you have engaged. This can be triggered either from an API call or from the dashboard ("Engage" button).

Adverse Action events

EventDescription
adverse_action.createdA new Adverse Action has been created.
adverse_action.completedAn Adverse Action has been completed. The post-adverse action notice has been sent.
adverse_action.pausedAn Adverse Action has been paused. The post-adverse action notice delivery has been temporarily halted.
adverse_action.resumedA paused Adverse Action has been resumed. The post-adverse action notice will be rescheduled.
adverse_action.canceledAn Adverse Action has been canceled.
adverse_action.notice_not_deliveredThe Adverse Action notice is confirmed to be undeliverable to the candidate of that report. User action is required.

Package events

EventDescription
package.createdA Package has been created.
package.updatedA Package has been updated.
package.deletedA Package has been deleted.

Continuous Check events

EventDescription
continuous_check.subscription_errorAn error occurred when attempting to enroll a Candidate in Continuous MVR.
continuous_check.confirmation_requiredA Candidate has been unenrolled from Continuous MVR due to stale or invalid PII. The Candidate sumbitted updated information through the Checkr exception process. Action is required to re-enroll the Candidate.

Form I-9 events

EventDescription
form_i9_v2.createdA new Form I-9 has been created.
form_i9_v2.updatedAn in-progress Form I-9 has received an update. This usually means a change in status — for example, Section 1 being signed by a candidate, or a change in E-Verify status for a worksite with E-Verify enabled.

You can find information about Form I-9 statuses in the Form I-9 reference section
form_i9_v2.completedA Form I-9 has reached an authorized status.