Skip to main content

User

This module contains endpoints for creating and managing users.

Standard flow without poa:

  • Create user account and genereate all balances - /v1/user/balances/crypto-and-fiat
  • Add KYC file - /v1/user/kyc-files/:externalUserId or Creating KYC verification - /v1/kyc
  • Add user document verification - /v1/user/verification

Standard flow with poa:

  • Create user account and genereate all balances - /v1/user/balances/crypto-and-fiat
  • Add KYC file - /v1/user/kyc-files/:externalUserId or Creating KYC verification - /v1/kyc
  • Add POA file - /v1/user/poa-files/:externalUserId
  • Add user document verification - /v1/user/verification

If POA files are required, you need to add documents for verification and wait for the response from webhook webhook/poa-verification/status with the verification status.

Balances are created when a user is created, but the IBAN is created when document verification is added to the client.
KYC files for ID_CARD and RESIDENCE_PERMIT documents require a photo of the front, back of the document and a customer selfie, for PASSPORT one photo of the document and a customer selfie are required.

List of countries for which we support IBAN generation:

  • AM
  • AT
  • AZ
  • BE
  • BG
  • CH
  • CY
  • CZ
  • DE
  • DK
  • EE
  • ES
  • FI
  • FR
  • GB
  • GE
  • GR
  • HR
  • HU
  • IE
  • IL
  • IN
  • IS
  • IT
  • LI
  • LT
  • LU
  • LV
  • MD
  • MT
  • NL
  • NO
  • PL
  • PT
  • RO
  • SE
  • SI
  • SK
  • UA

Customers from countries:

  • AM
  • AR
  • AZ
  • GE
  • IL
  • MD
  • UA

proof of address is also required, POA files need to be added in new endpoint /v1/user/poa-files/:externalUserId.


Create user account and genereate all balances

Each user must have unique externalUserId. If user with this externalUserId already exists, error will be thrown. Fiat balances is created asynchronously, when created it gets the status 'WAITING_TO_BE_ACTIVATED', when it is created correctly we will send information about it using a webhook /webhook/user/status and we will change the balance status to 'ACTIVE'

Method: POST
Endpoint: /v1/user/balances/crypto-and-fiat

Request

Request body - required

NameTypeRequiredDescription
externalUserIdstringYesExternal user id (from your system)
emailstringYesEmail
phonestringYesPhone
firstNamestringYesFirst name
lastNamestringYesLast name
addressstringYesAddress
citystringYesCity
postCodestringYesPost code. Postal code should follow the format accepted in the given country.
countrystringYesISO 3166-1 alpha-2 country code. Country of residence
citizenshipstringYesISO 3166-1 alpha-2 country code. Country of issue of the document
documentTypestringYesEnum: [ "PASSPORT", "ID_CARD", "RESIDENCE_PERMIT" ]
documentNumberstringYesDocument number

 

Example body request

{
"externalUserId": "bca65c48-df49-4831-a7b2-de7903321581",
"email": "johndoe@gmail.com",
"phone": "48123123123",
"firstName": "John",
"lastName": "Doe",
"address": "Adama Matuszczaka 51/4",
"city": "Rzeszów",
"postCode": "35-083",
"country": "PL",
"citizenship": "PL",
"documentType": "ID_CARD",
"documentNumber": "CEV124630"
}

Response

Code: 200
Description: Returns our user id and all user balances

 

Response body explanation

{
"userId": "User id (from our system)",
"poaRequired": "Information on whether POA is required",
"fiatBalances": [
{
"id": "Balance id (from our system)",
"amount": "Amount",
"name": "Currency name",
"rate": "Rate",
"iban": "IBAN number",
"status": "Enum: [ 'ACTIVE, 'WAITING_TO_BE_ACTIVATED' ]"
}
],
"cryptoBalances": [
{
"id": "Balance id (from our system)",
"amount": "Amount",
"name": "Currency name",
"wallet": "Wallet address",
"rate": "Rate",
"networkConfig": {
[networkName]: {
"mainnet": "Is mainnet network",
"name": "Network name",
"withdrawal": {
"feeWithdrawal": "Withdrawal fee",
"minWithdrawal": "Withdrawal min amount"
},
"deposit": {
"minDeposit": "Deposit min amount"
},
}
}
}
]
}

 

Example response

