Onboarding schema
GET /api/v1/partner/onboarding/schema
Required scope:
partner:read. No customer in the path — the contract is identical for every partner.
Our KYB field set, as data. Build your onboarding form from this response instead of hardcoding seventeen industry strings that drift the day we add one.
Read this first: it describes a fixed schema, it does not accept one
The response says so itself:
"dynamic": {
"custom_fields": false,
"conditional_fields": false,
"partner_defined_fields": false,
"partner_defined_documents": false,
"repeating_groups": true
}
If you are looking for a system where you define the fields and Niftipay renders them, that is not this and does not exist. This is the opposite direction: we publish our fixed contract so you can render it.
repeating_groups: true is the one honest yes — directors[] and ubos[] are
repeating groups. Their shape is fixed; you may send more people, never more
fields. Anything outside this schema is 422, not stored.
Shape
{ "schema_version": "2026-08-27",
"dynamic": { … },
"groups": [
{ "key": "business", "fields": [ … ] },
{ "key": "contact", "fields": [ … ] },
{ "key": "commercial", "fields": [ … ] }
],
"repeating_groups": [
{ "key": "directors", "max_items": 20, "min_items_at_submit": 1, "fields": [ … ] },
{ "key": "ubos", "max_items": 20, "min_items_at_submit": 1, "fields": [ … ] }
],
"declarations": [ … ],
"documents": { "required_at_submit": [ … ], "delete_supported": false, … },
"requirements": { "supported": true, … } }
A field:
{ "key": "industry",
"type": "enum",
"required_at_submit": true,
"options": ["ecommerce_retail", "cannabis", … ],
"notes": "The selection IS the risk classification. No free text beyond `other`." }
| Property | Meaning |
|---|---|
type |
string · enum · boolean · number · date · url · email · array |
required_at_submit |
Whether it must be present before the case leaves draft. Everything is optional on the way there — POST /verifications takes any subset. |
options |
Present for enum, and for array whose items are enum values. |
max_length |
For strings. |
notes |
Rules a type cannot express. Read them. |
Version it, do not poll it
schema_version is a date, and it changes only when a partner could notice —
a field added or removed, an enum value gained or lost, a rule tightened. Never
for wording.
Cache the response against it. Re-fetch on deploy, or when a 422 surprises
you.
What it will not tell you
- Nothing merchant-specific. No per-customer requirements, no progress. Use Retrieve a verification and Requirements for those.
- Nothing about layout. No ordering hints, no field groupings beyond the
three coarse ones, no labels. The
keyis a key, not a caption — you write merchant-facing wording in your own language and voice. - Nothing conditional. There are no “show B only if A” rules to express, because we have none.
The prose version of the same contract, with the reasoning, is the KYB field reference. The endpoint is the one to build against; the page is the one to read.