---
title: "Verification status change"
method: POST
path: "verification-update"
tags: ["Webhooks"]
---

# Verification status change

`POST verification-update` (webhook)

Webhook that is called when a customer's KYC/KYB verification status changes.
This endpoint should be implemented by clients of the Grid API.

### Authentication
The webhook includes a signature in the `X-Grid-Signature` header that allows you to verify that the webhook was sent by Grid.
To verify the signature:
1. Get the Grid API public key provided to you during integration
2. Decode the base64 signature from the header
3. Create a SHA-256 hash of the request body
4. Verify the signature using the public key and the hash

If the signature verification succeeds, the webhook is authentic. If not, it should be rejected.

## Payload

- VerificationWebhook
  - `id` string, required — Unique identifier for this webhook delivery (can be used for idempotency)
  - `type` 'VERIFICATION.APPROVED' | 'VERIFICATION.REJECTED' | 'VERIFICATION.RESOLVE_ERRORS' | 'VERIFICATION.IN_PROGRESS' | 'VERIFICATION.PENDING_MANUAL_REVIEW', required — Type of webhook event in OBJECT.EVENT dot-notation. The part before the dot identifies the resource, the part after identifies the event. This lets consumers route purely on type without inspecting data.status.
  - `timestamp` string, date-time, required — ISO 8601 timestamp of when the webhook was sent
  - `data` Verification, required
    - `id` string, required — Unique identifier for this verification
    - `customerId` string, required — The ID of the customer being verified
    - `verificationStatus` 'RESOLVE_ERRORS' | 'PENDING_MANUAL_REVIEW' | 'IN_PROGRESS' | 'APPROVED' | 'REJECTED' | 'READY_FOR_VERIFICATION', required — Current status of the KYC/KYB verification
    - `errors` VerificationError[], required — List of issues preventing verification from proceeding. Empty when verificationStatus is APPROVED or IN_PROGRESS.
      - `resourceId` string, required — ID of the resource with the issue (Customer, BeneficialOwner, or Document)
      - `type` 'MISSING_FIELD' | 'INVALID_FIELD' | 'MISSING_LEGAL_PRESENCE_DOCUMENT' | 'MISSING_CONTROL_STRUCTURE_DOCUMENT' | 'MISSING_OWNERSHIP_STRUCTURE_DOCUMENT' | 'MISSING_PROOF_OF_ADDRESS_DOCUMENT' | 'MISSING_IDENTITY_DOCUMENT' | 'INVALID_DOCUMENT' | 'EXPIRED_DOCUMENT' | 'POOR_QUALITY_DOCUMENT' | 'SUSPECTED_FRAUD_DOCUMENT' | 'WRONG_DOCUMENT_TYPE' | 'INCOMPLETE_DOCUMENT' | 'UNREADABLE_DOCUMENT' | 'DOCUMENT_VERIFICATION_FAILED' | 'APPLICANT_SANCTIONED' | 'APPLICANT_FRAUD' | 'APPLICANT_CRIMINAL_RECORD' | 'APPLICANT_REJECTED' | 'MISSING_BENEFICIAL_OWNER' | 'MISSING_CONTROL_PERSON' | 'MISSING_GOOD_STANDING_DOCUMENT', required — Type of verification error. The category-specific MISSING_*_DOCUMENT types indicate which document category is needed. Document quality types (POOR_QUALITY_DOCUMENT, SUSPECTED_FRAUD_DOCUMENT, etc.) indicate specific issues with uploaded documents. APPLICANT_* types indicate issues with the applicant themselves (sanctions, fraud, criminal records).
      - `field` string — Dot-notation path to the field with the issue. Present when type is MISSING_FIELD or INVALID_FIELD.
      - `acceptedDocumentTypes` DocumentType[] — Document types that would satisfy this requirement. The integrator can upload any one of the listed types. Present when type is MISSING_LEGAL_PRESENCE_DOCUMENT, MISSING_CONTROL_STRUCTURE_DOCUMENT, MISSING_OWNERSHIP_STRUCTURE_DOCUMENT, MISSING_PROOF_OF_ADDRESS_DOCUMENT, MISSING_IDENTITY_DOCUMENT, INVALID_DOCUMENT, or EXPIRED_DOCUMENT. | Error Type | Accepted Document Types | |---|---| | MISSING_LEGAL_PRESENCE_DOCUMENT | CERTIFICATE_OF_INCORPORATION, ARTICLES_OF_INCORPORATION, ARTICLES_OF_ASSOCIATION, STATE_REGISTRY_EXCERPT | | MISSING_CONTROL_STRUCTURE_DOCUMENT | DIRECTOR_REGISTRY, TRUST_AGREEMENT, STATE_COMPANY_REGISTRY, PARTNERSHIP_CONTROL_AGREEMENT | | MISSING_OWNERSHIP_STRUCTURE_DOCUMENT | SHAREHOLDER_REGISTER, TRUST_AGREEMENT, PARTNERSHIP_AGREEMENT | | MISSING_PROOF_OF_ADDRESS_DOCUMENT | UTILITY_BILL, RENT_OR_LEASE_AGREEMENT, ELECTRICITY_BILL, BANK_STATEMENT, TAX_RETURN | | MISSING_IDENTITY_DOCUMENT | PASSPORT, DRIVERS_LICENSE, NATIONAL_ID |
      - `reason` string, required — Human-readable description of the issue
    - `createdAt` string, date-time, required — When this verification was created
    - `updatedAt` string, date-time — When this verification was last updated

## Acknowledgement `200`

Webhook received successfully

## Other responses

- `400` — Bad request
- `401` — Unauthorized - Signature validation failed
- `409` — Conflict - Webhook has already been processed (duplicate id)

---

[API](https://skmtc.net/stainless-api/apis/grid-api.md) · [All operations](https://skmtc.net/stainless-api/apis/grid-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/stainless-api/grid-api/revisions/151f2d9bad9c/schema)