{
"userId": "617c6277-41cc-45ab-b2c1-b4187d823827",
"poaRequired": "true",
"fiatBalances": [
{
"id": "02ee1b09-9934-4dcc-8dec-91bf34b8f543",
"amount": "0.00",
"name": "eur",
"rate": 1,
"iban": "LT683130019950000568",
"status": "ACTIVE"
}
],
"cryptoBalances": [
{
"id": "f2de1f4b-916f-417e-9410-8bf4a70693ee",
"amount": "0.000000",
"name": "usdc",
"wallet": "0x2e90ca5bbe46d5ae23f2df90457d020391b92673",
"rate": 0.963728,
"networkConfig": {
"ethereum": {
"mainnet": false,
"name": "sepolia",
"withdrawal": {
"feeWithdrawal": 10,
"minWithdrawal": 15
},
"deposit": {
"minDeposit": 5
}
},
"polygon": {
"mainnet": false,
"name": "amoy",
"withdrawal": {
"feeWithdrawal": 10,
"minWithdrawal": 15
},
"deposit": {
"minDeposit": 5
}
}
}
},
{
"id": "7415034b-3dcf-4f45-a213-ce6361c248aa",
"amount": "0.000000",
"name": "usdt",
"wallet": "0x2e90ca5bbe46d5ae23f2df90457d020391b92673",
"rate": 0.963486,
"networkConfig": {
"ethereum": {
"mainnet": false,
"name": "sepolia",
"withdrawal": {
"feeWithdrawal": 10,
"minWithdrawal": 15
},
"deposit": {
"minDeposit": 5
}
},
"polygon": {
"mainnet": false,
"name": "amoy",
"withdrawal": {
"feeWithdrawal": 10,
"minWithdrawal": 15
},
"deposit": {
"minDeposit": 5
}
}
}
},
{
"id": "ca5f1989-978b-422c-b0bd-b799c5e32fe8",
"amount": "0.00000000",
"name": "ltc",
"wallet": "tltc1qvf4kplcdjzskhukeg58lnde4gxhqv822fpxm2t",
"rate": 128.12666666,
"networkConfig": {
"btc": {
"mainnet": false,
"name": "test",
"withdrawal": {
"feeWithdrawal": 0.002,
"minWithdrawal": 0.004
},
"deposit": {
"minDeposit": 0
}
}
}
},
{
"id": "b28d71d3-60ae-49ac-9346-26bf5358e198",
"amount": "0.00000000",
"name": "pol",
"wallet": "0x2e90ca5bbe46d5ae23f2df90457d020391b92673",
"rate": 0.39908402,
"networkConfig": {
"polygon": {
"mainnet": false,
"name": "amoy",
"withdrawal": {
"feeWithdrawal": 0.001,
"minWithdrawal": 0.00005
},
"deposit": {
"minDeposit": 0
}
}
}
},
{
"id": "d83263ca-3e1f-4190-8739-e99900758ed2",
"amount": "0.00000000",
"name": "eth",
"wallet": "0x2e90ca5bbe46d5ae23f2df90457d020391b92673",
"rate": 3169.4854887,
"networkConfig": {
"ethereum": {
"mainnet": false,
"name": "sepolia",
"withdrawal": {
"feeWithdrawal": 0.003,
"minWithdrawal": 0.006
},
"deposit": {
"minDeposit": 0
}
}
}
},
{
"id": "fae1baed-815b-4b5f-998b-d3b2c36145da",
"amount": "0.00000000",
"name": "btc",
"wallet": "tb1qsclk8wvk7zplp6t8f0954qddctqtvcrhea5gca",
"rate": 100686.13333333,
"networkConfig": {
"btc": {
"mainnet": false,
"name": "test",
"withdrawal": {
"feeWithdrawal": 0.0003,
"minWithdrawal": 0.0003
},
"deposit": {
"minDeposit": 0
}
}
}
}
]
}

 

Code: 400
Description: User exist

Example response

{
"errorCode": "P411",
"errorName": "user-exists"
}

 

Code: 400
Description: User of this country cannot have iban

Example response

{
"errorCode": "P431",
"errorName": "forbidden-country"
}

Add KYC file

Method: POST
Endpoint: /v1/user/kyc-files/:externalUserId

