Business and merchant verification (KYB and KYM)
KYB (know your business) and KYM (know your merchant) extend hosted verification from people to businesses and merchants. Your server creates a one-shot link, the business or merchant completes onboarding on a Noxtica page, and your operators review the case in Backoffice. A backend engineer creates the sessions, and a Backoffice administrator follows them.
Key points
- In developmentBusiness and merchant verification is not generally open. Whether the calls and Backoffice pages work depends on your organisation, so ask your account team.
- A one-shot link, shown onceA KYB or KYM create call returns a hosted link once. KYB needs the write:identity scope and KYM needs write:kym.
- Follow sessions in BackofficeThe KYB and KYM pages list sessions, entities, cases and alerts. These sessions have no server-side status read like the one for identity sessions.
- Monitoring is notify-onlyReported transactions feed alert rules. An alert is a notification for a person to review and never starts a payment.
What it is
Availability: In development. Business and merchant verification is not generally open, and nothing on this page is a commitment on scope, availability or date. Whether the calls and Backoffice pages below work for your organisation depends on your organisation; ask your account team. When it is not available, Backoffice shows “KYB is not available for this workspace yet.” or “Merchant verification (KYM) is not available for this workspace yet.”, and the API answers 404 with V1 endpoint not found.
- KYB is hosted business onboarding. The business representative enters business information, uploads documents, declares owners, reviews and submits. A submitted session goes to human review in Backoffice. This page describes no automated business-registry check.
- KYM is hosted merchant onboarding plus notify-only transaction monitoring. The merchant enters a profile, uploads documents, accepts a declaration, reviews and submits. Your server can also report transactions, which feed alert rules. An alert is a notification for a person to review. It never starts a payment action.
Both hosted pages open as a full page. They cannot be embedded in an iframe. Results are signals: your operators decide, and Backoffice keeps the case and its notes.
| KYB | KYM | |
|---|---|---|
| Create a session | POST /v1/kyb/sessions | POST /v1/kym/sessions |
| Key permission | Verify identity documents (KYC), scope write:identity | Manage KYM merchant onboarding sessions and transactions, scope write:kym |
| Hosted page | https://verify.noxtica.com/b/<token> | https://verify.noxtica.com/m/<token> |
| Link validity, in seconds | 3600 to 2592000, default 604800 | 3600 to 1209600, default 259200 |
| Creates | A business entity in review | A merchant case in open status |
| Session statuses | pending, in_progress, submitted, under_review, completed, expired, abandoned | pending, opened, submitted, under_review, completed, expired, abandoned |
| Hosted steps | business info, documents, UBO declaration, review, submit | profile, documents, declaration, review, submit |
| Backoffice | KYB: Entities, Sessions, Workflows | KYM: Cases, Sessions, Alerts, Alert Definitions |
| Events | kyb.entity.created, kyb.entity.under_review, kyb.entity.closed | kym.alert.created, kym.case.status_changed |
Prerequisites
- Confirmation from your account team that KYB or KYM is enabled for your organisation. Without it, every call below answers
404. - A Backoffice user with the administrator role for the KYB and KYM pages. Changes ask for fresh step-up verification (MFA).
- A server key with the right permission: “Verify identity documents (KYC)” for KYB, and “Manage KYM merchant onboarding sessions and transactions” for KYM. Create it in Backoffice → API & SDK → Server API Keys. The secret is shown once. Server keys start with
sk_prod_. Keep the key on your server. - The hosted verification service configured for your environment. If it is not, session creation answers
503 hosted_verify_not_configured. - For events: an endpoint registered as in Identity verification events and webhooks.
Steps
1. Create a KYB session
POST https://collect.noxtica.com/v1/kyb/sessions
Authorization: Bearer sk_prod_your_server_key
Content-Type: application/json
The body is a JSON object and can be {}. Every field is optional, and the business can fill in the real details on the hosted page. Snake_case names such as legal_name are accepted too.
| Field | Meaning |
|---|---|
legalName | Up to 200 characters. Without it, the session starts with the placeholder “Pending business information”. |
registrationNumber | Up to 64 characters. |
countryOfIncorporation | Two uppercase letters. Without it, the placeholder ZZ is used. |
entityKind | company, partnership, trust, foundation or other. The default is company. |
expiresInSeconds | 3600 to 2592000. The default is 604800. A value outside the range is refused, not adjusted. |
curl -sS https://collect.noxtica.com/v1/kyb/sessions \
-H "Authorization: Bearer $NOXTICA_SERVER_KEY" \
-H "Content-Type: application/json" \
-d '{"legalName":"Example Co","countryOfIncorporation":"GB","entityKind":"company"}'
A new session returns 200:
{
"ok": true,
"sessionId": "<uuid>",
"url": "https://verify.noxtica.com/b/<token>",
"expiresAt": 1790848845000,
"requestId": "<request-id>"
}
url is a one-shot link that carries the access token. It is returned once, in this response, and no later call returns it. Treat it as a secret and do not log it. expiresAt is in epoch milliseconds.
2. Create a KYM session
POST https://collect.noxtica.com/v1/kym/sessions
Authorization: Bearer sk_prod_your_server_key
Content-Type: application/json
| Field | Meaning |
|---|---|
merchantName | Up to 200 characters. Without it, the session starts with the placeholder “Pending merchant information”. |
registrationNumber | Up to 64 characters. |
country | Two letters. Lowercase is changed to uppercase. Without it, the placeholder ZZ is used. |
expiresInSeconds | 3600 to 1209600. The default is 259200. |
The response has the same shape as the KYB response, with a url that starts https://verify.noxtica.com/m/. KYB requires an uppercase country code, and KYM accepts either case.
3. Send the link and follow the session in Backoffice
Send the one-shot url to the business representative or merchant by redirect, email or QR code, as in Identity verification integration. Store the sessionId.
These sessions have no server-side status read like the one for identity sessions. Follow them in Backoffice (the KYB hub is at /kyb and the KYM hub at /kym), or use events:
| Backoffice page | What it does |
|---|---|
| KYB → KYB Entities | Review business entities, ownership graphs, documents, screening, notes and decisions. |
| KYB → KYB Sessions | Start hosted business onboarding and follow each collection session. “Onboarding session history” lists session, entity, status, step, created and expiry. |
| KYB → KYB Workflows | Publish and review the task graphs and form definitions used by KYB cases. |
| KYM → Merchant Cases | Review merchant onboarding and monitoring cases, declared parties, checks and decisions. |
| KYM → KYM Sessions | Start hosted merchant onboarding and follow each session. The history includes the case. |
| KYM → Merchant Alerts | Triage, assign and resolve notify-only transaction-monitoring alerts. |
| KYM → Alert Definitions | Create and deactivate the rules that generate merchant alerts. |
On the two sessions pages, the “Just started — one-time link” table shows a new link once, with “Copy link”, “Open hosted page”, “QR code” and “Live status”. It is not saved anywhere. “Create test session” starts a one-hour session with no real customer data. Its name begins “TEST session ”.
4. Report merchant transactions (KYM)
Report one observed transaction for a merchant case that already exists. Take the caseId from the “Case” column on KYM Sessions or from Merchant Cases.
POST https://collect.noxtica.com/v1/kym/transactions
Authorization: Bearer sk_prod_your_server_key
Content-Type: application/json
{
"caseId": "<case-id>",
"idempotencyKey": "txn-0001",
"amountMinor": 1000,
"currency": "EUR",
"occurredAt": "2026-10-27T09:30:00Z",
"counterpartyRef": "cp_example"
}
| Field | Meaning |
|---|---|
caseId | Required, up to 512 characters. |
idempotencyKey | Required, up to 255 characters. A repeat of the same key returns the original row. |
amountMinor | Required whole number, zero or more, in the currency’s minor unit. |
currency | Required three-letter code. Lowercase is changed to uppercase. |
occurredAt | Required timestamp that parses as a date, for example ISO 8601. |
counterpartyRef | Optional reference of your own. |
A new row returns 201 with {"ok": true, "eventId": "<id>", "deduplicated": false, "requestId": "<request-id>"}. A repeat returns 200 with "deduplicated": true. The body can be at most 4096 bytes. The call only records the event for alert rules. It starts no payment.
5. Subscribe to events
Register an endpoint and tick the labels below under “Events to deliver” in Backoffice → Integrations & API → Webhooks. Signatures, headers and deduplication work as for identity events.
| Event | Label in Backoffice | Fires when |
|---|---|---|
kyb.entity.created | KYB entity created | An operator creates an entity in Backoffice. |
kyb.entity.under_review | KYB entity under review | A hosted session is submitted, a session is started from Backoffice, or an operator moves an entity to review. |
kyb.entity.closed | KYB entity closed | An operator closes the entity. |
kym.alert.created | KYM alert created | A scheduled evaluation creates an alert. |
kym.case.status_changed | KYM case status changed | A hosted session is submitted, or an operator changes the case status. |
The data objects carry no names, registration numbers or party details:
| Event family | data fields |
|---|---|
kyb.entity.* | schemaVersion, entityId, status (active, under_review, suspended or closed, after the change), occurredAt, deliveryId |
kym.* | schemaVersion, caseId, alertId and severity (for kym.alert.created, else null), status (open, under_review, monitoring or closed, for kym.case.status_changed, else null), occurredAt, deliveryId |
{
"id": "<deliveryId>",
"type": "kyb.entity.under_review",
"created_at": 1790762445000,
"tenant_id": "<tenant-id>",
"data": {
"schemaVersion": "1",
"entityId": "<entity-id>",
"status": "under_review",
"occurredAt": 1790762445000,
"deliveryId": "<deliveryId>"
}
}
These events are notifications, not decisions. Business and merchant events are not part of the identity delivery log, and Noxtica publishes no retry schedule for them. kym.* events are attempted once. Plan for a missed event: open the entity or case in Backoffice to see its current state.
Create a KYB session
POST to /v1/kyb/sessions with a write:identity key. Every field is optional, and the response carries the hosted link.
Create a KYM session
POST to /v1/kym/sessions with a write:kym key. The response has the same shape and a link under /m/.
Send the link and follow it
Send the link to the business or merchant and follow the session on KYB Sessions or KYM Sessions in Backoffice.
Report merchant transactions
POST observed transactions for an existing merchant case. They feed alert rules and start no payment.
Subscribe to events
Tick the KYB and KYM labels on the Webhooks page. Treat each event as a notification and confirm state in Backoffice.
Verify it works
- In Backoffice, open KYB → KYB Sessions (or KYM → KYM Sessions) and select “Create test session”. A row appears under “Just started — one-time link”. If you see “KYB is not available for this workspace yet.”, the module is not enabled.
- Select “Open hosted page”, or scan the QR code, and walk through the steps.
- Select “Live status” on the row. It shows the status and the step and refreshes by itself while the panel is open.
- Call the create endpoint with your server key. A
200response withsessionId,urlandexpiresAtmeans the module, the key and the hosted service are all in place. - After the session is submitted, find the entity under KYB Entities or the case under Merchant Cases.
Troubleshooting
| Symptom | Cause | Fix |
|---|---|---|
404 with V1 endpoint not found | The module is not enabled for your organisation, or the path is wrong. | Check the path, then ask your account team. Do not retry in a loop. |
404 with case_not_found on a transaction | No merchant case has that caseId in your organisation. | Copy the case id from Backoffice. |
403 with API key does not have write:identity scope (or write:kym scope) | The key lacks write:identity (KYB) or write:kym (KYM and transactions). | Create a key with the right permission. |
400 with invalid_country | KYB needs two uppercase letters. KYM needs two letters. | Use an ISO country code such as GB. |
400 with invalid_ttl, invalid_legal_name, invalid_merchant_name, invalid_registration_number or invalid_entity_kind | A field is outside the limits above. | Fix the field. A bad expiresInSeconds is refused. |
400 with invalid_case_id, invalid_idempotency_key, invalid_amount, invalid_currency or invalid_occurred_at | A transaction field is missing or malformed. | Fix the field. |
413 with body_too_large | The transaction body is over 4096 bytes. | Send the fields above and nothing else. |
415 with invalid_request | The content type is not JSON. | Send Content-Type: application/json. |
429 with Rate limit exceeded | Too many requests. | Wait for retryAfter or Retry-After. Bounds can change. |
503 with hosted_verify_not_configured | The hosted service is not set up for this environment. | Ask your account team. |
The url was lost | The link is shown once. | Create a new session and let the old one expire. |
Related
- Identity verification events and webhooks — register an endpoint and verify signatures.
- Identity verification integration — the same hosted-link pattern for individuals.
- Identity verification data — Noxtica does not delete verification details or evidence automatically, and an administrator removes them.
- Identity verification FAQ and troubleshooting — common questions.
- Identity verification — the product overview and its limits.
- Server API reference — the generated endpoint reference.