Partner API - User Onboarding Guide
Purpose
This document explains how to onboard a platform user through the Partner API in the test environment: the required step order, which steps are asynchronous, the statuses to wait for, and the most common reasons a step fails.
Note
User vs. Customer. This flow onboards a platform user (a login/operator account, created via POST /users with a type such as ADMIN) - not a banking customer. Onboarding a natural person or legal entity as a customer (reference accounts, products, KYC) is a different flow, documented in Customer Onboarding.
The requests in order
| Step | Method + endpoint | Produces |
|---|---|---|
| Get token | POST /oauth2/token (Auth URL) |
access_token |
| Create user | POST /users |
userId |
| Get user | GET /users/{userId} |
globalId, status |
| Upload document | POST /v2/documents |
documentId |
| Get document | GET /v2/documents/{documentId} |
status |
| Start onboarding | POST /user-onboardings |
onboardingId |
| Get onboarding | GET /user-onboardings/{onboardingId} |
status |
| Reset password | GET /users/{userId}/reset-password |
- |
| Update user | PATCH /users/{userId} |
- |
Run the first seven steps in order. Reset password and update user are post-onboarding operations, run on demand.
Prerequisites
You need your client_id and client_secret, and the Auth URL / API Base URL for your environment - see Partner API Authentication.
General rules
- Order matters. Each step depends on data created by the previous one (
access_token->userId->documentId->onboardingId). Run requests top to bottom. - Most write operations are asynchronous. A
200response means the command was accepted, not that processing finished. Poll the matching GET endpoint until it reports a terminal status before moving on. - Statuses to wait for:
GET /users/{userId}->CREATEDbefore uploading the document.GET /v2/documents/{documentId}->CREATEDbefore starting onboarding.GET /user-onboardings/{onboardingId}->APPROVED(terminal).PENDINGis transient - keep polling.
access_tokenfrom the token request is sent as theauthorizationheader on every subsequent request. If you get401, request a new token (the old one has expired).requestor-idheader - required on the document upload and onboarding writes; it is always the acting user'suserId.- German addresses must be real -
city+zipmust be a matching real pair (e.g.Berlin/10178), otherwise downstream taxpayer creation fails.
User onboarding flow
- Get token -
POST /oauth2/token(grant_type=client_credentials,content-type: application/x-www-form-urlencoded). Returns theaccess_tokenused by all later requests. - Create User -
POST /userswithtype: ADMIN, personal data, nationality,mainAddress, andcontact. Use a unique email per user; a duplicate email is rejected. ReturnsuserId. - Get User -
GET /users/{userId}. Asynchronous: poll untilstatusisCREATEDbefore continuing. ReturnsglobalId. - Upload IDENTIFICATION_CERTIFICATE -
POST /v2/documents(multipart form-data: adocumentmetadata field plus thefile, with theRequestor-IDheader set to theuserId). The file must be a PDF (max ~4 MB). ReturnsdocumentId. - Get Document -
GET /v2/documents/{documentId}. Asynchronous: poll untilstatusisCREATEDbefore starting onboarding. - Start Onboarding -
POST /user-onboardingswith body{ "userId": "<userId>" }and theRequestor-IDheader set to the sameuserId. ReturnsonboardingId. - Get Onboarding -
GET /user-onboardings/{onboardingId}. Poll until terminal statusAPPROVED. On failure the response carries the reason - check it before retrying.
Post-onboarding operations
Reset password
GET /users/{userId}/reset-passwordtriggers a password-reset for the user. Run any time after the user exists.
Update user
PATCH /users/{userId}updates mutable user fields:lastName,nationalities,mainAddress,contact,status(e.g.INACTIVE), andmfaType(e.g.SMS).- Send only the fields you intend to change. Re-run
GET /users/{userId}to confirm the new values took effect. - Keep the address rule in mind: if you change
mainAddress, the newcity/zipmust still be a real pair.
Common failure causes - quick checklist
| Symptom | Likely cause |
|---|---|
401 Unauthorized on any request after the token request |
access_token missing or expired - request a new token |
Create User 400 |
Invalid/missing required field, malformed mainAddress, or a duplicate email |
Get User never reaches CREATED |
User processing still in progress - keep polling; if it never settles, check the Create User response |
Document upload 400/415 |
File is not a PDF, exceeds the size limit, or requestor-id header is missing |
Get Document never reaches CREATED |
Upload is async - wait; do not start onboarding until the document is CREATED |
Onboarding stuck PENDING |
Document not CREATED yet, or user not CREATED yet when onboarding started |
Onboarding REJECTED/error |
A prerequisite (user / document) was not in its terminal state - re-check steps 3 and 5, then re-run from a clean user |
| Taxpayer/downstream creation fails later | Fake German city/zip pair in mainAddress |