Create Batch
Creates a new Bulk Client Import batch for the customer types you select: individuals, companies, or both. At creation the platform freezes the verification schema for the selected types, so the batch is always validated against the requirements that were in effect at this moment, even if they change later.
The new batch starts in status OPEN with all row counters at 0. Counters stay at zero until you commit a manifest; uploading files to storage does not change them.
A batch is created completely or not at all: if any required schema cannot be resolved, no partially usable batch is created.
You can have at most 3 batches that are not closed at the same time. Creating a fourth returns 409; cancel a batch you no longer need to free a slot.
Endpoint
POST /v2/compliance/batch
Link
Request
Headers
Authorization
<JWT>
Yes
Content-Type
application/json
Yes
Accept
application/json
Yes
Body
CreateBatchRequest selects the application types the batch will accept. The platform resolves the matching verification levels automatically.
types
array[string]
Customer types the batch will accept: individual, company, or both. Empty and repeated values are invalid.
Yes
["individual", "company"]
Example Request Body:
{
"types": ["individual", "company"]
}Response (201 Created)
Returns the created Batch object.
Response Fields
batch_id
string
Unique batch identifier. Use it in all other batch methods.
"01a0af8b-831f-7dbe-8eaf-459f81998958"
status
string
Batch status: OPEN, CLOSED, CHANGE_REQUESTED or CANCELLED. Always OPEN for a new batch.
"OPEN"
schema_version
string
Version of the frozen schema snapshot. You can pass it in manifest.json; a foreign value is rejected at commit.
"string"
types
array[string]
Customer types selected at creation.
["individual", "company"]
individual_kyc_level
string
Opaque reference to the individual schema. Empty if individual rows are not enabled.
"string"
company_kyc_level
string
Opaque reference to the company schema. Empty if company rows are not enabled.
"string"
party_kyc_levels
array[string]
Opaque references to associated-party schemas in associated_party_levels of Get Batch Schema, sorted.
["string"]
counters
object
ItemCounters — number of rows per status. Always numbers, including zeros.
see below
processed
boolean
true when every row has reached submitted, invalidor failed.
false
done
boolean
true when every row has a final result.
false
created_at
string (date-time)
When the batch was created.
"2026-09-28T10:15:30Z"
committed_at
string (date-time)
When the batch was last committed. Empty for a new batch.
—
processed_at
string (date-time)
When processed became true. Empty for a new batch.
—
done_at
string (date-time)
When done became true. Empty for a new batch.
—
error
string
Set only if the batch itself failed (e.g. an unreadable manifest). Row-level problems are reported on rows.
""
counters object (ItemCounters)
total
integer
Total rows in the batch.
draft
integer
Rows accepted from the manifest, not yet validated.
valid
integer
Rows that passed validation.
invalid
integer
Rows that failed validation.
creating
integer
Rows whose customer is being created.
submitted
integer
Rows submitted for compliance review.
finished
integer
Approved customers.
change_requested
integer
Rows where reviewers requested changes.
rejected
integer
Rejected customers.
failed
integer
Rows that could not be processed.
Example Response:
Examples
Request — individuals only
Response
Error Responses
Errors are returned as {"code", "message", "details"}, where code is a gRPC status code. Use the HTTP status for error handling.
Invalid Request (400) — types is empty, contains a repeated or unknown value, or a required associated-party structure is not supported:
Authorization fail (401):
Access Restricted (403) — your partner account is not enabled for Bulk Client Import:
Open-Batch Limit Reached (409) — you already have 3 batches that are not closed:
Schema Source Unavailable (503) — the verification schema could not be resolved right now. No batch is created; retry later:
Next Steps
Get the schema — call
GET /v2/compliance/batch/{batch_id}/schemato see which fields, documents, questionnaire answers and associated parties each row needs.Get the example manifest — call
GET /v2/compliance/batch/{batch_id}/example-manifestand use it as the starting point formanifest.json.Get storage credentials — call
GET /v2/compliance/batch/{batch_id}/credentialsand upload documents and the manifest.
Notes
Frozen schema: the requirements captured at creation apply for the whole life of the batch. To onboard against newer requirements, create a new batch.
Select only the types you need: rows of a type that was not selected at creation are rejected as
invalid. You can't add a type to an existing batch.Open-batch limit:
OPEN,CLOSEDandCHANGE_REQUESTEDbatches count towards the limit of 3; aCANCELLEDbatch does not. Use Cancel Batch to free a slot.Opaque identifiers:
individual_kyc_level,company_kyc_levelandparty_kyc_levelsare references into the schema returned by Get Batch Schema. Do not parse them or rely on their format.Counters: all counters are
0until the first commit. Uploading files to the prefix does not add rows.
Typical Workflow:
Call
POST /v2/compliance/batchwith the types you plan to onboard.Save
batch_idfrom the response.Fetch the schema and the example manifest.
Get storage credentials, upload documents and
manifest.json.Commit the batch with
POST /v2/compliance/batch/{batch_id}/commit.
Last updated