KYC files can be added all at once or you can add individual missing ones. Required files for each type of document:

  • PASSPORT - front, selfie
  • ID_CARD - front, back, selfie
  • RESIDENCE_PERMIT - front, back, selfie

Request

Parameters - required

NameTypeRequiredExampleDescription
externalUserIdstringYesf9b430dc-7e1a-42a0-bbb4-9003935ea9f9External user id (from your system)

Request body (Content-Type: multipart/form-data) - required

NameTypeRequiredDescription
front_idfileYesFront photo of document passed in request. Allowed types: 'image/jpeg', 'image/png', 'image/jpg'. Maximum file size is 2MB
back_idfileNoBack photo of document passed in request. Required only if documentType is ID_CARD and RESIDENCE_PERMIT. Allowed types: 'image/jpeg', 'image/png', 'image/jpg'. Maximum file size is 2MB
selfiefileYesCustomer face photo. Allowed types: 'image/jpeg', 'image/png', 'image/jpg'. Maximum file size is 2MB

Response

Code: 200
Description: KYC files added

Example response

{
"message": "KYC files uploaded successfully"
}

 

Code: 400
Description: User does not exist

Example response

{
"errorCode": "P412",
"errorName": "invalid-user"
}

 

Code: 400
Description: Invalid file type

Example response

{
"errorCode": "P426",
"errorName": "invalid-file-type"
}

Add POA file

Method: POST
Endpoint: /v1/user/poa-files/:externalUserId

POA files must be added all at once. They can be a maximum of 3 files no larger than 5MB.

Request

Parameters - required

NameTypeRequiredExampleDescription
externalUserIdstringYesf9b430dc-7e1a-42a0-bbb4-9003935ea9f9External user id (from your system)

Request body (Content-Type: multipart/form-data) - required

NameTypeRequiredDescription
filesfileYesPOA files, maximum 3 files, no larger than 5MB. Allowed types: 'image/jpeg', 'image/png', 'image/jpg', 'application/pdf'

Response

Code: 200
Description: POA files added

Example response

{
"message": "POA files uploaded successfully"
}

 

Code: 400
Description: File is too large

Example response

{
"errorCode": "P440",
"errorName": "file-too-large"
}

 

Code: 400
Description: File type is not supported

Example response

{
"errorCode": "P426",
"errorName": "invalid-file-type"
}

 

Code: 202
Description: POA verification pending

Example response

{
"errorCode": "P211",
"errorName": "poa-verification-pending"
}

 

Code: 400
Description: POA verification pending

Example response

{
"errorCode": "P447",
"errorName": "poa-already-verified"
}

Add user document verification

For all created users it is required to add documents for verification

Method: POST
Endpoint: /v1/user/verification

Request

Request body - required

NameTypeRequiredDescription
externalUserIdstringYesExternal user id (from your system)
birthDatestringYesBirth date
citystringYesCity
streetstringYesStreet
numberstringYesHouse number
postCodestringYesPost code. Postal code should follow the format accepted in the given country.
nationalitystringYesISO 3166-1 alpha-2 country code. Nationality
documentExpirationDatestringYesDocument expiration date
incomeSourcestringYesEnum: [ 'BUSINESS_ACTIVITY', 'SALARY', 'OTHER', 'MAINTAINED_BY_FAMILY', 'INVESTMENTS', 'SOCIAL_BENEFITS', 'TENANCY' ]
taxIdstringNoClient's tax residency list. Required only if incomeSource is BUSINESS_ACTIVITY
additionalInfostringNoAditional info to income source. Required only if incomeSource is SALARY, OTHER, MAINTAINED_BY_FAMILY, INVESTMENTS, SOCIAL_BENEFITS, TENANCY.
occupationstringYesEnum: [ 'IT', 'HEALTHCARE_AND_MEDICAL_SERVICES', 'FINANCE_AND_ACCOUNTING', 'EDUCATION_AND_TEACHING', 'SALES_AND_MARKETING', 'ENGINEERING', 'CUSTOMER_SERVICE', 'ADMINISTRATION_AND_OFFICE_MANAGEMENT', 'LEGAL_SERVICES', 'ARTS_AND_DESIGN', 'RETAIL_AND_SALES', 'CONSTRUCTION_AND_TRADES', 'HUMAN_RESOURCES', 'MANUFACTURING_AND_PRODUCTION', 'SCIENCE_AND_RESEARCH' ]
riskLvlstringYesEnum: [ 'LOW', 'MEDIUM', 'HIGH' ]

