Webhook Events
Theary delivers webhook events to notify your application about verification status changes. This document provides exhaustive documentation of all event types, payload structures, and field definitions.Payload Structure
All webhook events follow this structure:Top-Level Fields
| Field | Type | Required | Description |
|---|---|---|---|
event | WebhookEventType | Yes | Event type identifier. One of: verification.completed, verification.action_required, verification.notification |
occurredAt | string (ISO 8601) | Yes | Timestamp when the event was generated |
data | object | Yes | Event-specific payload. Structure varies by event type |
WebhookEventType Enum
| Value | Description |
|---|---|
verification.completed | Verification search completed with results |
verification.action_required | Verification requires manual intervention |
verification.notification | Intermediate notification during verification process |
HTTP Headers
Every webhook request includes these headers:| Header | Type | Description |
|---|---|---|
Content-Type | string | Always application/json |
X-Event-Type | WebhookEventType | Event type (e.g., verification.completed) |
X-Event-Id | string (UUID) | Unique delivery identifier for idempotency |
X-Search-Type | SearchType | Search type when available (e.g., EMPLOYMENT) |
X-External-Search-Id | string | External identifier provided at order creation |
X-Endpoint-Source | string | Routing source: type-specific or fallback |
User-Agent | string | Always Theary-Webhook-Delivery/1.0 |
Authorization | string | Basic auth header when configured (format: Basic <base64>) |
X-Webhook-Signature | string | HMAC-SHA256 signature when secret is configured |
Signature Verification
Webhooks are signed using HMAC-SHA256. The signature is provided in theX-Webhook-Signature header with format sha256=<hex>.
Common Enums
SearchType
| Value | Description |
|---|---|
EMPLOYMENT | Employment verification |
EDUCATION | Education/credential verification |
CRIMINAL | Criminal background check |
REFERENCE | Professional reference check |
VerificationChannel
| Value | Description |
|---|---|
EMAIL | Email communication channel |
VOICE | Phone/voice communication channel |
FAX | Fax communication channel |
StandardOutcomeCode
| Value | Terminal | Description |
|---|---|---|
VERIFIED | Yes | Information successfully verified |
NO_RECORD | Yes | No record found for the subject |
THIRD_PARTY | Yes | Requires third-party vendor completion |
WRONG_ORG | Yes | Request misdirected to wrong organization |
INFO_REQUESTED | No | Additional information requested |
INSUFFICIENT | No | Insufficient information to proceed |
RECEIVED | No | Request received, processing |
STARTED | No | Verification process started |
SENT | No | Outbound communication sent |
FAILED | No | Attempt failed (retryable) |
SUPPRESSED | No | Communication suppressed |
Event: verification.completed
Sent when a verification search completes with results.Data Fields
| Field | Type | Required | Description |
|---|---|---|---|
searchId | string (UUID) | Yes | Unique search identifier |
verificationId | string (UUID) | Yes | Verification result identifier |
externalSearchId | string | No | External identifier from order creation |
searchType | SearchType | No | Type of verification performed |
status | string | No | Human-readable status (e.g., QA Review, Completed) |
channel | VerificationChannel | No | Terminal channel that completed the verification |
verificationResult | VerificationResult | Yes | Complete verification result object |
accreditation | AccreditationResult | No | Accreditation data (education searches only) |
VerificationResult Object
| Field | Type | Required | Description |
|---|---|---|---|
id | string (UUID) | Yes | Verification result primary key |
searchId | string (UUID) | Yes | Associated search ID |
outcome | StandardOutcomeCode | Yes | Verification outcome |
resultDetails | string or object | No | Raw extraction data (JSON) |
extractedData | object | No | Parsed extraction data |
submittedAt | string (ISO 8601) | No | When result was submitted |
createdAt | string (ISO 8601) | No | Record creation timestamp |
updatedAt | string (ISO 8601) | No | Record update timestamp |
channel | VerificationChannel | No | Channel that produced the result |
additionalComments | string | No | Free-form notes from verification |
discrepancy | boolean | No | True if verified data differs from provided data |
employmentVerification | EmploymentVerification | Conditional | Present for EMPLOYMENT searches |
educationVerification | EducationVerification | Conditional | Present for EDUCATION searches |
verifier | VerifierProfile | No | Verifier contact information |
VerifierProfile Object
| Field | Type | Required | Description |
|---|---|---|---|
firstName | string | No | Verifier’s first name |
lastName | string | No | Verifier’s last name |
position | string | No | Verifier’s job title or role |
EmploymentVerification Object
Complete employment verification data with provided (claimed) and verified fields.Provided Fields (from applicant/requester)
| Field | Type | Description |
|---|---|---|
providedCompanyName | string | Claimed employer name |
providedContactName | string | Contact name provided |
providedContactNumber | string | Contact phone provided |
providedContactEmail | string | Contact email provided |
providedLocation | string | Employer location |
providedStartDate | string (YYYY-MM-DD) | Claimed employment start date |
providedEndDate | string (YYYY-MM-DD) | Claimed employment end date |
providedPosition | string | Claimed job title |
providedSalary | string | Claimed compensation |
providedAddress1 | string | Employer address line 1 |
providedAddress2 | string | Employer address line 2 |
providedCity | string | Employer city |
providedState | string | Employer state |
providedZip | string | Employer postal code |
Verified Fields (from verification)
| Field | Type | Description |
|---|---|---|
verifiedEntityId | string | Internal employer entity ID |
verifiedCompanyName | string | Confirmed employer name |
verifiedContactName | string | Name of person who verified |
verifiedContactNumber | string | Verified contact phone |
verifiedContactEmail | string | Verified contact email |
verifiedLocation | string | Confirmed employer location |
verifiedPosition | string | Confirmed job title |
verifiedSalary | string | Confirmed compensation |
verifiedContactId | string | Internal contact entity ID |
verifiedStartDate | string (YYYY-MM-DD) | Confirmed start date |
verifiedEndDate | string (YYYY-MM-DD) | Confirmed end date |
verifiedReasonLeft | string | Reason for leaving employment |
verifiedRehire | boolean or null | Rehire eligibility |
comments | string | Additional verifier comments |
doNotContact | boolean | Do-not-contact flag from request |
verifierFirstName | string | Verifier first name |
verifierLastName | string | Verifier last name |
verifierPosition | string | Verifier job title |
Example: Employment Verification (Email)
Example: Employment Verification (Voice)
EducationVerification Object
Complete education verification data with provided and verified fields.Provided Fields
| Field | Type | Description |
|---|---|---|
providedSchoolName | string | Claimed institution name |
providedLocation | string | Institution location |
providedAddress1 | string | Address line 1 |
providedAddress2 | string | Address line 2 |
providedCity | string | City |
providedState | string | State |
providedZip | string | Postal code |
providedContactName | string | Contact name |
providedContactNumber | string | Contact phone |
providedContactEmail | string | Contact email |
providedDegree | string | Claimed degree |
providedMajor | string | Claimed major |
providedMinor | string | Claimed minor |
providedStartDate | string (YYYY-MM-DD) | Attendance start date |
providedEndDate | string (YYYY-MM-DD) | Attendance end date |
providedGraduated | string | Graduation status claimed |
providedGraduationDate | string (YYYY-MM-DD) | Claimed graduation date |
Verified Fields
| Field | Type | Description |
|---|---|---|
verifiedEntityId | string | Internal institution entity ID |
verifiedSchoolName | string | Confirmed institution name |
verifiedLocation | string | Confirmed location |
verifiedDegree | string | Confirmed degree |
verifiedMajor | string | Confirmed major |
verifiedMinor | string | Confirmed minor |
verifiedGpa | string | Confirmed GPA |
verifiedStartDate | string (YYYY-MM-DD) | Confirmed start date |
verifiedEndDate | string (YYYY-MM-DD) | Confirmed end date |
verifiedGraduated | string | Confirmed graduation status |
verifiedGraduationDate | string (YYYY-MM-DD) | Confirmed graduation date |
verifiedContactName | string | Registrar/contact name |
verifiedContactNumber | string | Contact phone |
verifiedContactEmail | string | Contact email |
comments | string | Additional comments |
verifierFirstName | string | Verifier first name |
verifierLastName | string | Verifier last name |
verifierPosition | string | Verifier title |
Example: Education Verification (Fax)
Example: Education Verification (No Record)
AccreditationResult Object
Included in education verification webhooks (verification.completed and verification.action_required).
| Field | Type | Description |
|---|---|---|
reference | AccreditationReference | Input parameters used for lookup |
matches | AccreditationMatch[] | Exact campus/institution matches |
suggestions | CampusSummary[] | Alternate campuses when no exact match |
metadata | AccreditationMetadata | Lookup metadata and status |
note | string | Present when matches is empty; review instructions |
AccreditationReference Object
| Field | Type | Description |
|---|---|---|
name | string | Institution name used for lookup |
date | string | Reference date (graduation/attendance) |
city | string | City filter |
state | string | State filter |
AccreditationMatch Object
| Field | Type | Description |
|---|---|---|
campus | CampusSummary | Campus/institution details |
accreditation | AccreditationEvaluation | Accreditation status details |
CampusSummary Object
| Field | Type | Description |
|---|---|---|
dapipId | string | Database of Accredited Postsecondary Institutions ID |
locationName | string | Campus name |
parentInstitution | string | Parent institution name |
locationType | string | Type: Institution, Branch, etc. |
city | string | City |
state | string | State |
address | string | Full address |
url | string | Institution website |
AccreditationEvaluation Object
| Field | Type | Description |
|---|---|---|
statusLabel | string | Human-readable status |
isAccredited | boolean | Accreditation status |
accreditor | string | Accrediting agency name |
programName | string | Accreditation program |
validFrom | string | Accreditation start date |
validThrough | string | Accreditation end date (null if ongoing) |
reason | string | Explanation of accreditation status |
latestAction | AccreditationAction | Most recent accreditation action |
recordTimeline | AccreditationTimelineItem[] | Historical accreditation records |
AccreditationMetadata Object
| Field | Type | Description |
|---|---|---|
campusesConsidered | number | Number of campuses evaluated |
checkedOn | string | Date of accreditation check |
dataSource | string | Data source identifier |
accreditationStatus | AccreditationStatus | Aggregated status |
AccreditationStatus Enum
| Value | Description |
|---|---|
accredited | Institution is currently accredited |
not_accredited | Institution is not accredited |
unknown | Accreditation status could not be determined |
not_found | No matching institution found |
Event: verification.action_required
Sent when verification cannot proceed without manual intervention.Data Fields
| Field | Type | Required | Description |
|---|---|---|---|
searchId | string (UUID) | Yes | Search identifier |
verificationId | string (UUID) | No | Present when verification record exists |
externalSearchId | string | No | External identifier |
searchType | SearchType | No | Type of verification |
reasonCode | ActionRequiredReasonCode | Yes | Machine-readable reason code |
status | string | No | Human-readable status |
channel | VerificationChannel | No | Channel that triggered the action |
contact | ContactPayload | No | Structured contact information |
metadata | object | No | Additional context and troubleshooting data |
accreditation | AccreditationResult | No | Accreditation data (education with THIRD_PARTY_RECORD) |
ActionRequiredReasonCode Enum
| Code | Description | When Triggered |
|---|---|---|
THIRD_PARTY_RECORD | Requires third-party vendor | Research identified paywalled portal or vendor |
UPSTREAM_ISSUE | External service failure | Fax provider outage, email throttling, API failure |
SYSTEM_FAILURE | Internal system error | Database issue, workflow crash |
SLA_REACHED | SLA timeout exceeded | Search exceeded SLA without result |
HUMAN_ESCALATION | Automation exhausted | No contacts found, retry cap hit, manual review needed |
OTHER | Catch-all | Cases not matching other codes |
ContactPayload Object
Structured contact information based on search type.| Field | Type | Description |
|---|---|---|
type | string | Contact type: EMPLOYMENT, EDUCATION, LICENSE, REFERENCE |
data | object | Type-specific contact data |
EmploymentContactPayload
| Field | Type | Description |
|---|---|---|
providedCompanyName | string | Employer name |
providedContactName | string | Contact name |
providedContactNumber | string | Contact phone |
providedContactEmail | string | Contact email |
providedLocation | string | Employer location |
providedStartDate | string | Employment start date |
providedEndDate | string | Employment end date |
providedPosition | string | Job title |
providedSalary | string | Compensation |
providedAddress1 | string | Address line 1 |
providedAddress2 | string | Address line 2 |
providedCity | string | City |
providedState | string | State |
providedZip | string | Postal code |
doNotContact | boolean | Do-not-contact flag |
EducationContactPayload
| Field | Type | Description |
|---|---|---|
providedSchoolName | string | Institution name |
providedLocation | string | Institution location |
providedAddress1 | string | Address line 1 |
providedAddress2 | string | Address line 2 |
providedCity | string | City |
providedState | string | State |
providedZip | string | Postal code |
providedContactName | string | Contact name |
providedContactNumber | string | Contact phone |
providedContactEmail | string | Contact email |
providedDegree | string | Degree |
providedMajor | string | Major |
providedMinor | string | Minor |
providedStartDate | string | Attendance start |
providedEndDate | string | Attendance end |
providedGraduated | string | Graduation status |
providedGraduationDate | string | Graduation date |
LicenseContactPayload
| Field | Type | Description |
|---|---|---|
providedAgency | string | Licensing agency |
providedLicenseName | string | License/certification name |
providedLicenseNumber | string | License number |
providedReceiveDate | string | Issue date |
providedExpireDate | string | Expiration date |
providedState | string | Issuing jurisdiction |
ReferenceContactPayload
| Field | Type | Description |
|---|---|---|
providedCompanyName | string | Company associated with reference |
providedReferenceName | string | Reference contact name |
providedReferencePhone | string | Reference phone |
providedReferenceEmail | string | Reference email |
providedType | string | Relationship type (e.g., peer, manager) |
providedRelationship | string | Relationship details |
providedReferenceAddress | string | Reference address |
providedReferenceCity | string | City |
providedReferenceState | string | State |
providedReferenceZip | string | Postal code |
providedLocation | string | Location summary |
providedComments | string | Additional notes |
Example: THIRD_PARTY_RECORD (Employment)
Example: THIRD_PARTY_RECORD (Education with Accreditation)
Example: UPSTREAM_ISSUE
Example: SYSTEM_FAILURE
Example: SLA_REACHED
Example: HUMAN_ESCALATION
Example: OTHER
Event: verification.notification
Sent during intermediate stages of verification process.Data Fields
| Field | Type | Required | Description |
|---|---|---|---|
searchId | string (UUID) | Yes | Search identifier |
externalSearchId | string | No | External identifier |
verificationId | string (UUID) | No | Verification record ID when linked |
searchType | SearchType | No | Type of verification |
notificationType | VerificationNotificationType | No | Notification category |
messageId | string | No | Provider message ID |
threadId | string | No | Conversation thread ID |
from | string | No | Sender identity |
subject | string | No | Subject/description |
classification | Classification | No | Message classification |
channels | VerificationChannel[] | No | Active channels |
contactPlan | ContactPlanEntry[] | No | Contact plan (when notificationType is CONTACT_PLAN) |
outboundAttempt | OutboundAttempt | No | Attempt details (when notificationType is OUTBOUND_ATTEMPT) |
inboundMetadata | InboundMetadata | No | Inbound details (when notificationType is INBOUND_MESSAGE) |
VerificationNotificationType Enum
| Value | Description |
|---|---|
CONTACT_PLAN | Research identified viable contacts |
OUTBOUND_ATTEMPT | Outbound communication attempt made |
INBOUND_MESSAGE | Inbound communication received |
Classification Object
| Field | Type | Description |
|---|---|---|
type | string | Classification label (e.g., VERIFICATION_RESPONSE, CALLBACK_REQUEST, INFO_REQUEST) |
confidence | number | Confidence score (0-1) |
ContactPlanEntry Object
| Field | Type | Description |
|---|---|---|
name | string | Contact name |
title | string | Job title/role |
entityName | string | Organization name |
location | string | Location |
method | string | Contact method: EMAIL, VOICE, FAX, or THIRD_PARTY |
destination | string | Email, phone, fax number, or vendor ID |
source | string | Research source (e.g., Search history, Web) |
OutboundAttempt Object
| Field | Type | Description |
|---|---|---|
channel | VerificationChannel | Channel used |
attemptNumber | number | 1-based attempt index |
contactName | string | Contact name |
contactTitle | string | Contact title |
contactEntity | string | Organization |
destination | string | Email/phone/fax destination |
metadata | object | Channel-specific details (e.g., { "callId": "..." }) |
InboundMetadata Object
| Field | Type | Description |
|---|---|---|
summary | string | Content summary |
title | string | Headline/title |
ticketUrl | string | Link to ticket/entry |
linkLabel | string | Display label for URL |
source | string | Source (e.g., MICROSOFT_GRAPH, FAX_WEBHOOK) |
Example: CONTACT_PLAN
Example: OUTBOUND_ATTEMPT
Example: INBOUND_MESSAGE (Email)
Example: INBOUND_MESSAGE (Voice)
Example: INBOUND_MESSAGE (Urgent)
Third-Party Vendor Reference
WhenreasonCode is THIRD_PARTY_RECORD, the metadata object includes vendor information.
Employment Vendors
| Standardized Name | Source Keywords |
|---|---|
THE_WORK_NUMBER | TALX, The Work Number, INVerify, WNFE |
THOMAS_AND_COMPANY | Thomas and Company, Thomas & Co |
PRECHECK | PreCheck, EmpCheck, EmpChek |
VERIFYTODAY | VerifyToday, Verify Today System |
CCCVERIFY | CCC Verify, CCCVerify |
EXPERIAN | uConfirm, Experian Verify |
QUICKCONFIRM | QuickConfirm |
TRUEWORK | Truework, True Work |
VERISAFE_JOBS | Verisafe Jobs |
VAULT_VERIFY | VaultVerify |
VERIFY_FAST | Verify Fast, VerifyFast |
VERIFENT | Verifent |
VERIFY_ADVANTAGE | VerifyAdvantage |
TENSTREET | Tenstreet |
TRUECONFIRM | TrueConfirm |
JOBTRAX | JobTrax |
VERIFICATION_MANAGER | Verification Manager |
Education Vendors
| Standardized Name | Source Keywords |
|---|---|
NSCH_DEGREE_VERIFY | National Student Clearinghouse, NSC, NSCH, DegreeVerify, DiplomaVerify |
PARCHMENT | Parchment |
NEED_MY_TRANSCRIPT | Need My Transcript, NeedMyTranscript, needmytranscript.com |
SCRIBORDER | ScribOrder, Scrib Order, scriborder.com |
AURADATA | AuraData, Aura Data, auradata.com |
DIPLOMA_SENDER | Diploma Sender, diplomasender.com |
CERTREE_EDU | Certree EDU |
UNKNOWN | Unrecognized vendor |
Retry Policy
| Setting | Default | Description |
|---|---|---|
| Retry attempts | 3 | Maximum delivery attempts |
| Backoff | Exponential | 2s, 4s, 8s (with jitter) |
| 4xx errors | Not retried | Client errors are final |
| 5xx errors | Retried | Server errors are retried |
| Timeout | 30 seconds | Per-request timeout |
Configuration
Tenant webhook configuration via policy:Policy Parameters
| Parameter | Default | Description |
|---|---|---|
searchSlaMinutes | 1440 (24h) | Search SLA in minutes |
reassignmentWindowMinutes | 2880 (48h) | Auto-reassignment window |
includeContactPlanInEscalation | false | Include research data in escalation webhooks |
Best Practices
1. Acknowledge Quickly
Return 2xx within 30 seconds:2. Verify Signatures
3. Handle Idempotency
UseX-Event-Id to detect duplicates:
4. Handle All Event Types
Testing
Sample Test Payload
Tools
- ngrok:
ngrok http 3000for local testing - webhook.site: Temporary webhook URL for testing
- Postman: Import payloads for manual testing