Skip to main content
Karsa represents both people and businesses as Customers. Set type to BUSINESS when creating a business and INDIVIDUAL when creating a person. There are two supported ways to provide business data: The atomic route is a convenience operation over the Customer model. It does not create a separate kind of Business resource.

Before you send the request

You need:
  • your Karsa API base URL;
  • a source-bound bearer credential;
  • one stable source identifier for the business;
  • one stable source identifier for every UBO;
  • unique source identifiers for every ownership and role relationship; and
  • one stable Idempotency-Key for this complete onboarding attempt.
Use identifiers from your own system. Do not generate a new externalId when retrying the same customer. Treat dossier.sourceEffectiveAt as the business-time cutoff for the complete snapshot. The business and every beneficial owner’s effectiveAt must be at or before that cutoff. Karsa may receive and record the request later; those availability timestamps do not move the historical business-time cutoff. One request supports at most 50 beneficial owners, 10 role assignments per owner, and 100 total ownership plus role relationships. The complete dossier rules also apply: relationship IDs and provider evidence type/source-record pairs must be unique, every referenced related party must be declared, and all provider evidence must belong to one package with one snapshot observation time no later than sourceEffectiveAt.

Send the canonical three-Customer request

This request creates Example Manufacturing LLC plus Ada and Grace as two separate individual Customers. The two ownership percentages add to 100%, but Karsa does not require every business to use that exact total because sources may provide incomplete or indirect ownership.
Use explicit null when your source states that a nullable fact is unavailable. Do not remove required keys or invent placeholder values. The API Reference is authoritative for the complete field constraints.

Read the response

The response gives the business and each UBO a distinct stable Customer resourceId:
Store all three Customer resourceId values. The UBO IDs can be referenced anywhere another individual Customer can be referenced.

How the API ingests this request

The supported integration boundary is the HTTP API. Karsa processes this request as follows:
  1. Fastify authenticates the bearer credential and binds the request to its tenant and source.
  2. The request schema validates the business, every complete INDIVIDUAL UBO profile, every relationship, and the same complete dossier contract used by the standalone KYB endpoint before any records are committed.
  3. The idempotency receipt and one database transaction cover the complete onboarding operation.
  4. The business and every UBO pass through the same Customer ingestion path used by POST /api/ingestion/customers.
  5. Karsa creates the ownership and role relationships, pins the dossier to the returned business CustomerVersion and the stated business-time cutoff, creates its durable Case, and queues the internal KYB workflow.
  6. The transaction commits and the API returns all Customer, relationship, dossier, Case, and internal workflow identifiers.
Our local acceptance test follows this exact path: it sends the authenticated request to the local Fastify server over loopback HTTP, retries it with the same idempotency key, and only then uses read-only PostgreSQL queries to verify the committed rows. It does not insert test records directly into the database.

What Karsa commits

Karsa validates the whole request before committing it. One successful request writes:
  1. one stable business Customer and its immutable CustomerVersion;
  2. one stable individual Customer and CustomerVersion for every UBO;
  3. versioned beneficial-ownership and role relationships from each UBO Customer to the business Customer;
  4. one immutable KYB dossier pinned to the business CustomerVersion;
  5. one durable Case in PROCESSING; and
  6. one queued internal KYB workflow run.
These writes are atomic. If Customer validation, a relationship, the dossier, or the KYB runtime fails, none of the Customers or relationships from that request are committed.

Retry safely

After a timeout or ambiguous network response, send the exact same body with the same Idempotency-Key. Karsa returns the original response instead of creating duplicate Customers, relationships, dossiers, Cases, or workflow runs. Use a new idempotency key only for a new logical submission. Keep each source externalId stable so later observations append immutable versions to the same Customer identity.

Use separate requests when you need more control

You can instead create the business and each person separately through POST /api/ingestion/customers, then submit the KYB dossier. That pattern is useful when the people already exist as Customers or arrive at different times. Use the atomic onboarding route when your system needs certainty that the business and every supplied UBO were accepted together.
  • Customers: understand business and individual Customer records
  • KYB dossiers: submit evidence for an existing business CustomerVersion
  • Upload flow: connect documents, accounts, transactions, and outcomes
  • API Reference → Customers → Create a business and its UBO customers: inspect every field and error