Example body request

{
"externalUserId": "bca65c48-df49-4831-a7b2-de7903321581",
"email": "johndoe@gmail.com",
"phone": "48123123123",
"firstName": "John",
"lastName": "Doe",
"birthDate": "2000-01-01",
"city": "Rzeszów",
"street": "Adama Matuszczaka",
"number": "14/2",
"postCode": "12-123",
"country": "PL",
"nationality": "PL",
"citizenship": "PL",
"documentExpirationDate": "2030-01-01",
"documentNumber": "ABC12345",
"documentType": "ID_CARD",
"incomeSource": "SALARY",
"additionalInfo": "I am a programmer",
"occupation": "IT",
"riskLvl": "LOW"
}

Response

Code: 200
Description: User document verification added

Example response

{
"message": "Verification documents to user added successfully"
}

 

Code: 400
Description: User already verified

Example response

{
"errorCode": "P442",
"errorName": "user-already-verified"
}

 

Code: 400
Description: User has maximum number of verifications

Example response

{
"errorCode": "P430",
"errorName": "maximum-number-of-verifications"
}

 

Code: 400
Description: User does not exist

Example response

{
"errorCode": "P412",
"errorName": "invalid-user"
}

 

Code: 404
Description: Kyc file not found

Example response

{
"errorCode": "P427",
"errorName": "kyc-file-not-found"
}

 

Code: 202
Description: POA file not yet uploaded. Verification is pending and will resume after POA is added

Example response

{
"errorCode": "P210",
"errorName": "poa-file-not-found"
}

 

Code: 202
Description: POA verification pending

Example response

{
"errorCode": "P211",
"errorName": "poa-verification-pending"
}

 

Code: 400
Description: KYC verification is not valid or has expired

Example response

{
"errorCode": "P446",
"errorName": "kyc-verification-is-not-valid-or-has-expired"
}

 

Code: 400
Description: POA verification rejected

Example response

{
"errorCode": "P444",
"errorName": "poa-verification-rejected"
}

 

Code: 400
Description: POA already verified

Example response

{
"errorCode": "P447",
"errorName": "poa-already-verified"
}

Update existing user

Method: PATCH
Endpoint: /v1/user/:externalUserId

Include only fields you want to update. Unable to update country

Request

Parameters - required

NameTypeRequiredExampleDescription
externalUserIdstringYesf9b430dc-7e1a-42a0-bbb4-9003935ea9f9External user id (from your system)

Response

Code: 204
Description: User details updated

Example response

{
"message": "User updated successfully"
}

 

Code: 400
Description: User does not exist

Example response

{
"errorCode": "P412",
"errorName": "invalid-user"
}

 

Code: 400
Description: Changing country not possible

Example response

{
"errorCode": "P452",
"errorName": "country-change-not-possible"
}

Delete user

Method: DELETE
Endpoint: /v1/user/:externalUserId

Deletes user

Request

Parameters - required

NameTypeRequiredExampleDescription
externalUserIdstringYesf9b430dc-7e1a-42a0-bbb4-9003935ea9f9External user id (from your system)

Response

Code: 204
Description: User deleted

Example response

{
"message": "User deleted successfully"
}

 

Code: 400
Description: User does not exist

Example response

{
"errorCode": "P412",
"errorName": "invalid-user"
}

 

Code: 400
Description: User has balance greater than 5 EUR.

Example response

{
"errorCode": "P429",
"errorMessage": "User has balance greater than 5 EUR.",
"errorName": "user-balance-exceeds-limit-exception"
}

Suspend user

Method: PATCH
Endpoint: /v1/user/suspend/:externalUserId

Suspends user. User must not have any active cards to suspend them

Request

Parameters - required

NameTypeRequiredExampleDescription
externalUserIdstringYesf9b430dc-7e1a-42a0-bbb4-9003935ea9f9External user id (from your system)

Response

Code: 204
Description: User suspended

Example response

{
"message": "User suspended"
}

 

Code: 400
Description: User does not exist

Example response

{
"errorCode": "P412",
"errorName": "invalid-user"
}

 

Code: 400
Description: User has active cards and suspension is not possible

Example response

{
"errorCode": "P454",
"errorMessage": "User has active cards and suspension is not possible",
"errorName": "suspend-user-impossible"
}

