---
title: "KYC customer status change"
method: POST
path: "kyc-status"
tags: ["Webhooks"]
---

# KYC customer status change

`POST kyc-status` (webhook)

Webhook that is called when the KYC status of a customer is updated.
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.

### KYC/B Flow
This webhook is triggered when KYC/B has reached a decision on a customer. Generally most customers will finish KYC within a few minutes. Others might be rejected because of incorrect data passed in or may have been flagged for manual review.
The webhook will only trigger for final states. This will be APPROVED, REJECTED, EXPIRED, CANCELED, MANUALLY_APPROVED, MANUALLY_REJECTED.

  * APPROVED: The customer has been approved.
  * REJECTED: The customer has been rejected after a KYC check.
  * PENDING_REVIEW: KYC check is in progress.
  * EXPIRED: KYC check has expired. This is generally because a customer did not submit all required information needed within a session.
  * CANCELED: KYC check was canceled.
  * MANUALLY_APPROVED: The customer was manually approved.
  * MANUALLY_REJECTED: The customer was manually rejected.
  * NOT_STARTED: KYC has not started on the customer.

## Payload

- KycStatusWebhook
  - `timestamp` string, date-time, required — ISO8601 timestamp when the webhook was sent (can be used to prevent replay attacks)
  - `webhookId` string, required — Unique identifier for this webhook delivery (can be used for idempotency)
  - `type` 'INCOMING_PAYMENT' | 'OUTGOING_PAYMENT' | 'TEST' | 'BULK_UPLOAD' | 'INVITATION_CLAIMED' | 'KYC_STATUS' | 'ACCOUNT_STATUS', required — Type of webhook event, used by the receiver to identify which webhook is being received
  - `customerId` string, required — System generated id of the customer
  - `kycStatus` 'APPROVED' | 'REJECTED' | 'PENDING_REVIEW' | 'EXPIRED' | 'CANCELED' | 'MANUALLY_APPROVED' | 'MANUALLY_REJECTED', required — The current KYC status of a customer

## Acknowledgement `200`

Webhook received successfully

## Other responses

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

---

[API](https://skmtc.dev/lightsparkdev/apis/grid-api.md) · [All operations](https://skmtc.dev/lightsparkdev/apis/grid-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/lightsparkdev/grid-api/revisions/9ae8cc2fa307/schema)
