Skip to main content
Hosted KYC lets you verify a user through a Payward-managed hosted UI. You create or update the user first, start a hosted verification, send the user to the hosted UI, then reconcile the final status through verification, user, and webhook endpoints. Use the Backend verification API instead when your backend already collects document or liveness evidence.
Hosted KYC is asynchronous. Treat the start response as launch material for the hosted UI, not as a final verification decision.

How it works

A typical Hosted KYC integration follows five steps:
1

Create or update the user

Create the Payward user and provide the profile fields required for onboarding.
2

Start Hosted KYC

Call POST /v1/users/{user_id}/verifications/start/hosted with the user ID in the user_id path parameter.
3

Send the user to the hosted UI

Launch the hosted UI with the returned launch fields, or create a one-time link and redirect the user to it.
4

Handle interruptions

Resume the same hosted verification when the user returns to an existing flow.
5

Reconcile status

Use webhooks, the verification endpoints, and Get User to decide what the user can do next.

Base URL

Authentication

All requests require three headers: See Authentication for how to generate the signature.

Step 1 - Create or update the user

Before starting Hosted KYC, create the user and provide the profile fields required for onboarding. Hosted KYC uses the user’s existing Payward profile. Do not send collected evidence or verification results in the hosted-start request. Use these endpoints before starting verification: Store the user ID. The hosted verification endpoints use it as the user_id path parameter.

Step 2 - Start Hosted KYC

Call Start verification from hosted flow when the user is ready to verify:
The request body is empty:
The response includes the public verification ID and hosted UI launch fields:
Store verification_id. You need it to create one-time links, resume the hosted flow, reconcile status, and troubleshoot the user’s verification.

Step 3 - Send the user to the hosted UI

Use the launch method agreed during onboarding. For an embedded launch, use session_token and environment_id from the hosted-start or resume response. Treat session_token as short-lived and do not store it as a long-term credential. For a redirect or shareable link, create a one-time link for the existing verification:
The response includes a full URL and a shortened URL:
Send the user to url or url_short. One-time links are temporary. Create a fresh link if the user needs to return later.

Step 4 - Resume an interrupted flow

If the user returns to an existing hosted verification, resume that verification instead of starting a duplicate one:
The response returns fresh hosted UI launch fields:
Use the returned launch fields for embedded flows. If you need a URL, call Create one-time link for hosted verification after resuming.

Step 5 - Reconcile status

Hosted KYC does not finish in the start response. Reconcile status from webhooks and the latest API state. Use GET /v1/users/{user_id}/verifications/{verification_id} to fetch the latest state for one hosted verification:
If you do not have the verification ID, use GET /v1/users/{user_id}/verifications to list hosted verification attempts:
Example response:
Hosted verification status responses use method: "hosted" and include each covered document role in types. Use the verification status together with Get User: The reasons field only appears when a verification status is failed.

Webhook events

Register webhooks for user lifecycle events so your system does not need to poll continuously after a final user-state change. Webhook events are signals to fetch the latest state, not the complete state by themselves. Webhook delivery can be repeated. Deduplicate events by event_id, return a 2xx response only after accepting the event, and fetch the latest user and verification state before changing what the user can do.

Retry guidance

Use Start verification from hosted flow to create a hosted verification. Do not call it repeatedly to refresh a session or link. Use these follow-up endpoints for the same verification_id: Only start a new hosted verification after a previous attempt reaches a terminal state and your Payward integration allows another attempt.

API reference