Unsuspend user

Method: PATCH
Endpoint: /v1/user/unsuspend/:externalUserId

Unsuspends user

Request

Parameters - required

NameTypeRequiredExampleDescription
externalUserIdstringYesf9b430dc-7e1a-42a0-bbb4-9003935ea9f9External user id (from your system)

Response

Code: 204
Description: User unsuspended

Example response

{
"message": "User unsuspended"
}

 

Code: 400
Description: User does not exist

Example response

{
"errorCode": "P412",
"errorName": "invalid-user"
}

Get user balance

Method: GET
Endpoint: /v1/user/:externalUserId/balances

Request

Parameters - required

NameTypeRequiredExampleDescription
externalUserIdstringYesf9b430dc-7e1a-42a0-bbb4-9003935ea9f9External user id (from your system)

Response

Code: 200
Description: Returns all user balances

 

Response body explanation

{
"fiatBalances": [
{
"id": "Balance id (from our system)",
"amount": "Amount",
"name": "Currency name",
"rate": "Rate",
"iban": "IBAN number",
"status": "Enum: [ 'ACTIVE, 'WAITING_TO_BE_ACTIVATED' ]"
}
],
"cryptoBalances": [
{
"id": "Balance id (from our system)",
"amount": "Amount",
"name": "Currency name",
"wallet": "Wallet address",
"rate": "Rate",
"networkConfig": {
[networkName]: {
"mainnet": "Is mainnet network",
"name": "Network name",
"withdrawal": {
"feeWithdrawal": "Withdrawal fee",
"minWithdrawal": "Withdrawal min amount"
},
"deposit": {
"minDeposit": "Deposit min amount"
},
}
}
}
]
}

 

Example response

{
"fiatBalances": [
{
"id": "02ee1b09-9934-4dcc-8dec-91bf34b8f543",
"amount": "0.00",
"name": "eur",
"rate": 1,
"iban": "LT683130019950000568",
"status": "ACTIVE"
}
],
"cryptoBalances": [
{
"id": "f2de1f4b-916f-417e-9410-8bf4a70693ee",
"amount": "0.000000",
"name": "usdc",
"wallet": "0x2e90ca5bbe46d5ae23f2df90457d020391b92673",
"rate": 0.963728,
"networkConfig": {
"ethereum": {
"mainnet": false,
"name": "sepolia",
"withdrawal": {
"feeWithdrawal": 10,
"minWithdrawal": 15
},
"deposit": {
"minDeposit": 5
}
},
"polygon": {
"mainnet": false,
"name": "amoy",
"withdrawal": {
"feeWithdrawal": 10,
"minWithdrawal": 15
},
"deposit": {
"minDeposit": 5
}
}
}
},
{
"id": "7415034b-3dcf-4f45-a213-ce6361c248aa",
"amount": "0.000000",
"name": "usdt",
"wallet": "0x2e90ca5bbe46d5ae23f2df90457d020391b92673",
"rate": 0.963486,
"networkConfig": {
"ethereum": {
"mainnet": false,
"name": "sepolia",
"withdrawal": {
"feeWithdrawal": 10,
"minWithdrawal": 15
},
"deposit": {
"minDeposit": 5
}
},
"polygon": {
"mainnet": false,
"name": "amoy",
"withdrawal": {
"feeWithdrawal": 10,
"minWithdrawal": 15
},
"deposit": {
"minDeposit": 5
}
}
}
},
{
"id": "ca5f1989-978b-422c-b0bd-b799c5e32fe8",
"amount": "0.00000000",
"name": "ltc",
"wallet": "tltc1qvf4kplcdjzskhukeg58lnde4gxhqv822fpxm2t",
"rate": 128.12666666,
"networkConfig": {
"btc": {
"mainnet": false,
"name": "test",
"withdrawal": {
"feeWithdrawal": 0.002,
"minWithdrawal": 0.004
},
"deposit": {
"minDeposit": 0
}
}
}
},
{
"id": "b28d71d3-60ae-49ac-9346-26bf5358e198",
"amount": "0.00000000",
"name": "pol",
"wallet": "0x2e90ca5bbe46d5ae23f2df90457d020391b92673",
"rate": 0.39908402,
"networkConfig": {
"polygon": {
"mainnet": false,
"name": "amoy",
"withdrawal": {
"feeWithdrawal": 0.001,
"minWithdrawal": 0.00005
},
"deposit": {
"minDeposit": 0
}
}
}
},
{
"id": "d83263ca-3e1f-4190-8739-e99900758ed2",
"amount": "0.00000000",
"name": "eth",
"wallet": "0x2e90ca5bbe46d5ae23f2df90457d020391b92673",
"rate": 3169.4854887,
"networkConfig": {
"ethereum": {
"mainnet": false,
"name": "sepolia",
"withdrawal": {
"feeWithdrawal": 0.003,
"minWithdrawal": 0.006
},
"deposit": {
"minDeposit": 0
}
}
}
},
{
"id": "fae1baed-815b-4b5f-998b-d3b2c36145da",
"amount": "0.00000000",
"name": "btc",
"wallet": "tb1qsclk8wvk7zplp6t8f0954qddctqtvcrhea5gca",
"rate": 100686.13333333,
"networkConfig": {
"btc": {
"mainnet": false,
"name": "test",
"withdrawal": {
"feeWithdrawal": 0.0003,
"minWithdrawal": 0.0003
},
"deposit": {
"minDeposit": 0
}
}
}
}
]
}

 

Code: 400
Description: User does not exist

Example response

{
"errorCode": "P412",
"errorName": "invalid-user"
}

Get user transaction history

Transaction history can be returned to one year ago. It is returned for the selected month.
Explanation of types:

  • exchange - currency exchange
  • atmFee - fee charged for ATM transaction
  • sepaDeposit - incoming SEPA transfer
  • sepaTransfer - outgoing SEPA transfer
  • transfer - transfer
  • cardTransaction - card transaction
  • cryptoDeposit - crypto deposit
  • cryptoWithdrawal - crypto withdrawal
  • atmWithdrawal - atm withdrawal
  • fiatDeposit - fiat deposit
  • refund - refund
  • cashback - cashback
  • payment - card payment
  • partialRefund - partial refund
  • fiatWithdrawal - fiat withdrawal
  • transaction - transaction

Explanation of status:

  • SUCCESSFUL - transaction successful
  • UNSUCCESSFUL - transaction unsuccessful
  • IN_PROGRESS - transaction in progress
  • IN_PROGRESS_TR_DATA - transaction needs travel rule data completion

Method: GET
Endpoint: /v1/user/transaction-history/:externalUserId/:month/:year

Request

Parameters - required

NameTypeRequiredExampleDescription
externalUserIdstringYesf9b430dc-7e1a-42a0-bbb4-9003935ea9f9External user id (from your system)
monthnumberYes1Month
yearnumberYes2025Year

Response

Code: 200
Description: Returns user transaction history

 

Response body explanation

[
{
"createdAt": "Transaction created date",
"type": "Transaction type",
"amount": "Transaction amount",
"amountFrom": "Transaction from amount, if the transaction is an exchange",
"currency": "Transaction currency",
"currencyFrom": "Transaction from currency, if the transaction is an exchange",
"status": "Transaction status"
}
]

 

Example response

[
{
"createdAt": "2025-01-20T10:33:23.808Z",
"type": "exchange",
"amount": 0.00220961,
"amountFrom": -20,
"currency": "eth",
"currencyFrom": "doge",
"status": "SUCCESSFUL"
},
{
"createdAt": "2025-01-20T09:59:38.233Z",
"type": "exchange",
"amount": 26.91447658,
"amountFrom": -10,
"currency": "doge",
"currencyFrom": "eur",
"status": "SUCCESSFUL"
},
{
"createdAt": "2025-01-20T09:35:36.182Z",
"type": "exchange",
"amount": 99.9651492,
"amountFrom": -10,
"currency": "doge",
"currencyFrom": "eur",
"status": "SUCCESSFUL"
}
]

 

Code: 400
Description: Invalid month or year

Example response

{
"errorCode": "P403",
"errorMessage": "
The month cannot be less than 1,
The month cannot be longer than 12,
The year must be the current year or the previous year
"
}

 

Code: 400
Description: Invalid date

Example response

{
"errorCode": "P435",
"errorName": "invalid-date"
}

 

Code: 400
Description: User does not exist

Example response

{
"errorCode": "P412",
"errorName": "invalid-user"
}