Broker API v1
Scroll down for code samples, example requests and responses. Select a language for code samples from the tabs above or the mobile navigation menu.
Authentication:
Generate key pair
Generate private key
shell
$ openssl genpkey -algorithm RSA -out private.pem -pkeyopt rsa_keygen_bits:4096
Convert private key to public key
$ openssl rsa -pubout -in private.pem -out public.pem
Provide us public key use private key to sign jwt token
Generate JWT token
Required claims:
* sub - broker id
* jti - any random identifier, can be used to revoke token
* iat - issued at time
* exp - expiration time
Required headers:
* kid - broker key id
Payload sample:
{
"iat": 1748326149,
"exp": 1748327949,
"sub": "9a3fb417-b125-4a68-9359-bc18e20ee321",
"jti": "01f28c7a-2492-4d5a-a6d9-5ea8575585b7"
}
Headers example:
{
"kid": "6bbb77b1-2b46-4de5-8a65-7d5d8be31523"
}
Sign token sample:
const expiresIn = 30 * 60; // 30 min
const tokenId = crypto.randomUUID();
const jwtToken = jwt.sign({}, Buffer.from(PRIVATE_KEY, 'utf8'), {
jwtid: tokenId,
subject: BROKER_ID,
expiresIn,
algorithm: 'RS512',
keyid: BROKER_KEY_ID,
});
console.log('token', jwtToken);
Use generated token in Authorization header in format Bearer <TOKEN>.
Authentication errors
AUTH_NO_TOKEN_PROVIDED – no authentication token was provided.
AUTH_INVALID_TOKEN – the provided authentication token is invalid.
AUTH_BROKER_IS_NOT_ENABLED – the access to broker api is disabled (on NDAX side).
AUTH_TOKEN_REVOKED – the auth token has been revoked.
AUTH_TOKEN_EXPIRED – the auth token has expired.
AUTH_TOKEN_INVALID_EXP – the token’s expiration (exp claim) is invalid.
AUTH_TOKEN_INVALID_SUB – the token’s subject (sub claim) is invalid.
AUTH_TOKEN_INVALID_KID – the token’s key ID (kid header) is invalid.
AUTH_KEY_IS_DISABLED – the access to the broker API using the provided key is disabled.
AUTH_KEY_PERMISSION_DENIED – the broker key does not have sufficient permissions to call this endpoint.
Base URLs:
Authentication
- HTTP Authentication, scheme: bearer
Auth
rewokeAuthToken
Code samples
# You can also use wget
curl -X POST https://api-dev.ndax.io/v1/integrations/broker/auth/revoke \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
POST https://api-dev.ndax.io/v1/integrations/broker/auth/revoke HTTP/1.1
Host: api-dev.ndax.io
Content-Type: application/json
Accept: application/json
const inputBody = '{
"tokenId": "string"
}';
const headers = {
'Content-Type':'application/json',
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('https://api-dev.ndax.io/v1/integrations/broker/auth/revoke',
{
method: 'POST',
body: inputBody,
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.post 'https://api-dev.ndax.io/v1/integrations/broker/auth/revoke',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.post('https://api-dev.ndax.io/v1/integrations/broker/auth/revoke', headers = headers)
print(r.json())
<?php
require 'vendor/autoload.php';
$headers = array(
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('POST','https://api-dev.ndax.io/v1/integrations/broker/auth/revoke', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("https://api-dev.ndax.io/v1/integrations/broker/auth/revoke");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Content-Type": []string{"application/json"},
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("POST", "https://api-dev.ndax.io/v1/integrations/broker/auth/revoke", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
POST /auth/revoke
Rewoke auth token
Required permission: auth:revoke
Error codes:
INTERNAL_SERVER_ERROR – an unexpected server error occurred.
BAD_REQUEST – the request is invalid or contains incorrect parameters.
BAD_GATEWAY – received an invalid response from an upstream server.
Body parameter
{
"tokenId": "string"
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| body | body | RevokeTokenOptions | true | none |
Example responses
400 Response
{
"message": "Broker user already exists",
"statusCode": 400,
"errorCode": "BROKER_USER_ALREADY_EXISTS",
"details": {
"externalId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
401 Response
{
"message": "Auth token expired",
"statusCode": 401,
"errorCode": "AUTH_TOKEN_EXPIRED",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
404 Response
{
"message": "Broker user not found",
"statusCode": 404,
"errorCode": "BROKER_USER_NOT_FOUND",
"details": {
"externalUserId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
500 Response
{
"message": "Internal server error",
"statusCode": 500,
"errorCode": "INTERNAL_SERVER_ERROR",
"details": {
"externalId": "12354686-52f1-43ba-aec6-c3d863112232"
},
"datetime": "2025-10-19T17:28:39.780Z"
}
502 Response
{
"message": "Bad gateway",
"statusCode": 502,
"errorCode": "BAD_GATEWAY",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 201 | Created | OK | None |
| 400 | Bad Request | Bad request | ErrorResponse |
| 401 | Unauthorized | Unauthorized | ErrorResponse |
| 404 | Not Found | Not found | ErrorResponse |
| 500 | Internal Server Error | Internal server error | ErrorResponse |
| 502 | Bad Gateway | Bad gateway | ErrorResponse |
Users
createUser
Code samples
# You can also use wget
curl -X POST https://api-dev.ndax.io/v1/integrations/broker/users \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
POST https://api-dev.ndax.io/v1/integrations/broker/users HTTP/1.1
Host: api-dev.ndax.io
Content-Type: application/json
Accept: application/json
const inputBody = '{
"externalId": "string",
"userInfo": {
"firstName": "John",
"middleName": "J",
"lastName": "Doe",
"phoneNumber": "+15263696352",
"email": "[email protected]",
"dob": "1994-12-12",
"sin": 123123123,
"address": {
"countryCode": "CA",
"provinceCode": "AB",
"city": "Calgary",
"street": "Tower str",
"postalCode": "013-T43",
"building": 12,
"unit": 5
},
"postalAddress": {
"countryCode": "CA",
"addressLine": "69 Eagle Road Bonnyville, AB T9N 3X4"
}
},
"financialInfo": {
"netAnnualIncomeValue": "LESS_THAN_30K",
"netAssetsValue": "LESS_THAN_100K",
"netFinancialAssetsValue": "LESS_THAN_100K",
"dualIncome": true,
"lessThanTwoYearsIncome": true,
"occupation": {
"employmentType": "EMPLOYED",
"employmentInfo": {
"employerName": "Microsoft",
"typeOfBusiness": "ACCOUNTING",
"jobTitle": "ACCOUNTANT",
"customJobTitle": "string"
},
"unemploymentInfo": {
"sourceOfIncome": "OTHER",
"otherSourceOfIncome": "Received an inheritance"
}
}
},
"accountType": "INVESTING_IN_DIGITAL_CURRENCY",
"platformReference": {
"platformReferenceType": "Other",
"otherPlatformReference": "Telegram channel"
},
"kyc": {
"creditBureau": {
"creditBureau": "Bureau ABC",
"fileCreatedAt": "2025-11-14T13:20:09.487Z",
"fileCheckedAt": "2025-11-14T13:20:09.487Z",
"creditBureauFileNumber": "X423425T5442"
}
},
"language": "en"
}';
const headers = {
'Content-Type':'application/json',
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('https://api-dev.ndax.io/v1/integrations/broker/users',
{
method: 'POST',
body: inputBody,
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.post 'https://api-dev.ndax.io/v1/integrations/broker/users',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.post('https://api-dev.ndax.io/v1/integrations/broker/users', headers = headers)
print(r.json())
<?php
require 'vendor/autoload.php';
$headers = array(
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('POST','https://api-dev.ndax.io/v1/integrations/broker/users', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("https://api-dev.ndax.io/v1/integrations/broker/users");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Content-Type": []string{"application/json"},
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("POST", "https://api-dev.ndax.io/v1/integrations/broker/users", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
POST /users
Create broker user
Required permission: user:create
Error codes:
BROKER_USER_ALREADY_EXISTS – when a user with the given externalId already exists.
BROKER_USER_EMAIL_ALREADY_IN_USE – when a user with the given email already exists.
BROKER_USER_IS_UNDERAGE – when a user is underage.
BROKER_USER_UNEMPLOYMENT_INFO_REQUIRED – when financialInfo is provided and employmentType is one of (HOMEMAKER, RETIRED, STUDENT, UNEMPLOYED), but unemploymentInfo is missing.
BROKER_USER_EMPLOYMENT_INFO_SHOULD_NOT_EXIST – when financialInfo is provided and employmentType is one of (HOMEMAKER, RETIRED, STUDENT, UNEMPLOYED), but employmentInfo is provided.
BROKER_USER_OTHER_SOURCE_OF_INCOME_REQUIRED – when unemploymentInfo.sourceOfIncome is OTHER, but unemploymentInfo.otherSourceOfIncome is missing.
BROKER_USER_OTHER_SOURCE_OF_INCOME_SHOULD_NOT_EXIST – when unemploymentInfo.sourceOfIncome is not OTHER, but unemploymentInfo.otherSourceOfIncome is provided.
BROKER_USER_UNEMPLOYMENT_INFO_SHOULD_NOT_EXIST – when financialInfo is provided and employmentType is one of (EMPLOYED, SELF_EMPLOYED), but unemploymentInfo is provided.
BROKER_USER_EMPLOYMENT_INFO_REQUIRED – when financialInfo is provided and employmentType is one of (EMPLOYED, SELF_EMPLOYED), but employmentInfo is missing.
BROKER_USER_EMPLOYMENT_INFO_CUSTOM_JOB_TITLE_NOT_FOUND – when financialInfo is provided and employmentInfo.customJobTitle not found (not mapped).
BROKER_USER_INVALID_TYPE_OF_BUSINESS – invalid typeOfBusiness value received.
BROKER_USER_INVALID_JOB_TITLE – invalid jobTitle, or the value is not a member of the provided enum.
DUAL_SOURCE_KYC_SOURCE_NOT_DEFINED - if kyc.dualSource is provided, and the information confirmation contains a source name that does not match either sourceName1 or sourceName2.
DUAL_SOURCE_KYC_INSUFFICIENT_CONFIRMATIONS_PROVIDED - if kyc.dualSource is provided, the request must contain at least two of the following properties: dobConfirmedBy, addressConfirmedBy, financialAccountConfirmedBy.
KYC_INFO_ONE_METHOD_REQUIRED - when fewer or more than one KYC method is provided (exactly one is required).
BROKER_USER_INVALID_ADDRESS - when the system was unable to interpret the postalAddress.
BROKER_USER_NO_ADDRESS_PROVIDED - neither address nor postalAddress was provided; at least one of them is required.
INTERNAL_SERVER_ERROR – an unexpected server error occurred.
BAD_REQUEST – the request is invalid or contains incorrect parameters.
BAD_GATEWAY – received an invalid response from an upstream server.
Body parameter
{
"externalId": "string",
"userInfo": {
"firstName": "John",
"middleName": "J",
"lastName": "Doe",
"phoneNumber": "+15263696352",
"email": "[email protected]",
"dob": "1994-12-12",
"sin": 123123123,
"address": {
"countryCode": "CA",
"provinceCode": "AB",
"city": "Calgary",
"street": "Tower str",
"postalCode": "013-T43",
"building": 12,
"unit": 5
},
"postalAddress": {
"countryCode": "CA",
"addressLine": "69 Eagle Road Bonnyville, AB T9N 3X4"
}
},
"financialInfo": {
"netAnnualIncomeValue": "LESS_THAN_30K",
"netAssetsValue": "LESS_THAN_100K",
"netFinancialAssetsValue": "LESS_THAN_100K",
"dualIncome": true,
"lessThanTwoYearsIncome": true,
"occupation": {
"employmentType": "EMPLOYED",
"employmentInfo": {
"employerName": "Microsoft",
"typeOfBusiness": "ACCOUNTING",
"jobTitle": "ACCOUNTANT",
"customJobTitle": "string"
},
"unemploymentInfo": {
"sourceOfIncome": "OTHER",
"otherSourceOfIncome": "Received an inheritance"
}
}
},
"accountType": "INVESTING_IN_DIGITAL_CURRENCY",
"platformReference": {
"platformReferenceType": "Other",
"otherPlatformReference": "Telegram channel"
},
"kyc": {
"creditBureau": {
"creditBureau": "Bureau ABC",
"fileCreatedAt": "2025-11-14T13:20:09.487Z",
"fileCheckedAt": "2025-11-14T13:20:09.487Z",
"creditBureauFileNumber": "X423425T5442"
}
},
"language": "en"
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| body | body | CreateBrokerUserOptions | true | none |
Example responses
201 Response
{
"userId": "c2c78a6f-9929-4625-9b02-39acffcb421d",
"externalUserId": 5555
}
400 Response
{
"message": "Broker user already exists",
"statusCode": 400,
"errorCode": "BROKER_USER_ALREADY_EXISTS",
"details": {
"externalId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
401 Response
{
"message": "Auth token expired",
"statusCode": 401,
"errorCode": "AUTH_TOKEN_EXPIRED",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
404 Response
{
"message": "Broker user not found",
"statusCode": 404,
"errorCode": "BROKER_USER_NOT_FOUND",
"details": {
"externalUserId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
500 Response
{
"message": "Internal server error",
"statusCode": 500,
"errorCode": "INTERNAL_SERVER_ERROR",
"details": {
"externalId": "12354686-52f1-43ba-aec6-c3d863112232"
},
"datetime": "2025-10-19T17:28:39.780Z"
}
502 Response
{
"message": "Bad gateway",
"statusCode": 502,
"errorCode": "BAD_GATEWAY",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 201 | Created | OK | CreateBrokerUserResult |
| 400 | Bad Request | Bad request | ErrorResponse |
| 401 | Unauthorized | Unauthorized | ErrorResponse |
| 404 | Not Found | Not found | ErrorResponse |
| 500 | Internal Server Error | Internal server error | ErrorResponse |
| 502 | Bad Gateway | Bad gateway | ErrorResponse |
updateUserKyc
Code samples
# You can also use wget
curl -X POST https://api-dev.ndax.io/v1/integrations/broker/users/kyc \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
POST https://api-dev.ndax.io/v1/integrations/broker/users/kyc HTTP/1.1
Host: api-dev.ndax.io
Content-Type: application/json
Accept: application/json
const inputBody = '{
"userId": "string",
"externalUserId": "string",
"kyc": {
"creditBureau": {
"creditBureau": "Bureau ABC",
"fileCreatedAt": "2025-11-14T13:20:09.487Z",
"fileCheckedAt": "2025-11-14T13:20:09.487Z",
"creditBureauFileNumber": "X423425T5442"
}
}
}';
const headers = {
'Content-Type':'application/json',
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('https://api-dev.ndax.io/v1/integrations/broker/users/kyc',
{
method: 'POST',
body: inputBody,
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.post 'https://api-dev.ndax.io/v1/integrations/broker/users/kyc',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.post('https://api-dev.ndax.io/v1/integrations/broker/users/kyc', headers = headers)
print(r.json())
<?php
require 'vendor/autoload.php';
$headers = array(
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('POST','https://api-dev.ndax.io/v1/integrations/broker/users/kyc', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("https://api-dev.ndax.io/v1/integrations/broker/users/kyc");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Content-Type": []string{"application/json"},
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("POST", "https://api-dev.ndax.io/v1/integrations/broker/users/kyc", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
POST /users/kyc
Update user KYC info
Required permission: user:manage
Error codes:
NO_BROKER_USER_IDENTIFIER_PROVIDED – when neither userId nor externalUserId is provided.
BROKER_USER_NOT_FOUND – when the user is not found.
AMBIGUOUS_BROKER_USER_IDENTIFIER – when both userId and externalUserId are provided, but only one is expected.
DUAL_SOURCE_KYC_SOURCE_NOT_DEFINED - if kyc.dualSource is provided, and the information confirmation contains a source name that does not match either sourceName1 or sourceName2.
DUAL_SOURCE_KYC_INSUFFICIENT_CONFIRMATIONS_PROVIDED - if kyc.dualSource is provided, the request must contain at least two of the following properties: dobConfirmedBy, addressConfirmedBy, financialAccountConfirmedBy.
KYC_INFO_ONE_METHOD_REQUIRED - when fewer or more than one KYC method is provided (exactly one is required).
INTERNAL_SERVER_ERROR – an unexpected server error occurred.
BAD_REQUEST – the request is invalid or contains incorrect parameters.
BAD_GATEWAY – received an invalid response from an upstream server.
Body parameter
{
"userId": "string",
"externalUserId": "string",
"kyc": {
"creditBureau": {
"creditBureau": "Bureau ABC",
"fileCreatedAt": "2025-11-14T13:20:09.487Z",
"fileCheckedAt": "2025-11-14T13:20:09.487Z",
"creditBureauFileNumber": "X423425T5442"
}
}
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| body | body | UpdateBrokerUserKycOptions | false | none |
Example responses
400 Response
{
"message": "Broker user already exists",
"statusCode": 400,
"errorCode": "BROKER_USER_ALREADY_EXISTS",
"details": {
"externalId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
401 Response
{
"message": "Auth token expired",
"statusCode": 401,
"errorCode": "AUTH_TOKEN_EXPIRED",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
404 Response
{
"message": "Broker user not found",
"statusCode": 404,
"errorCode": "BROKER_USER_NOT_FOUND",
"details": {
"externalUserId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
500 Response
{
"message": "Internal server error",
"statusCode": 500,
"errorCode": "INTERNAL_SERVER_ERROR",
"details": {
"externalId": "12354686-52f1-43ba-aec6-c3d863112232"
},
"datetime": "2025-10-19T17:28:39.780Z"
}
502 Response
{
"message": "Bad gateway",
"statusCode": 502,
"errorCode": "BAD_GATEWAY",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 201 | Created | OK | None |
| 400 | Bad Request | Bad request | ErrorResponse |
| 401 | Unauthorized | Unauthorized | ErrorResponse |
| 404 | Not Found | Not found | ErrorResponse |
| 500 | Internal Server Error | Internal server error | ErrorResponse |
| 502 | Bad Gateway | Bad gateway | ErrorResponse |
getUserInfo
Code samples
# You can also use wget
curl -X GET https://api-dev.ndax.io/v1/integrations/broker/users/info \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
GET https://api-dev.ndax.io/v1/integrations/broker/users/info HTTP/1.1
Host: api-dev.ndax.io
Accept: application/json
const headers = {
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('https://api-dev.ndax.io/v1/integrations/broker/users/info',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.get 'https://api-dev.ndax.io/v1/integrations/broker/users/info',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.get('https://api-dev.ndax.io/v1/integrations/broker/users/info', headers = headers)
print(r.json())
<?php
require 'vendor/autoload.php';
$headers = array(
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','https://api-dev.ndax.io/v1/integrations/broker/users/info', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("https://api-dev.ndax.io/v1/integrations/broker/users/info");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("GET", "https://api-dev.ndax.io/v1/integrations/broker/users/info", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
GET /users/info
Get broker user
Required permission: user:read
Error codes:
NO_BROKER_USER_IDENTIFIER_PROVIDED – when neither userId nor externalUserId is provided.
BROKER_USER_NOT_FOUND – when the user is not found.
AMBIGUOUS_BROKER_USER_IDENTIFIER – when both userId and externalUserId are provided, but only one is expected.
INTERNAL_SERVER_ERROR – an unexpected server error occurred.
BAD_REQUEST – the request is invalid or contains incorrect parameters.
BAD_GATEWAY – received an invalid response from an upstream server.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| userId | query | string | false | none |
| externalUserId | query | string | false | none |
Example responses
200 Response
{
"id": "c2c78a6f-9929-4625-9b02-39acffcb421d",
"externalId": "c2c78a6f-9929-4625-9b02-39acffcb421d",
"firstName": "Doe",
"middleName": "string",
"lastName": "string",
"email": "[email protected]",
"phoneNumber": "+15263696352",
"status": "ACTIVE",
"closeReason": "FRAUD",
"activeLiquidationId": "c2c78a6f-9929-4625-9b02-39acffcb421d",
"tradingLimits": {
"buy": {
"oneTimeLimit": 1000,
"daily": {
"total": 2000,
"used": 340
}
},
"sell": {
"oneTimeLimit": 1000,
"daily": {
"total": 2000,
"used": 340
}
}
},
"allowedActions": {
"deletePersonalInfoOnAccountClosure": true,
"reopenAccount": "NO_PERSONAL_INFO_REQUIRED"
},
"requiredActions": {
"infoCheck": true,
"appropriatenessQuestionnaire": {
"nextAttemptDate": "string"
}
},
"language": "en"
}
400 Response
{
"message": "Broker user already exists",
"statusCode": 400,
"errorCode": "BROKER_USER_ALREADY_EXISTS",
"details": {
"externalId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
401 Response
{
"message": "Auth token expired",
"statusCode": 401,
"errorCode": "AUTH_TOKEN_EXPIRED",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
404 Response
{
"message": "Broker user not found",
"statusCode": 404,
"errorCode": "BROKER_USER_NOT_FOUND",
"details": {
"externalUserId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
500 Response
{
"message": "Internal server error",
"statusCode": 500,
"errorCode": "INTERNAL_SERVER_ERROR",
"details": {
"externalId": "12354686-52f1-43ba-aec6-c3d863112232"
},
"datetime": "2025-10-19T17:28:39.780Z"
}
502 Response
{
"message": "Bad gateway",
"statusCode": 502,
"errorCode": "BAD_GATEWAY",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | OK | BrokerUserResponse |
| 400 | Bad Request | Bad request | ErrorResponse |
| 401 | Unauthorized | Unauthorized | ErrorResponse |
| 404 | Not Found | Not found | ErrorResponse |
| 500 | Internal Server Error | Internal server error | ErrorResponse |
| 502 | Bad Gateway | Bad gateway | ErrorResponse |
submitInfoCheck
Code samples
# You can also use wget
curl -X POST https://api-dev.ndax.io/v1/integrations/broker/users/info-check \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
POST https://api-dev.ndax.io/v1/integrations/broker/users/info-check HTTP/1.1
Host: api-dev.ndax.io
Content-Type: application/json
Accept: application/json
const inputBody = '{
"userId": "c2c78a6f-9929-4625-9b02-39acffcb421d",
"externalUserId": 5555,
"userInfo": {
"firstName": "John",
"middleName": "string",
"lastName": "Doe",
"phoneNumber": "+15263696352",
"dob": "1994-12-12",
"sin": "string",
"address": {
"countryCode": "CA",
"provinceCode": "AB",
"city": "Calgary",
"street": "Tower str",
"postalCode": "013-T43",
"building": 12,
"unit": 5
},
"postalAddress": {
"countryCode": "CA",
"addressLine": "69 Eagle Road Bonnyville, AB T9N 3X4"
}
},
"financialInfo": {
"netAnnualIncomeValue": "LESS_THAN_30K",
"netAssetsValue": "LESS_THAN_100K",
"netFinancialAssetsValue": "LESS_THAN_100K",
"dualIncome": true,
"lessThanTwoYearsIncome": true,
"occupation": {
"employmentType": "EMPLOYED",
"employmentInfo": {
"employerName": "Microsoft",
"typeOfBusiness": "ACCOUNTING",
"jobTitle": "ACCOUNTANT",
"customJobTitle": "string"
},
"unemploymentInfo": {
"sourceOfIncome": "OTHER",
"otherSourceOfIncome": "Received an inheritance"
}
}
},
"accountType": "INVESTING_IN_DIGITAL_CURRENCY"
}';
const headers = {
'Content-Type':'application/json',
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('https://api-dev.ndax.io/v1/integrations/broker/users/info-check',
{
method: 'POST',
body: inputBody,
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.post 'https://api-dev.ndax.io/v1/integrations/broker/users/info-check',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.post('https://api-dev.ndax.io/v1/integrations/broker/users/info-check', headers = headers)
print(r.json())
<?php
require 'vendor/autoload.php';
$headers = array(
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('POST','https://api-dev.ndax.io/v1/integrations/broker/users/info-check', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("https://api-dev.ndax.io/v1/integrations/broker/users/info-check");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Content-Type": []string{"application/json"},
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("POST", "https://api-dev.ndax.io/v1/integrations/broker/users/info-check", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
POST /users/info-check
Submit info check
Required permission: user:manage
Error codes:
NO_BROKER_USER_IDENTIFIER_PROVIDED – when neither userId nor externalUserId is provided.
BROKER_USER_NOT_FOUND – when the user is not found.
AMBIGUOUS_BROKER_USER_IDENTIFIER – when both userId and externalUserId are provided, but only one is expected.
BROKER_USER_UNEMPLOYMENT_INFO_REQUIRED – when financialInfo is provided and employmentType is one of (HOMEMAKER, RETIRED, STUDENT, UNEMPLOYED), but unemploymentInfo is missing.
BROKER_USER_EMPLOYMENT_INFO_SHOULD_NOT_EXIST – when financialInfo is provided and employmentType is one of (HOMEMAKER, RETIRED, STUDENT, UNEMPLOYED), but employmentInfo is provided.
BROKER_USER_OTHER_SOURCE_OF_INCOME_REQUIRED – when unemploymentInfo.sourceOfIncome is OTHER, but unemploymentInfo.otherSourceOfIncome is missing.
BROKER_USER_OTHER_SOURCE_OF_INCOME_SHOULD_NOT_EXIST – when unemploymentInfo.sourceOfIncome is not OTHER, but unemploymentInfo.otherSourceOfIncome is provided.
BROKER_USER_UNEMPLOYMENT_INFO_SHOULD_NOT_EXIST – when financialInfo is provided and employmentType is one of (EMPLOYED, SELF_EMPLOYED), but unemploymentInfo is provided.
BROKER_USER_EMPLOYMENT_INFO_REQUIRED – when financialInfo is provided and employmentType is one of (EMPLOYED, SELF_EMPLOYED), but employmentInfo is missing.
BROKER_USER_INVALID_TYPE_OF_BUSINESS – invalid typeOfBusiness value received.
BROKER_USER_INVALID_JOB_TITLE – invalid jobTitle, or the value is not a member of the provided enum.
BROKER_USER_IS_CLOSED – the broker user is closed, operation not allowed.
INFO_CHECK_IS_NOT_EXPECTED – info check was not requested (expected only when GET /users/info returned requiredActions.infoCheck = true).
BROKER_USER_INVALID_ADDRESS - when the system was unable to interpret the postalAddress.
BROKER_USER_NO_ADDRESS_PROVIDED - neither address nor postalAddress was provided; at least one of them is required.
INTERNAL_SERVER_ERROR – an unexpected server error occurred.
BAD_REQUEST – the request is invalid or contains incorrect parameters.
BAD_GATEWAY – received an invalid response from an upstream server.
Body parameter
{
"userId": "c2c78a6f-9929-4625-9b02-39acffcb421d",
"externalUserId": 5555,
"userInfo": {
"firstName": "John",
"middleName": "string",
"lastName": "Doe",
"phoneNumber": "+15263696352",
"dob": "1994-12-12",
"sin": "string",
"address": {
"countryCode": "CA",
"provinceCode": "AB",
"city": "Calgary",
"street": "Tower str",
"postalCode": "013-T43",
"building": 12,
"unit": 5
},
"postalAddress": {
"countryCode": "CA",
"addressLine": "69 Eagle Road Bonnyville, AB T9N 3X4"
}
},
"financialInfo": {
"netAnnualIncomeValue": "LESS_THAN_30K",
"netAssetsValue": "LESS_THAN_100K",
"netFinancialAssetsValue": "LESS_THAN_100K",
"dualIncome": true,
"lessThanTwoYearsIncome": true,
"occupation": {
"employmentType": "EMPLOYED",
"employmentInfo": {
"employerName": "Microsoft",
"typeOfBusiness": "ACCOUNTING",
"jobTitle": "ACCOUNTANT",
"customJobTitle": "string"
},
"unemploymentInfo": {
"sourceOfIncome": "OTHER",
"otherSourceOfIncome": "Received an inheritance"
}
}
},
"accountType": "INVESTING_IN_DIGITAL_CURRENCY"
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| body | body | SubmitInfoCheckRequest | true | none |
Example responses
201 Response
{
"id": "c2c78a6f-9929-4625-9b02-39acffcb421d",
"externalId": "c2c78a6f-9929-4625-9b02-39acffcb421d",
"firstName": "Doe",
"middleName": "string",
"lastName": "string",
"email": "[email protected]",
"phoneNumber": "+15263696352",
"status": "ACTIVE",
"closeReason": "FRAUD",
"activeLiquidationId": "c2c78a6f-9929-4625-9b02-39acffcb421d",
"tradingLimits": {
"buy": {
"oneTimeLimit": 1000,
"daily": {
"total": 2000,
"used": 340
}
},
"sell": {
"oneTimeLimit": 1000,
"daily": {
"total": 2000,
"used": 340
}
}
},
"allowedActions": {
"deletePersonalInfoOnAccountClosure": true,
"reopenAccount": "NO_PERSONAL_INFO_REQUIRED"
},
"requiredActions": {
"infoCheck": true,
"appropriatenessQuestionnaire": {
"nextAttemptDate": "string"
}
},
"language": "en"
}
400 Response
{
"message": "Broker user already exists",
"statusCode": 400,
"errorCode": "BROKER_USER_ALREADY_EXISTS",
"details": {
"externalId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
401 Response
{
"message": "Auth token expired",
"statusCode": 401,
"errorCode": "AUTH_TOKEN_EXPIRED",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
404 Response
{
"message": "Broker user not found",
"statusCode": 404,
"errorCode": "BROKER_USER_NOT_FOUND",
"details": {
"externalUserId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
500 Response
{
"message": "Internal server error",
"statusCode": 500,
"errorCode": "INTERNAL_SERVER_ERROR",
"details": {
"externalId": "12354686-52f1-43ba-aec6-c3d863112232"
},
"datetime": "2025-10-19T17:28:39.780Z"
}
502 Response
{
"message": "Bad gateway",
"statusCode": 502,
"errorCode": "BAD_GATEWAY",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 201 | Created | OK | BrokerUserResponse |
| 400 | Bad Request | Bad request | ErrorResponse |
| 401 | Unauthorized | Unauthorized | ErrorResponse |
| 404 | Not Found | Not found | ErrorResponse |
| 500 | Internal Server Error | Internal server error | ErrorResponse |
| 502 | Bad Gateway | Bad gateway | ErrorResponse |
updateFinancialInfo
Code samples
# You can also use wget
curl -X PATCH https://api-dev.ndax.io/v1/integrations/broker/users/financial-info \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
PATCH https://api-dev.ndax.io/v1/integrations/broker/users/financial-info HTTP/1.1
Host: api-dev.ndax.io
Content-Type: application/json
Accept: application/json
const inputBody = '{
"userId": "string",
"externalUserId": "string",
"financialInfo": {
"netAnnualIncomeValue": "LESS_THAN_30K",
"netAssetsValue": "LESS_THAN_100K",
"netFinancialAssetsValue": "LESS_THAN_100K",
"dualIncome": true,
"lessThanTwoYearsIncome": true,
"occupation": {
"employmentType": "EMPLOYED",
"employmentInfo": {
"employerName": "Microsoft",
"typeOfBusiness": "ACCOUNTING",
"jobTitle": "ACCOUNTANT",
"customJobTitle": "string"
},
"unemploymentInfo": {
"sourceOfIncome": "OTHER",
"otherSourceOfIncome": "Received an inheritance"
}
}
}
}';
const headers = {
'Content-Type':'application/json',
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('https://api-dev.ndax.io/v1/integrations/broker/users/financial-info',
{
method: 'PATCH',
body: inputBody,
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.patch 'https://api-dev.ndax.io/v1/integrations/broker/users/financial-info',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.patch('https://api-dev.ndax.io/v1/integrations/broker/users/financial-info', headers = headers)
print(r.json())
<?php
require 'vendor/autoload.php';
$headers = array(
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('PATCH','https://api-dev.ndax.io/v1/integrations/broker/users/financial-info', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("https://api-dev.ndax.io/v1/integrations/broker/users/financial-info");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("PATCH");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Content-Type": []string{"application/json"},
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("PATCH", "https://api-dev.ndax.io/v1/integrations/broker/users/financial-info", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
PATCH /users/financial-info
Update financial info
Required permission: user:manage
Error codes:
NO_BROKER_USER_IDENTIFIER_PROVIDED – when neither userId nor externalUserId is provided.
BROKER_USER_NOT_FOUND – when the user is not found.
AMBIGUOUS_BROKER_USER_IDENTIFIER – when both userId and externalUserId are provided, but only one is expected.
BROKER_USER_UNEMPLOYMENT_INFO_REQUIRED – when financialInfo is provided and employmentType is one of (HOMEMAKER, RETIRED, STUDENT, UNEMPLOYED), but unemploymentInfo is missing.
BROKER_USER_EMPLOYMENT_INFO_SHOULD_NOT_EXIST – when financialInfo is provided and employmentType is one of (HOMEMAKER, RETIRED, STUDENT, UNEMPLOYED), but employmentInfo is provided.
BROKER_USER_OTHER_SOURCE_OF_INCOME_REQUIRED – when unemploymentInfo.sourceOfIncome is OTHER, but unemploymentInfo.otherSourceOfIncome is missing.
BROKER_USER_OTHER_SOURCE_OF_INCOME_SHOULD_NOT_EXIST – when unemploymentInfo.sourceOfIncome is not OTHER, but unemploymentInfo.otherSourceOfIncome is provided.
BROKER_USER_UNEMPLOYMENT_INFO_SHOULD_NOT_EXIST – when financialInfo is provided and employmentType is one of (EMPLOYED, SELF_EMPLOYED), but unemploymentInfo is provided.
BROKER_USER_EMPLOYMENT_INFO_REQUIRED – when financialInfo is provided and employmentType is one of (EMPLOYED, SELF_EMPLOYED), but employmentInfo is missing.
BROKER_USER_INVALID_TYPE_OF_BUSINESS – invalid typeOfBusiness value received.
BROKER_USER_INVALID_JOB_TITLE – invalid jobTitle, or the value is not a member of the provided enum.
INTERNAL_SERVER_ERROR – an unexpected server error occurred.
BAD_REQUEST – the request is invalid or contains incorrect parameters.
BAD_GATEWAY – received an invalid response from an upstream server.
Body parameter
{
"userId": "string",
"externalUserId": "string",
"financialInfo": {
"netAnnualIncomeValue": "LESS_THAN_30K",
"netAssetsValue": "LESS_THAN_100K",
"netFinancialAssetsValue": "LESS_THAN_100K",
"dualIncome": true,
"lessThanTwoYearsIncome": true,
"occupation": {
"employmentType": "EMPLOYED",
"employmentInfo": {
"employerName": "Microsoft",
"typeOfBusiness": "ACCOUNTING",
"jobTitle": "ACCOUNTANT",
"customJobTitle": "string"
},
"unemploymentInfo": {
"sourceOfIncome": "OTHER",
"otherSourceOfIncome": "Received an inheritance"
}
}
}
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| body | body | UpdateBrokerUserFinancialInfoOptions | true | none |
Example responses
200 Response
{
"totalNotionalValue": 13200,
"holdNotionalValue": 100,
"availableNotionalValue": 13100,
"notionalProductId": 5,
"notionalProductSymbol": "CAD",
"positions": [
{
"productId": 5,
"productSymbol": "BTC",
"total": 0.1,
"totalNotionalValue": 12300,
"available": 0.1,
"availableNotionalValue": 12300,
"hold": 0,
"holdNotionalValue": 0
}
]
}
400 Response
{
"message": "Broker user already exists",
"statusCode": 400,
"errorCode": "BROKER_USER_ALREADY_EXISTS",
"details": {
"externalId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
401 Response
{
"message": "Auth token expired",
"statusCode": 401,
"errorCode": "AUTH_TOKEN_EXPIRED",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
404 Response
{
"message": "Broker user not found",
"statusCode": 404,
"errorCode": "BROKER_USER_NOT_FOUND",
"details": {
"externalUserId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
500 Response
{
"message": "Internal server error",
"statusCode": 500,
"errorCode": "INTERNAL_SERVER_ERROR",
"details": {
"externalId": "12354686-52f1-43ba-aec6-c3d863112232"
},
"datetime": "2025-10-19T17:28:39.780Z"
}
502 Response
{
"message": "Bad gateway",
"statusCode": 502,
"errorCode": "BAD_GATEWAY",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | OK | BalancesResponse |
| 400 | Bad Request | Bad request | ErrorResponse |
| 401 | Unauthorized | Unauthorized | ErrorResponse |
| 404 | Not Found | Not found | ErrorResponse |
| 500 | Internal Server Error | Internal server error | ErrorResponse |
| 502 | Bad Gateway | Bad gateway | ErrorResponse |
closeUser
Code samples
# You can also use wget
curl -X POST https://api-dev.ndax.io/v1/integrations/broker/users/close \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
POST https://api-dev.ndax.io/v1/integrations/broker/users/close HTTP/1.1
Host: api-dev.ndax.io
Content-Type: application/json
Accept: application/json
const inputBody = '{
"userId": "string",
"externalUserId": "string",
"closeReason": "FRAUD",
"otherCloseReason": "string",
"deletePersonalInfo": true,
"liquidationFeeTier": 0
}';
const headers = {
'Content-Type':'application/json',
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('https://api-dev.ndax.io/v1/integrations/broker/users/close',
{
method: 'POST',
body: inputBody,
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.post 'https://api-dev.ndax.io/v1/integrations/broker/users/close',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.post('https://api-dev.ndax.io/v1/integrations/broker/users/close', headers = headers)
print(r.json())
<?php
require 'vendor/autoload.php';
$headers = array(
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('POST','https://api-dev.ndax.io/v1/integrations/broker/users/close', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("https://api-dev.ndax.io/v1/integrations/broker/users/close");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Content-Type": []string{"application/json"},
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("POST", "https://api-dev.ndax.io/v1/integrations/broker/users/close", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
POST /users/close
Close user
Required permission: user:manage
Error codes:
NO_BROKER_USER_IDENTIFIER_PROVIDED – when neither userId nor externalUserId is provided.
BROKER_USER_NOT_FOUND – when the user is not found.
AMBIGUOUS_BROKER_USER_IDENTIFIER – when both userId and externalUserId are provided, but only one is expected.
BROKER_USER_CANNOT_DELETE_PERSONAL_INFO_ON_CLOSE – user cannot delete personal information because the account has existing financial transactions
INTERNAL_SERVER_ERROR – an unexpected server error occurred.
BAD_REQUEST – the request is invalid or contains incorrect parameters.
BAD_GATEWAY – received an invalid response from an upstream server.
Body parameter
{
"userId": "string",
"externalUserId": "string",
"closeReason": "FRAUD",
"otherCloseReason": "string",
"deletePersonalInfo": true,
"liquidationFeeTier": 0
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| body | body | CloseBrokerUserOptions | true | none |
Example responses
201 Response
{
"liquidationId": "string"
}
400 Response
{
"message": "Broker user already exists",
"statusCode": 400,
"errorCode": "BROKER_USER_ALREADY_EXISTS",
"details": {
"externalId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
401 Response
{
"message": "Auth token expired",
"statusCode": 401,
"errorCode": "AUTH_TOKEN_EXPIRED",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
404 Response
{
"message": "Broker user not found",
"statusCode": 404,
"errorCode": "BROKER_USER_NOT_FOUND",
"details": {
"externalUserId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
500 Response
{
"message": "Internal server error",
"statusCode": 500,
"errorCode": "INTERNAL_SERVER_ERROR",
"details": {
"externalId": "12354686-52f1-43ba-aec6-c3d863112232"
},
"datetime": "2025-10-19T17:28:39.780Z"
}
502 Response
{
"message": "Bad gateway",
"statusCode": 502,
"errorCode": "BAD_GATEWAY",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 201 | Created | OK | CloseBrokerUserResponse |
| 400 | Bad Request | Bad request | ErrorResponse |
| 401 | Unauthorized | Unauthorized | ErrorResponse |
| 404 | Not Found | Not found | ErrorResponse |
| 500 | Internal Server Error | Internal server error | ErrorResponse |
| 502 | Bad Gateway | Bad gateway | ErrorResponse |
reopenUser
Code samples
# You can also use wget
curl -X POST https://api-dev.ndax.io/v1/integrations/broker/users/reopen \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
POST https://api-dev.ndax.io/v1/integrations/broker/users/reopen HTTP/1.1
Host: api-dev.ndax.io
Content-Type: application/json
Accept: application/json
const inputBody = '{
"userId": "string",
"externalUserId": "string",
"personalInfo": {
"userInfo": {
"firstName": "John",
"middleName": "J",
"lastName": "Doe",
"phoneNumber": "+15263696352",
"email": "[email protected]",
"dob": "1994-12-12",
"sin": 123123123,
"address": {
"countryCode": "CA",
"provinceCode": "AB",
"city": "Calgary",
"street": "Tower str",
"postalCode": "013-T43",
"building": 12,
"unit": 5
},
"postalAddress": {
"countryCode": "CA",
"addressLine": "69 Eagle Road Bonnyville, AB T9N 3X4"
}
},
"financialInfo": {
"netAnnualIncomeValue": "LESS_THAN_30K",
"netAssetsValue": "LESS_THAN_100K",
"netFinancialAssetsValue": "LESS_THAN_100K",
"dualIncome": true,
"lessThanTwoYearsIncome": true,
"occupation": {
"employmentType": "EMPLOYED",
"employmentInfo": {
"employerName": "Microsoft",
"typeOfBusiness": "ACCOUNTING",
"jobTitle": "ACCOUNTANT",
"customJobTitle": "string"
},
"unemploymentInfo": {
"sourceOfIncome": "OTHER",
"otherSourceOfIncome": "Received an inheritance"
}
}
},
"accountType": "INVESTING_IN_DIGITAL_CURRENCY",
"platformReference": {
"platformReferenceType": "Other",
"otherPlatformReference": "Telegram channel"
},
"kyc": {
"creditBureau": {
"creditBureau": "Bureau ABC",
"fileCreatedAt": "2025-11-14T13:20:09.487Z",
"fileCheckedAt": "2025-11-14T13:20:09.487Z",
"creditBureauFileNumber": "X423425T5442"
}
},
"language": "en"
}
}';
const headers = {
'Content-Type':'application/json',
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('https://api-dev.ndax.io/v1/integrations/broker/users/reopen',
{
method: 'POST',
body: inputBody,
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.post 'https://api-dev.ndax.io/v1/integrations/broker/users/reopen',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.post('https://api-dev.ndax.io/v1/integrations/broker/users/reopen', headers = headers)
print(r.json())
<?php
require 'vendor/autoload.php';
$headers = array(
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('POST','https://api-dev.ndax.io/v1/integrations/broker/users/reopen', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("https://api-dev.ndax.io/v1/integrations/broker/users/reopen");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Content-Type": []string{"application/json"},
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("POST", "https://api-dev.ndax.io/v1/integrations/broker/users/reopen", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
POST /users/reopen
Reopen user
Required permission: user:manage
Error codes:
BROKER_USER_IS_ACTIVE – when broker user is active.
BROKER_USER_IS_UNDERAGE – when a user is underage.
BROKER_USER_CANNOT_BE_REOPENED – when broker user close reason is not SELF_CLOSED.
NO_BROKER_USER_IDENTIFIER_PROVIDED – when neither userId nor externalUserId is provided.
BROKER_USER_NOT_FOUND – when the user is not found.
AMBIGUOUS_BROKER_USER_IDENTIFIER – when both userId and externalUserId are provided, but only one is expected.
PERSONAL_INFO_REQUIRED_FOR_REOPENING_BROKER_USER – personal information must be provided again to reopen the account because it was previously deleted
INTERNAL_SERVER_ERROR – an unexpected server error occurred.
BAD_REQUEST – the request is invalid or contains incorrect parameters.
BAD_GATEWAY – received an invalid response from an upstream server.
Body parameter
{
"userId": "string",
"externalUserId": "string",
"personalInfo": {
"userInfo": {
"firstName": "John",
"middleName": "J",
"lastName": "Doe",
"phoneNumber": "+15263696352",
"email": "[email protected]",
"dob": "1994-12-12",
"sin": 123123123,
"address": {
"countryCode": "CA",
"provinceCode": "AB",
"city": "Calgary",
"street": "Tower str",
"postalCode": "013-T43",
"building": 12,
"unit": 5
},
"postalAddress": {
"countryCode": "CA",
"addressLine": "69 Eagle Road Bonnyville, AB T9N 3X4"
}
},
"financialInfo": {
"netAnnualIncomeValue": "LESS_THAN_30K",
"netAssetsValue": "LESS_THAN_100K",
"netFinancialAssetsValue": "LESS_THAN_100K",
"dualIncome": true,
"lessThanTwoYearsIncome": true,
"occupation": {
"employmentType": "EMPLOYED",
"employmentInfo": {
"employerName": "Microsoft",
"typeOfBusiness": "ACCOUNTING",
"jobTitle": "ACCOUNTANT",
"customJobTitle": "string"
},
"unemploymentInfo": {
"sourceOfIncome": "OTHER",
"otherSourceOfIncome": "Received an inheritance"
}
}
},
"accountType": "INVESTING_IN_DIGITAL_CURRENCY",
"platformReference": {
"platformReferenceType": "Other",
"otherPlatformReference": "Telegram channel"
},
"kyc": {
"creditBureau": {
"creditBureau": "Bureau ABC",
"fileCreatedAt": "2025-11-14T13:20:09.487Z",
"fileCheckedAt": "2025-11-14T13:20:09.487Z",
"creditBureauFileNumber": "X423425T5442"
}
},
"language": "en"
}
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| body | body | ReopenBrokerUserOptions | false | none |
Example responses
400 Response
{
"message": "Broker user already exists",
"statusCode": 400,
"errorCode": "BROKER_USER_ALREADY_EXISTS",
"details": {
"externalId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
401 Response
{
"message": "Auth token expired",
"statusCode": 401,
"errorCode": "AUTH_TOKEN_EXPIRED",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
404 Response
{
"message": "Broker user not found",
"statusCode": 404,
"errorCode": "BROKER_USER_NOT_FOUND",
"details": {
"externalUserId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
500 Response
{
"message": "Internal server error",
"statusCode": 500,
"errorCode": "INTERNAL_SERVER_ERROR",
"details": {
"externalId": "12354686-52f1-43ba-aec6-c3d863112232"
},
"datetime": "2025-10-19T17:28:39.780Z"
}
502 Response
{
"message": "Bad gateway",
"statusCode": 502,
"errorCode": "BAD_GATEWAY",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 201 | Created | OK | None |
| 400 | Bad Request | Bad request | ErrorResponse |
| 401 | Unauthorized | Unauthorized | ErrorResponse |
| 404 | Not Found | Not found | ErrorResponse |
| 500 | Internal Server Error | Internal server error | ErrorResponse |
| 502 | Bad Gateway | Bad gateway | ErrorResponse |
updateUserPreferences
Code samples
# You can also use wget
curl -X PATCH https://api-dev.ndax.io/v1/integrations/broker/users/preferences \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
PATCH https://api-dev.ndax.io/v1/integrations/broker/users/preferences HTTP/1.1
Host: api-dev.ndax.io
Content-Type: application/json
Accept: application/json
const inputBody = '{
"userId": "string",
"externalUserId": "string",
"language": "en"
}';
const headers = {
'Content-Type':'application/json',
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('https://api-dev.ndax.io/v1/integrations/broker/users/preferences',
{
method: 'PATCH',
body: inputBody,
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.patch 'https://api-dev.ndax.io/v1/integrations/broker/users/preferences',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.patch('https://api-dev.ndax.io/v1/integrations/broker/users/preferences', headers = headers)
print(r.json())
<?php
require 'vendor/autoload.php';
$headers = array(
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('PATCH','https://api-dev.ndax.io/v1/integrations/broker/users/preferences', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("https://api-dev.ndax.io/v1/integrations/broker/users/preferences");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("PATCH");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Content-Type": []string{"application/json"},
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("PATCH", "https://api-dev.ndax.io/v1/integrations/broker/users/preferences", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
PATCH /users/preferences
Update user preferences
Required permission: user:manage
Error codes:
NO_BROKER_USER_IDENTIFIER_PROVIDED – when neither userId nor externalUserId is provided.
BROKER_USER_NOT_FOUND – when the user is not found.
AMBIGUOUS_BROKER_USER_IDENTIFIER – when both userId and externalUserId are provided, but only one is expected.
INTERNAL_SERVER_ERROR – an unexpected server error occurred.
BAD_REQUEST – the request is invalid or contains incorrect parameters.
BAD_GATEWAY – received an invalid response from an upstream server.
Body parameter
{
"userId": "string",
"externalUserId": "string",
"language": "en"
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| body | body | UpdateBrokerUserPreferencesOptions | false | none |
Example responses
400 Response
{
"message": "Broker user already exists",
"statusCode": 400,
"errorCode": "BROKER_USER_ALREADY_EXISTS",
"details": {
"externalId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
401 Response
{
"message": "Auth token expired",
"statusCode": 401,
"errorCode": "AUTH_TOKEN_EXPIRED",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
404 Response
{
"message": "Broker user not found",
"statusCode": 404,
"errorCode": "BROKER_USER_NOT_FOUND",
"details": {
"externalUserId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
500 Response
{
"message": "Internal server error",
"statusCode": 500,
"errorCode": "INTERNAL_SERVER_ERROR",
"details": {
"externalId": "12354686-52f1-43ba-aec6-c3d863112232"
},
"datetime": "2025-10-19T17:28:39.780Z"
}
502 Response
{
"message": "Bad gateway",
"statusCode": 502,
"errorCode": "BAD_GATEWAY",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 201 | Created | OK | None |
| 400 | Bad Request | Bad request | ErrorResponse |
| 401 | Unauthorized | Unauthorized | ErrorResponse |
| 404 | Not Found | Not found | ErrorResponse |
| 500 | Internal Server Error | Internal server error | ErrorResponse |
| 502 | Bad Gateway | Bad gateway | ErrorResponse |
getUsersBalances
Code samples
# You can also use wget
curl -X GET https://api-dev.ndax.io/v1/integrations/broker/users/balances \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
GET https://api-dev.ndax.io/v1/integrations/broker/users/balances HTTP/1.1
Host: api-dev.ndax.io
Accept: application/json
const headers = {
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('https://api-dev.ndax.io/v1/integrations/broker/users/balances',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.get 'https://api-dev.ndax.io/v1/integrations/broker/users/balances',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.get('https://api-dev.ndax.io/v1/integrations/broker/users/balances', headers = headers)
print(r.json())
<?php
require 'vendor/autoload.php';
$headers = array(
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','https://api-dev.ndax.io/v1/integrations/broker/users/balances', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("https://api-dev.ndax.io/v1/integrations/broker/users/balances");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("GET", "https://api-dev.ndax.io/v1/integrations/broker/users/balances", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
GET /users/balances
Get users balances
Required permission: user:balance:read
Error codes:
NO_BROKER_USER_IDENTIFIER_PROVIDED – when neither userId nor externalUserId is provided.
BROKER_USER_NOT_FOUND – when the user is not found.
AMBIGUOUS_BROKER_USER_IDENTIFIER – when both userId and externalUserId are provided, but only one is expected.
INTERNAL_SERVER_ERROR – an unexpected server error occurred.
BAD_REQUEST – the request is invalid or contains incorrect parameters.
BAD_GATEWAY – received an invalid response from an upstream server.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| userId | query | string | false | none |
| externalUserId | query | string | false | none |
Example responses
200 Response
{
"totalNotionalValue": 13200,
"holdNotionalValue": 100,
"availableNotionalValue": 13100,
"notionalProductId": 5,
"notionalProductSymbol": "CAD",
"positions": [
{
"productId": 5,
"productSymbol": "BTC",
"total": 0.1,
"totalNotionalValue": 12300,
"available": 0.1,
"availableNotionalValue": 12300,
"hold": 0,
"holdNotionalValue": 0
}
]
}
400 Response
{
"message": "Broker user already exists",
"statusCode": 400,
"errorCode": "BROKER_USER_ALREADY_EXISTS",
"details": {
"externalId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
401 Response
{
"message": "Auth token expired",
"statusCode": 401,
"errorCode": "AUTH_TOKEN_EXPIRED",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
404 Response
{
"message": "Broker user not found",
"statusCode": 404,
"errorCode": "BROKER_USER_NOT_FOUND",
"details": {
"externalUserId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
500 Response
{
"message": "Internal server error",
"statusCode": 500,
"errorCode": "INTERNAL_SERVER_ERROR",
"details": {
"externalId": "12354686-52f1-43ba-aec6-c3d863112232"
},
"datetime": "2025-10-19T17:28:39.780Z"
}
502 Response
{
"message": "Bad gateway",
"statusCode": 502,
"errorCode": "BAD_GATEWAY",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | OK | BalancesResponse |
| 400 | Bad Request | Bad request | ErrorResponse |
| 401 | Unauthorized | Unauthorized | ErrorResponse |
| 404 | Not Found | Not found | ErrorResponse |
| 500 | Internal Server Error | Internal server error | ErrorResponse |
| 502 | Bad Gateway | Bad gateway | ErrorResponse |
getUserPortfolioPerformanceChart
Code samples
# You can also use wget
curl -X GET https://api-dev.ndax.io/v1/integrations/broker/users/portfolio/performance?range=24H \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
GET https://api-dev.ndax.io/v1/integrations/broker/users/portfolio/performance?range=24H HTTP/1.1
Host: api-dev.ndax.io
Accept: application/json
const headers = {
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('https://api-dev.ndax.io/v1/integrations/broker/users/portfolio/performance?range=24H',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.get 'https://api-dev.ndax.io/v1/integrations/broker/users/portfolio/performance',
params: {
'range' => '[PortfolioRange](#schemaportfoliorange)'
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.get('https://api-dev.ndax.io/v1/integrations/broker/users/portfolio/performance', params={
'range': '24H'
}, headers = headers)
print(r.json())
<?php
require 'vendor/autoload.php';
$headers = array(
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','https://api-dev.ndax.io/v1/integrations/broker/users/portfolio/performance', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("https://api-dev.ndax.io/v1/integrations/broker/users/portfolio/performance?range=24H");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("GET", "https://api-dev.ndax.io/v1/integrations/broker/users/portfolio/performance", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
GET /users/portfolio/performance
Get broker user's portfolio performance chart
Required permission: user:portfolio:read
Error codes:
NO_BROKER_USER_IDENTIFIER_PROVIDED – when neither userId nor externalUserId is provided.
BROKER_USER_NOT_FOUND – when the user is not found.
AMBIGUOUS_BROKER_USER_IDENTIFIER – when both userId and externalUserId are provided, but only one is expected.
INTERNAL_SERVER_ERROR – an unexpected server error occurred.
BAD_REQUEST – the request is invalid or contains incorrect parameters.
BAD_GATEWAY – received an invalid response from an upstream server.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| range | query | PortfolioRange | true | none |
| userId | query | string | false | none |
| externalUserId | query | string | false | none |
Enumerated Values
| Parameter | Value |
|---|---|
| range | 24H |
| range | 7D |
| range | 1M |
| range | 3M |
| range | 6M |
| range | ALL |
Example responses
200 Response
"[\n [\n 1753920000000,\n [\n [\n 6,\n 54.628615891599566,\n 34.77363543159958,\n 0.11052649999999994,\n 0,\n 34.77363543159958\n ],\n [\n 7,\n 197082.00560990928,\n 157636.6183407743,\n 20.49686089026732,\n 0,\n 157636.6183407743\n ]\n ]\n ],\n [\n 1753833600000,\n [\n [\n 6,\n 55.430524968143686,\n 35.57554450814369,\n 0.11052649999999994,\n 0,\n 35.57554450814369\n ],\n [\n 7,\n 197007.6348799469,\n 157562.24761081193,\n 20.49686089026732,\n 0,\n 157562.24761081193\n ]\n ]\n ]\n]\n"
400 Response
{
"message": "Broker user already exists",
"statusCode": 400,
"errorCode": "BROKER_USER_ALREADY_EXISTS",
"details": {
"externalId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
401 Response
{
"message": "Auth token expired",
"statusCode": 401,
"errorCode": "AUTH_TOKEN_EXPIRED",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
404 Response
{
"message": "Broker user not found",
"statusCode": 404,
"errorCode": "BROKER_USER_NOT_FOUND",
"details": {
"externalUserId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
500 Response
{
"message": "Internal server error",
"statusCode": 500,
"errorCode": "INTERNAL_SERVER_ERROR",
"details": {
"externalId": "12354686-52f1-43ba-aec6-c3d863112232"
},
"datetime": "2025-10-19T17:28:39.780Z"
}
502 Response
{
"message": "Bad gateway",
"statusCode": 502,
"errorCode": "BAD_GATEWAY",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | OK | PortfolioPerformanceChartResponse |
| 400 | Bad Request | Bad request | ErrorResponse |
| 401 | Unauthorized | Unauthorized | ErrorResponse |
| 404 | Not Found | Not found | ErrorResponse |
| 500 | Internal Server Error | Internal server error | ErrorResponse |
| 502 | Bad Gateway | Bad gateway | ErrorResponse |
getUserPortfolioInfo
Code samples
# You can also use wget
curl -X GET https://api-dev.ndax.io/v1/integrations/broker/users/portfolio/info \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
GET https://api-dev.ndax.io/v1/integrations/broker/users/portfolio/info HTTP/1.1
Host: api-dev.ndax.io
Accept: application/json
const headers = {
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('https://api-dev.ndax.io/v1/integrations/broker/users/portfolio/info',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.get 'https://api-dev.ndax.io/v1/integrations/broker/users/portfolio/info',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.get('https://api-dev.ndax.io/v1/integrations/broker/users/portfolio/info', headers = headers)
print(r.json())
<?php
require 'vendor/autoload.php';
$headers = array(
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','https://api-dev.ndax.io/v1/integrations/broker/users/portfolio/info', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("https://api-dev.ndax.io/v1/integrations/broker/users/portfolio/info");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("GET", "https://api-dev.ndax.io/v1/integrations/broker/users/portfolio/info", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
GET /users/portfolio/info
Get broker user's portfolio info
Required permission: user:portfolio:read
Error codes:
NO_BROKER_USER_IDENTIFIER_PROVIDED – when neither userId nor externalUserId is provided.
BROKER_USER_NOT_FOUND – when the user is not found.
AMBIGUOUS_BROKER_USER_IDENTIFIER – when both userId and externalUserId are provided, but only one is expected.
INTERNAL_SERVER_ERROR – an unexpected server error occurred.
BAD_REQUEST – the request is invalid or contains incorrect parameters.
BAD_GATEWAY – received an invalid response from an upstream server.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| userId | query | string | false | none |
| externalUserId | query | string | false | none |
Example responses
200 Response
{
"totalInvested": 0.1,
"totalWithdrawal": 0.1,
"totalProfit": 0.1,
"portfolioGrowth": 0.1,
"assets": [
{
"productId": 1,
"purchasePrice": 94344.54,
"realizedGain": 1.43,
"unrealizedGain": 23.4,
"change": 0.4
}
]
}
400 Response
{
"message": "Broker user already exists",
"statusCode": 400,
"errorCode": "BROKER_USER_ALREADY_EXISTS",
"details": {
"externalId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
401 Response
{
"message": "Auth token expired",
"statusCode": 401,
"errorCode": "AUTH_TOKEN_EXPIRED",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
404 Response
{
"message": "Broker user not found",
"statusCode": 404,
"errorCode": "BROKER_USER_NOT_FOUND",
"details": {
"externalUserId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
500 Response
{
"message": "Internal server error",
"statusCode": 500,
"errorCode": "INTERNAL_SERVER_ERROR",
"details": {
"externalId": "12354686-52f1-43ba-aec6-c3d863112232"
},
"datetime": "2025-10-19T17:28:39.780Z"
}
502 Response
{
"message": "Bad gateway",
"statusCode": 502,
"errorCode": "BAD_GATEWAY",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | OK | PortfolioInfoResponse |
| 400 | Bad Request | Bad request | ErrorResponse |
| 401 | Unauthorized | Unauthorized | ErrorResponse |
| 404 | Not Found | Not found | ErrorResponse |
| 500 | Internal Server Error | Internal server error | ErrorResponse |
| 502 | Bad Gateway | Bad gateway | ErrorResponse |
Liquidations
getLiquidationById
Code samples
# You can also use wget
curl -X GET https://api-dev.ndax.io/v1/integrations/broker/liquidations/{id} \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
GET https://api-dev.ndax.io/v1/integrations/broker/liquidations/{id} HTTP/1.1
Host: api-dev.ndax.io
Accept: application/json
const headers = {
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('https://api-dev.ndax.io/v1/integrations/broker/liquidations/{id}',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.get 'https://api-dev.ndax.io/v1/integrations/broker/liquidations/{id}',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.get('https://api-dev.ndax.io/v1/integrations/broker/liquidations/{id}', headers = headers)
print(r.json())
<?php
require 'vendor/autoload.php';
$headers = array(
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','https://api-dev.ndax.io/v1/integrations/broker/liquidations/{id}', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("https://api-dev.ndax.io/v1/integrations/broker/liquidations/{id}");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("GET", "https://api-dev.ndax.io/v1/integrations/broker/liquidations/{id}", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
GET /liquidations/{id}
Get liquidation by ID
Required permission: liquidation:read
Error codes:
LIQUIDATION_NOT_FOUND - when liquidation not found.
INTERNAL_SERVER_ERROR – an unexpected server error occurred.
BAD_REQUEST – the request is invalid or contains incorrect parameters.
BAD_GATEWAY – received an invalid response from an upstream server.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| id | path | string | true | none |
Example responses
200 Response
{
"id": "string",
"brokerId": "string",
"userId": "string",
"deletePersonalInfo": true,
"liquidationFeeTier": 0,
"status": "PROCESSING",
"positions": [
{
"productId": 0,
"amount": "string",
"status": "PENDING"
}
],
"createdAt": "string"
}
400 Response
{
"message": "Broker user already exists",
"statusCode": 400,
"errorCode": "BROKER_USER_ALREADY_EXISTS",
"details": {
"externalId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
401 Response
{
"message": "Auth token expired",
"statusCode": 401,
"errorCode": "AUTH_TOKEN_EXPIRED",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
404 Response
{
"message": "Broker user not found",
"statusCode": 404,
"errorCode": "BROKER_USER_NOT_FOUND",
"details": {
"externalUserId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
500 Response
{
"message": "Internal server error",
"statusCode": 500,
"errorCode": "INTERNAL_SERVER_ERROR",
"details": {
"externalId": "12354686-52f1-43ba-aec6-c3d863112232"
},
"datetime": "2025-10-19T17:28:39.780Z"
}
502 Response
{
"message": "Bad gateway",
"statusCode": 502,
"errorCode": "BAD_GATEWAY",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | OK | LiquidationResponse |
| 400 | Bad Request | Bad request | ErrorResponse |
| 401 | Unauthorized | Unauthorized | ErrorResponse |
| 404 | Not Found | Not found | ErrorResponse |
| 500 | Internal Server Error | Internal server error | ErrorResponse |
| 502 | Bad Gateway | Bad gateway | ErrorResponse |
Broker
getBrokerBalances
Code samples
# You can also use wget
curl -X GET https://api-dev.ndax.io/v1/integrations/broker/balances \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
GET https://api-dev.ndax.io/v1/integrations/broker/balances HTTP/1.1
Host: api-dev.ndax.io
Accept: application/json
const headers = {
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('https://api-dev.ndax.io/v1/integrations/broker/balances',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.get 'https://api-dev.ndax.io/v1/integrations/broker/balances',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.get('https://api-dev.ndax.io/v1/integrations/broker/balances', headers = headers)
print(r.json())
<?php
require 'vendor/autoload.php';
$headers = array(
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','https://api-dev.ndax.io/v1/integrations/broker/balances', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("https://api-dev.ndax.io/v1/integrations/broker/balances");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("GET", "https://api-dev.ndax.io/v1/integrations/broker/balances", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
GET /balances
Get broker account balances
Required permission: broker:balance:read
Error codes:
INTERNAL_SERVER_ERROR – an unexpected server error occurred.
BAD_REQUEST – the request is invalid or contains incorrect parameters.
BAD_GATEWAY – received an invalid response from an upstream server.
Example responses
200 Response
{
"totalNotionalValue": 13200,
"holdNotionalValue": 100,
"availableNotionalValue": 13100,
"notionalProductId": 5,
"notionalProductSymbol": "CAD",
"positions": [
{
"productId": 5,
"productSymbol": "BTC",
"total": 0.1,
"totalNotionalValue": 12300,
"available": 0.1,
"availableNotionalValue": 12300,
"hold": 0,
"holdNotionalValue": 0
}
]
}
400 Response
{
"message": "Broker user already exists",
"statusCode": 400,
"errorCode": "BROKER_USER_ALREADY_EXISTS",
"details": {
"externalId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
401 Response
{
"message": "Auth token expired",
"statusCode": 401,
"errorCode": "AUTH_TOKEN_EXPIRED",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
404 Response
{
"message": "Broker user not found",
"statusCode": 404,
"errorCode": "BROKER_USER_NOT_FOUND",
"details": {
"externalUserId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
500 Response
{
"message": "Internal server error",
"statusCode": 500,
"errorCode": "INTERNAL_SERVER_ERROR",
"details": {
"externalId": "12354686-52f1-43ba-aec6-c3d863112232"
},
"datetime": "2025-10-19T17:28:39.780Z"
}
502 Response
{
"message": "Bad gateway",
"statusCode": 502,
"errorCode": "BAD_GATEWAY",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | OK | BalancesResponse |
| 400 | Bad Request | Bad request | ErrorResponse |
| 401 | Unauthorized | Unauthorized | ErrorResponse |
| 404 | Not Found | Not found | ErrorResponse |
| 500 | Internal Server Error | Internal server error | ErrorResponse |
| 502 | Bad Gateway | Bad gateway | ErrorResponse |
Rules
getBrokerRules
Code samples
# You can also use wget
curl -X GET https://api-dev.ndax.io/v1/integrations/broker/rules \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
GET https://api-dev.ndax.io/v1/integrations/broker/rules HTTP/1.1
Host: api-dev.ndax.io
Accept: application/json
const headers = {
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('https://api-dev.ndax.io/v1/integrations/broker/rules',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.get 'https://api-dev.ndax.io/v1/integrations/broker/rules',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.get('https://api-dev.ndax.io/v1/integrations/broker/rules', headers = headers)
print(r.json())
<?php
require 'vendor/autoload.php';
$headers = array(
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','https://api-dev.ndax.io/v1/integrations/broker/rules', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("https://api-dev.ndax.io/v1/integrations/broker/rules");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("GET", "https://api-dev.ndax.io/v1/integrations/broker/rules", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
GET /rules
Create broker rules
Required permission: broker:rule:read
Error codes:
INTERNAL_SERVER_ERROR – an unexpected server error occurred.
BAD_REQUEST – the request is invalid or contains incorrect parameters.
Example responses
200 Response
[
{
"id": "string",
"brokerId": "12354686-52f1-43ba-aec6-c3d863112232",
"enabled": true,
"type": "Slippage",
"value": "string"
}
]
400 Response
{
"message": "Broker user already exists",
"statusCode": 400,
"errorCode": "BROKER_USER_ALREADY_EXISTS",
"details": {
"externalId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
401 Response
{
"message": "Auth token expired",
"statusCode": 401,
"errorCode": "AUTH_TOKEN_EXPIRED",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
404 Response
{
"message": "Broker user not found",
"statusCode": 404,
"errorCode": "BROKER_USER_NOT_FOUND",
"details": {
"externalUserId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
500 Response
{
"message": "Internal server error",
"statusCode": 500,
"errorCode": "INTERNAL_SERVER_ERROR",
"details": {
"externalId": "12354686-52f1-43ba-aec6-c3d863112232"
},
"datetime": "2025-10-19T17:28:39.780Z"
}
502 Response
{
"message": "Bad gateway",
"statusCode": 502,
"errorCode": "BAD_GATEWAY",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | OK | Inline |
| 400 | Bad Request | Bad request | ErrorResponse |
| 401 | Unauthorized | Unauthorized | ErrorResponse |
| 404 | Not Found | Not found | ErrorResponse |
| 500 | Internal Server Error | Internal server error | ErrorResponse |
| 502 | Bad Gateway | Bad gateway | ErrorResponse |
Response Schema
Status Code 200
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| anonymous | [BrokerRuleResponse] | false | none | none |
| » id | string | true | none | none |
| » brokerId | string | true | none | none |
| » enabled | boolean | true | none | none |
| » type | BrokerRuleType | true | none | none |
| » value | string | true | none | none |
Enumerated Values
| Property | Value |
|---|---|
| type | Slippage |
| type | HaltQuotesExecution |
| type | QuoteExpirationTimeout |
| type | OneTimeBuyNotionalLimit |
| type | DailyBuyNotionalLimit |
| type | OneTimeSellNotionalLimit |
| type | DailySellNotionalLimit |
createBrokerRule
Code samples
# You can also use wget
curl -X POST https://api-dev.ndax.io/v1/integrations/broker/rules \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
POST https://api-dev.ndax.io/v1/integrations/broker/rules HTTP/1.1
Host: api-dev.ndax.io
Content-Type: application/json
Accept: application/json
const inputBody = '{
"type": "Slippage",
"value": "string"
}';
const headers = {
'Content-Type':'application/json',
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('https://api-dev.ndax.io/v1/integrations/broker/rules',
{
method: 'POST',
body: inputBody,
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.post 'https://api-dev.ndax.io/v1/integrations/broker/rules',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.post('https://api-dev.ndax.io/v1/integrations/broker/rules', headers = headers)
print(r.json())
<?php
require 'vendor/autoload.php';
$headers = array(
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('POST','https://api-dev.ndax.io/v1/integrations/broker/rules', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("https://api-dev.ndax.io/v1/integrations/broker/rules");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Content-Type": []string{"application/json"},
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("POST", "https://api-dev.ndax.io/v1/integrations/broker/rules", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
POST /rules
Create broker rule
Required permission: broker:rule:manage
Error codes:
BROKER_RULE_ALREADY_EXISTS - the rule already exists (cannot create with the same type twice).
BROKER_RULE_INVALID_VALUE – invalid broker rule value; expected a positive number for trading limits.
INTERNAL_SERVER_ERROR – an unexpected server error occurred.
BAD_REQUEST – the request is invalid or contains incorrect parameters.
Body parameter
{
"type": "Slippage",
"value": "string"
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| body | body | CreateBrokerRuleOptions | true | none |
Example responses
201 Response
{
"id": "string",
"brokerId": "12354686-52f1-43ba-aec6-c3d863112232",
"enabled": true,
"type": "Slippage",
"value": "string"
}
400 Response
{
"message": "Broker user already exists",
"statusCode": 400,
"errorCode": "BROKER_USER_ALREADY_EXISTS",
"details": {
"externalId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
401 Response
{
"message": "Auth token expired",
"statusCode": 401,
"errorCode": "AUTH_TOKEN_EXPIRED",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
404 Response
{
"message": "Broker user not found",
"statusCode": 404,
"errorCode": "BROKER_USER_NOT_FOUND",
"details": {
"externalUserId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
500 Response
{
"message": "Internal server error",
"statusCode": 500,
"errorCode": "INTERNAL_SERVER_ERROR",
"details": {
"externalId": "12354686-52f1-43ba-aec6-c3d863112232"
},
"datetime": "2025-10-19T17:28:39.780Z"
}
502 Response
{
"message": "Bad gateway",
"statusCode": 502,
"errorCode": "BAD_GATEWAY",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 201 | Created | OK | BrokerRuleResponse |
| 400 | Bad Request | Bad request | ErrorResponse |
| 401 | Unauthorized | Unauthorized | ErrorResponse |
| 404 | Not Found | Not found | ErrorResponse |
| 500 | Internal Server Error | Internal server error | ErrorResponse |
| 502 | Bad Gateway | Bad gateway | ErrorResponse |
updateBrokerRule
Code samples
# You can also use wget
curl -X PATCH https://api-dev.ndax.io/v1/integrations/broker/rules/{ruleId} \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
PATCH https://api-dev.ndax.io/v1/integrations/broker/rules/{ruleId} HTTP/1.1
Host: api-dev.ndax.io
Content-Type: application/json
Accept: application/json
const inputBody = '{
"value": "string"
}';
const headers = {
'Content-Type':'application/json',
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('https://api-dev.ndax.io/v1/integrations/broker/rules/{ruleId}',
{
method: 'PATCH',
body: inputBody,
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.patch 'https://api-dev.ndax.io/v1/integrations/broker/rules/{ruleId}',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.patch('https://api-dev.ndax.io/v1/integrations/broker/rules/{ruleId}', headers = headers)
print(r.json())
<?php
require 'vendor/autoload.php';
$headers = array(
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('PATCH','https://api-dev.ndax.io/v1/integrations/broker/rules/{ruleId}', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("https://api-dev.ndax.io/v1/integrations/broker/rules/{ruleId}");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("PATCH");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Content-Type": []string{"application/json"},
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("PATCH", "https://api-dev.ndax.io/v1/integrations/broker/rules/{ruleId}", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
PATCH /rules/{ruleId}
Update broker rule
Required permission: broker:rule:manage
Error codes:
BROKER_RULE_NOT_FOUND - broker rule not found.
BROKER_RULE_INVALID_VALUE – invalid broker rule value; expected a positive number for trading limits.
INTERNAL_SERVER_ERROR – an unexpected server error occurred.
BAD_REQUEST – the request is invalid or contains incorrect parameters.
Body parameter
{
"value": "string"
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| ruleId | path | string | true | none |
| body | body | UpdateBrokerRuleOptions | true | none |
Example responses
200 Response
{
"id": "string",
"brokerId": "12354686-52f1-43ba-aec6-c3d863112232",
"enabled": true,
"type": "Slippage",
"value": "string"
}
400 Response
{
"message": "Broker user already exists",
"statusCode": 400,
"errorCode": "BROKER_USER_ALREADY_EXISTS",
"details": {
"externalId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
401 Response
{
"message": "Auth token expired",
"statusCode": 401,
"errorCode": "AUTH_TOKEN_EXPIRED",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
404 Response
{
"message": "Broker user not found",
"statusCode": 404,
"errorCode": "BROKER_USER_NOT_FOUND",
"details": {
"externalUserId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
500 Response
{
"message": "Internal server error",
"statusCode": 500,
"errorCode": "INTERNAL_SERVER_ERROR",
"details": {
"externalId": "12354686-52f1-43ba-aec6-c3d863112232"
},
"datetime": "2025-10-19T17:28:39.780Z"
}
502 Response
{
"message": "Bad gateway",
"statusCode": 502,
"errorCode": "BAD_GATEWAY",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | OK | BrokerRuleResponse |
| 400 | Bad Request | Bad request | ErrorResponse |
| 401 | Unauthorized | Unauthorized | ErrorResponse |
| 404 | Not Found | Not found | ErrorResponse |
| 500 | Internal Server Error | Internal server error | ErrorResponse |
| 502 | Bad Gateway | Bad gateway | ErrorResponse |
enableBrokerRule
Code samples
# You can also use wget
curl -X PATCH https://api-dev.ndax.io/v1/integrations/broker/rules/{ruleId}/enable \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
PATCH https://api-dev.ndax.io/v1/integrations/broker/rules/{ruleId}/enable HTTP/1.1
Host: api-dev.ndax.io
Accept: application/json
const headers = {
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('https://api-dev.ndax.io/v1/integrations/broker/rules/{ruleId}/enable',
{
method: 'PATCH',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.patch 'https://api-dev.ndax.io/v1/integrations/broker/rules/{ruleId}/enable',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.patch('https://api-dev.ndax.io/v1/integrations/broker/rules/{ruleId}/enable', headers = headers)
print(r.json())
<?php
require 'vendor/autoload.php';
$headers = array(
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('PATCH','https://api-dev.ndax.io/v1/integrations/broker/rules/{ruleId}/enable', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("https://api-dev.ndax.io/v1/integrations/broker/rules/{ruleId}/enable");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("PATCH");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("PATCH", "https://api-dev.ndax.io/v1/integrations/broker/rules/{ruleId}/enable", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
PATCH /rules/{ruleId}/enable
Enabled broker rule
Required permission: broker:rule:manage
Error codes:
BROKER_RULE_NOT_FOUND - broker rule not found.
BROKER_RULE_ALREADY_ENABLED - broker rule already enabled.
INTERNAL_SERVER_ERROR – an unexpected server error occurred.
BAD_REQUEST – the request is invalid or contains incorrect parameters.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| ruleId | path | string | true | none |
Example responses
200 Response
{
"id": "string",
"brokerId": "12354686-52f1-43ba-aec6-c3d863112232",
"enabled": true,
"type": "Slippage",
"value": "string"
}
400 Response
{
"message": "Broker user already exists",
"statusCode": 400,
"errorCode": "BROKER_USER_ALREADY_EXISTS",
"details": {
"externalId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
401 Response
{
"message": "Auth token expired",
"statusCode": 401,
"errorCode": "AUTH_TOKEN_EXPIRED",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
404 Response
{
"message": "Broker user not found",
"statusCode": 404,
"errorCode": "BROKER_USER_NOT_FOUND",
"details": {
"externalUserId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
500 Response
{
"message": "Internal server error",
"statusCode": 500,
"errorCode": "INTERNAL_SERVER_ERROR",
"details": {
"externalId": "12354686-52f1-43ba-aec6-c3d863112232"
},
"datetime": "2025-10-19T17:28:39.780Z"
}
502 Response
{
"message": "Bad gateway",
"statusCode": 502,
"errorCode": "BAD_GATEWAY",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | OK | BrokerRuleResponse |
| 400 | Bad Request | Bad request | ErrorResponse |
| 401 | Unauthorized | Unauthorized | ErrorResponse |
| 404 | Not Found | Not found | ErrorResponse |
| 500 | Internal Server Error | Internal server error | ErrorResponse |
| 502 | Bad Gateway | Bad gateway | ErrorResponse |
disableBrokerRule
Code samples
# You can also use wget
curl -X PATCH https://api-dev.ndax.io/v1/integrations/broker/rules/{ruleId}/disable \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
PATCH https://api-dev.ndax.io/v1/integrations/broker/rules/{ruleId}/disable HTTP/1.1
Host: api-dev.ndax.io
Accept: application/json
const headers = {
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('https://api-dev.ndax.io/v1/integrations/broker/rules/{ruleId}/disable',
{
method: 'PATCH',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.patch 'https://api-dev.ndax.io/v1/integrations/broker/rules/{ruleId}/disable',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.patch('https://api-dev.ndax.io/v1/integrations/broker/rules/{ruleId}/disable', headers = headers)
print(r.json())
<?php
require 'vendor/autoload.php';
$headers = array(
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('PATCH','https://api-dev.ndax.io/v1/integrations/broker/rules/{ruleId}/disable', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("https://api-dev.ndax.io/v1/integrations/broker/rules/{ruleId}/disable");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("PATCH");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("PATCH", "https://api-dev.ndax.io/v1/integrations/broker/rules/{ruleId}/disable", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
PATCH /rules/{ruleId}/disable
Disable broker rule
Required permission: broker:rule:manage
Error codes:
BROKER_RULE_NOT_FOUND - broker rule not found.
BROKER_RULE_ALREADY_DISABLED - broker rule already disabled.
INTERNAL_SERVER_ERROR – an unexpected server error occurred.
BAD_REQUEST – the request is invalid or contains incorrect parameters.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| ruleId | path | string | true | none |
Example responses
200 Response
{
"id": "string",
"brokerId": "12354686-52f1-43ba-aec6-c3d863112232",
"enabled": true,
"type": "Slippage",
"value": "string"
}
400 Response
{
"message": "Broker user already exists",
"statusCode": 400,
"errorCode": "BROKER_USER_ALREADY_EXISTS",
"details": {
"externalId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
401 Response
{
"message": "Auth token expired",
"statusCode": 401,
"errorCode": "AUTH_TOKEN_EXPIRED",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
404 Response
{
"message": "Broker user not found",
"statusCode": 404,
"errorCode": "BROKER_USER_NOT_FOUND",
"details": {
"externalUserId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
500 Response
{
"message": "Internal server error",
"statusCode": 500,
"errorCode": "INTERNAL_SERVER_ERROR",
"details": {
"externalId": "12354686-52f1-43ba-aec6-c3d863112232"
},
"datetime": "2025-10-19T17:28:39.780Z"
}
502 Response
{
"message": "Bad gateway",
"statusCode": 502,
"errorCode": "BAD_GATEWAY",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | OK | BrokerRuleResponse |
| 400 | Bad Request | Bad request | ErrorResponse |
| 401 | Unauthorized | Unauthorized | ErrorResponse |
| 404 | Not Found | Not found | ErrorResponse |
| 500 | Internal Server Error | Internal server error | ErrorResponse |
| 502 | Bad Gateway | Bad gateway | ErrorResponse |
Market
getProducts
Code samples
# You can also use wget
curl -X GET https://api-dev.ndax.io/v1/integrations/broker/products \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
GET https://api-dev.ndax.io/v1/integrations/broker/products HTTP/1.1
Host: api-dev.ndax.io
Accept: application/json
const headers = {
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('https://api-dev.ndax.io/v1/integrations/broker/products',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.get 'https://api-dev.ndax.io/v1/integrations/broker/products',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.get('https://api-dev.ndax.io/v1/integrations/broker/products', headers = headers)
print(r.json())
<?php
require 'vendor/autoload.php';
$headers = array(
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','https://api-dev.ndax.io/v1/integrations/broker/products', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("https://api-dev.ndax.io/v1/integrations/broker/products");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("GET", "https://api-dev.ndax.io/v1/integrations/broker/products", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
GET /products
Get products
Required permission: product:read
Error codes:
INTERNAL_SERVER_ERROR – an unexpected server error occurred.
BAD_GATEWAY – received an invalid response from an upstream server.
Example responses
200 Response
[
{
"productId": 1,
"symbol": "BTC",
"fullName": "Bitcoin",
"type": "CryptoCurrency",
"image": "https://res.cloudinary.com/ndaxio/image/upload/v1707474049/uploads/3c67b092-82e6-431b-9ca4-8b6a569c160c.svg",
"decimalPlaces": 8,
"homepageLink": "http://www.bitcoin.org",
"whitePaperLink": "https://bitcoin.org/bitcoin.pdf",
"marketCapRank": 1,
"marketCap": 3193551674487.55,
"circulatingSupply": 19941106,
"totalSupply": 19941106,
"depositConfigs": [
{
"_id": "string",
"type": "FROM_EXTERNAL_WALLET",
"disabled": true,
"fee": 0,
"accountProviderId": 0,
"templateForm": "ADDRESS_ONLY",
"canGenerateDepositKeys": true,
"depositKeyPattern": [
"DEFAULT"
],
"note": "string",
"network": {
"name": "string",
"suspended": true,
"blockchainExplorer": {
"address": "string",
"transaction": "string"
},
"addressValidatorRegex": "string",
"tagValidatorRegex": "string"
}
}
]
}
]
400 Response
{
"message": "Broker user already exists",
"statusCode": 400,
"errorCode": "BROKER_USER_ALREADY_EXISTS",
"details": {
"externalId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
401 Response
{
"message": "Auth token expired",
"statusCode": 401,
"errorCode": "AUTH_TOKEN_EXPIRED",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
404 Response
{
"message": "Broker user not found",
"statusCode": 404,
"errorCode": "BROKER_USER_NOT_FOUND",
"details": {
"externalUserId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
500 Response
{
"message": "Internal server error",
"statusCode": 500,
"errorCode": "INTERNAL_SERVER_ERROR",
"details": {
"externalId": "12354686-52f1-43ba-aec6-c3d863112232"
},
"datetime": "2025-10-19T17:28:39.780Z"
}
502 Response
{
"message": "Bad gateway",
"statusCode": 502,
"errorCode": "BAD_GATEWAY",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | OK | Inline |
| 400 | Bad Request | Bad request | ErrorResponse |
| 401 | Unauthorized | Unauthorized | ErrorResponse |
| 404 | Not Found | Not found | ErrorResponse |
| 500 | Internal Server Error | Internal server error | ErrorResponse |
| 502 | Bad Gateway | Bad gateway | ErrorResponse |
Response Schema
Status Code 200
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| anonymous | [BrokerProductResponse] | false | none | none |
| » productId | number | true | none | Product identifier |
| » symbol | string | true | none | Product symbol |
| » fullName | string | true | none | Product full name |
| » type | ProductType | true | none | Type of asset |
| » image | string | false | none | Product logo image url |
| » decimalPlaces | number | true | none | Product decimal places |
| » homepageLink | string | false | none | none |
| » whitePaperLink | string | false | none | none |
| » marketCapRank | number | false | none | none |
| » marketCap | string | false | none | none |
| » circulatingSupply | string | false | none | none |
| » totalSupply | string | false | none | none |
| » depositConfigs | [ExternalWalletDepositConfig] | true | none | [Deposit configuration for external wallet deposits, as defined in @ndaxio/asset-manager-ts-client.] |
| »» _id | string | true | none | none |
| »» type | DepositConfigType | true | none | none |
| »» disabled | boolean | true | none | none |
| »» fee | number | false | none | none |
| »» accountProviderId | integer | true | none | none |
| »» templateForm | DepositTemplateForm | true | none | none |
| »» canGenerateDepositKeys | boolean | true | none | none |
| »» depositKeyPattern | [DepositKeyPatternElement] | true | none | none |
| »» note | string | false | none | none |
| »» network | NetworkInfo | true | none | none |
| »»» name | string | true | none | none |
| »»» suspended | boolean | true | none | none |
| »»» blockchainExplorer | BlockchainExplorerLinks | false | none | none |
| »»»» address | string | true | none | none |
| »»»» transaction | string | true | none | none |
| »»» addressValidatorRegex | string | false | none | none |
| »»» tagValidatorRegex | string | false | none | none |
Enumerated Values
| Property | Value |
|---|---|
| type | Unknown |
| type | NationalCurrency |
| type | CryptoCurrency |
| type | Contract |
| type | FROM_EXTERNAL_WALLET |
| type | FIAT_DEPOSIT |
| type | TRANSFER |
| type | LIGHTNING |
| templateForm | ADDRESS_ONLY |
| templateForm | ADDRESS_AND_DESTINATION_TAG |
| templateForm | ADDRESS_AND_MEMO |
getInstruments
Code samples
# You can also use wget
curl -X GET https://api-dev.ndax.io/v1/integrations/broker/instruments \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
GET https://api-dev.ndax.io/v1/integrations/broker/instruments HTTP/1.1
Host: api-dev.ndax.io
Accept: application/json
const headers = {
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('https://api-dev.ndax.io/v1/integrations/broker/instruments',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.get 'https://api-dev.ndax.io/v1/integrations/broker/instruments',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.get('https://api-dev.ndax.io/v1/integrations/broker/instruments', headers = headers)
print(r.json())
<?php
require 'vendor/autoload.php';
$headers = array(
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','https://api-dev.ndax.io/v1/integrations/broker/instruments', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("https://api-dev.ndax.io/v1/integrations/broker/instruments");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("GET", "https://api-dev.ndax.io/v1/integrations/broker/instruments", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
GET /instruments
Get instruments
Required permission: instrument:read
Error codes:
INTERNAL_SERVER_ERROR – an unexpected server error occurred. BAD_GATEWAY – received an invalid response from an upstream server.
Example responses
200 Response
[
{
"instrumentId": 5,
"instrumentSymbol": "BTCCAD",
"product1Id": 1,
"product1Symbol": "BTC",
"product2Id": 5,
"product2Symbol": "CAD",
"minQuantity": 0.0001,
"quantityIncrement": 0.0001,
"priceIncrement": 0.001
}
]
400 Response
{
"message": "Broker user already exists",
"statusCode": 400,
"errorCode": "BROKER_USER_ALREADY_EXISTS",
"details": {
"externalId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
401 Response
{
"message": "Auth token expired",
"statusCode": 401,
"errorCode": "AUTH_TOKEN_EXPIRED",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
404 Response
{
"message": "Broker user not found",
"statusCode": 404,
"errorCode": "BROKER_USER_NOT_FOUND",
"details": {
"externalUserId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
500 Response
{
"message": "Internal server error",
"statusCode": 500,
"errorCode": "INTERNAL_SERVER_ERROR",
"details": {
"externalId": "12354686-52f1-43ba-aec6-c3d863112232"
},
"datetime": "2025-10-19T17:28:39.780Z"
}
502 Response
{
"message": "Bad gateway",
"statusCode": 502,
"errorCode": "BAD_GATEWAY",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | OK | Inline |
| 400 | Bad Request | Bad request | ErrorResponse |
| 401 | Unauthorized | Unauthorized | ErrorResponse |
| 404 | Not Found | Not found | ErrorResponse |
| 500 | Internal Server Error | Internal server error | ErrorResponse |
| 502 | Bad Gateway | Bad gateway | ErrorResponse |
Response Schema
Status Code 200
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| anonymous | [BrokerInstrumentConfig] | false | none | none |
| » instrumentId | number | true | none | none |
| » instrumentSymbol | string | true | none | none |
| » product1Id | number | true | none | Identifier of base product |
| » product1Symbol | string | true | none | Symbol of base product |
| » product2Id | number | true | none | Identifier of quote product |
| » product2Symbol | string | true | none | Symbol of quote product |
| » minQuantity | number | true | none | Minimum quantity of product1 could be executed in quote |
| » quantityIncrement | number | true | none | Minimum non-dividable unit of quantity |
| » priceIncrement | number | true | none | Minimum non-dividable unit of price |
getTickers
Code samples
# You can also use wget
curl -X GET https://api-dev.ndax.io/v1/integrations/broker/tickers \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
GET https://api-dev.ndax.io/v1/integrations/broker/tickers HTTP/1.1
Host: api-dev.ndax.io
Accept: application/json
const headers = {
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('https://api-dev.ndax.io/v1/integrations/broker/tickers',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.get 'https://api-dev.ndax.io/v1/integrations/broker/tickers',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.get('https://api-dev.ndax.io/v1/integrations/broker/tickers', headers = headers)
print(r.json())
<?php
require 'vendor/autoload.php';
$headers = array(
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','https://api-dev.ndax.io/v1/integrations/broker/tickers', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("https://api-dev.ndax.io/v1/integrations/broker/tickers");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("GET", "https://api-dev.ndax.io/v1/integrations/broker/tickers", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
GET /tickers
Get tickers
Required permission: ticker:read
Error codes:
INTERNAL_SERVER_ERROR – an unexpected server error occurred. BAD_GATEWAY – received an invalid response from an upstream server.
Example responses
200 Response
[
{
"instrumentId": 0,
"bestBid": "string",
"bestOffer": "string",
"lastTradedPrice": "string",
"bidQty": "string",
"askQty": "string",
"rolling24HrVolume": "string",
"rolling24HrPxChange": "string",
"rolling24HrPxChangePercent": "string",
"sessionOpen": "string",
"sessionHigh": "string",
"sessionLow": "string",
"sessionClose": "string"
}
]
400 Response
{
"message": "Broker user already exists",
"statusCode": 400,
"errorCode": "BROKER_USER_ALREADY_EXISTS",
"details": {
"externalId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
401 Response
{
"message": "Auth token expired",
"statusCode": 401,
"errorCode": "AUTH_TOKEN_EXPIRED",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
404 Response
{
"message": "Broker user not found",
"statusCode": 404,
"errorCode": "BROKER_USER_NOT_FOUND",
"details": {
"externalUserId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
500 Response
{
"message": "Internal server error",
"statusCode": 500,
"errorCode": "INTERNAL_SERVER_ERROR",
"details": {
"externalId": "12354686-52f1-43ba-aec6-c3d863112232"
},
"datetime": "2025-10-19T17:28:39.780Z"
}
502 Response
{
"message": "Bad gateway",
"statusCode": 502,
"errorCode": "BAD_GATEWAY",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | OK | Inline |
| 400 | Bad Request | Bad request | ErrorResponse |
| 401 | Unauthorized | Unauthorized | ErrorResponse |
| 404 | Not Found | Not found | ErrorResponse |
| 500 | Internal Server Error | Internal server error | ErrorResponse |
| 502 | Bad Gateway | Bad gateway | ErrorResponse |
Response Schema
Status Code 200
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| anonymous | [BrokerTickerResponse] | false | none | none |
| » instrumentId | integer(int32) | true | none | Numeric ID of the instrument |
| » bestBid | string | true | none | Best bid price |
| » bestOffer | string | true | none | Best offer price |
| » lastTradedPrice | string | true | none | Last traded price |
| » bidQty | string | true | none | Bid quantity |
| » askQty | string | true | none | Ask quantity |
| » rolling24HrVolume | string | true | none | 24-hour rolling trading volume |
| » rolling24HrPxChange | string | true | none | 24-hour rolling absolute price change |
| » rolling24HrPxChangePercent | string | true | none | 24-hour rolling price change in percent |
| » sessionOpen | string | true | none | Session opening price (Session starts at 00:00 UTC) |
| » sessionHigh | string | true | none | Session highest price (Session starts at 00:00 UTC) |
| » sessionLow | string | true | none | Session lowest price (Session starts at 00:00 UTC) |
| » sessionClose | string | true | none | Session closing price (Session starts at 00:00 UTC) |
Quotes
getQuoteById
Code samples
# You can also use wget
curl -X GET https://api-dev.ndax.io/v1/integrations/broker/quotes/{id} \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
GET https://api-dev.ndax.io/v1/integrations/broker/quotes/{id} HTTP/1.1
Host: api-dev.ndax.io
Accept: application/json
const headers = {
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('https://api-dev.ndax.io/v1/integrations/broker/quotes/{id}',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.get 'https://api-dev.ndax.io/v1/integrations/broker/quotes/{id}',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.get('https://api-dev.ndax.io/v1/integrations/broker/quotes/{id}', headers = headers)
print(r.json())
<?php
require 'vendor/autoload.php';
$headers = array(
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','https://api-dev.ndax.io/v1/integrations/broker/quotes/{id}', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("https://api-dev.ndax.io/v1/integrations/broker/quotes/{id}");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("GET", "https://api-dev.ndax.io/v1/integrations/broker/quotes/{id}", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
GET /quotes/{id}
Get quote by ID
Required permission: quote:read
Error codes:
QUOTE_NOT_FOUND – the quote was not found.
INTERNAL_SERVER_ERROR – an unexpected server error occurred.
BAD_REQUEST – the request is invalid or contains incorrect parameters.
BAD_GATEWAY – received an invalid response from an upstream server.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| id | path | string | true | none |
Example responses
200 Response
{
"quoteId": "c2c78a6f-9929-4625-9b02-39acffcb421d",
"brokerUserId": "c2c78a6f-9929-4625-9b02-39acffcb4211",
"instrumentId": 5,
"fromProductId": 1,
"toProductId": 5,
"side": "BUY",
"status": "PENDING",
"rejectReason": "INSUFFICIENT_MARKET_LIQUIDITY",
"enteredAmount": 50,
"estimatedPrice": 129323.47,
"estimatedAmount": 0.00038,
"estimatedOrderFee": {
"productId": 1,
"amount": 0.00000136,
"notionalValue": 0.1987790824,
"percentage": 0.2
},
"brokerFee": {
"tier": 1,
"tierFeePercentage": 0.2,
"amount": 0.02,
"productId": 5,
"notionalValue": 0.02,
"percentage": 0.2
},
"createdAt": "string",
"expirationDate": "string",
"trade": {
"tradeId": "c2c78a6f-9929-4625-9b02-39acffcb421d",
"instrumentId": 5,
"fromProductId": 1,
"toProductId": 5,
"side": "BUY",
"enteredAmount": 50,
"status": "PENDING",
"sentAmount": 48.43,
"receivedAmount": 0.00035928,
"price": 124543.54,
"orderFee": {
"productId": 1,
"amount": 0.00000136,
"notionalValue": 0.1987790824,
"percentage": 0.2
},
"brokerFee": {
"tier": 1,
"tierFeePercentage": 0.2,
"amount": 0.02,
"productId": 5,
"notionalValue": 0.02,
"percentage": 0.2
},
"createdAt": "2025-07-30T11:59:44.195Z",
"completedAt": "2025-07-30T11:59:48.512Z"
}
}
400 Response
{
"message": "Broker user already exists",
"statusCode": 400,
"errorCode": "BROKER_USER_ALREADY_EXISTS",
"details": {
"externalId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
401 Response
{
"message": "Auth token expired",
"statusCode": 401,
"errorCode": "AUTH_TOKEN_EXPIRED",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
404 Response
{
"message": "Broker user not found",
"statusCode": 404,
"errorCode": "BROKER_USER_NOT_FOUND",
"details": {
"externalUserId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
500 Response
{
"message": "Internal server error",
"statusCode": 500,
"errorCode": "INTERNAL_SERVER_ERROR",
"details": {
"externalId": "12354686-52f1-43ba-aec6-c3d863112232"
},
"datetime": "2025-10-19T17:28:39.780Z"
}
502 Response
{
"message": "Bad gateway",
"statusCode": 502,
"errorCode": "BAD_GATEWAY",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | OK | QuoteResponse |
| 400 | Bad Request | Bad request | ErrorResponse |
| 401 | Unauthorized | Unauthorized | ErrorResponse |
| 404 | Not Found | Not found | ErrorResponse |
| 500 | Internal Server Error | Internal server error | ErrorResponse |
| 502 | Bad Gateway | Bad gateway | ErrorResponse |
createQuote
Code samples
# You can also use wget
curl -X POST https://api-dev.ndax.io/v1/integrations/broker/quotes \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
POST https://api-dev.ndax.io/v1/integrations/broker/quotes HTTP/1.1
Host: api-dev.ndax.io
Content-Type: application/json
Accept: application/json
const inputBody = '{
"idempotencyId": "f04506eb-fe1b-47b9-ac0c-914341d168f7",
"userId": "c2c78a6f-9929-4625-9b02-39acffcb421d",
"externalUserId": 5555,
"side": "BUY",
"value": 50,
"instrumentId": 5,
"feeTier": 0
}';
const headers = {
'Content-Type':'application/json',
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('https://api-dev.ndax.io/v1/integrations/broker/quotes',
{
method: 'POST',
body: inputBody,
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.post 'https://api-dev.ndax.io/v1/integrations/broker/quotes',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.post('https://api-dev.ndax.io/v1/integrations/broker/quotes', headers = headers)
print(r.json())
<?php
require 'vendor/autoload.php';
$headers = array(
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('POST','https://api-dev.ndax.io/v1/integrations/broker/quotes', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("https://api-dev.ndax.io/v1/integrations/broker/quotes");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Content-Type": []string{"application/json"},
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("POST", "https://api-dev.ndax.io/v1/integrations/broker/quotes", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
POST /quotes
Create quote
Required permission: quote:manage
Error codes:
QUOTE_ALREADY_EXISTS - when an idempotentId is provided and the same value is received more than once.
NO_BROKER_USER_IDENTIFIER_PROVIDED – when neither userId nor externalUserId is provided.
BROKER_USER_NOT_FOUND – when the user is not found.
AMBIGUOUS_BROKER_USER_IDENTIFIER – when both userId and externalUserId are provided, but only one is expected.
BROKER_USER_NOT_FOUND – the broker user was not found.
BROKER_USER_IS_CLOSED – the broker user is closed, operation not allowed.
APPROPRIATENESS_QUESTIONNAIRE_IS_NOT_COMPLETED – the appropriateness questionnaire has not been completed.
INFO_CHECK_IS_NOT_COMPLETED – the info check has not been completed.
INSTRUMENT_NOT_FOUND – the specified instrument was not found.
INSTRUMENT_IS_DISABLED – the specified instrument is disabled.
BROKER_ACCOUNT_NOT_ENOUGH_FUNDS – insufficient funds in the broker master account.
QUOTE_ESTIMATED_AMOUNT_IS_ZERO – the quote value is too low; the estimated amount to receive equals zero.
QUOTE_VALUE_LESS_THAN_MINIMUM_QUANTITY – the quote value is below the minimum quantity (after deducting broker fees).
ONE_TIME_TRADE_LIMIT_EXCEEDED – the one-time trade limit has been exceeded.
DAILY_TRADE_LIMIT_EXCEEDED – the daily trade limit has been exceeded.
INSUFFICIENT_MARKET_LIQUIDITY – There is not enough market liquidity to fulfill the requested order volume.
INTERNAL_SERVER_ERROR – an unexpected server error occurred.
BAD_REQUEST – the request is invalid or contains incorrect parameters.
BAD_GATEWAY – received an invalid response from an upstream server.
Body parameter
{
"idempotencyId": "f04506eb-fe1b-47b9-ac0c-914341d168f7",
"userId": "c2c78a6f-9929-4625-9b02-39acffcb421d",
"externalUserId": 5555,
"side": "BUY",
"value": 50,
"instrumentId": 5,
"feeTier": 0
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| body | body | CreateQuoteOptions | true | none |
Example responses
201 Response
{
"quoteId": "c2c78a6f-9929-4625-9b02-39acffcb421d",
"brokerUserId": "c2c78a6f-9929-4625-9b02-39acffcb4211",
"instrumentId": 5,
"fromProductId": 1,
"toProductId": 5,
"side": "BUY",
"status": "PENDING",
"rejectReason": "INSUFFICIENT_MARKET_LIQUIDITY",
"enteredAmount": 50,
"estimatedPrice": 129323.47,
"estimatedAmount": 0.00038,
"estimatedOrderFee": {
"productId": 1,
"amount": 0.00000136,
"notionalValue": 0.1987790824,
"percentage": 0.2
},
"brokerFee": {
"tier": 1,
"tierFeePercentage": 0.2,
"amount": 0.02,
"productId": 5,
"notionalValue": 0.02,
"percentage": 0.2
},
"createdAt": "string",
"expirationDate": "string",
"trade": {
"tradeId": "c2c78a6f-9929-4625-9b02-39acffcb421d",
"instrumentId": 5,
"fromProductId": 1,
"toProductId": 5,
"side": "BUY",
"enteredAmount": 50,
"status": "PENDING",
"sentAmount": 48.43,
"receivedAmount": 0.00035928,
"price": 124543.54,
"orderFee": {
"productId": 1,
"amount": 0.00000136,
"notionalValue": 0.1987790824,
"percentage": 0.2
},
"brokerFee": {
"tier": 1,
"tierFeePercentage": 0.2,
"amount": 0.02,
"productId": 5,
"notionalValue": 0.02,
"percentage": 0.2
},
"createdAt": "2025-07-30T11:59:44.195Z",
"completedAt": "2025-07-30T11:59:48.512Z"
}
}
400 Response
{
"message": "Broker user already exists",
"statusCode": 400,
"errorCode": "BROKER_USER_ALREADY_EXISTS",
"details": {
"externalId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
401 Response
{
"message": "Auth token expired",
"statusCode": 401,
"errorCode": "AUTH_TOKEN_EXPIRED",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
404 Response
{
"message": "Broker user not found",
"statusCode": 404,
"errorCode": "BROKER_USER_NOT_FOUND",
"details": {
"externalUserId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
500 Response
{
"message": "Internal server error",
"statusCode": 500,
"errorCode": "INTERNAL_SERVER_ERROR",
"details": {
"externalId": "12354686-52f1-43ba-aec6-c3d863112232"
},
"datetime": "2025-10-19T17:28:39.780Z"
}
502 Response
{
"message": "Bad gateway",
"statusCode": 502,
"errorCode": "BAD_GATEWAY",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 201 | Created | OK | QuoteResponse |
| 400 | Bad Request | Bad request | ErrorResponse |
| 401 | Unauthorized | Unauthorized | ErrorResponse |
| 404 | Not Found | Not found | ErrorResponse |
| 500 | Internal Server Error | Internal server error | ErrorResponse |
| 502 | Bad Gateway | Bad gateway | ErrorResponse |
executeQuote
Code samples
# You can also use wget
curl -X POST https://api-dev.ndax.io/v1/integrations/broker/quotes/{id}/execute \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
POST https://api-dev.ndax.io/v1/integrations/broker/quotes/{id}/execute HTTP/1.1
Host: api-dev.ndax.io
Accept: application/json
const headers = {
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('https://api-dev.ndax.io/v1/integrations/broker/quotes/{id}/execute',
{
method: 'POST',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.post 'https://api-dev.ndax.io/v1/integrations/broker/quotes/{id}/execute',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.post('https://api-dev.ndax.io/v1/integrations/broker/quotes/{id}/execute', headers = headers)
print(r.json())
<?php
require 'vendor/autoload.php';
$headers = array(
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('POST','https://api-dev.ndax.io/v1/integrations/broker/quotes/{id}/execute', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("https://api-dev.ndax.io/v1/integrations/broker/quotes/{id}/execute");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("POST", "https://api-dev.ndax.io/v1/integrations/broker/quotes/{id}/execute", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
POST /quotes/{id}/execute
Execute quote
Required permission: quote:manage
Error codes:
QUOTE_NOT_FOUND – the quote was not found.
QUOTE_EXPIRED – the quote has expired (created more than one minute ago).
QUOTE_CANNOT_BE_CONFIRMED – the quote cannot be confirmed because it has already been executed or failed.
POLICY_IS_NOT_ACCEPTED – the “Buy Crypto” policy has not been acknowledged (when side = BUY).
BROKER_USER_ACCOUNT_NOT_ENOUGH_FUNDS – the user’s account does not have enough funds.
INTERNAL_SERVER_ERROR – an unexpected server error occurred.
BAD_REQUEST – the request is invalid or contains incorrect parameters.
BAD_GATEWAY – received an invalid response from an upstream server.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| id | path | string | true | none |
Example responses
201 Response
{
"quoteId": "c2c78a6f-9929-4625-9b02-39acffcb421d",
"brokerUserId": "c2c78a6f-9929-4625-9b02-39acffcb4211",
"instrumentId": 5,
"fromProductId": 1,
"toProductId": 5,
"side": "BUY",
"status": "PENDING",
"rejectReason": "INSUFFICIENT_MARKET_LIQUIDITY",
"enteredAmount": 50,
"estimatedPrice": 129323.47,
"estimatedAmount": 0.00038,
"estimatedOrderFee": {
"productId": 1,
"amount": 0.00000136,
"notionalValue": 0.1987790824,
"percentage": 0.2
},
"brokerFee": {
"tier": 1,
"tierFeePercentage": 0.2,
"amount": 0.02,
"productId": 5,
"notionalValue": 0.02,
"percentage": 0.2
},
"createdAt": "string",
"expirationDate": "string",
"trade": {
"tradeId": "c2c78a6f-9929-4625-9b02-39acffcb421d",
"instrumentId": 5,
"fromProductId": 1,
"toProductId": 5,
"side": "BUY",
"enteredAmount": 50,
"status": "PENDING",
"sentAmount": 48.43,
"receivedAmount": 0.00035928,
"price": 124543.54,
"orderFee": {
"productId": 1,
"amount": 0.00000136,
"notionalValue": 0.1987790824,
"percentage": 0.2
},
"brokerFee": {
"tier": 1,
"tierFeePercentage": 0.2,
"amount": 0.02,
"productId": 5,
"notionalValue": 0.02,
"percentage": 0.2
},
"createdAt": "2025-07-30T11:59:44.195Z",
"completedAt": "2025-07-30T11:59:48.512Z"
}
}
400 Response
{
"message": "Broker user already exists",
"statusCode": 400,
"errorCode": "BROKER_USER_ALREADY_EXISTS",
"details": {
"externalId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
401 Response
{
"message": "Auth token expired",
"statusCode": 401,
"errorCode": "AUTH_TOKEN_EXPIRED",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
404 Response
{
"message": "Broker user not found",
"statusCode": 404,
"errorCode": "BROKER_USER_NOT_FOUND",
"details": {
"externalUserId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
500 Response
{
"message": "Internal server error",
"statusCode": 500,
"errorCode": "INTERNAL_SERVER_ERROR",
"details": {
"externalId": "12354686-52f1-43ba-aec6-c3d863112232"
},
"datetime": "2025-10-19T17:28:39.780Z"
}
502 Response
{
"message": "Bad gateway",
"statusCode": 502,
"errorCode": "BAD_GATEWAY",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 201 | Created | OK | QuoteResponse |
| 400 | Bad Request | Bad request | ErrorResponse |
| 401 | Unauthorized | Unauthorized | ErrorResponse |
| 404 | Not Found | Not found | ErrorResponse |
| 500 | Internal Server Error | Internal server error | ErrorResponse |
| 502 | Bad Gateway | Bad gateway | ErrorResponse |
cancelQuote
Code samples
# You can also use wget
curl -X POST https://api-dev.ndax.io/v1/integrations/broker/quotes/{id}/cancel \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
POST https://api-dev.ndax.io/v1/integrations/broker/quotes/{id}/cancel HTTP/1.1
Host: api-dev.ndax.io
Accept: application/json
const headers = {
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('https://api-dev.ndax.io/v1/integrations/broker/quotes/{id}/cancel',
{
method: 'POST',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.post 'https://api-dev.ndax.io/v1/integrations/broker/quotes/{id}/cancel',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.post('https://api-dev.ndax.io/v1/integrations/broker/quotes/{id}/cancel', headers = headers)
print(r.json())
<?php
require 'vendor/autoload.php';
$headers = array(
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('POST','https://api-dev.ndax.io/v1/integrations/broker/quotes/{id}/cancel', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("https://api-dev.ndax.io/v1/integrations/broker/quotes/{id}/cancel");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("POST", "https://api-dev.ndax.io/v1/integrations/broker/quotes/{id}/cancel", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
POST /quotes/{id}/cancel
Cancel quote
Required permission: quote:manage
Error codes:
QUOTE_NOT_FOUND – the quote was not found.
QUOTE_EXPIRED – the quote has expired (created more than one minute ago).
QUOTE_CANNOT_BE_CANCELLED – the quote cannot be cancelled because it has already been executed or failed.
INTERNAL_SERVER_ERROR – an unexpected server error occurred.
BAD_REQUEST – the request is invalid or contains incorrect parameters.
BAD_GATEWAY – received an invalid response from an upstream server.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| id | path | string | true | none |
Example responses
201 Response
{
"quoteId": "c2c78a6f-9929-4625-9b02-39acffcb421d",
"brokerUserId": "c2c78a6f-9929-4625-9b02-39acffcb4211",
"instrumentId": 5,
"fromProductId": 1,
"toProductId": 5,
"side": "BUY",
"status": "PENDING",
"rejectReason": "INSUFFICIENT_MARKET_LIQUIDITY",
"enteredAmount": 50,
"estimatedPrice": 129323.47,
"estimatedAmount": 0.00038,
"estimatedOrderFee": {
"productId": 1,
"amount": 0.00000136,
"notionalValue": 0.1987790824,
"percentage": 0.2
},
"brokerFee": {
"tier": 1,
"tierFeePercentage": 0.2,
"amount": 0.02,
"productId": 5,
"notionalValue": 0.02,
"percentage": 0.2
},
"createdAt": "string",
"expirationDate": "string",
"trade": {
"tradeId": "c2c78a6f-9929-4625-9b02-39acffcb421d",
"instrumentId": 5,
"fromProductId": 1,
"toProductId": 5,
"side": "BUY",
"enteredAmount": 50,
"status": "PENDING",
"sentAmount": 48.43,
"receivedAmount": 0.00035928,
"price": 124543.54,
"orderFee": {
"productId": 1,
"amount": 0.00000136,
"notionalValue": 0.1987790824,
"percentage": 0.2
},
"brokerFee": {
"tier": 1,
"tierFeePercentage": 0.2,
"amount": 0.02,
"productId": 5,
"notionalValue": 0.02,
"percentage": 0.2
},
"createdAt": "2025-07-30T11:59:44.195Z",
"completedAt": "2025-07-30T11:59:48.512Z"
}
}
400 Response
{
"message": "Broker user already exists",
"statusCode": 400,
"errorCode": "BROKER_USER_ALREADY_EXISTS",
"details": {
"externalId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
401 Response
{
"message": "Auth token expired",
"statusCode": 401,
"errorCode": "AUTH_TOKEN_EXPIRED",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
404 Response
{
"message": "Broker user not found",
"statusCode": 404,
"errorCode": "BROKER_USER_NOT_FOUND",
"details": {
"externalUserId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
500 Response
{
"message": "Internal server error",
"statusCode": 500,
"errorCode": "INTERNAL_SERVER_ERROR",
"details": {
"externalId": "12354686-52f1-43ba-aec6-c3d863112232"
},
"datetime": "2025-10-19T17:28:39.780Z"
}
502 Response
{
"message": "Bad gateway",
"statusCode": 502,
"errorCode": "BAD_GATEWAY",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 201 | Created | OK | QuoteResponse |
| 400 | Bad Request | Bad request | ErrorResponse |
| 401 | Unauthorized | Unauthorized | ErrorResponse |
| 404 | Not Found | Not found | ErrorResponse |
| 500 | Internal Server Error | Internal server error | ErrorResponse |
| 502 | Bad Gateway | Bad gateway | ErrorResponse |
Trades
getUserTrades
Code samples
# You can also use wget
curl -X GET https://api-dev.ndax.io/v1/integrations/broker/trades \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
GET https://api-dev.ndax.io/v1/integrations/broker/trades HTTP/1.1
Host: api-dev.ndax.io
Accept: application/json
const headers = {
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('https://api-dev.ndax.io/v1/integrations/broker/trades',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.get 'https://api-dev.ndax.io/v1/integrations/broker/trades',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.get('https://api-dev.ndax.io/v1/integrations/broker/trades', headers = headers)
print(r.json())
<?php
require 'vendor/autoload.php';
$headers = array(
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','https://api-dev.ndax.io/v1/integrations/broker/trades', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("https://api-dev.ndax.io/v1/integrations/broker/trades");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("GET", "https://api-dev.ndax.io/v1/integrations/broker/trades", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
GET /trades
Get broker user's trades
Required permission: trade:read
Error codes:
INTERNAL_SERVER_ERROR – an unexpected server error occurred.
BAD_REQUEST – the request is invalid or contains incorrect parameters.
BAD_GATEWAY – received an invalid response from an upstream server.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| page | query | number | false | none |
| size | query | number | false | none |
| userId | query | string | false | none |
| externalUserId | query | string | false | none |
| status | query | TradeStatus | false | none |
| from | query | string | false | none |
| to | query | string | false | none |
Enumerated Values
| Parameter | Value |
|---|---|
| status | PENDING |
| status | PROCESSING |
| status | COMPLETED |
| status | FAILED |
| status | REJECTED |
Example responses
200 Response
{
"list": [
{
"tradeId": "c2c78a6f-9929-4625-9b02-39acffcb421d",
"instrumentId": 5,
"fromProductId": 1,
"toProductId": 5,
"side": "BUY",
"enteredAmount": 50,
"status": "PENDING",
"sentAmount": 48.43,
"receivedAmount": 0.00035928,
"price": 124543.54,
"orderFee": {
"productId": 1,
"amount": 0.00000136,
"notionalValue": 0.1987790824,
"percentage": 0.2
},
"brokerFee": {
"tier": 1,
"tierFeePercentage": 0.2,
"amount": 0.02,
"productId": 5,
"notionalValue": 0.02,
"percentage": 0.2
},
"createdAt": "2025-07-30T11:59:44.195Z",
"completedAt": "2025-07-30T11:59:48.512Z"
}
],
"total": 0
}
400 Response
{
"message": "Broker user already exists",
"statusCode": 400,
"errorCode": "BROKER_USER_ALREADY_EXISTS",
"details": {
"externalId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
401 Response
{
"message": "Auth token expired",
"statusCode": 401,
"errorCode": "AUTH_TOKEN_EXPIRED",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
404 Response
{
"message": "Broker user not found",
"statusCode": 404,
"errorCode": "BROKER_USER_NOT_FOUND",
"details": {
"externalUserId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
500 Response
{
"message": "Internal server error",
"statusCode": 500,
"errorCode": "INTERNAL_SERVER_ERROR",
"details": {
"externalId": "12354686-52f1-43ba-aec6-c3d863112232"
},
"datetime": "2025-10-19T17:28:39.780Z"
}
502 Response
{
"message": "Bad gateway",
"statusCode": 502,
"errorCode": "BAD_GATEWAY",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | OK | TradesPaginatedResponse |
| 400 | Bad Request | Bad request | ErrorResponse |
| 401 | Unauthorized | Unauthorized | ErrorResponse |
| 404 | Not Found | Not found | ErrorResponse |
| 500 | Internal Server Error | Internal server error | ErrorResponse |
| 502 | Bad Gateway | Bad gateway | ErrorResponse |
getTradeById
Code samples
# You can also use wget
curl -X GET https://api-dev.ndax.io/v1/integrations/broker/trades/{id} \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
GET https://api-dev.ndax.io/v1/integrations/broker/trades/{id} HTTP/1.1
Host: api-dev.ndax.io
Accept: application/json
const headers = {
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('https://api-dev.ndax.io/v1/integrations/broker/trades/{id}',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.get 'https://api-dev.ndax.io/v1/integrations/broker/trades/{id}',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.get('https://api-dev.ndax.io/v1/integrations/broker/trades/{id}', headers = headers)
print(r.json())
<?php
require 'vendor/autoload.php';
$headers = array(
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','https://api-dev.ndax.io/v1/integrations/broker/trades/{id}', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("https://api-dev.ndax.io/v1/integrations/broker/trades/{id}");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("GET", "https://api-dev.ndax.io/v1/integrations/broker/trades/{id}", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
GET /trades/{id}
Get trade by ID
Required permission: trade:read
Error codes:
TRADE_NOT_FOUND – the trade was not found.
INTERNAL_SERVER_ERROR – an unexpected server error occurred.
BAD_REQUEST – the request is invalid or contains incorrect parameters.
BAD_GATEWAY – received an invalid response from an upstream server.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| id | path | string | true | none |
Example responses
200 Response
{
"tradeId": "c2c78a6f-9929-4625-9b02-39acffcb421d",
"instrumentId": 5,
"fromProductId": 1,
"toProductId": 5,
"side": "BUY",
"enteredAmount": 50,
"status": "PENDING",
"sentAmount": 48.43,
"receivedAmount": 0.00035928,
"price": 124543.54,
"orderFee": {
"productId": 1,
"amount": 0.00000136,
"notionalValue": 0.1987790824,
"percentage": 0.2
},
"brokerFee": {
"tier": 1,
"tierFeePercentage": 0.2,
"amount": 0.02,
"productId": 5,
"notionalValue": 0.02,
"percentage": 0.2
},
"createdAt": "2025-07-30T11:59:44.195Z",
"completedAt": "2025-07-30T11:59:48.512Z"
}
400 Response
{
"message": "Broker user already exists",
"statusCode": 400,
"errorCode": "BROKER_USER_ALREADY_EXISTS",
"details": {
"externalId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
401 Response
{
"message": "Auth token expired",
"statusCode": 401,
"errorCode": "AUTH_TOKEN_EXPIRED",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
404 Response
{
"message": "Broker user not found",
"statusCode": 404,
"errorCode": "BROKER_USER_NOT_FOUND",
"details": {
"externalUserId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
500 Response
{
"message": "Internal server error",
"statusCode": 500,
"errorCode": "INTERNAL_SERVER_ERROR",
"details": {
"externalId": "12354686-52f1-43ba-aec6-c3d863112232"
},
"datetime": "2025-10-19T17:28:39.780Z"
}
502 Response
{
"message": "Bad gateway",
"statusCode": 502,
"errorCode": "BAD_GATEWAY",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | OK | TradeResponse |
| 400 | Bad Request | Bad request | ErrorResponse |
| 401 | Unauthorized | Unauthorized | ErrorResponse |
| 404 | Not Found | Not found | ErrorResponse |
| 500 | Internal Server Error | Internal server error | ErrorResponse |
| 502 | Bad Gateway | Bad gateway | ErrorResponse |
Policies
getRegularPolicy
Code samples
# You can also use wget
curl -X GET https://api-dev.ndax.io/v1/integrations/broker/policies/regular/{policyType} \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
GET https://api-dev.ndax.io/v1/integrations/broker/policies/regular/{policyType} HTTP/1.1
Host: api-dev.ndax.io
Accept: application/json
const headers = {
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('https://api-dev.ndax.io/v1/integrations/broker/policies/regular/{policyType}',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.get 'https://api-dev.ndax.io/v1/integrations/broker/policies/regular/{policyType}',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.get('https://api-dev.ndax.io/v1/integrations/broker/policies/regular/{policyType}', headers = headers)
print(r.json())
<?php
require 'vendor/autoload.php';
$headers = array(
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','https://api-dev.ndax.io/v1/integrations/broker/policies/regular/{policyType}', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("https://api-dev.ndax.io/v1/integrations/broker/policies/regular/{policyType}");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("GET", "https://api-dev.ndax.io/v1/integrations/broker/policies/regular/{policyType}", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
GET /policies/regular/{policyType}
Get regular policy
Required permission: policy:read
Error codes:
INTERNAL_SERVER_ERROR – an unexpected server error occurred.
BAD_REQUEST – the request is invalid or contains incorrect parameters.
BAD_GATEWAY – received an invalid response from an upstream server.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| policyType | path | PolicyType | true | none |
| version | query | string | false | none |
| language | query | PolicyLanguage | false | none |
| fontColor | query | string | false | HEX color #RGB, #RGBA, #RRGGBB or #RRGGBBAA |
| backgroundColor | query | string | false | HEX color #RGB, #RGBA, #RRGGBB or #RRGGBBAA |
Enumerated Values
| Parameter | Value |
|---|---|
| language | en |
| language | fr |
Example responses
200 Response
{
"id": 4,
"version": 0.2,
"type": "AML_POLICY",
"content": "ZnNkZ...nNkZnM=",
"previousVersions": [
0.1
],
"requireAcknowledgement": true,
"createdAt": "2025-07-30T11:59:44.195Z",
"updatedAt": "2025-07-30T11:59:44.195Z",
"reviewedAt": "2025-07-30T11:59:44.195Z"
}
400 Response
{
"message": "Broker user already exists",
"statusCode": 400,
"errorCode": "BROKER_USER_ALREADY_EXISTS",
"details": {
"externalId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
401 Response
{
"message": "Auth token expired",
"statusCode": 401,
"errorCode": "AUTH_TOKEN_EXPIRED",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
404 Response
{
"message": "Broker user not found",
"statusCode": 404,
"errorCode": "BROKER_USER_NOT_FOUND",
"details": {
"externalUserId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
500 Response
{
"message": "Internal server error",
"statusCode": 500,
"errorCode": "INTERNAL_SERVER_ERROR",
"details": {
"externalId": "12354686-52f1-43ba-aec6-c3d863112232"
},
"datetime": "2025-10-19T17:28:39.780Z"
}
502 Response
{
"message": "Bad gateway",
"statusCode": 502,
"errorCode": "BAD_GATEWAY",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | OK | PolicyInfo |
| 400 | Bad Request | Bad request | ErrorResponse |
| 401 | Unauthorized | Unauthorized | ErrorResponse |
| 404 | Not Found | Not found | ErrorResponse |
| 500 | Internal Server Error | Internal server error | ErrorResponse |
| 502 | Bad Gateway | Bad gateway | ErrorResponse |
getUnacknowledgedRegularPolicies
Code samples
# You can also use wget
curl -X GET https://api-dev.ndax.io/v1/integrations/broker/policies/regular/unacknowledged \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
GET https://api-dev.ndax.io/v1/integrations/broker/policies/regular/unacknowledged HTTP/1.1
Host: api-dev.ndax.io
Accept: application/json
const headers = {
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('https://api-dev.ndax.io/v1/integrations/broker/policies/regular/unacknowledged',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.get 'https://api-dev.ndax.io/v1/integrations/broker/policies/regular/unacknowledged',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.get('https://api-dev.ndax.io/v1/integrations/broker/policies/regular/unacknowledged', headers = headers)
print(r.json())
<?php
require 'vendor/autoload.php';
$headers = array(
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','https://api-dev.ndax.io/v1/integrations/broker/policies/regular/unacknowledged', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("https://api-dev.ndax.io/v1/integrations/broker/policies/regular/unacknowledged");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("GET", "https://api-dev.ndax.io/v1/integrations/broker/policies/regular/unacknowledged", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
GET /policies/regular/unacknowledged
Get unacknowledged regular policy
Required permission: policy:read
Error codes:
NO_BROKER_USER_IDENTIFIER_PROVIDED – when neither userId nor externalUserId is provided.
BROKER_USER_NOT_FOUND – when the user is not found.
AMBIGUOUS_BROKER_USER_IDENTIFIER – when both userId and externalUserId are provided, but only one is expected.
INTERNAL_SERVER_ERROR – an unexpected server error occurred.
BAD_REQUEST – the request is invalid or contains incorrect parameters.
BAD_GATEWAY – received an invalid response from an upstream server.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| userId | query | string | false | none |
| externalUserId | query | string | false | none |
Example responses
200 Response
[
"API_POLICY"
]
400 Response
{
"message": "Broker user already exists",
"statusCode": 400,
"errorCode": "BROKER_USER_ALREADY_EXISTS",
"details": {
"externalId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
401 Response
{
"message": "Auth token expired",
"statusCode": 401,
"errorCode": "AUTH_TOKEN_EXPIRED",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
404 Response
{
"message": "Broker user not found",
"statusCode": 404,
"errorCode": "BROKER_USER_NOT_FOUND",
"details": {
"externalUserId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
500 Response
{
"message": "Internal server error",
"statusCode": 500,
"errorCode": "INTERNAL_SERVER_ERROR",
"details": {
"externalId": "12354686-52f1-43ba-aec6-c3d863112232"
},
"datetime": "2025-10-19T17:28:39.780Z"
}
502 Response
{
"message": "Bad gateway",
"statusCode": 502,
"errorCode": "BAD_GATEWAY",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | OK | Inline |
| 400 | Bad Request | Bad request | ErrorResponse |
| 401 | Unauthorized | Unauthorized | ErrorResponse |
| 404 | Not Found | Not found | ErrorResponse |
| 500 | Internal Server Error | Internal server error | ErrorResponse |
| 502 | Bad Gateway | Bad gateway | ErrorResponse |
Response Schema
Status Code 200
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| anonymous | [AcknowledgeablePolicyType] | false | none | none |
acknowledgeRegularPolicies
Code samples
# You can also use wget
curl -X POST https://api-dev.ndax.io/v1/integrations/broker/policies/regular/acknowledge \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
POST https://api-dev.ndax.io/v1/integrations/broker/policies/regular/acknowledge HTTP/1.1
Host: api-dev.ndax.io
Content-Type: application/json
Accept: application/json
const inputBody = '{
"userId": "c2c78a6f-9929-4625-9b02-39acffcb421d",
"externalUserId": 5555,
"policies": [
{
"type": "API_POLICY",
"version": 0.2,
"language": "en"
}
]
}';
const headers = {
'Content-Type':'application/json',
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('https://api-dev.ndax.io/v1/integrations/broker/policies/regular/acknowledge',
{
method: 'POST',
body: inputBody,
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.post 'https://api-dev.ndax.io/v1/integrations/broker/policies/regular/acknowledge',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.post('https://api-dev.ndax.io/v1/integrations/broker/policies/regular/acknowledge', headers = headers)
print(r.json())
<?php
require 'vendor/autoload.php';
$headers = array(
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('POST','https://api-dev.ndax.io/v1/integrations/broker/policies/regular/acknowledge', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("https://api-dev.ndax.io/v1/integrations/broker/policies/regular/acknowledge");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Content-Type": []string{"application/json"},
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("POST", "https://api-dev.ndax.io/v1/integrations/broker/policies/regular/acknowledge", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
POST /policies/regular/acknowledge
Acknowledge regular policies
Required permission: policy:manage
Error codes:
POLICY_CANNOT_BE_ACKNOWLEDGED – occurs when an attempt is made to acknowledge a policy type that does not support acknowledgment (AML_POLICY, BOUNTY_BUG_POLICY, DISCLAIMER, SECURITY_POLICY, DEPOSIT_OF_NON_SUPPORTED_VIRTUAL_ASSET).
INTERNAL_SERVER_ERROR – an unexpected server error occurred.
BAD_REQUEST – the request is invalid or contains incorrect parameters.
BAD_GATEWAY – received an invalid response from an upstream server.
Body parameter
{
"userId": "c2c78a6f-9929-4625-9b02-39acffcb421d",
"externalUserId": 5555,
"policies": [
{
"type": "API_POLICY",
"version": 0.2,
"language": "en"
}
]
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| body | body | AcknowledgeRegularPoliciesOptions | true | none |
Example responses
400 Response
{
"message": "Broker user already exists",
"statusCode": 400,
"errorCode": "BROKER_USER_ALREADY_EXISTS",
"details": {
"externalId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
401 Response
{
"message": "Auth token expired",
"statusCode": 401,
"errorCode": "AUTH_TOKEN_EXPIRED",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
404 Response
{
"message": "Broker user not found",
"statusCode": 404,
"errorCode": "BROKER_USER_NOT_FOUND",
"details": {
"externalUserId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
500 Response
{
"message": "Internal server error",
"statusCode": 500,
"errorCode": "INTERNAL_SERVER_ERROR",
"details": {
"externalId": "12354686-52f1-43ba-aec6-c3d863112232"
},
"datetime": "2025-10-19T17:28:39.780Z"
}
502 Response
{
"message": "Bad gateway",
"statusCode": 502,
"errorCode": "BAD_GATEWAY",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 201 | Created | OK | None |
| 400 | Bad Request | Bad request | ErrorResponse |
| 401 | Unauthorized | Unauthorized | ErrorResponse |
| 404 | Not Found | Not found | ErrorResponse |
| 500 | Internal Server Error | Internal server error | ErrorResponse |
| 502 | Bad Gateway | Bad gateway | ErrorResponse |
getTradeBuyPolicy
Code samples
# You can also use wget
curl -X GET https://api-dev.ndax.io/v1/integrations/broker/policies/buy/{instrumentId} \
-H 'Accept: application/json'
GET https://api-dev.ndax.io/v1/integrations/broker/policies/buy/{instrumentId} HTTP/1.1
Host: api-dev.ndax.io
Accept: application/json
const headers = {
'Accept':'application/json'
};
fetch('https://api-dev.ndax.io/v1/integrations/broker/policies/buy/{instrumentId}',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json'
}
result = RestClient.get 'https://api-dev.ndax.io/v1/integrations/broker/policies/buy/{instrumentId}',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Accept': 'application/json'
}
r = requests.get('https://api-dev.ndax.io/v1/integrations/broker/policies/buy/{instrumentId}', headers = headers)
print(r.json())
<?php
require 'vendor/autoload.php';
$headers = array(
'Accept' => 'application/json',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','https://api-dev.ndax.io/v1/integrations/broker/policies/buy/{instrumentId}', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("https://api-dev.ndax.io/v1/integrations/broker/policies/buy/{instrumentId}");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Accept": []string{"application/json"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("GET", "https://api-dev.ndax.io/v1/integrations/broker/policies/buy/{instrumentId}", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
GET /policies/buy/{instrumentId}
Get trade buy policies
Required permission: policy:read
Error codes:
INSTRUMENT_NOT_FOUND – the specified instrument was not found.
INSTRUMENT_IS_DISABLED – the specified instrument is disabled.
INTERNAL_SERVER_ERROR – an unexpected server error occurred.
BAD_REQUEST – the request is invalid or contains incorrect parameters.
BAD_GATEWAY – received an invalid response from an upstream server.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| instrumentId | path | integer | true | none |
| language | query | PolicyLanguage | false | none |
| fontColor | query | string | false | HEX color #RGB, #RGBA, #RRGGBB or #RRGGBBAA |
| backgroundColor | query | string | false | HEX color #RGB, #RGBA, #RRGGBB or #RRGGBBAA |
Enumerated Values
| Parameter | Value |
|---|---|
| language | en |
| language | fr |
Example responses
200 Response
{
"id": 0,
"version": "string",
"group": "STAKING_OPT_IN",
"identifier": 0,
"identifierType": "PRODUCT",
"content": "string",
"previousVersions": [
"string"
],
"requireAcknowledgement": true,
"createdAt": "string",
"updatedAt": "string",
"reviewedAt": "string"
}
400 Response
{
"message": "Broker user already exists",
"statusCode": 400,
"errorCode": "BROKER_USER_ALREADY_EXISTS",
"details": {
"externalId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
401 Response
{
"message": "Auth token expired",
"statusCode": 401,
"errorCode": "AUTH_TOKEN_EXPIRED",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
404 Response
{
"message": "Broker user not found",
"statusCode": 404,
"errorCode": "BROKER_USER_NOT_FOUND",
"details": {
"externalUserId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
500 Response
{
"message": "Internal server error",
"statusCode": 500,
"errorCode": "INTERNAL_SERVER_ERROR",
"details": {
"externalId": "12354686-52f1-43ba-aec6-c3d863112232"
},
"datetime": "2025-10-19T17:28:39.780Z"
}
502 Response
{
"message": "Bad gateway",
"statusCode": 502,
"errorCode": "BAD_GATEWAY",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | OK | DynamicPolicyInfo |
| 400 | Bad Request | Bad request | ErrorResponse |
| 401 | Unauthorized | Unauthorized | ErrorResponse |
| 404 | Not Found | Not found | ErrorResponse |
| 500 | Internal Server Error | Internal server error | ErrorResponse |
| 502 | Bad Gateway | Bad gateway | ErrorResponse |
getUnacknowledgedTradeBuyPolicy
Code samples
# You can also use wget
curl -X GET https://api-dev.ndax.io/v1/integrations/broker/policies/buy/{instrumentId}/unacknowledged \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
GET https://api-dev.ndax.io/v1/integrations/broker/policies/buy/{instrumentId}/unacknowledged HTTP/1.1
Host: api-dev.ndax.io
Accept: application/json
const headers = {
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('https://api-dev.ndax.io/v1/integrations/broker/policies/buy/{instrumentId}/unacknowledged',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.get 'https://api-dev.ndax.io/v1/integrations/broker/policies/buy/{instrumentId}/unacknowledged',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.get('https://api-dev.ndax.io/v1/integrations/broker/policies/buy/{instrumentId}/unacknowledged', headers = headers)
print(r.json())
<?php
require 'vendor/autoload.php';
$headers = array(
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','https://api-dev.ndax.io/v1/integrations/broker/policies/buy/{instrumentId}/unacknowledged', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("https://api-dev.ndax.io/v1/integrations/broker/policies/buy/{instrumentId}/unacknowledged");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("GET", "https://api-dev.ndax.io/v1/integrations/broker/policies/buy/{instrumentId}/unacknowledged", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
GET /policies/buy/{instrumentId}/unacknowledged
Get unacknowledged trade buy policy
Required permission: policy:read
Error codes:
NO_BROKER_USER_IDENTIFIER_PROVIDED – when neither userId nor externalUserId is provided.
BROKER_USER_NOT_FOUND – when the user is not found.
AMBIGUOUS_BROKER_USER_IDENTIFIER – when both userId and externalUserId are provided, but only one is expected.
INTERNAL_SERVER_ERROR – an unexpected server error occurred.
BAD_REQUEST – the request is invalid or contains incorrect parameters.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| instrumentId | path | integer | true | none |
| userId | query | string | false | none |
| externalUserId | query | string | false | none |
Example responses
200 Response
{
"dynamicPolicyId": 0,
"group": "STAKING_OPT_IN",
"identifier": 0,
"version": "string"
}
400 Response
{
"message": "Broker user already exists",
"statusCode": 400,
"errorCode": "BROKER_USER_ALREADY_EXISTS",
"details": {
"externalId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
401 Response
{
"message": "Auth token expired",
"statusCode": 401,
"errorCode": "AUTH_TOKEN_EXPIRED",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
404 Response
{
"message": "Broker user not found",
"statusCode": 404,
"errorCode": "BROKER_USER_NOT_FOUND",
"details": {
"externalUserId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
500 Response
{
"message": "Internal server error",
"statusCode": 500,
"errorCode": "INTERNAL_SERVER_ERROR",
"details": {
"externalId": "12354686-52f1-43ba-aec6-c3d863112232"
},
"datetime": "2025-10-19T17:28:39.780Z"
}
502 Response
{
"message": "Bad gateway",
"statusCode": 502,
"errorCode": "BAD_GATEWAY",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | OK | UnaknowledgedDynamicPolicy |
| 400 | Bad Request | Bad request | ErrorResponse |
| 401 | Unauthorized | Unauthorized | ErrorResponse |
| 404 | Not Found | Not found | ErrorResponse |
| 500 | Internal Server Error | Internal server error | ErrorResponse |
| 502 | Bad Gateway | Bad gateway | ErrorResponse |
acknowledgeTradeBuyPolicy
Code samples
# You can also use wget
curl -X POST https://api-dev.ndax.io/v1/integrations/broker/policies/buy/{instrumentId}/acknowledge?language=en \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
POST https://api-dev.ndax.io/v1/integrations/broker/policies/buy/{instrumentId}/acknowledge?language=en HTTP/1.1
Host: api-dev.ndax.io
Accept: application/json
const headers = {
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('https://api-dev.ndax.io/v1/integrations/broker/policies/buy/{instrumentId}/acknowledge?language=en',
{
method: 'POST',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.post 'https://api-dev.ndax.io/v1/integrations/broker/policies/buy/{instrumentId}/acknowledge',
params: {
'language' => '[PolicyLanguage](#schemapolicylanguage)'
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.post('https://api-dev.ndax.io/v1/integrations/broker/policies/buy/{instrumentId}/acknowledge', params={
'language': 'en'
}, headers = headers)
print(r.json())
<?php
require 'vendor/autoload.php';
$headers = array(
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('POST','https://api-dev.ndax.io/v1/integrations/broker/policies/buy/{instrumentId}/acknowledge', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("https://api-dev.ndax.io/v1/integrations/broker/policies/buy/{instrumentId}/acknowledge?language=en");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("POST", "https://api-dev.ndax.io/v1/integrations/broker/policies/buy/{instrumentId}/acknowledge", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
POST /policies/buy/{instrumentId}/acknowledge
Acknowledge trade buy policy
Required permission: policy:manage
Error codes:
NO_BROKER_USER_IDENTIFIER_PROVIDED – when neither userId nor externalUserId is provided.
BROKER_USER_NOT_FOUND – when the user is not found.
INSTRUMENT_NOT_FOUND – the specified instrument was not found.
INSTRUMENT_IS_DISABLED – the specified instrument is disabled.
AMBIGUOUS_BROKER_USER_IDENTIFIER – when both userId and externalUserId are provided, but only one is expected.
INTERNAL_SERVER_ERROR – an unexpected server error occurred.
BAD_REQUEST – the request is invalid or contains incorrect parameters.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| instrumentId | path | integer | true | none |
| language | query | PolicyLanguage | true | none |
| userId | query | string | false | none |
| externalUserId | query | string | false | none |
Enumerated Values
| Parameter | Value |
|---|---|
| language | en |
| language | fr |
Example responses
400 Response
{
"message": "Broker user already exists",
"statusCode": 400,
"errorCode": "BROKER_USER_ALREADY_EXISTS",
"details": {
"externalId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
401 Response
{
"message": "Auth token expired",
"statusCode": 401,
"errorCode": "AUTH_TOKEN_EXPIRED",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
404 Response
{
"message": "Broker user not found",
"statusCode": 404,
"errorCode": "BROKER_USER_NOT_FOUND",
"details": {
"externalUserId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
500 Response
{
"message": "Internal server error",
"statusCode": 500,
"errorCode": "INTERNAL_SERVER_ERROR",
"details": {
"externalId": "12354686-52f1-43ba-aec6-c3d863112232"
},
"datetime": "2025-10-19T17:28:39.780Z"
}
502 Response
{
"message": "Bad gateway",
"statusCode": 502,
"errorCode": "BAD_GATEWAY",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 201 | Created | OK | None |
| 400 | Bad Request | Bad request | ErrorResponse |
| 401 | Unauthorized | Unauthorized | ErrorResponse |
| 404 | Not Found | Not found | ErrorResponse |
| 500 | Internal Server Error | Internal server error | ErrorResponse |
| 502 | Bad Gateway | Bad gateway | ErrorResponse |
Reports
getReports
Code samples
# You can also use wget
curl -X GET https://api-dev.ndax.io/v1/integrations/broker/reports?type=TRADES&format=PDF \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
GET https://api-dev.ndax.io/v1/integrations/broker/reports?type=TRADES&format=PDF HTTP/1.1
Host: api-dev.ndax.io
Accept: application/json
const headers = {
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('https://api-dev.ndax.io/v1/integrations/broker/reports?type=TRADES&format=PDF',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.get 'https://api-dev.ndax.io/v1/integrations/broker/reports',
params: {
'type' => '[ReportType](#schemareporttype)',
'format' => '[ReportFormat](#schemareportformat)'
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.get('https://api-dev.ndax.io/v1/integrations/broker/reports', params={
'type': 'TRADES', 'format': 'PDF'
}, headers = headers)
print(r.json())
<?php
require 'vendor/autoload.php';
$headers = array(
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','https://api-dev.ndax.io/v1/integrations/broker/reports', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("https://api-dev.ndax.io/v1/integrations/broker/reports?type=TRADES&format=PDF");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("GET", "https://api-dev.ndax.io/v1/integrations/broker/reports", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
GET /reports
Get reports
Required permission: report:read
Error codes:
NO_BROKER_USER_IDENTIFIER_PROVIDED – when neither userId nor externalUserId is provided.
BROKER_USER_NOT_FOUND – when the user is not found.
AMBIGUOUS_BROKER_USER_IDENTIFIER – when both userId and externalUserId are provided, but only one is expected.
INTERNAL_SERVER_ERROR – an unexpected server error occurred.
BAD_REQUEST – the request is invalid or contains incorrect parameters.
BAD_GATEWAY – received an invalid response from an upstream server.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| userId | query | string | false | none |
| externalUserId | query | string | false | none |
| type | query | ReportType | true | none |
| format | query | ReportFormat | true | none |
| from | query | string | false | none |
| to | query | string | false | none |
| page | query | integer | false | none |
| size | query | integer | false | none |
Enumerated Values
| Parameter | Value |
|---|---|
| type | TRADES |
| format | |
| format | CSV |
Example responses
200 Response
{
"list": [
{
"id": "string",
"status": "PENDING",
"format": "PDF",
"type": "TRADES",
"createdAt": "2019-08-24T14:15:22Z",
"completedAt": "2019-08-24T14:15:22Z",
"from": "2019-08-24T14:15:22Z",
"to": "2019-08-24T14:15:22Z",
"productOrInstrumentId": 1
}
],
"total": 0
}
400 Response
{
"message": "Broker user already exists",
"statusCode": 400,
"errorCode": "BROKER_USER_ALREADY_EXISTS",
"details": {
"externalId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
401 Response
{
"message": "Auth token expired",
"statusCode": 401,
"errorCode": "AUTH_TOKEN_EXPIRED",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
404 Response
{
"message": "Broker user not found",
"statusCode": 404,
"errorCode": "BROKER_USER_NOT_FOUND",
"details": {
"externalUserId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
500 Response
{
"message": "Internal server error",
"statusCode": 500,
"errorCode": "INTERNAL_SERVER_ERROR",
"details": {
"externalId": "12354686-52f1-43ba-aec6-c3d863112232"
},
"datetime": "2025-10-19T17:28:39.780Z"
}
502 Response
{
"message": "Bad gateway",
"statusCode": 502,
"errorCode": "BAD_GATEWAY",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | OK | PaginatedReportResponse |
| 400 | Bad Request | Bad request | ErrorResponse |
| 401 | Unauthorized | Unauthorized | ErrorResponse |
| 404 | Not Found | Not found | ErrorResponse |
| 500 | Internal Server Error | Internal server error | ErrorResponse |
| 502 | Bad Gateway | Bad gateway | ErrorResponse |
generateReport
Code samples
# You can also use wget
curl -X POST https://api-dev.ndax.io/v1/integrations/broker/reports \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
POST https://api-dev.ndax.io/v1/integrations/broker/reports HTTP/1.1
Host: api-dev.ndax.io
Content-Type: application/json
Accept: application/json
const inputBody = '{
"userId": "c2c78a6f-9929-4625-9b02-39acffcb421d",
"externalUserId": 5555,
"type": "TRADES",
"format": "PDF",
"from": "2025-07-20T11:59:44.195Z",
"to": "2025-07-30T11:59:44.195Z",
"productOrInstrumentId": 1
}';
const headers = {
'Content-Type':'application/json',
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('https://api-dev.ndax.io/v1/integrations/broker/reports',
{
method: 'POST',
body: inputBody,
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.post 'https://api-dev.ndax.io/v1/integrations/broker/reports',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.post('https://api-dev.ndax.io/v1/integrations/broker/reports', headers = headers)
print(r.json())
<?php
require 'vendor/autoload.php';
$headers = array(
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('POST','https://api-dev.ndax.io/v1/integrations/broker/reports', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("https://api-dev.ndax.io/v1/integrations/broker/reports");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Content-Type": []string{"application/json"},
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("POST", "https://api-dev.ndax.io/v1/integrations/broker/reports", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
POST /reports
Generate report
Required permission: report:manage
Error codes:
NO_BROKER_USER_IDENTIFIER_PROVIDED – when neither userId nor externalUserId is provided.
BROKER_USER_NOT_FOUND – when the user is not found.
AMBIGUOUS_BROKER_USER_IDENTIFIER – when both userId and externalUserId are provided, but only one is expected.
INTERNAL_SERVER_ERROR – an unexpected server error occurred.
BAD_REQUEST – the request is invalid or contains incorrect parameters.
BAD_GATEWAY – received an invalid response from an upstream server.
Body parameter
{
"userId": "c2c78a6f-9929-4625-9b02-39acffcb421d",
"externalUserId": 5555,
"type": "TRADES",
"format": "PDF",
"from": "2025-07-20T11:59:44.195Z",
"to": "2025-07-30T11:59:44.195Z",
"productOrInstrumentId": 1
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| body | body | GenerateReportOptions | true | none |
Example responses
201 Response
{
"id": "string",
"status": "PENDING",
"format": "PDF",
"type": "TRADES",
"createdAt": "2019-08-24T14:15:22Z",
"completedAt": "2019-08-24T14:15:22Z",
"from": "2019-08-24T14:15:22Z",
"to": "2019-08-24T14:15:22Z",
"productOrInstrumentId": 1
}
400 Response
{
"message": "Broker user already exists",
"statusCode": 400,
"errorCode": "BROKER_USER_ALREADY_EXISTS",
"details": {
"externalId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
401 Response
{
"message": "Auth token expired",
"statusCode": 401,
"errorCode": "AUTH_TOKEN_EXPIRED",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
404 Response
{
"message": "Broker user not found",
"statusCode": 404,
"errorCode": "BROKER_USER_NOT_FOUND",
"details": {
"externalUserId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
500 Response
{
"message": "Internal server error",
"statusCode": 500,
"errorCode": "INTERNAL_SERVER_ERROR",
"details": {
"externalId": "12354686-52f1-43ba-aec6-c3d863112232"
},
"datetime": "2025-10-19T17:28:39.780Z"
}
502 Response
{
"message": "Bad gateway",
"statusCode": 502,
"errorCode": "BAD_GATEWAY",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 201 | Created | OK | ReportResponse |
| 400 | Bad Request | Bad request | ErrorResponse |
| 401 | Unauthorized | Unauthorized | ErrorResponse |
| 404 | Not Found | Not found | ErrorResponse |
| 500 | Internal Server Error | Internal server error | ErrorResponse |
| 502 | Bad Gateway | Bad gateway | ErrorResponse |
getReportsUpdates
Code samples
# You can also use wget
curl -X GET https://api-dev.ndax.io/v1/integrations/broker/reports/updates?ids=string \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
GET https://api-dev.ndax.io/v1/integrations/broker/reports/updates?ids=string HTTP/1.1
Host: api-dev.ndax.io
Accept: application/json
const headers = {
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('https://api-dev.ndax.io/v1/integrations/broker/reports/updates?ids=string',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.get 'https://api-dev.ndax.io/v1/integrations/broker/reports/updates',
params: {
'ids' => 'string'
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.get('https://api-dev.ndax.io/v1/integrations/broker/reports/updates', params={
'ids': 'string'
}, headers = headers)
print(r.json())
<?php
require 'vendor/autoload.php';
$headers = array(
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','https://api-dev.ndax.io/v1/integrations/broker/reports/updates', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("https://api-dev.ndax.io/v1/integrations/broker/reports/updates?ids=string");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("GET", "https://api-dev.ndax.io/v1/integrations/broker/reports/updates", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
GET /reports/updates
Get reports updates
Required permission: report:read
Error codes:
NO_BROKER_USER_IDENTIFIER_PROVIDED – when neither userId nor externalUserId is provided.
BROKER_USER_NOT_FOUND – when the user is not found.
AMBIGUOUS_BROKER_USER_IDENTIFIER – when both userId and externalUserId are provided, but only one is expected.
INTERNAL_SERVER_ERROR – an unexpected server error occurred.
BAD_REQUEST – the request is invalid or contains incorrect parameters.
BAD_GATEWAY – received an invalid response from an upstream server.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| ids | query | string | true | none |
| userId | query | string | false | none |
| externalUserId | query | string | false | none |
Example responses
200 Response
[
{
"id": "string",
"status": "PENDING",
"completedAt": "2019-08-24T14:15:22Z"
}
]
400 Response
{
"message": "Broker user already exists",
"statusCode": 400,
"errorCode": "BROKER_USER_ALREADY_EXISTS",
"details": {
"externalId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
401 Response
{
"message": "Auth token expired",
"statusCode": 401,
"errorCode": "AUTH_TOKEN_EXPIRED",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
404 Response
{
"message": "Broker user not found",
"statusCode": 404,
"errorCode": "BROKER_USER_NOT_FOUND",
"details": {
"externalUserId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
500 Response
{
"message": "Internal server error",
"statusCode": 500,
"errorCode": "INTERNAL_SERVER_ERROR",
"details": {
"externalId": "12354686-52f1-43ba-aec6-c3d863112232"
},
"datetime": "2025-10-19T17:28:39.780Z"
}
502 Response
{
"message": "Bad gateway",
"statusCode": 502,
"errorCode": "BAD_GATEWAY",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | OK | Inline |
| 400 | Bad Request | Bad request | ErrorResponse |
| 401 | Unauthorized | Unauthorized | ErrorResponse |
| 404 | Not Found | Not found | ErrorResponse |
| 500 | Internal Server Error | Internal server error | ErrorResponse |
| 502 | Bad Gateway | Bad gateway | ErrorResponse |
Response Schema
Status Code 200
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| anonymous | [UpdatedReportResponse] | false | none | none |
| » id | string | false | none | none |
| » status | ReportStatus | true | none | Report status |
| » completedAt | string(date-time) | false | none | none |
Enumerated Values
| Property | Value |
|---|---|
| status | PENDING |
| status | PROCESSING |
| status | PROCESSED |
| status | FAILED |
| status | ARCHIVED |
downloadReport
Code samples
# You can also use wget
curl -X GET https://api-dev.ndax.io/v1/integrations/broker/reports/{id}/download \
-H 'Accept: application/octet-stream' \
-H 'Authorization: Bearer {access-token}'
GET https://api-dev.ndax.io/v1/integrations/broker/reports/{id}/download HTTP/1.1
Host: api-dev.ndax.io
Accept: application/octet-stream
const headers = {
'Accept':'application/octet-stream',
'Authorization':'Bearer {access-token}'
};
fetch('https://api-dev.ndax.io/v1/integrations/broker/reports/{id}/download',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/octet-stream',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.get 'https://api-dev.ndax.io/v1/integrations/broker/reports/{id}/download',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Accept': 'application/octet-stream',
'Authorization': 'Bearer {access-token}'
}
r = requests.get('https://api-dev.ndax.io/v1/integrations/broker/reports/{id}/download', headers = headers)
print(r.json())
<?php
require 'vendor/autoload.php';
$headers = array(
'Accept' => 'application/octet-stream',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','https://api-dev.ndax.io/v1/integrations/broker/reports/{id}/download', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("https://api-dev.ndax.io/v1/integrations/broker/reports/{id}/download");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Accept": []string{"application/octet-stream"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("GET", "https://api-dev.ndax.io/v1/integrations/broker/reports/{id}/download", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
GET /reports/{id}/download
Download report
Required permission: report:read
Error codes:
NO_BROKER_USER_IDENTIFIER_PROVIDED – when neither userId nor externalUserId is provided.
BROKER_USER_NOT_FOUND – when the user is not found.
AMBIGUOUS_BROKER_USER_IDENTIFIER – when both userId and externalUserId are provided, but only one is expected.
INTERNAL_SERVER_ERROR – an unexpected server error occurred.
BAD_REQUEST – the request is invalid or contains incorrect parameters.
BAD_GATEWAY – received an invalid response from an upstream server.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| id | path | string | true | none |
| userId | query | string | false | none |
| externalUserId | query | string | false | none |
Example responses
200 Response
400 Response
{
"message": "Broker user already exists",
"statusCode": 400,
"errorCode": "BROKER_USER_ALREADY_EXISTS",
"details": {
"externalId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
401 Response
{
"message": "Auth token expired",
"statusCode": 401,
"errorCode": "AUTH_TOKEN_EXPIRED",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
404 Response
{
"message": "Broker user not found",
"statusCode": 404,
"errorCode": "BROKER_USER_NOT_FOUND",
"details": {
"externalUserId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
500 Response
{
"message": "Internal server error",
"statusCode": 500,
"errorCode": "INTERNAL_SERVER_ERROR",
"details": {
"externalId": "12354686-52f1-43ba-aec6-c3d863112232"
},
"datetime": "2025-10-19T17:28:39.780Z"
}
502 Response
{
"message": "Bad gateway",
"statusCode": 502,
"errorCode": "BAD_GATEWAY",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | OK | string |
| 400 | Bad Request | Bad request | ErrorResponse |
| 401 | Unauthorized | Unauthorized | ErrorResponse |
| 404 | Not Found | Not found | ErrorResponse |
| 500 | Internal Server Error | Internal server error | ErrorResponse |
| 502 | Bad Gateway | Bad gateway | ErrorResponse |
deleteReport
Code samples
# You can also use wget
curl -X DELETE https://api-dev.ndax.io/v1/integrations/broker/reports/{id} \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
DELETE https://api-dev.ndax.io/v1/integrations/broker/reports/{id} HTTP/1.1
Host: api-dev.ndax.io
Accept: application/json
const headers = {
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('https://api-dev.ndax.io/v1/integrations/broker/reports/{id}',
{
method: 'DELETE',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.delete 'https://api-dev.ndax.io/v1/integrations/broker/reports/{id}',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.delete('https://api-dev.ndax.io/v1/integrations/broker/reports/{id}', headers = headers)
print(r.json())
<?php
require 'vendor/autoload.php';
$headers = array(
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('DELETE','https://api-dev.ndax.io/v1/integrations/broker/reports/{id}', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("https://api-dev.ndax.io/v1/integrations/broker/reports/{id}");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("DELETE");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("DELETE", "https://api-dev.ndax.io/v1/integrations/broker/reports/{id}", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
DELETE /reports/{id}
Delete report
Required permission: report:manage
Error codes:
NO_BROKER_USER_IDENTIFIER_PROVIDED – when neither userId nor externalUserId is provided.
BROKER_USER_NOT_FOUND – when the user is not found.
AMBIGUOUS_BROKER_USER_IDENTIFIER – when both userId and externalUserId are provided, but only one is expected.
INTERNAL_SERVER_ERROR – an unexpected server error occurred.
BAD_REQUEST – the request is invalid or contains incorrect parameters.
BAD_GATEWAY – received an invalid response from an upstream server.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| id | path | string | true | none |
| userId | query | string | false | none |
| externalUserId | query | string | false | none |
Example responses
400 Response
{
"message": "Broker user already exists",
"statusCode": 400,
"errorCode": "BROKER_USER_ALREADY_EXISTS",
"details": {
"externalId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
401 Response
{
"message": "Auth token expired",
"statusCode": 401,
"errorCode": "AUTH_TOKEN_EXPIRED",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
404 Response
{
"message": "Broker user not found",
"statusCode": 404,
"errorCode": "BROKER_USER_NOT_FOUND",
"details": {
"externalUserId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
500 Response
{
"message": "Internal server error",
"statusCode": 500,
"errorCode": "INTERNAL_SERVER_ERROR",
"details": {
"externalId": "12354686-52f1-43ba-aec6-c3d863112232"
},
"datetime": "2025-10-19T17:28:39.780Z"
}
502 Response
{
"message": "Bad gateway",
"statusCode": 502,
"errorCode": "BAD_GATEWAY",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | OK | None |
| 400 | Bad Request | Bad request | ErrorResponse |
| 401 | Unauthorized | Unauthorized | ErrorResponse |
| 404 | Not Found | Not found | ErrorResponse |
| 500 | Internal Server Error | Internal server error | ErrorResponse |
| 502 | Bad Gateway | Bad gateway | ErrorResponse |
Statements
downloadIrocStatement
Code samples
# You can also use wget
curl -X GET https://api-dev.ndax.io/v1/integrations/broker/statements/iroc/download?statementId=string \
-H 'Accept: application/octet-stream' \
-H 'Authorization: Bearer {access-token}'
GET https://api-dev.ndax.io/v1/integrations/broker/statements/iroc/download?statementId=string HTTP/1.1
Host: api-dev.ndax.io
Accept: application/octet-stream
const headers = {
'Accept':'application/octet-stream',
'Authorization':'Bearer {access-token}'
};
fetch('https://api-dev.ndax.io/v1/integrations/broker/statements/iroc/download?statementId=string',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/octet-stream',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.get 'https://api-dev.ndax.io/v1/integrations/broker/statements/iroc/download',
params: {
'statementId' => 'string'
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Accept': 'application/octet-stream',
'Authorization': 'Bearer {access-token}'
}
r = requests.get('https://api-dev.ndax.io/v1/integrations/broker/statements/iroc/download', params={
'statementId': 'string'
}, headers = headers)
print(r.json())
<?php
require 'vendor/autoload.php';
$headers = array(
'Accept' => 'application/octet-stream',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','https://api-dev.ndax.io/v1/integrations/broker/statements/iroc/download', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("https://api-dev.ndax.io/v1/integrations/broker/statements/iroc/download?statementId=string");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Accept": []string{"application/octet-stream"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("GET", "https://api-dev.ndax.io/v1/integrations/broker/statements/iroc/download", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
GET /statements/iroc/download
Downloads monthly, quarterly, and annual statements
Required permission: statement:read
Error codes:
STATEMENT_NOT_FOUND – statement not found.
NO_BROKER_USER_IDENTIFIER_PROVIDED – when neither userId nor externalUserId is provided.
BROKER_USER_NOT_FOUND – when the user is not found.
AMBIGUOUS_BROKER_USER_IDENTIFIER – when both userId and externalUserId are provided, but only one is expected.
INTERNAL_SERVER_ERROR – an unexpected server error occurred.
BAD_GATEWAY – received an invalid response from an upstream server.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| statementId | query | string | true | none |
| userId | query | string | false | none |
| externalUserId | query | string | false | none |
Example responses
200 Response
400 Response
{
"message": "Broker user already exists",
"statusCode": 400,
"errorCode": "BROKER_USER_ALREADY_EXISTS",
"details": {
"externalId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
401 Response
{
"message": "Auth token expired",
"statusCode": 401,
"errorCode": "AUTH_TOKEN_EXPIRED",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
404 Response
{
"message": "Broker user not found",
"statusCode": 404,
"errorCode": "BROKER_USER_NOT_FOUND",
"details": {
"externalUserId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
500 Response
{
"message": "Internal server error",
"statusCode": 500,
"errorCode": "INTERNAL_SERVER_ERROR",
"details": {
"externalId": "12354686-52f1-43ba-aec6-c3d863112232"
},
"datetime": "2025-10-19T17:28:39.780Z"
}
502 Response
{
"message": "Bad gateway",
"statusCode": 502,
"errorCode": "BAD_GATEWAY",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | OK | string |
| 400 | Bad Request | Bad request | ErrorResponse |
| 401 | Unauthorized | Unauthorized | ErrorResponse |
| 404 | Not Found | Not found | ErrorResponse |
| 500 | Internal Server Error | Internal server error | ErrorResponse |
| 502 | Bad Gateway | Bad gateway | ErrorResponse |
getIrocStatementList
Code samples
# You can also use wget
curl -X GET https://api-dev.ndax.io/v1/integrations/broker/statements/iroc/list?page=0&size=0 \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
GET https://api-dev.ndax.io/v1/integrations/broker/statements/iroc/list?page=0&size=0 HTTP/1.1
Host: api-dev.ndax.io
Accept: application/json
const headers = {
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('https://api-dev.ndax.io/v1/integrations/broker/statements/iroc/list?page=0&size=0',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.get 'https://api-dev.ndax.io/v1/integrations/broker/statements/iroc/list',
params: {
'page' => 'integer',
'size' => 'integer'
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.get('https://api-dev.ndax.io/v1/integrations/broker/statements/iroc/list', params={
'page': '0', 'size': '0'
}, headers = headers)
print(r.json())
<?php
require 'vendor/autoload.php';
$headers = array(
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','https://api-dev.ndax.io/v1/integrations/broker/statements/iroc/list', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("https://api-dev.ndax.io/v1/integrations/broker/statements/iroc/list?page=0&size=0");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("GET", "https://api-dev.ndax.io/v1/integrations/broker/statements/iroc/list", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
GET /statements/iroc/list
gets records of all statements related to userId or extUserId
Required permission: statement:read
Error codes:
NO_BROKER_USER_IDENTIFIER_PROVIDED – when neither userId nor externalUserId is provided.
BROKER_USER_NOT_FOUND – when the user is not found.
AMBIGUOUS_BROKER_USER_IDENTIFIER – when both userId and externalUserId are provided, but only one is expected.
INTERNAL_SERVER_ERROR – an unexpected server error occurred.
BAD_REQUEST – the request is invalid or contains incorrect parameters.
BAD_GATEWAY – received an invalid response from an upstream server.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| page | query | integer | true | none |
| size | query | integer | true | none |
| statementType | query | IrocStatementType | false | none |
| startDate | query | string | false | none |
| endDate | query | string | false | none |
| userId | query | string | false | none |
| externalUserId | query | string | false | none |
Enumerated Values
| Parameter | Value |
|---|---|
| statementType | MONTHLY |
| statementType | QUARTERLY |
| statementType | ANNUALLY |
Example responses
200 Response
{
"list": [
{
"brokerId": "string",
"userId": "string",
"omsAccountId": 0,
"month": 0,
"quarter": 0,
"status": "COMPLETE",
"statementId": "string",
"generatedDate": "2019-08-24T14:15:22Z",
"startDate": "2019-08-24T14:15:22Z",
"endDate": "2019-08-24T14:15:22Z",
"statementType": "MONTHLY"
}
],
"total": 0
}
400 Response
{
"message": "Broker user already exists",
"statusCode": 400,
"errorCode": "BROKER_USER_ALREADY_EXISTS",
"details": {
"externalId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
401 Response
{
"message": "Auth token expired",
"statusCode": 401,
"errorCode": "AUTH_TOKEN_EXPIRED",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
404 Response
{
"message": "Broker user not found",
"statusCode": 404,
"errorCode": "BROKER_USER_NOT_FOUND",
"details": {
"externalUserId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
500 Response
{
"message": "Internal server error",
"statusCode": 500,
"errorCode": "INTERNAL_SERVER_ERROR",
"details": {
"externalId": "12354686-52f1-43ba-aec6-c3d863112232"
},
"datetime": "2025-10-19T17:28:39.780Z"
}
502 Response
{
"message": "Bad gateway",
"statusCode": 502,
"errorCode": "BAD_GATEWAY",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | OK | PaginatedIrocStatement |
| 400 | Bad Request | Bad request | ErrorResponse |
| 401 | Unauthorized | Unauthorized | ErrorResponse |
| 404 | Not Found | Not found | ErrorResponse |
| 500 | Internal Server Error | Internal server error | ErrorResponse |
| 502 | Bad Gateway | Bad gateway | ErrorResponse |
generateMonthlyIrocStatement
Code samples
# You can also use wget
curl -X POST https://api-dev.ndax.io/v1/integrations/broker/statements/iroc/generate/monthly \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
POST https://api-dev.ndax.io/v1/integrations/broker/statements/iroc/generate/monthly HTTP/1.1
Host: api-dev.ndax.io
Content-Type: application/json
Accept: application/json
const inputBody = '{
"month": 0,
"year": 0,
"userId": "string",
"externalUserId": "string"
}';
const headers = {
'Content-Type':'application/json',
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('https://api-dev.ndax.io/v1/integrations/broker/statements/iroc/generate/monthly',
{
method: 'POST',
body: inputBody,
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.post 'https://api-dev.ndax.io/v1/integrations/broker/statements/iroc/generate/monthly',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.post('https://api-dev.ndax.io/v1/integrations/broker/statements/iroc/generate/monthly', headers = headers)
print(r.json())
<?php
require 'vendor/autoload.php';
$headers = array(
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('POST','https://api-dev.ndax.io/v1/integrations/broker/statements/iroc/generate/monthly', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("https://api-dev.ndax.io/v1/integrations/broker/statements/iroc/generate/monthly");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Content-Type": []string{"application/json"},
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("POST", "https://api-dev.ndax.io/v1/integrations/broker/statements/iroc/generate/monthly", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
POST /statements/iroc/generate/monthly
sends request to generate monthly statement for userId or extUserId
Required permission: statement:read
Error codes:
NO_BROKER_USER_IDENTIFIER_PROVIDED – when neither userId nor externalUserId is provided.
BROKER_USER_NOT_FOUND – when the user is not found.
AMBIGUOUS_BROKER_USER_IDENTIFIER – when both userId and externalUserId are provided, but only one is expected.
INTERNAL_SERVER_ERROR – an unexpected server error occurred.
BAD_GATEWAY – received an invalid response from an upstream server.
Body parameter
{
"month": 0,
"year": 0,
"userId": "string",
"externalUserId": "string"
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| body | body | GenerateMonthlyIrocStatementRequest | true | none |
Example responses
200 Response
{
"brokerId": "string",
"userId": "string",
"omsAccountId": 0,
"month": 0,
"quarter": 0,
"status": "COMPLETE",
"statementId": "string",
"generatedDate": "2019-08-24T14:15:22Z",
"startDate": "2019-08-24T14:15:22Z",
"endDate": "2019-08-24T14:15:22Z",
"statementType": "MONTHLY"
}
400 Response
{
"message": "Broker user already exists",
"statusCode": 400,
"errorCode": "BROKER_USER_ALREADY_EXISTS",
"details": {
"externalId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
401 Response
{
"message": "Auth token expired",
"statusCode": 401,
"errorCode": "AUTH_TOKEN_EXPIRED",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
404 Response
{
"message": "Broker user not found",
"statusCode": 404,
"errorCode": "BROKER_USER_NOT_FOUND",
"details": {
"externalUserId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
500 Response
{
"message": "Internal server error",
"statusCode": 500,
"errorCode": "INTERNAL_SERVER_ERROR",
"details": {
"externalId": "12354686-52f1-43ba-aec6-c3d863112232"
},
"datetime": "2025-10-19T17:28:39.780Z"
}
502 Response
{
"message": "Bad gateway",
"statusCode": 502,
"errorCode": "BAD_GATEWAY",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | OK | IrocStatementResponse |
| 400 | Bad Request | Bad request | ErrorResponse |
| 401 | Unauthorized | Unauthorized | ErrorResponse |
| 404 | Not Found | Not found | ErrorResponse |
| 500 | Internal Server Error | Internal server error | ErrorResponse |
| 502 | Bad Gateway | Bad gateway | ErrorResponse |
generateQuarterlyIrocStatement
Code samples
# You can also use wget
curl -X POST https://api-dev.ndax.io/v1/integrations/broker/statements/iroc/generate/quarterly \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
POST https://api-dev.ndax.io/v1/integrations/broker/statements/iroc/generate/quarterly HTTP/1.1
Host: api-dev.ndax.io
Content-Type: application/json
Accept: application/json
const inputBody = '{
"userId": "string",
"externalUserId": "string",
"quarter": 0,
"year": 0
}';
const headers = {
'Content-Type':'application/json',
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('https://api-dev.ndax.io/v1/integrations/broker/statements/iroc/generate/quarterly',
{
method: 'POST',
body: inputBody,
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.post 'https://api-dev.ndax.io/v1/integrations/broker/statements/iroc/generate/quarterly',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.post('https://api-dev.ndax.io/v1/integrations/broker/statements/iroc/generate/quarterly', headers = headers)
print(r.json())
<?php
require 'vendor/autoload.php';
$headers = array(
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('POST','https://api-dev.ndax.io/v1/integrations/broker/statements/iroc/generate/quarterly', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("https://api-dev.ndax.io/v1/integrations/broker/statements/iroc/generate/quarterly");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Content-Type": []string{"application/json"},
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("POST", "https://api-dev.ndax.io/v1/integrations/broker/statements/iroc/generate/quarterly", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
POST /statements/iroc/generate/quarterly
sends request to generate quarterly statement for userId or extUserId
Required permission: statement:read
Error codes:
NO_BROKER_USER_IDENTIFIER_PROVIDED – when neither userId nor externalUserId is provided.
BROKER_USER_NOT_FOUND – when the user is not found.
AMBIGUOUS_BROKER_USER_IDENTIFIER – when both userId and externalUserId are provided, but only one is expected.
INTERNAL_SERVER_ERROR – an unexpected server error occurred.
BAD_GATEWAY – received an invalid response from an upstream server.
Body parameter
{
"userId": "string",
"externalUserId": "string",
"quarter": 0,
"year": 0
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| body | body | GenerateQuarterlyIrocStatementRequest | true | none |
Example responses
200 Response
{
"brokerId": "string",
"userId": "string",
"omsAccountId": 0,
"month": 0,
"quarter": 0,
"status": "COMPLETE",
"statementId": "string",
"generatedDate": "2019-08-24T14:15:22Z",
"startDate": "2019-08-24T14:15:22Z",
"endDate": "2019-08-24T14:15:22Z",
"statementType": "MONTHLY"
}
400 Response
{
"message": "Broker user already exists",
"statusCode": 400,
"errorCode": "BROKER_USER_ALREADY_EXISTS",
"details": {
"externalId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
401 Response
{
"message": "Auth token expired",
"statusCode": 401,
"errorCode": "AUTH_TOKEN_EXPIRED",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
404 Response
{
"message": "Broker user not found",
"statusCode": 404,
"errorCode": "BROKER_USER_NOT_FOUND",
"details": {
"externalUserId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
500 Response
{
"message": "Internal server error",
"statusCode": 500,
"errorCode": "INTERNAL_SERVER_ERROR",
"details": {
"externalId": "12354686-52f1-43ba-aec6-c3d863112232"
},
"datetime": "2025-10-19T17:28:39.780Z"
}
502 Response
{
"message": "Bad gateway",
"statusCode": 502,
"errorCode": "BAD_GATEWAY",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | OK | IrocStatementResponse |
| 400 | Bad Request | Bad request | ErrorResponse |
| 401 | Unauthorized | Unauthorized | ErrorResponse |
| 404 | Not Found | Not found | ErrorResponse |
| 500 | Internal Server Error | Internal server error | ErrorResponse |
| 502 | Bad Gateway | Bad gateway | ErrorResponse |
generateAnnualIrocStatement
Code samples
# You can also use wget
curl -X POST https://api-dev.ndax.io/v1/integrations/broker/statements/iroc/generate/annually \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
POST https://api-dev.ndax.io/v1/integrations/broker/statements/iroc/generate/annually HTTP/1.1
Host: api-dev.ndax.io
Content-Type: application/json
Accept: application/json
const inputBody = '{
"userId": "string",
"externalUserId": "string",
"year": 0
}';
const headers = {
'Content-Type':'application/json',
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('https://api-dev.ndax.io/v1/integrations/broker/statements/iroc/generate/annually',
{
method: 'POST',
body: inputBody,
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.post 'https://api-dev.ndax.io/v1/integrations/broker/statements/iroc/generate/annually',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.post('https://api-dev.ndax.io/v1/integrations/broker/statements/iroc/generate/annually', headers = headers)
print(r.json())
<?php
require 'vendor/autoload.php';
$headers = array(
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('POST','https://api-dev.ndax.io/v1/integrations/broker/statements/iroc/generate/annually', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("https://api-dev.ndax.io/v1/integrations/broker/statements/iroc/generate/annually");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Content-Type": []string{"application/json"},
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("POST", "https://api-dev.ndax.io/v1/integrations/broker/statements/iroc/generate/annually", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
POST /statements/iroc/generate/annually
sends request to generate annual statement for userId or extUserId
Required permission: statement:read
Error codes:
NO_BROKER_USER_IDENTIFIER_PROVIDED – when neither userId nor externalUserId is provided.
BROKER_USER_NOT_FOUND – when the user is not found.
AMBIGUOUS_BROKER_USER_IDENTIFIER – when both userId and externalUserId are provided, but only one is expected.
INTERNAL_SERVER_ERROR – an unexpected server error occurred.
BAD_GATEWAY – received an invalid response from an upstream server.
Body parameter
{
"userId": "string",
"externalUserId": "string",
"year": 0
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| body | body | GenerateAnnualyIrocStatementRequest | true | none |
Example responses
200 Response
{
"brokerId": "string",
"userId": "string",
"omsAccountId": 0,
"month": 0,
"quarter": 0,
"status": "COMPLETE",
"statementId": "string",
"generatedDate": "2019-08-24T14:15:22Z",
"startDate": "2019-08-24T14:15:22Z",
"endDate": "2019-08-24T14:15:22Z",
"statementType": "MONTHLY"
}
400 Response
{
"message": "Broker user already exists",
"statusCode": 400,
"errorCode": "BROKER_USER_ALREADY_EXISTS",
"details": {
"externalId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
401 Response
{
"message": "Auth token expired",
"statusCode": 401,
"errorCode": "AUTH_TOKEN_EXPIRED",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
404 Response
{
"message": "Broker user not found",
"statusCode": 404,
"errorCode": "BROKER_USER_NOT_FOUND",
"details": {
"externalUserId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
500 Response
{
"message": "Internal server error",
"statusCode": 500,
"errorCode": "INTERNAL_SERVER_ERROR",
"details": {
"externalId": "12354686-52f1-43ba-aec6-c3d863112232"
},
"datetime": "2025-10-19T17:28:39.780Z"
}
502 Response
{
"message": "Bad gateway",
"statusCode": 502,
"errorCode": "BAD_GATEWAY",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | OK | IrocStatementResponse |
| 400 | Bad Request | Bad request | ErrorResponse |
| 401 | Unauthorized | Unauthorized | ErrorResponse |
| 404 | Not Found | Not found | ErrorResponse |
| 500 | Internal Server Error | Internal server error | ErrorResponse |
| 502 | Bad Gateway | Bad gateway | ErrorResponse |
getDailyTradeConfirmations
Code samples
# You can also use wget
curl -X GET https://api-dev.ndax.io/v1/integrations/broker/statements/trade-confirmations/daily \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
GET https://api-dev.ndax.io/v1/integrations/broker/statements/trade-confirmations/daily HTTP/1.1
Host: api-dev.ndax.io
Accept: application/json
const headers = {
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('https://api-dev.ndax.io/v1/integrations/broker/statements/trade-confirmations/daily',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.get 'https://api-dev.ndax.io/v1/integrations/broker/statements/trade-confirmations/daily',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.get('https://api-dev.ndax.io/v1/integrations/broker/statements/trade-confirmations/daily', headers = headers)
print(r.json())
<?php
require 'vendor/autoload.php';
$headers = array(
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','https://api-dev.ndax.io/v1/integrations/broker/statements/trade-confirmations/daily', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("https://api-dev.ndax.io/v1/integrations/broker/statements/trade-confirmations/daily");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("GET", "https://api-dev.ndax.io/v1/integrations/broker/statements/trade-confirmations/daily", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
GET /statements/trade-confirmations/daily
Get daily trade confirmations
Required permission: statement:read
Error codes:
NO_BROKER_USER_IDENTIFIER_PROVIDED – when neither userId nor externalUserId is provided.
BROKER_USER_NOT_FOUND – when the user is not found.
AMBIGUOUS_BROKER_USER_IDENTIFIER – when both userId and externalUserId are provided, but only one is expected.
INTERNAL_SERVER_ERROR – an unexpected server error occurred.
BAD_GATEWAY – received an invalid response from an upstream server.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| userId | query | string | false | none |
| externalUserId | query | string | false | none |
Example responses
200 Response
[
{
"brokerId": "12354686-52f1-43ba-aec6-c3d863112232",
"userId": "c2c78a6f-9929-4625-9b02-39acffcb421d",
"omsAccountId": 0,
"type": "OTC",
"date": "string"
}
]
400 Response
{
"message": "Broker user already exists",
"statusCode": 400,
"errorCode": "BROKER_USER_ALREADY_EXISTS",
"details": {
"externalId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
401 Response
{
"message": "Auth token expired",
"statusCode": 401,
"errorCode": "AUTH_TOKEN_EXPIRED",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
404 Response
{
"message": "Broker user not found",
"statusCode": 404,
"errorCode": "BROKER_USER_NOT_FOUND",
"details": {
"externalUserId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
500 Response
{
"message": "Internal server error",
"statusCode": 500,
"errorCode": "INTERNAL_SERVER_ERROR",
"details": {
"externalId": "12354686-52f1-43ba-aec6-c3d863112232"
},
"datetime": "2025-10-19T17:28:39.780Z"
}
502 Response
{
"message": "Bad gateway",
"statusCode": 502,
"errorCode": "BAD_GATEWAY",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | OK | Inline |
| 400 | Bad Request | Bad request | ErrorResponse |
| 401 | Unauthorized | Unauthorized | ErrorResponse |
| 404 | Not Found | Not found | ErrorResponse |
| 500 | Internal Server Error | Internal server error | ErrorResponse |
| 502 | Bad Gateway | Bad gateway | ErrorResponse |
Response Schema
Status Code 200
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| anonymous | [DailyTradeConfirmationResponse] | false | none | none |
| » brokerId | string | true | none | none |
| » userId | string | true | none | none |
| » omsAccountId | integer | true | none | none |
| » type | TradingConfirmationType | true | none | none |
| » date | string | true | none | none |
Enumerated Values
| Property | Value |
|---|---|
| type | OTC |
| type | REGULAR |
downloadDailyTradeConfirmation
Code samples
# You can also use wget
curl -X GET https://api-dev.ndax.io/v1/integrations/broker/statements/trade-confirmations/daily/download?date=string&tradeConfirmationType=OTC \
-H 'Accept: application/octet-stream' \
-H 'Authorization: Bearer {access-token}'
GET https://api-dev.ndax.io/v1/integrations/broker/statements/trade-confirmations/daily/download?date=string&tradeConfirmationType=OTC HTTP/1.1
Host: api-dev.ndax.io
Accept: application/octet-stream
const headers = {
'Accept':'application/octet-stream',
'Authorization':'Bearer {access-token}'
};
fetch('https://api-dev.ndax.io/v1/integrations/broker/statements/trade-confirmations/daily/download?date=string&tradeConfirmationType=OTC',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/octet-stream',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.get 'https://api-dev.ndax.io/v1/integrations/broker/statements/trade-confirmations/daily/download',
params: {
'date' => 'string',
'tradeConfirmationType' => '[TradingConfirmationType](#schematradingconfirmationtype)'
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Accept': 'application/octet-stream',
'Authorization': 'Bearer {access-token}'
}
r = requests.get('https://api-dev.ndax.io/v1/integrations/broker/statements/trade-confirmations/daily/download', params={
'date': 'string', 'tradeConfirmationType': 'OTC'
}, headers = headers)
print(r.json())
<?php
require 'vendor/autoload.php';
$headers = array(
'Accept' => 'application/octet-stream',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','https://api-dev.ndax.io/v1/integrations/broker/statements/trade-confirmations/daily/download', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("https://api-dev.ndax.io/v1/integrations/broker/statements/trade-confirmations/daily/download?date=string&tradeConfirmationType=OTC");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Accept": []string{"application/octet-stream"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("GET", "https://api-dev.ndax.io/v1/integrations/broker/statements/trade-confirmations/daily/download", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
GET /statements/trade-confirmations/daily/download
Download daily trade confirmation
Required permission: statement:read
Error codes:
STATEMENT_NOT_FOUND – statement not found.
NO_BROKER_USER_IDENTIFIER_PROVIDED – when neither userId nor externalUserId is provided.
BROKER_USER_NOT_FOUND – when the user is not found.
AMBIGUOUS_BROKER_USER_IDENTIFIER – when both userId and externalUserId are provided, but only one is expected.
INTERNAL_SERVER_ERROR – an unexpected server error occurred.
BAD_REQUEST – the request is invalid or contains incorrect parameters.
BAD_GATEWAY – received an invalid response from an upstream server.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| date | query | string | true | none |
| tradeConfirmationType | query | TradingConfirmationType | true | none |
| userId | query | string | false | none |
| externalUserId | query | string | false | none |
Enumerated Values
| Parameter | Value |
|---|---|
| tradeConfirmationType | OTC |
| tradeConfirmationType | REGULAR |
Example responses
200 Response
400 Response
{
"message": "Broker user already exists",
"statusCode": 400,
"errorCode": "BROKER_USER_ALREADY_EXISTS",
"details": {
"externalId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
401 Response
{
"message": "Auth token expired",
"statusCode": 401,
"errorCode": "AUTH_TOKEN_EXPIRED",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
404 Response
{
"message": "Broker user not found",
"statusCode": 404,
"errorCode": "BROKER_USER_NOT_FOUND",
"details": {
"externalUserId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
500 Response
{
"message": "Internal server error",
"statusCode": 500,
"errorCode": "INTERNAL_SERVER_ERROR",
"details": {
"externalId": "12354686-52f1-43ba-aec6-c3d863112232"
},
"datetime": "2025-10-19T17:28:39.780Z"
}
502 Response
{
"message": "Bad gateway",
"statusCode": 502,
"errorCode": "BAD_GATEWAY",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | OK | string |
| 400 | Bad Request | Bad request | ErrorResponse |
| 401 | Unauthorized | Unauthorized | ErrorResponse |
| 404 | Not Found | Not found | ErrorResponse |
| 500 | Internal Server Error | Internal server error | ErrorResponse |
| 502 | Bad Gateway | Bad gateway | ErrorResponse |
Appropriateness Questionnaire
getAppropriatenessQuestionnaireQuestions
Code samples
# You can also use wget
curl -X GET https://api-dev.ndax.io/v1/integrations/broker/appropriateness-questionnaire/questions \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
GET https://api-dev.ndax.io/v1/integrations/broker/appropriateness-questionnaire/questions HTTP/1.1
Host: api-dev.ndax.io
Accept: application/json
const headers = {
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('https://api-dev.ndax.io/v1/integrations/broker/appropriateness-questionnaire/questions',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.get 'https://api-dev.ndax.io/v1/integrations/broker/appropriateness-questionnaire/questions',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.get('https://api-dev.ndax.io/v1/integrations/broker/appropriateness-questionnaire/questions', headers = headers)
print(r.json())
<?php
require 'vendor/autoload.php';
$headers = array(
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','https://api-dev.ndax.io/v1/integrations/broker/appropriateness-questionnaire/questions', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("https://api-dev.ndax.io/v1/integrations/broker/appropriateness-questionnaire/questions");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("GET", "https://api-dev.ndax.io/v1/integrations/broker/appropriateness-questionnaire/questions", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
GET /appropriateness-questionnaire/questions
Get appropriateness questionnaire questions
Required permission: questionnaire:read
Error codes:
INTERNAL_SERVER_ERROR – an unexpected server error occurred.
BAD_GATEWAY – received an invalid response from an upstream server.
Example responses
200 Response
[
{
"id": "string",
"title": {
"en": "string",
"fr": "string"
},
"text": {
"en": "string",
"fr": "string"
},
"tooltip": {
"en": "string",
"fr": "string"
},
"options": [
{
"id": "string",
"text": {
"en": "string",
"fr": "string"
}
}
]
}
]
400 Response
{
"message": "Broker user already exists",
"statusCode": 400,
"errorCode": "BROKER_USER_ALREADY_EXISTS",
"details": {
"externalId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
401 Response
{
"message": "Auth token expired",
"statusCode": 401,
"errorCode": "AUTH_TOKEN_EXPIRED",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
404 Response
{
"message": "Broker user not found",
"statusCode": 404,
"errorCode": "BROKER_USER_NOT_FOUND",
"details": {
"externalUserId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
500 Response
{
"message": "Internal server error",
"statusCode": 500,
"errorCode": "INTERNAL_SERVER_ERROR",
"details": {
"externalId": "12354686-52f1-43ba-aec6-c3d863112232"
},
"datetime": "2025-10-19T17:28:39.780Z"
}
502 Response
{
"message": "Bad gateway",
"statusCode": 502,
"errorCode": "BAD_GATEWAY",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | OK | Inline |
| 400 | Bad Request | Bad request | ErrorResponse |
| 401 | Unauthorized | Unauthorized | ErrorResponse |
| 404 | Not Found | Not found | ErrorResponse |
| 500 | Internal Server Error | Internal server error | ErrorResponse |
| 502 | Bad Gateway | Bad gateway | ErrorResponse |
Response Schema
Status Code 200
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| anonymous | [AppropriatenessQuestionnaireQuestionResponse] | false | none | none |
| » id | string | true | none | none |
| » title | LocalizedText | true | none | none |
| »» en | string | true | none | none |
| »» fr | string | true | none | none |
| » text | LocalizedText | true | none | none |
| » tooltip | LocalizedText | false | none | none |
| » options | [AppropriatenessQuestionnaireOptionResponse] | true | none | none |
| »» id | string | true | none | none |
| »» text | LocalizedText | true | none | none |
submitAppropriatenessQuestionnaire
Code samples
# You can also use wget
curl -X POST https://api-dev.ndax.io/v1/integrations/broker/appropriateness-questionnaire/submit \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
POST https://api-dev.ndax.io/v1/integrations/broker/appropriateness-questionnaire/submit HTTP/1.1
Host: api-dev.ndax.io
Content-Type: application/json
Accept: application/json
const inputBody = '{
"userId": "c2c78a6f-9929-4625-9b02-39acffcb421d",
"externalUserId": 5555,
"answers": [
{
"questionId": "string",
"optionId": "string"
}
]
}';
const headers = {
'Content-Type':'application/json',
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('https://api-dev.ndax.io/v1/integrations/broker/appropriateness-questionnaire/submit',
{
method: 'POST',
body: inputBody,
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.post 'https://api-dev.ndax.io/v1/integrations/broker/appropriateness-questionnaire/submit',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.post('https://api-dev.ndax.io/v1/integrations/broker/appropriateness-questionnaire/submit', headers = headers)
print(r.json())
<?php
require 'vendor/autoload.php';
$headers = array(
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('POST','https://api-dev.ndax.io/v1/integrations/broker/appropriateness-questionnaire/submit', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("https://api-dev.ndax.io/v1/integrations/broker/appropriateness-questionnaire/submit");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Content-Type": []string{"application/json"},
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("POST", "https://api-dev.ndax.io/v1/integrations/broker/appropriateness-questionnaire/submit", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
POST /appropriateness-questionnaire/submit
Submit appropriateness questionnaire
Required permission: questionnaire:submit
Error codes:
NO_BROKER_USER_IDENTIFIER_PROVIDED – when neither userId nor externalUserId is provided.
BROKER_USER_NOT_FOUND – when the user is not found.
AMBIGUOUS_BROKER_USER_IDENTIFIER – when both userId and externalUserId are provided, but only one is expected.
BROKER_USER_IS_CLOSED – the broker user is closed, questionnaire cannot be submitted.
INTERNAL_SERVER_ERROR – an unexpected server error occurred.
BAD_REQUEST – the request is invalid or contains incorrect parameters.
BAD_GATEWAY – received an invalid response from an upstream server.
Body parameter
{
"userId": "c2c78a6f-9929-4625-9b02-39acffcb421d",
"externalUserId": 5555,
"answers": [
{
"questionId": "string",
"optionId": "string"
}
]
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| body | body | AppropriatenessQuestionnaireSubmitRequest | true | none |
Example responses
201 Response
{
"status": "ACCOUNT_CLOSED",
"nextAttemptDate": "string"
}
400 Response
{
"message": "Broker user already exists",
"statusCode": 400,
"errorCode": "BROKER_USER_ALREADY_EXISTS",
"details": {
"externalId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
401 Response
{
"message": "Auth token expired",
"statusCode": 401,
"errorCode": "AUTH_TOKEN_EXPIRED",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
404 Response
{
"message": "Broker user not found",
"statusCode": 404,
"errorCode": "BROKER_USER_NOT_FOUND",
"details": {
"externalUserId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
500 Response
{
"message": "Internal server error",
"statusCode": 500,
"errorCode": "INTERNAL_SERVER_ERROR",
"details": {
"externalId": "12354686-52f1-43ba-aec6-c3d863112232"
},
"datetime": "2025-10-19T17:28:39.780Z"
}
502 Response
{
"message": "Bad gateway",
"statusCode": 502,
"errorCode": "BAD_GATEWAY",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 201 | Created | OK | AppropriatenessQuestionnaireSubmissionResponse |
| 400 | Bad Request | Bad request | ErrorResponse |
| 401 | Unauthorized | Unauthorized | ErrorResponse |
| 404 | Not Found | Not found | ErrorResponse |
| 500 | Internal Server Error | Internal server error | ErrorResponse |
| 502 | Bad Gateway | Bad gateway | ErrorResponse |
Maintenances
getUpcomingMaintenances
Code samples
# You can also use wget
curl -X GET https://api-dev.ndax.io/v1/integrations/broker/maintenances/upcoming \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
GET https://api-dev.ndax.io/v1/integrations/broker/maintenances/upcoming HTTP/1.1
Host: api-dev.ndax.io
Accept: application/json
const headers = {
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('https://api-dev.ndax.io/v1/integrations/broker/maintenances/upcoming',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.get 'https://api-dev.ndax.io/v1/integrations/broker/maintenances/upcoming',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.get('https://api-dev.ndax.io/v1/integrations/broker/maintenances/upcoming', headers = headers)
print(r.json())
<?php
require 'vendor/autoload.php';
$headers = array(
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','https://api-dev.ndax.io/v1/integrations/broker/maintenances/upcoming', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("https://api-dev.ndax.io/v1/integrations/broker/maintenances/upcoming");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("GET", "https://api-dev.ndax.io/v1/integrations/broker/maintenances/upcoming", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
GET /maintenances/upcoming
Get upcoming maintenances
Required permission: maintenances:read
Error codes:
INTERNAL_SERVER_ERROR – an unexpected server error occurred.
BAD_REQUEST – the request is invalid or contains incorrect parameters.
BAD_GATEWAY – received an invalid response from an upstream server.
Example responses
200 Response
[
{
"id": "string",
"status": "SCHEDULED",
"startAt": "string",
"endAt": "string"
}
]
400 Response
{
"message": "Broker user already exists",
"statusCode": 400,
"errorCode": "BROKER_USER_ALREADY_EXISTS",
"details": {
"externalId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
401 Response
{
"message": "Auth token expired",
"statusCode": 401,
"errorCode": "AUTH_TOKEN_EXPIRED",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
404 Response
{
"message": "Broker user not found",
"statusCode": 404,
"errorCode": "BROKER_USER_NOT_FOUND",
"details": {
"externalUserId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
500 Response
{
"message": "Internal server error",
"statusCode": 500,
"errorCode": "INTERNAL_SERVER_ERROR",
"details": {
"externalId": "12354686-52f1-43ba-aec6-c3d863112232"
},
"datetime": "2025-10-19T17:28:39.780Z"
}
502 Response
{
"message": "Bad gateway",
"statusCode": 502,
"errorCode": "BAD_GATEWAY",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | OK | Inline |
| 400 | Bad Request | Bad request | ErrorResponse |
| 401 | Unauthorized | Unauthorized | ErrorResponse |
| 404 | Not Found | Not found | ErrorResponse |
| 500 | Internal Server Error | Internal server error | ErrorResponse |
| 502 | Bad Gateway | Bad gateway | ErrorResponse |
Response Schema
Status Code 200
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| anonymous | [MaintenanceResponse] | false | none | none |
| » id | string | true | none | none |
| » status | MaintenanceStatus | true | none | none |
| » startAt | string | true | none | none |
| » endAt | string | true | none | none |
Enumerated Values
| Property | Value |
|---|---|
| status | SCHEDULED |
| status | IN_PROGRESS |
| status | COMPLETED |
| status | CANCELED |
getMaintenanceHistory
Code samples
# You can also use wget
curl -X GET https://api-dev.ndax.io/v1/integrations/broker/maintenances/history \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
GET https://api-dev.ndax.io/v1/integrations/broker/maintenances/history HTTP/1.1
Host: api-dev.ndax.io
Accept: application/json
const headers = {
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('https://api-dev.ndax.io/v1/integrations/broker/maintenances/history',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.get 'https://api-dev.ndax.io/v1/integrations/broker/maintenances/history',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.get('https://api-dev.ndax.io/v1/integrations/broker/maintenances/history', headers = headers)
print(r.json())
<?php
require 'vendor/autoload.php';
$headers = array(
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','https://api-dev.ndax.io/v1/integrations/broker/maintenances/history', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("https://api-dev.ndax.io/v1/integrations/broker/maintenances/history");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("GET", "https://api-dev.ndax.io/v1/integrations/broker/maintenances/history", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
GET /maintenances/history
Get maintenance history
Required permission: maintenances:read
Error codes:
INTERNAL_SERVER_ERROR – an unexpected server error occurred.
BAD_REQUEST – the request is invalid or contains incorrect parameters.
BAD_GATEWAY – received an invalid response from an upstream server.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| page | query | integer | false | none |
| size | query | integer | false | none |
Example responses
200 Response
{
"total": 0,
"list": [
{
"id": "string",
"status": "SCHEDULED",
"startAt": "string",
"endAt": "string"
}
]
}
400 Response
{
"message": "Broker user already exists",
"statusCode": 400,
"errorCode": "BROKER_USER_ALREADY_EXISTS",
"details": {
"externalId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
401 Response
{
"message": "Auth token expired",
"statusCode": 401,
"errorCode": "AUTH_TOKEN_EXPIRED",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
404 Response
{
"message": "Broker user not found",
"statusCode": 404,
"errorCode": "BROKER_USER_NOT_FOUND",
"details": {
"externalUserId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
500 Response
{
"message": "Internal server error",
"statusCode": 500,
"errorCode": "INTERNAL_SERVER_ERROR",
"details": {
"externalId": "12354686-52f1-43ba-aec6-c3d863112232"
},
"datetime": "2025-10-19T17:28:39.780Z"
}
502 Response
{
"message": "Bad gateway",
"statusCode": 502,
"errorCode": "BAD_GATEWAY",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | OK | MaintenancePaginatedResponse |
| 400 | Bad Request | Bad request | ErrorResponse |
| 401 | Unauthorized | Unauthorized | ErrorResponse |
| 404 | Not Found | Not found | ErrorResponse |
| 500 | Internal Server Error | Internal server error | ErrorResponse |
| 502 | Bad Gateway | Bad gateway | ErrorResponse |
Deposits
generateDepositKey
Code samples
# You can also use wget
curl -X POST https://api-dev.ndax.io/v1/integrations/broker/deposit-keys \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
POST https://api-dev.ndax.io/v1/integrations/broker/deposit-keys HTTP/1.1
Host: api-dev.ndax.io
Content-Type: application/json
Accept: application/json
const inputBody = '{
"userId": 0,
"externalUserId": "string",
"accountProviderId": 0
}';
const headers = {
'Content-Type':'application/json',
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('https://api-dev.ndax.io/v1/integrations/broker/deposit-keys',
{
method: 'POST',
body: inputBody,
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.post 'https://api-dev.ndax.io/v1/integrations/broker/deposit-keys',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.post('https://api-dev.ndax.io/v1/integrations/broker/deposit-keys', headers = headers)
print(r.json())
<?php
require 'vendor/autoload.php';
$headers = array(
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('POST','https://api-dev.ndax.io/v1/integrations/broker/deposit-keys', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("https://api-dev.ndax.io/v1/integrations/broker/deposit-keys");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Content-Type": []string{"application/json"},
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("POST", "https://api-dev.ndax.io/v1/integrations/broker/deposit-keys", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
POST /deposit-keys
Generate deposit key
Generates a new deposit key for a given user and account provider, and returns the new default deposit key.
Provide either userId or externalUserId to identify the user, but not both.
Required permission: deposit-key:generate
Error codes:
PRODUCT_IS_DISABLED – product is disabled.
ACCOUNT_PROVIDER_NOT_FOUND – account provider not found.
ACCOUNT_PROVIDER_DISABLED – account provider is disabled.
NETWORK_SUSPENDED – onchain network is suspended.
NO_BROKER_USER_IDENTIFIER_PROVIDED – neither userId nor externalUserId was provided.
AMBIGUOUS_BROKER_USER_IDENTIFIER – both userId and externalUserId were provided; only one is expected.
BROKER_USER_NOT_FOUND – the broker user was not found.
INTERNAL_SERVER_ERROR – an unexpected server error occurred.
BAD_REQUEST – the request is invalid or contains incorrect parameters.
BAD_GATEWAY – received an invalid response from an upstream server.
Body parameter
{
"userId": 0,
"externalUserId": "string",
"accountProviderId": 0
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| body | body | GenerateDepositKeyRequest | true | none |
Example responses
200 Response
{
"address": "string",
"tag": "string",
"legacyAddress": "string"
}
400 Response
{
"message": "Broker user already exists",
"statusCode": 400,
"errorCode": "BROKER_USER_ALREADY_EXISTS",
"details": {
"externalId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
401 Response
{
"message": "Auth token expired",
"statusCode": 401,
"errorCode": "AUTH_TOKEN_EXPIRED",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
404 Response
{
"message": "Broker user not found",
"statusCode": 404,
"errorCode": "BROKER_USER_NOT_FOUND",
"details": {
"externalUserId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
500 Response
{
"message": "Internal server error",
"statusCode": 500,
"errorCode": "INTERNAL_SERVER_ERROR",
"details": {
"externalId": "12354686-52f1-43ba-aec6-c3d863112232"
},
"datetime": "2025-10-19T17:28:39.780Z"
}
502 Response
{
"message": "Bad gateway",
"statusCode": 502,
"errorCode": "BAD_GATEWAY",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | OK – returns the default deposit key | DepositKey |
| 400 | Bad Request | Bad request | ErrorResponse |
| 401 | Unauthorized | Unauthorized | ErrorResponse |
| 404 | Not Found | Not found | ErrorResponse |
| 500 | Internal Server Error | Internal server error | ErrorResponse |
| 502 | Bad Gateway | Bad gateway | ErrorResponse |
getDefaultDepositKey
Code samples
# You can also use wget
curl -X GET https://api-dev.ndax.io/v1/integrations/broker/deposit-keys/default?accountProviderId=0 \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
GET https://api-dev.ndax.io/v1/integrations/broker/deposit-keys/default?accountProviderId=0 HTTP/1.1
Host: api-dev.ndax.io
Accept: application/json
const headers = {
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('https://api-dev.ndax.io/v1/integrations/broker/deposit-keys/default?accountProviderId=0',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.get 'https://api-dev.ndax.io/v1/integrations/broker/deposit-keys/default',
params: {
'accountProviderId' => 'integer'
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.get('https://api-dev.ndax.io/v1/integrations/broker/deposit-keys/default', params={
'accountProviderId': '0'
}, headers = headers)
print(r.json())
<?php
require 'vendor/autoload.php';
$headers = array(
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','https://api-dev.ndax.io/v1/integrations/broker/deposit-keys/default', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("https://api-dev.ndax.io/v1/integrations/broker/deposit-keys/default?accountProviderId=0");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("GET", "https://api-dev.ndax.io/v1/integrations/broker/deposit-keys/default", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
GET /deposit-keys/default
Get default deposit key
Returns the default deposit key for a given user and account provider.
Provide either userId or externalUserId to identify the user, but not both.
Required permission: deposit-key:read
Error codes:
PRODUCT_IS_DISABLED – product is disabled.
ACCOUNT_PROVIDER_NOT_FOUND – account provider not found.
ACCOUNT_PROVIDER_DISABLED – account provider is disabled.
NETWORK_SUSPENDED – onchain network is suspended.
NO_BROKER_USER_IDENTIFIER_PROVIDED – neither userId nor externalUserId was provided.
AMBIGUOUS_BROKER_USER_IDENTIFIER – both userId and externalUserId were provided; only one is expected.
BROKER_USER_NOT_FOUND – the broker user was not found.
INTERNAL_SERVER_ERROR – an unexpected server error occurred.
BAD_REQUEST – the request is invalid or contains incorrect parameters.
BAD_GATEWAY – received an invalid response from an upstream server.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| accountProviderId | query | integer | true | none |
| userId | query | integer | false | none |
| externalUserId | query | string | false | none |
Example responses
200 Response
{
"address": "string",
"tag": "string",
"legacyAddress": "string"
}
400 Response
{
"message": "Broker user already exists",
"statusCode": 400,
"errorCode": "BROKER_USER_ALREADY_EXISTS",
"details": {
"externalId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
401 Response
{
"message": "Auth token expired",
"statusCode": 401,
"errorCode": "AUTH_TOKEN_EXPIRED",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
404 Response
{
"message": "Broker user not found",
"statusCode": 404,
"errorCode": "BROKER_USER_NOT_FOUND",
"details": {
"externalUserId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
500 Response
{
"message": "Internal server error",
"statusCode": 500,
"errorCode": "INTERNAL_SERVER_ERROR",
"details": {
"externalId": "12354686-52f1-43ba-aec6-c3d863112232"
},
"datetime": "2025-10-19T17:28:39.780Z"
}
502 Response
{
"message": "Bad gateway",
"statusCode": 502,
"errorCode": "BAD_GATEWAY",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | OK | DepositKey |
| 400 | Bad Request | Bad request | ErrorResponse |
| 401 | Unauthorized | Unauthorized | ErrorResponse |
| 404 | Not Found | Not found | ErrorResponse |
| 500 | Internal Server Error | Internal server error | ErrorResponse |
| 502 | Bad Gateway | Bad gateway | ErrorResponse |
getDepositKeyHistory
Code samples
# You can also use wget
curl -X GET https://api-dev.ndax.io/v1/integrations/broker/deposit-keys/history?accountProviderId=0 \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
GET https://api-dev.ndax.io/v1/integrations/broker/deposit-keys/history?accountProviderId=0 HTTP/1.1
Host: api-dev.ndax.io
Accept: application/json
const headers = {
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('https://api-dev.ndax.io/v1/integrations/broker/deposit-keys/history?accountProviderId=0',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.get 'https://api-dev.ndax.io/v1/integrations/broker/deposit-keys/history',
params: {
'accountProviderId' => 'integer'
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.get('https://api-dev.ndax.io/v1/integrations/broker/deposit-keys/history', params={
'accountProviderId': '0'
}, headers = headers)
print(r.json())
<?php
require 'vendor/autoload.php';
$headers = array(
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','https://api-dev.ndax.io/v1/integrations/broker/deposit-keys/history', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("https://api-dev.ndax.io/v1/integrations/broker/deposit-keys/history?accountProviderId=0");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("GET", "https://api-dev.ndax.io/v1/integrations/broker/deposit-keys/history", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
GET /deposit-keys/history
Get deposit key history
Returns the history of deposit keys for a given user and account provider.
Provide either userId or externalUserId to identify the user, but not both.
Required permission: deposit-key:read
Error codes:
NO_BROKER_USER_IDENTIFIER_PROVIDED – neither userId nor externalUserId was provided.
AMBIGUOUS_BROKER_USER_IDENTIFIER – both userId and externalUserId were provided; only one is expected.
BROKER_USER_NOT_FOUND – the broker user was not found.
INTERNAL_SERVER_ERROR – an unexpected server error occurred.
BAD_REQUEST – the request is invalid or contains incorrect parameters.
BAD_GATEWAY – received an invalid response from an upstream server.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| accountProviderId | query | integer | true | none |
| userId | query | integer | false | none |
| externalUserId | query | string | false | none |
Example responses
200 Response
[
{
"address": "string",
"tag": "string",
"legacyAddress": "string"
}
]
400 Response
{
"message": "Broker user already exists",
"statusCode": 400,
"errorCode": "BROKER_USER_ALREADY_EXISTS",
"details": {
"externalId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
401 Response
{
"message": "Auth token expired",
"statusCode": 401,
"errorCode": "AUTH_TOKEN_EXPIRED",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
404 Response
{
"message": "Broker user not found",
"statusCode": 404,
"errorCode": "BROKER_USER_NOT_FOUND",
"details": {
"externalUserId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
500 Response
{
"message": "Internal server error",
"statusCode": 500,
"errorCode": "INTERNAL_SERVER_ERROR",
"details": {
"externalId": "12354686-52f1-43ba-aec6-c3d863112232"
},
"datetime": "2025-10-19T17:28:39.780Z"
}
502 Response
{
"message": "Bad gateway",
"statusCode": 502,
"errorCode": "BAD_GATEWAY",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | OK | Inline |
| 400 | Bad Request | Bad request | ErrorResponse |
| 401 | Unauthorized | Unauthorized | ErrorResponse |
| 404 | Not Found | Not found | ErrorResponse |
| 500 | Internal Server Error | Internal server error | ErrorResponse |
| 502 | Bad Gateway | Bad gateway | ErrorResponse |
Response Schema
Status Code 200
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| anonymous | [DepositKey] | false | none | none |
| » address | string | true | none | none |
| » tag | string | false | none | none |
| » legacyAddress | string | false | none | none |
getDepositTickets
Code samples
# You can also use wget
curl -X GET https://api-dev.ndax.io/v1/integrations/broker/deposit-tickets \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
GET https://api-dev.ndax.io/v1/integrations/broker/deposit-tickets HTTP/1.1
Host: api-dev.ndax.io
Accept: application/json
const headers = {
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('https://api-dev.ndax.io/v1/integrations/broker/deposit-tickets',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.get 'https://api-dev.ndax.io/v1/integrations/broker/deposit-tickets',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.get('https://api-dev.ndax.io/v1/integrations/broker/deposit-tickets', headers = headers)
print(r.json())
<?php
require 'vendor/autoload.php';
$headers = array(
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','https://api-dev.ndax.io/v1/integrations/broker/deposit-tickets', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("https://api-dev.ndax.io/v1/integrations/broker/deposit-tickets");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("GET", "https://api-dev.ndax.io/v1/integrations/broker/deposit-tickets", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
GET /deposit-tickets
Get deposit tickets
Returns a list of deposit tickets for a specific user account.
Provide either userId or externalUserId to identify the user, but not both.
Use the optional from and to parameters to filter by deposit creation date.
Required permission: deposit-tickets:read
Error codes:
NO_BROKER_USER_IDENTIFIER_PROVIDED – neither userId nor externalUserId was provided.
AMBIGUOUS_BROKER_USER_IDENTIFIER – both userId and externalUserId were provided; only one is expected.
BROKER_USER_NOT_FOUND – the broker user was not found.
INTERNAL_SERVER_ERROR – an unexpected server error occurred.
BAD_REQUEST – the request is invalid or contains incorrect parameters.
BAD_GATEWAY – received an invalid response from an upstream server.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| userId | query | integer | false | none |
| externalUserId | query | string | false | none |
| from | query | string(date-time) | false | ISO 8601 date-time string to filter deposits created on or after this date. |
| to | query | string(date-time) | false | ISO 8601 date-time string to filter deposits created on or before this date. |
Example responses
200 Response
[
{
"depositTicketId": 0,
"productId": 0,
"accountProviderId": 0,
"userId": "string",
"externalUserId": "string",
"amount": "string",
"status": "NEW",
"txHash": "string",
"senderAddress": "string",
"notionalValue": "string",
"createdAt": "2019-08-24T14:15:22Z"
}
]
400 Response
{
"message": "Broker user already exists",
"statusCode": 400,
"errorCode": "BROKER_USER_ALREADY_EXISTS",
"details": {
"externalId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
401 Response
{
"message": "Auth token expired",
"statusCode": 401,
"errorCode": "AUTH_TOKEN_EXPIRED",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
404 Response
{
"message": "Broker user not found",
"statusCode": 404,
"errorCode": "BROKER_USER_NOT_FOUND",
"details": {
"externalUserId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
500 Response
{
"message": "Internal server error",
"statusCode": 500,
"errorCode": "INTERNAL_SERVER_ERROR",
"details": {
"externalId": "12354686-52f1-43ba-aec6-c3d863112232"
},
"datetime": "2025-10-19T17:28:39.780Z"
}
502 Response
{
"message": "Bad gateway",
"statusCode": 502,
"errorCode": "BAD_GATEWAY",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | OK | Inline |
| 400 | Bad Request | Bad request | ErrorResponse |
| 401 | Unauthorized | Unauthorized | ErrorResponse |
| 404 | Not Found | Not found | ErrorResponse |
| 500 | Internal Server Error | Internal server error | ErrorResponse |
| 502 | Bad Gateway | Bad gateway | ErrorResponse |
Response Schema
Status Code 200
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| anonymous | [DepositFullyProcessedWebhookPayload] | false | none | none |
| » depositTicketId | integer | true | none | none |
| » productId | integer | true | none | none |
| » accountProviderId | integer | true | none | none |
| » userId | string | true | none | none |
| » externalUserId | string | true | none | none |
| » amount | string | true | none | none |
| » status | DepositTicketStatus | true | none | none |
| » txHash | string | false | none | none |
| » senderAddress | string | false | none | none |
| » notionalValue | string | true | none | none |
| » createdAt | string(date-time) | true | none | none |
Enumerated Values
| Property | Value |
|---|---|
| status | NEW |
| status | PROCESSING |
| status | REJECTED |
| status | FULLY_PROCESSED |
| status | FAILED |
| status | PENDING |
Keys
getBrokerKeys
Code samples
# You can also use wget
curl -X GET https://api-dev.ndax.io/v1/integrations/broker/keys \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
GET https://api-dev.ndax.io/v1/integrations/broker/keys HTTP/1.1
Host: api-dev.ndax.io
Accept: application/json
const headers = {
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('https://api-dev.ndax.io/v1/integrations/broker/keys',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.get 'https://api-dev.ndax.io/v1/integrations/broker/keys',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.get('https://api-dev.ndax.io/v1/integrations/broker/keys', headers = headers)
print(r.json())
<?php
require 'vendor/autoload.php';
$headers = array(
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','https://api-dev.ndax.io/v1/integrations/broker/keys', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("https://api-dev.ndax.io/v1/integrations/broker/keys");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("GET", "https://api-dev.ndax.io/v1/integrations/broker/keys", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
GET /keys
List broker keys
Returns all API keys for the authenticated broker account.
Required permission: key:read
Error codes:
INTERNAL_SERVER_ERROR – an unexpected server error occurred.
BAD_REQUEST – the request is invalid or contains incorrect parameters.
Example responses
200 Response
[
{
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
"name": "string",
"enabled": true,
"permissions": [
"auth:revoke"
],
"expiresAt": "2019-08-24T14:15:22Z",
"createdAt": "2019-08-24T14:15:22Z"
}
]
400 Response
{
"message": "Broker user already exists",
"statusCode": 400,
"errorCode": "BROKER_USER_ALREADY_EXISTS",
"details": {
"externalId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
401 Response
{
"message": "Auth token expired",
"statusCode": 401,
"errorCode": "AUTH_TOKEN_EXPIRED",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
403 Response
{
"message": "Auth key permission denied",
"statusCode": 502,
"errorCode": "AUTH_KEY_PERMISSION_DENIED",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
500 Response
{
"message": "Internal server error",
"statusCode": 500,
"errorCode": "INTERNAL_SERVER_ERROR",
"details": {
"externalId": "12354686-52f1-43ba-aec6-c3d863112232"
},
"datetime": "2025-10-19T17:28:39.780Z"
}
502 Response
{
"message": "Bad gateway",
"statusCode": 502,
"errorCode": "BAD_GATEWAY",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | OK | Inline |
| 400 | Bad Request | Bad request | ErrorResponse |
| 401 | Unauthorized | Unauthorized | ErrorResponse |
| 403 | Forbidden | Forbidden | ErrorResponse |
| 500 | Internal Server Error | Internal server error | ErrorResponse |
| 502 | Bad Gateway | Bad gateway | ErrorResponse |
Response Schema
Status Code 200
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| anonymous | [BrokerKeyResponse] | false | none | none |
| » id | string(uuid) | true | none | Unique key identifier |
| » name | string | true | none | Human-readable label for the key |
| » enabled | boolean | true | none | Whether this key is currently active for authentication |
| » permissions | [BrokerPermission] | true | none | List of permissions granted to this key |
| » expiresAt | string(date-time)¦null | true | none | When this key expires (null if no expiry) |
| » createdAt | string(date-time) | true | none | When this key was created |
createBrokerKey
Code samples
# You can also use wget
curl -X POST https://api-dev.ndax.io/v1/integrations/broker/keys \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
POST https://api-dev.ndax.io/v1/integrations/broker/keys HTTP/1.1
Host: api-dev.ndax.io
Content-Type: application/json
Accept: application/json
const inputBody = '{
"name": "string",
"publicKey": "string",
"permissions": [
"auth:revoke"
],
"ttlSeconds": 1
}';
const headers = {
'Content-Type':'application/json',
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('https://api-dev.ndax.io/v1/integrations/broker/keys',
{
method: 'POST',
body: inputBody,
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.post 'https://api-dev.ndax.io/v1/integrations/broker/keys',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.post('https://api-dev.ndax.io/v1/integrations/broker/keys', headers = headers)
print(r.json())
<?php
require 'vendor/autoload.php';
$headers = array(
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('POST','https://api-dev.ndax.io/v1/integrations/broker/keys', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("https://api-dev.ndax.io/v1/integrations/broker/keys");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Content-Type": []string{"application/json"},
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("POST", "https://api-dev.ndax.io/v1/integrations/broker/keys", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
POST /keys
Create broker key
Creates a new key in the disabled state. Enable it explicitly when ready. The new key's permissions cannot exceed the permissions of the signing key.
Required permission: key:manage
Error codes:
INTERNAL_SERVER_ERROR – an unexpected server error occurred.
BAD_REQUEST – the request is invalid or contains incorrect parameters.
Body parameter
{
"name": "string",
"publicKey": "string",
"permissions": [
"auth:revoke"
],
"ttlSeconds": 1
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| body | body | CreateBrokerKeyRequest | true | none |
Example responses
201 Response
{
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
"name": "string",
"enabled": true,
"permissions": [
"auth:revoke"
],
"expiresAt": "2019-08-24T14:15:22Z",
"createdAt": "2019-08-24T14:15:22Z"
}
400 Response
{
"message": "Broker user already exists",
"statusCode": 400,
"errorCode": "BROKER_USER_ALREADY_EXISTS",
"details": {
"externalId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
401 Response
{
"message": "Auth token expired",
"statusCode": 401,
"errorCode": "AUTH_TOKEN_EXPIRED",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
403 Response
{
"message": "Auth key permission denied",
"statusCode": 502,
"errorCode": "AUTH_KEY_PERMISSION_DENIED",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
500 Response
{
"message": "Internal server error",
"statusCode": 500,
"errorCode": "INTERNAL_SERVER_ERROR",
"details": {
"externalId": "12354686-52f1-43ba-aec6-c3d863112232"
},
"datetime": "2025-10-19T17:28:39.780Z"
}
502 Response
{
"message": "Bad gateway",
"statusCode": 502,
"errorCode": "BAD_GATEWAY",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 201 | Created | Created | BrokerKeyResponse |
| 400 | Bad Request | Bad request | ErrorResponse |
| 401 | Unauthorized | Unauthorized | ErrorResponse |
| 403 | Forbidden | Forbidden | ErrorResponse |
| 500 | Internal Server Error | Internal server error | ErrorResponse |
| 502 | Bad Gateway | Bad gateway | ErrorResponse |
updateBrokerKey
Code samples
# You can also use wget
curl -X PATCH https://api-dev.ndax.io/v1/integrations/broker/keys/{keyId} \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
PATCH https://api-dev.ndax.io/v1/integrations/broker/keys/{keyId} HTTP/1.1
Host: api-dev.ndax.io
Content-Type: application/json
Accept: application/json
const inputBody = '{
"name": "string",
"ttlSeconds": 1
}';
const headers = {
'Content-Type':'application/json',
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('https://api-dev.ndax.io/v1/integrations/broker/keys/{keyId}',
{
method: 'PATCH',
body: inputBody,
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.patch 'https://api-dev.ndax.io/v1/integrations/broker/keys/{keyId}',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.patch('https://api-dev.ndax.io/v1/integrations/broker/keys/{keyId}', headers = headers)
print(r.json())
<?php
require 'vendor/autoload.php';
$headers = array(
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('PATCH','https://api-dev.ndax.io/v1/integrations/broker/keys/{keyId}', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("https://api-dev.ndax.io/v1/integrations/broker/keys/{keyId}");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("PATCH");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Content-Type": []string{"application/json"},
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("PATCH", "https://api-dev.ndax.io/v1/integrations/broker/keys/{keyId}", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
PATCH /keys/{keyId}
Update broker key
Updates the key's name or TTL. To change permissions or the public key itself, create a new key.
Required permission: key:manage
Error codes:
BROKER_KEY_NOT_FOUND – the key ID in the request path does not exist.
INTERNAL_SERVER_ERROR – an unexpected server error occurred.
BAD_REQUEST – the request is invalid or contains incorrect parameters.
Body parameter
{
"name": "string",
"ttlSeconds": 1
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| keyId | path | string(uuid) | true | none |
| body | body | UpdateBrokerKeyRequest | true | none |
Example responses
200 Response
{
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
"name": "string",
"enabled": true,
"permissions": [
"auth:revoke"
],
"expiresAt": "2019-08-24T14:15:22Z",
"createdAt": "2019-08-24T14:15:22Z"
}
400 Response
{
"message": "Broker user already exists",
"statusCode": 400,
"errorCode": "BROKER_USER_ALREADY_EXISTS",
"details": {
"externalId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
401 Response
{
"message": "Auth token expired",
"statusCode": 401,
"errorCode": "AUTH_TOKEN_EXPIRED",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
403 Response
{
"message": "Auth key permission denied",
"statusCode": 502,
"errorCode": "AUTH_KEY_PERMISSION_DENIED",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
404 Response
{
"message": "Broker user not found",
"statusCode": 404,
"errorCode": "BROKER_USER_NOT_FOUND",
"details": {
"externalUserId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
500 Response
{
"message": "Internal server error",
"statusCode": 500,
"errorCode": "INTERNAL_SERVER_ERROR",
"details": {
"externalId": "12354686-52f1-43ba-aec6-c3d863112232"
},
"datetime": "2025-10-19T17:28:39.780Z"
}
502 Response
{
"message": "Bad gateway",
"statusCode": 502,
"errorCode": "BAD_GATEWAY",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | OK | BrokerKeyResponse |
| 400 | Bad Request | Bad request | ErrorResponse |
| 401 | Unauthorized | Unauthorized | ErrorResponse |
| 403 | Forbidden | Forbidden | ErrorResponse |
| 404 | Not Found | Not found | ErrorResponse |
| 500 | Internal Server Error | Internal server error | ErrorResponse |
| 502 | Bad Gateway | Bad gateway | ErrorResponse |
enableBrokerKey
Code samples
# You can also use wget
curl -X PATCH https://api-dev.ndax.io/v1/integrations/broker/keys/{keyId}/enable \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
PATCH https://api-dev.ndax.io/v1/integrations/broker/keys/{keyId}/enable HTTP/1.1
Host: api-dev.ndax.io
Accept: application/json
const headers = {
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('https://api-dev.ndax.io/v1/integrations/broker/keys/{keyId}/enable',
{
method: 'PATCH',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.patch 'https://api-dev.ndax.io/v1/integrations/broker/keys/{keyId}/enable',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.patch('https://api-dev.ndax.io/v1/integrations/broker/keys/{keyId}/enable', headers = headers)
print(r.json())
<?php
require 'vendor/autoload.php';
$headers = array(
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('PATCH','https://api-dev.ndax.io/v1/integrations/broker/keys/{keyId}/enable', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("https://api-dev.ndax.io/v1/integrations/broker/keys/{keyId}/enable");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("PATCH");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("PATCH", "https://api-dev.ndax.io/v1/integrations/broker/keys/{keyId}/enable", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
PATCH /keys/{keyId}/enable
Enable broker key
Enables a key so it can be used for authentication.
Required permission: key:manage
Error codes:
BROKER_KEY_NOT_FOUND – the key ID in the request path does not exist.
BROKER_KEY_ALREADY_ENABLED – attempted to enable a key that is already enabled.
INTERNAL_SERVER_ERROR – an unexpected server error occurred.
BAD_REQUEST – the request is invalid or contains incorrect parameters.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| keyId | path | string(uuid) | true | none |
Example responses
200 Response
{
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
"name": "string",
"enabled": true,
"permissions": [
"auth:revoke"
],
"expiresAt": "2019-08-24T14:15:22Z",
"createdAt": "2019-08-24T14:15:22Z"
}
400 Response
{
"message": "Broker user already exists",
"statusCode": 400,
"errorCode": "BROKER_USER_ALREADY_EXISTS",
"details": {
"externalId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
401 Response
{
"message": "Auth token expired",
"statusCode": 401,
"errorCode": "AUTH_TOKEN_EXPIRED",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
403 Response
{
"message": "Auth key permission denied",
"statusCode": 502,
"errorCode": "AUTH_KEY_PERMISSION_DENIED",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
404 Response
{
"message": "Broker user not found",
"statusCode": 404,
"errorCode": "BROKER_USER_NOT_FOUND",
"details": {
"externalUserId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
500 Response
{
"message": "Internal server error",
"statusCode": 500,
"errorCode": "INTERNAL_SERVER_ERROR",
"details": {
"externalId": "12354686-52f1-43ba-aec6-c3d863112232"
},
"datetime": "2025-10-19T17:28:39.780Z"
}
502 Response
{
"message": "Bad gateway",
"statusCode": 502,
"errorCode": "BAD_GATEWAY",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | OK | BrokerKeyResponse |
| 400 | Bad Request | Bad request | ErrorResponse |
| 401 | Unauthorized | Unauthorized | ErrorResponse |
| 403 | Forbidden | Forbidden | ErrorResponse |
| 404 | Not Found | Not found | ErrorResponse |
| 500 | Internal Server Error | Internal server error | ErrorResponse |
| 502 | Bad Gateway | Bad gateway | ErrorResponse |
disableBrokerKey
Code samples
# You can also use wget
curl -X PATCH https://api-dev.ndax.io/v1/integrations/broker/keys/{keyId}/disable \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
PATCH https://api-dev.ndax.io/v1/integrations/broker/keys/{keyId}/disable HTTP/1.1
Host: api-dev.ndax.io
Accept: application/json
const headers = {
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('https://api-dev.ndax.io/v1/integrations/broker/keys/{keyId}/disable',
{
method: 'PATCH',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.patch 'https://api-dev.ndax.io/v1/integrations/broker/keys/{keyId}/disable',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.patch('https://api-dev.ndax.io/v1/integrations/broker/keys/{keyId}/disable', headers = headers)
print(r.json())
<?php
require 'vendor/autoload.php';
$headers = array(
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('PATCH','https://api-dev.ndax.io/v1/integrations/broker/keys/{keyId}/disable', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("https://api-dev.ndax.io/v1/integrations/broker/keys/{keyId}/disable");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("PATCH");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("PATCH", "https://api-dev.ndax.io/v1/integrations/broker/keys/{keyId}/disable", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
PATCH /keys/{keyId}/disable
Disable broker key
Disables a key. Any in-flight JWT signed with this key will be rejected immediately.
Required permission: key:manage
Error codes:
BROKER_KEY_NOT_FOUND – the key ID in the request path does not exist.
BROKER_KEY_ALREADY_DISABLED – attempted to disable a key that is already disabled.
BROKER_KEY_CANNOT_DISABLE_CURRENT – attempted to disable the key currently signing the request.
INTERNAL_SERVER_ERROR – an unexpected server error occurred.
BAD_REQUEST – the request is invalid or contains incorrect parameters.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| keyId | path | string(uuid) | true | none |
Example responses
200 Response
{
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
"name": "string",
"enabled": true,
"permissions": [
"auth:revoke"
],
"expiresAt": "2019-08-24T14:15:22Z",
"createdAt": "2019-08-24T14:15:22Z"
}
400 Response
{
"message": "Broker user already exists",
"statusCode": 400,
"errorCode": "BROKER_USER_ALREADY_EXISTS",
"details": {
"externalId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
401 Response
{
"message": "Auth token expired",
"statusCode": 401,
"errorCode": "AUTH_TOKEN_EXPIRED",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
403 Response
{
"message": "Auth key permission denied",
"statusCode": 502,
"errorCode": "AUTH_KEY_PERMISSION_DENIED",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
404 Response
{
"message": "Broker user not found",
"statusCode": 404,
"errorCode": "BROKER_USER_NOT_FOUND",
"details": {
"externalUserId": 5555
},
"datetime": "2025-10-19T17:28:39.780Z"
}
500 Response
{
"message": "Internal server error",
"statusCode": 500,
"errorCode": "INTERNAL_SERVER_ERROR",
"details": {
"externalId": "12354686-52f1-43ba-aec6-c3d863112232"
},
"datetime": "2025-10-19T17:28:39.780Z"
}
502 Response
{
"message": "Bad gateway",
"statusCode": 502,
"errorCode": "BAD_GATEWAY",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | OK | BrokerKeyResponse |
| 400 | Bad Request | Bad request | ErrorResponse |
| 401 | Unauthorized | Unauthorized | ErrorResponse |
| 403 | Forbidden | Forbidden | ErrorResponse |
| 404 | Not Found | Not found | ErrorResponse |
| 500 | Internal Server Error | Internal server error | ErrorResponse |
| 502 | Bad Gateway | Bad gateway | ErrorResponse |
LeftoverTransfer
transferLeftover
Code samples
# You can also use wget
curl -X POST https://api-dev.ndax.io/v1/integrations/broker/leftover-transfers \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
POST https://api-dev.ndax.io/v1/integrations/broker/leftover-transfers HTTP/1.1
Host: api-dev.ndax.io
Content-Type: application/json
Accept: application/json
const inputBody = '{
"idempotencyKey": "string",
"productId": 0,
"userId": "2c4a230c-5085-4924-a3e1-25fb4fc5965b",
"externalUserId": "string"
}';
const headers = {
'Content-Type':'application/json',
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('https://api-dev.ndax.io/v1/integrations/broker/leftover-transfers',
{
method: 'POST',
body: inputBody,
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.post 'https://api-dev.ndax.io/v1/integrations/broker/leftover-transfers',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.post('https://api-dev.ndax.io/v1/integrations/broker/leftover-transfers', headers = headers)
print(r.json())
<?php
require 'vendor/autoload.php';
$headers = array(
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('POST','https://api-dev.ndax.io/v1/integrations/broker/leftover-transfers', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("https://api-dev.ndax.io/v1/integrations/broker/leftover-transfers");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Content-Type": []string{"application/json"},
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("POST", "https://api-dev.ndax.io/v1/integrations/broker/leftover-transfers", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
POST /leftover-transfers
Transfer leftover from a broker user's account to the broker float account
Transfers the full leftover balance of the given product (e.g. CAD) for the identified broker user from their OMS account to the broker's float OMS account. The request identifies the user (by userId or externalUserId) and the product; the amount is determined by the backend. The transfer is rejected if the user has any trade in status PENDING, PROCESSING, or REQUIRES_MANUAL_RETRY (return an appropriate 4xx with a clear message in that case). Uses ledger transaction type 124 (BrokerLeftoverTransfer). Idempotency is enforced via idempotencyKey.
Required permission: deposit-tickets:read
Error codes:
BROKER_LEFTOVER_TRANSFER_PRODUCT_NOT_ALLOWED – given product is not allowed to be transferred.
BROKER_USER_ACCOUNT_NOT_ENOUGH_FUNDS – the user’s account does not have enough funds.
BROKER_LEFTOVER_TRANSFER_ALREADY_EXISTS – leftover transfer already exists with the same idempotency key.
NO_BROKER_USER_IDENTIFIER_PROVIDED – neither userId nor externalUserId was provided.
AMBIGUOUS_BROKER_USER_IDENTIFIER – both userId and externalUserId were provided; only one is expected.
BROKER_USER_NOT_FOUND – the broker user was not found.
INTERNAL_SERVER_ERROR – an unexpected server error occurred.
BAD_REQUEST – the request is invalid or contains incorrect parameters.
BAD_GATEWAY – received an invalid response from an upstream server.
Body parameter
{
"idempotencyKey": "string",
"productId": 0,
"userId": "2c4a230c-5085-4924-a3e1-25fb4fc5965b",
"externalUserId": "string"
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| body | body | LeftoverTransferRequest | true | none |
Example responses
200 Response
{
"id": "string",
"brokerId": "string",
"brokerUserId": "string",
"status": "PENDING",
"productId": 0,
"amount": "string",
"idempotencyKey": "string",
"ledgerEntryId": "string",
"createdAt": "2019-08-24T14:15:22Z",
"completedAt": "2019-08-24T14:15:22Z"
}
401 Response
{
"message": "Auth token expired",
"statusCode": 401,
"errorCode": "AUTH_TOKEN_EXPIRED",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
500 Response
{
"message": "Internal server error",
"statusCode": 500,
"errorCode": "INTERNAL_SERVER_ERROR",
"details": {
"externalId": "12354686-52f1-43ba-aec6-c3d863112232"
},
"datetime": "2025-10-19T17:28:39.780Z"
}
502 Response
{
"message": "Bad gateway",
"statusCode": 502,
"errorCode": "BAD_GATEWAY",
"details": {},
"datetime": "2025-10-19T17:28:39.780Z"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Success | LeftoverTransferResponse |
| 400 | Bad Request | Bad request. The response body uses ErrorResponse and may contain one of the following error codes: |
- BROKER_LEFTOVER_TRANSFER_PRODUCT_NOT_ALLOWED – The requested product is not supported for leftover transfer. Only CAD is currently supported; the product field is configurable to allow additional products in future. Any product other than CAD returns this error.
- BROKER_USER_ACCOUNT_NOT_ENOUGH_FUNDS – The user's account balance for the requested product is below the minimum transferable amount (e.g. 0.01 CAD). Leftover transfer is only performed when the balance exceeds this threshold.
- Transfer blocked due to pending/processing/manual-retry trades, or ledger failure. The message will indicate the reason (e.g. "Cannot transfer leftover CAD: user account has N trade(s) with status PENDING, PROCESSING, or REQUIRES_MANUAL_RETRY").|ErrorResponse|
|401|Unauthorized|Unauthorized|ErrorResponse|
|409|Conflict|Conflict. BROKER_LEFTOVER_TRANSFER_ALREADY_EXISTS – A transfer request with the same
idempotencyKeyhas already been accepted. Idempotency keys prevent duplicate transfers (e.g. from duplicate button clicks or retries). Subsequent requests with the same key are treated as duplicates and rejected with this error.|ErrorResponse| |500|Internal Server Error|Internal server error|ErrorResponse| |502|Bad Gateway|Bad gateway|ErrorResponse|
Schemas
ErrorCode
"INTERNAL_SERVER_ERROR"
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| anonymous | string | false | none | none |
Enumerated Values
| Property | Value |
|---|---|
| anonymous | INTERNAL_SERVER_ERROR |
| anonymous | NOT_FOUND |
| anonymous | BAD_REQUEST |
| anonymous | BAD_GATEWAY |
| anonymous | AUTH_NO_TOKEN_PROVIDED |
| anonymous | AUTH_INVALID_TOKEN |
| anonymous | AUTH_BROKER_IS_NOT_ENABLED |
| anonymous | AUTH_TOKEN_REVOKED |
| anonymous | AUTH_TOKEN_EXPIRED |
| anonymous | AUTH_TOKEN_INVALID_EXP |
| anonymous | AUTH_TOKEN_INVALID_SUB |
| anonymous | AUTH_TOKEN_INVALID_KID |
| anonymous | AUTH_KEY_IS_DISABLED |
| anonymous | AUTH_KEY_PERMISSION_DENIED |
| anonymous | BROKER_RULE_ALREADY_EXISTS |
| anonymous | BROKER_RULE_NOT_FOUND |
| anonymous | BROKER_RULE_ALREADY_ENABLED |
| anonymous | BROKER_RULE_ALREADY_DISABLED |
| anonymous | BROKER_RULE_INVALID_VALUE |
| anonymous | BROKER_USER_NOT_FOUND |
| anonymous | QUOTE_NOT_FOUND |
| anonymous | QUOTE_EXPIRED |
| anonymous | QUOTE_ESTIMATED_AMOUNT_IS_ZERO |
| anonymous | QUOTE_CANNOT_BE_CONFIRMED |
| anonymous | QUOTE_CANNOT_BE_CANCELLED |
| anonymous | QUOTE_VALUE_LESS_THAN_MINIMUM_QUANTITY |
| anonymous | INSUFFICIENT_MARKET_LIQUIDITY |
| anonymous | INSTRUMENT_NOT_FOUND |
| anonymous | INSTRUMENT_IS_DISABLED |
| anonymous | BROKER_ACCOUNT_NOT_ENOUGH_FUNDS |
| anonymous | BROKER_USER_ACCOUNT_NOT_ENOUGH_FUNDS |
| anonymous | POLICY_IS_NOT_ACCEPTED |
| anonymous | POLICY_CANNOT_BE_ACKNOWLEDGED |
| anonymous | TRADE_NOT_FOUND |
| anonymous | AMBIGUOUS_BROKER_USER_IDENTIFIER |
| anonymous | NO_BROKER_USER_IDENTIFIER_PROVIDED |
| anonymous | ONE_TIME_TRADE_LIMIT_EXCEEDED |
| anonymous | DAILY_TRADE_LIMIT_EXCEEDED |
| anonymous | DUAL_SOURCE_KYC_SOURCE_NOT_DEFINED |
| anonymous | DUAL_SOURCE_KYC_INSUFFICIENT_CONFIRMATIONS_PROVIDED |
| anonymous | KYC_INFO_ONE_METHOD_REQUIRED |
| anonymous | BROKER_USER_IS_UNDERAGE |
| anonymous | BROKER_USER_IS_ACTIVE |
| anonymous | BROKER_USER_CANNOT_DELETE_PERSONAL_INFO_ON_CLOSE |
| anonymous | PERSONAL_INFO_REQUIRED_FOR_REOPENING_BROKER_USER |
| anonymous | BROKER_USER_CANNOT_BE_REOPENED |
| anonymous | BROKER_USER_IS_CLOSED |
| anonymous | BROKER_USER_ALREADY_CLOSED |
| anonymous | BROKER_USER_ALREADY_EXISTS |
| anonymous | BROKER_USER_EMAIL_ALREADY_IN_USE |
| anonymous | BROKER_USER_EMPLOYMENT_INFO_REQUIRED |
| anonymous | BROKER_USER_UNEMPLOYMENT_INFO_REQUIRED |
| anonymous | BROKER_USER_EMPLOYMENT_INFO_SHOULD_NOT_EXISTS |
| anonymous | BROKER_USER_UNEMPLOYMENT_INFO_SHOULD_NOT_EXISTS |
| anonymous | BROKER_USER_INVALID_TYPE_OF_BUSINESS |
| anonymous | BROKER_USER_INVALID_JOB_TITLE |
| anonymous | BROKER_USER_COUNTRY_IS_NOT_SUPPORTED |
| anonymous | BROKER_USER_OTHER_SOURCE_OF_INCOME_REQUIRED |
| anonymous | BROKER_USER_OTHER_SOURCE_OF_INCOME_SHOULD_NOT_EXISTS |
| anonymous | APPROPRIATENESS_QUESTIONNAIRE_IS_NOT_EXPECTED |
| anonymous | APPROPRIATENESS_QUESTIONNAIRE_NEXT_ATTEMPT_IS_NOT_AVAILABLE_YET |
| anonymous | INFO_CHECK_IS_NOT_EXPECTED |
| anonymous | BROKER_TRADE_FEE_NOT_FOUND |
| anonymous | STATEMENT_NOT_FOUND |
| anonymous | STATEMENT_PERIOD_NOT_IN_PAST |
| anonymous | STATEMENT_PERIOD_TOO_EARLY |
| anonymous | PRODUCT_IS_DISABLED |
| anonymous | ACCOUNT_PROVIDER_NOT_FOUND |
| anonymous | ACCOUNT_PROVIDER_DISABLED |
| anonymous | NETWORK_SUSPENDED |
| anonymous | BROKER_LEFTOVER_TRANSFER_PRODUCT_NOT_ALLOWED |
| anonymous | BROKER_LEFTOVER_TRANSFER_ALREADY_EXISTS |
ErrorResponse
{
"message": "string",
"statusCode": 0,
"errorCode": "INTERNAL_SERVER_ERROR",
"details": {},
"datetime": "string"
}
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| message | string | true | none | none |
| statusCode | integer | true | none | none |
| errorCode | ErrorCode | true | none | none |
| details | object | true | none | none |
| datetime | string | true | none | none |
RevokeTokenOptions
{
"tokenId": "string"
}
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| tokenId | string | true | none | none |
BrokerUserAddress
{
"countryCode": "CA",
"provinceCode": "AB",
"city": "Calgary",
"street": "Tower str",
"postalCode": "013-T43",
"building": 12,
"unit": 5
}
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| countryCode | string | true | none | none |
| provinceCode | string | true | none | none |
| city | string | true | none | none |
| street | string | true | none | none |
| postalCode | string | true | none | none |
| building | string | false | none | none |
| unit | string | false | none | none |
BrokerUserPostalAddress
{
"countryCode": "CA",
"addressLine": "69 Eagle Road Bonnyville, AB T9N 3X4"
}
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| countryCode | string | true | none | none |
| addressLine | string | true | none | none |
PlatformReferenceType
"Other"
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| anonymous | string | false | none | none |
Enumerated Values
| Property | Value |
|---|---|
| anonymous | |
| anonymous | |
| anonymous | |
| anonymous | |
| anonymous | Friend |
| anonymous | Other |
PlatformReference
{
"platformReferenceType": "Other",
"otherPlatformReference": "Telegram channel"
}
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| platformReferenceType | PlatformReferenceType | true | none | none |
| otherPlatformReference | string | false | none | none |
AccountType
"INVESTING_IN_DIGITAL_CURRENCY"
User account type
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| anonymous | string | false | none | User account type |
Enumerated Values
| Property | Value |
|---|---|
| anonymous | INVESTING_IN_DIGITAL_CURRENCY |
| anonymous | LIQUIDATING_EXISTING_INVESTMENT |
| anonymous | SUPPORTING_AN_EXCHANGE_SERVICE |
| anonymous | LIQUIDATING_MINING_PROCEEDS |
| anonymous | EDUCATION_OR_SAVINGS |
| anonymous | LONG_TERM_SAVINGS |
| anonymous | RETIREMENT_SAVINGS |
| anonymous | SHORT_TERM_SAVINGS |
BrokerUserNetAnnualIncomeValue
"LESS_THAN_30K"
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| anonymous | string | false | none | none |
Enumerated Values
| Property | Value |
|---|---|
| anonymous | LESS_THAN_30K |
| anonymous | BETWEEN_30K_75K |
| anonymous | BETWEEN_75K_125K |
| anonymous | BETWEEN_125K_200K |
| anonymous | BETWEEN_125K_300K |
| anonymous | MORE_THAN_200k |
| anonymous | MORE_THAN_300k |
BrokerUserNetAssetsValue
"LESS_THAN_100K"
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| anonymous | string | false | none | none |
Enumerated Values
| Property | Value |
|---|---|
| anonymous | LESS_THAN_100K |
| anonymous | BETWEEN_100K_400K |
| anonymous | BETWEEN_400K_1M |
| anonymous | BETWEEN_1M_5M |
| anonymous | MORE_THAN_5M |
BrokerUserNetFinancialAssetsValue
"LESS_THAN_100K"
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| anonymous | string | false | none | none |
Enumerated Values
| Property | Value |
|---|---|
| anonymous | LESS_THAN_100K |
| anonymous | BETWEEN_100K_400K |
| anonymous | BETWEEN_400K_1M |
| anonymous | BETWEEN_1M_5M |
| anonymous | MORE_THAN_5M |
SourceOfIncome
"OTHER"
Occupation source of income
Properties
None
TypeOfBusiness
"ACCOUNTING"
Occupation type of business
Properties
None
AccountingJobs
"ACCOUNTANT"
Properties
None
AdministrativeJobs
"ADMINISTRATIVE_ASSISTANT"
Properties
None
AgricultureAndFarmingJobs
"AGRICULTURE_INSPECTOR"
Properties
None
BankingAndMortgageProfessionalsJobs
"BANK_EXECUTIVE"
Properties
None
BuildingConstructionJobs
"BUILDING_CONTRACTOR"
Properties
None
BusinessManagementJobs
"BUSINESS_UNIT_MANAGER"
Properties
None
ClientSupportJobs
"ACCOUNT_MANAGER"
Properties
None
DesignAndCreativityJobs
"ARTIST"
Properties
None
EducationAndTrainingJobs
"CHILD_CARE_WORKER"
Properties
None
EngineeringAndArchitectJobs
"AERONAUTIC_OR_AVIONIC_ENGINEER"
Properties
None
FinanceAndFinTechJobs
"CHIEF_FINANCIAL_OFFICER"
Properties
None
FoodServicesAndHospitalityJobs
"BAKER"
Properties
None
GovernmentAndDiplomaticJobs
"ABORIGINAL_BAND_CHEF"
Properties
None
HumanResourcesJobs
"COMPENSATION_AND_BENEFITS_POLICY_SPECIALIST"
Properties
None
InsuranceJobs
"ACTUARY_OR_ACTUARIAL_ANALYST"
Properties
None
LegalJobs
"CONTRACTS_ADMINISTRATION_LAWYER"
Properties
None
ManufacturingAndOperationsJobs
"AGRICULTURAL_SPECIALIST"
Properties
None
MarketingJobs
"BRAND_AND_PRODUCT_MARKETING_SPECIALIST"
Properties
None
MedicalAndHealthJobs
"AUDIOLOGIST"
Properties
None
ResourceIndustryJobs
"ADMINISTRATIVE_ASSISTANT_OR_SECRETARY"
Properties
None
MilitaryProfessionalsJobs
"MILITARY_COMBAT_SPECIALIST"
Properties
None
ProjectAndProgramManagementJobs
"EVENT_PLANNING_AND_COORDINATOR"
Properties
None
PersonalCareServicesJobs
"BABYSITTER_OR_NANNY"
Properties
None
QualityAssuranceAndSafetyJobs
"BUILDING_AND_CONSTRUCTION_INSPECTOR"
Properties
None
RealEstateJobs
"ENERGY_AUDITOR"
Properties
None
ReligiousProfessionalsJobs
"CLERGY"
Properties
None
RetailAndBusinessDevelopmentJobs
"ACCOUNT_MANAGER_COMMISSIONED"
Properties
None
ScienceAndTechnologyJobs
"ASTRONOMER"
Properties
None
SecurityAndEmergencyServicesJobs
"AIR_TRAFFIC_CONTROLLER"
Properties
None
SkilledTradesMaintenanceAndRepairJobs
"AUTOBODY_TECHNICIAN_OR_MECHANIC"
Properties
None
SoftwareDevelopmentAndItJobs
"DATABASE_DEVELOPER_AND_ADMINISTRATOR"
Properties
None
SportsGamingAndEntertainmentJobs
"ACTOR"
Properties
None
TransportationAndLogisticsJobs
"AIR_TRAFFIC_CONTROLLER"
Properties
None
UtilitiesJobs
"CONTROL_AND_VALVE_INSTALLER"
Properties
None
WritingEditorialJobs
"ADVERTISING_WRITER"
Properties
None
JobTitleType
"ACCOUNTANT"
Properties
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| anonymous | AccountingJobs | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| anonymous | AdministrativeJobs | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| anonymous | AgricultureAndFarmingJobs | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| anonymous | BankingAndMortgageProfessionalsJobs | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| anonymous | BuildingConstructionJobs | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| anonymous | BusinessManagementJobs | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| anonymous | ClientSupportJobs | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| anonymous | DesignAndCreativityJobs | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| anonymous | EducationAndTrainingJobs | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| anonymous | EngineeringAndArchitectJobs | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| anonymous | FinanceAndFinTechJobs | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| anonymous | FoodServicesAndHospitalityJobs | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| anonymous | GovernmentAndDiplomaticJobs | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| anonymous | HumanResourcesJobs | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| anonymous | InsuranceJobs | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| anonymous | LegalJobs | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| anonymous | ManufacturingAndOperationsJobs | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| anonymous | MarketingJobs | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| anonymous | MedicalAndHealthJobs | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| anonymous | ResourceIndustryJobs | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| anonymous | MilitaryProfessionalsJobs | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| anonymous | ProjectAndProgramManagementJobs | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| anonymous | PersonalCareServicesJobs | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| anonymous | QualityAssuranceAndSafetyJobs | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| anonymous | RealEstateJobs | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| anonymous | ReligiousProfessionalsJobs | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| anonymous | RetailAndBusinessDevelopmentJobs | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| anonymous | ScienceAndTechnologyJobs | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| anonymous | SecurityAndEmergencyServicesJobs | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| anonymous | SkilledTradesMaintenanceAndRepairJobs | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| anonymous | SoftwareDevelopmentAndItJobs | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| anonymous | SportsGamingAndEntertainmentJobs | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| anonymous | TransportationAndLogisticsJobs | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| anonymous | UtilitiesJobs | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| anonymous | WritingEditorialJobs | false | none | none |
OccupationEmploymentInfo
{
"employerName": "Microsoft",
"typeOfBusiness": "ACCOUNTING",
"jobTitle": "ACCOUNTANT",
"customJobTitle": "string"
}
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| employerName | string | true | none | none |
| typeOfBusiness | TypeOfBusiness | false | none | Occupation type of business |
| jobTitle | JobTitleType | false | none | none |
| customJobTitle | string | false | none | none |
OccupationUnemploymentInfo
{
"sourceOfIncome": "OTHER",
"otherSourceOfIncome": "Received an inheritance"
}
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| sourceOfIncome | SourceOfIncome | true | none | Occupation source of income |
| otherSourceOfIncome | string | false | none | none |
EmploymentType
"EMPLOYED"
Occupation employment type
Properties
None
Occupation
{
"employmentType": "EMPLOYED",
"employmentInfo": {
"employerName": "Microsoft",
"typeOfBusiness": "ACCOUNTING",
"jobTitle": "ACCOUNTANT",
"customJobTitle": "string"
},
"unemploymentInfo": {
"sourceOfIncome": "OTHER",
"otherSourceOfIncome": "Received an inheritance"
}
}
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| employmentType | EmploymentType | true | none | Occupation employment type |
| employmentInfo | OccupationEmploymentInfo | false | none | none |
| unemploymentInfo | OccupationUnemploymentInfo | false | none | none |
BrokerUserFinancialInfo
{
"netAnnualIncomeValue": "LESS_THAN_30K",
"netAssetsValue": "LESS_THAN_100K",
"netFinancialAssetsValue": "LESS_THAN_100K",
"dualIncome": true,
"lessThanTwoYearsIncome": true,
"occupation": {
"employmentType": "EMPLOYED",
"employmentInfo": {
"employerName": "Microsoft",
"typeOfBusiness": "ACCOUNTING",
"jobTitle": "ACCOUNTANT",
"customJobTitle": "string"
},
"unemploymentInfo": {
"sourceOfIncome": "OTHER",
"otherSourceOfIncome": "Received an inheritance"
}
}
}
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| netAnnualIncomeValue | BrokerUserNetAnnualIncomeValue | true | none | none |
| netAssetsValue | BrokerUserNetAssetsValue | true | none | none |
| netFinancialAssetsValue | BrokerUserNetFinancialAssetsValue | true | none | none |
| dualIncome | boolean | true | none | none |
| lessThanTwoYearsIncome | boolean | false | none | none |
| occupation | Occupation | true | none | none |
BrokerUserInfo
{
"firstName": "John",
"middleName": "J",
"lastName": "Doe",
"phoneNumber": "+15263696352",
"email": "[email protected]",
"dob": "1994-12-12",
"sin": 123123123,
"address": {
"countryCode": "CA",
"provinceCode": "AB",
"city": "Calgary",
"street": "Tower str",
"postalCode": "013-T43",
"building": 12,
"unit": 5
},
"postalAddress": {
"countryCode": "CA",
"addressLine": "69 Eagle Road Bonnyville, AB T9N 3X4"
}
}
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| firstName | string | true | none | none |
| middleName | string | false | none | none |
| lastName | string | true | none | none |
| phoneNumber | string | true | none | none |
| string | true | none | none | |
| dob | string | true | none | none |
| sin | string | false | none | none |
| address | BrokerUserAddress | false | none | none |
| postalAddress | BrokerUserPostalAddress | false | none | none |
DocumentType
"PASSPORT"
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| anonymous | string | false | none | none |
Enumerated Values
| Property | Value |
|---|---|
| anonymous | PASSPORT |
| anonymous | PERMANENT_RESIDENT_CARD |
| anonymous | SECURE_CERTIFICATE_OF_INDIAN_STATUS |
| anonymous | DRIVER_LICENSE |
| anonymous | CITIZENSHIP_CARD |
| anonymous | PROVINCIAL_SERVICES_CARD |
| anonymous | PROVINCIAL_OR_TERRITORIAL_CARD |
| anonymous | GLOBAL_ENTRY_CARD |
| anonymous | NEXUS |
| anonymous | NATIONAL_HEALTH_INSURANCE_CARD |
| anonymous | NATIONAL_HEALTH_INSURANCE |
| anonymous | WORK_PERMIT |
| anonymous | VOTER_ID |
| anonymous | PROFESSIONAL_QUALIFICATION_CARD |
| anonymous | ASYLUM_REGISTRATION_CARD |
| anonymous | TAX_ID |
| anonymous | PROOF_OF_CITIZENSHIP |
| anonymous | SERVICE_ID_CARD |
| anonymous | VISA |
| anonymous | POSTAL_IDENTITY_CARD |
| anonymous | NATIONAL_IDENTITY_CARD |
DocumentKycInfo
{
"documentType": "PASSPORT",
"documentNumber": 123456789,
"countryOfIssuance": "CA",
"provinceOfIssuance": "AB",
"documentExpirationDate": "2026-10-10",
"verificationDate": "2025-11-14T13:20:09.487Z"
}
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| documentType | DocumentType | true | none | none |
| documentNumber | string | true | none | none |
| countryOfIssuance | string | true | none | none |
| provinceOfIssuance | string | false | none | none |
| documentExpirationDate | string | false | none | none |
| verificationDate | string | true | none | none |
CreditBureauKycInfo
{
"creditBureau": "Bureau ABC",
"fileCreatedAt": "2025-11-14T13:20:09.487Z",
"fileCheckedAt": "2025-11-14T13:20:09.487Z",
"creditBureauFileNumber": "X423425T5442"
}
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| creditBureau | string | true | none | none |
| fileCreatedAt | string | true | none | none |
| fileCheckedAt | string | true | none | none |
| creditBureauFileNumber | string | true | none | none |
DualSourceKycInfo
{
"sourceName1": "SourceA",
"sourceName2": "SourceB",
"verificationDate": "2025-11-14T13:20:09.487Z",
"nameConfirmedBy": [
"SourceA",
"SourceB"
],
"dobConfirmedBy": [
"SourceA",
"SourceB"
],
"addressConfirmedBy": [
"SourceA",
"SourceB"
],
"financialAccountConfirmedBy": [
"SourceA",
"SourceB"
]
}
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| sourceName1 | string | true | none | none |
| sourceName2 | string | true | none | none |
| verificationDate | string | true | none | none |
| nameConfirmedBy | [string] | true | none | none |
| dobConfirmedBy | [string] | false | none | none |
| addressConfirmedBy | [string] | false | none | none |
| financialAccountConfirmedBy | [string] | false | none | none |
BrokerUserKycInfo
{
"creditBureau": {
"creditBureau": "Bureau ABC",
"fileCreatedAt": "2025-11-14T13:20:09.487Z",
"fileCheckedAt": "2025-11-14T13:20:09.487Z",
"creditBureauFileNumber": "X423425T5442"
}
}
Only one KYC method is allowed
Properties
oneOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| anonymous | object | false | none | none |
| » creditBureau | CreditBureauKycInfo | true | none | none |
xor
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| anonymous | object | false | none | none |
| » document | DocumentKycInfo | true | none | none |
xor
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| anonymous | object | false | none | none |
| » dualSource | DualSourceKycInfo | true | none | none |
UpdateBrokerUserFinancialInfoOptions
{
"userId": "string",
"externalUserId": "string",
"financialInfo": {
"netAnnualIncomeValue": "LESS_THAN_30K",
"netAssetsValue": "LESS_THAN_100K",
"netFinancialAssetsValue": "LESS_THAN_100K",
"dualIncome": true,
"lessThanTwoYearsIncome": true,
"occupation": {
"employmentType": "EMPLOYED",
"employmentInfo": {
"employerName": "Microsoft",
"typeOfBusiness": "ACCOUNTING",
"jobTitle": "ACCOUNTANT",
"customJobTitle": "string"
},
"unemploymentInfo": {
"sourceOfIncome": "OTHER",
"otherSourceOfIncome": "Received an inheritance"
}
}
}
}
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| userId | string | false | none | none |
| externalUserId | string | false | none | none |
| financialInfo | BrokerUserFinancialInfo | true | none | none |
Language
"en"
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| anonymous | string | false | none | none |
Enumerated Values
| Property | Value |
|---|---|
| anonymous | en |
| anonymous | fr |
CreateBrokerUserOptions
{
"externalId": "string",
"userInfo": {
"firstName": "John",
"middleName": "J",
"lastName": "Doe",
"phoneNumber": "+15263696352",
"email": "[email protected]",
"dob": "1994-12-12",
"sin": 123123123,
"address": {
"countryCode": "CA",
"provinceCode": "AB",
"city": "Calgary",
"street": "Tower str",
"postalCode": "013-T43",
"building": 12,
"unit": 5
},
"postalAddress": {
"countryCode": "CA",
"addressLine": "69 Eagle Road Bonnyville, AB T9N 3X4"
}
},
"financialInfo": {
"netAnnualIncomeValue": "LESS_THAN_30K",
"netAssetsValue": "LESS_THAN_100K",
"netFinancialAssetsValue": "LESS_THAN_100K",
"dualIncome": true,
"lessThanTwoYearsIncome": true,
"occupation": {
"employmentType": "EMPLOYED",
"employmentInfo": {
"employerName": "Microsoft",
"typeOfBusiness": "ACCOUNTING",
"jobTitle": "ACCOUNTANT",
"customJobTitle": "string"
},
"unemploymentInfo": {
"sourceOfIncome": "OTHER",
"otherSourceOfIncome": "Received an inheritance"
}
}
},
"accountType": "INVESTING_IN_DIGITAL_CURRENCY",
"platformReference": {
"platformReferenceType": "Other",
"otherPlatformReference": "Telegram channel"
},
"kyc": {
"creditBureau": {
"creditBureau": "Bureau ABC",
"fileCreatedAt": "2025-11-14T13:20:09.487Z",
"fileCheckedAt": "2025-11-14T13:20:09.487Z",
"creditBureauFileNumber": "X423425T5442"
}
},
"language": "en"
}
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| externalId | string | true | none | none |
| userInfo | BrokerUserInfo | true | none | none |
| financialInfo | BrokerUserFinancialInfo | false | none | none |
| accountType | AccountType | false | none | User account type |
| platformReference | PlatformReference | false | none | none |
| kyc | BrokerUserKycInfo | true | none | Only one KYC method is allowed |
| language | Language | false | none | none |
CreateBrokerUserResult
{
"userId": "c2c78a6f-9929-4625-9b02-39acffcb421d",
"externalUserId": 5555
}
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| userId | string(UUID) | true | none | none |
| externalUserId | string | true | none | none |
UpdateBrokerUserPreferencesOptions
{
"userId": "string",
"externalUserId": "string",
"language": "en"
}
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| userId | string | false | none | none |
| externalUserId | string | false | none | none |
| language | Language | false | none | none |
UpdateBrokerUserKycOptions
{
"userId": "string",
"externalUserId": "string",
"kyc": {
"creditBureau": {
"creditBureau": "Bureau ABC",
"fileCreatedAt": "2025-11-14T13:20:09.487Z",
"fileCheckedAt": "2025-11-14T13:20:09.487Z",
"creditBureauFileNumber": "X423425T5442"
}
}
}
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| userId | string | false | none | none |
| externalUserId | string | false | none | none |
| kyc | BrokerUserKycInfo | true | none | Only one KYC method is allowed |
CloseBrokerUserOptions
{
"userId": "string",
"externalUserId": "string",
"closeReason": "FRAUD",
"otherCloseReason": "string",
"deletePersonalInfo": true,
"liquidationFeeTier": 0
}
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| userId | string | false | none | none |
| externalUserId | string | false | none | none |
| closeReason | BrokerUserCloseReason | true | none | none |
| otherCloseReason | string | false | none | none |
| deletePersonalInfo | boolean | true | none | none |
| liquidationFeeTier | integer | true | none | none |
ReopenBrokerUserPersonalInfo
{
"userInfo": {
"firstName": "John",
"middleName": "J",
"lastName": "Doe",
"phoneNumber": "+15263696352",
"email": "[email protected]",
"dob": "1994-12-12",
"sin": 123123123,
"address": {
"countryCode": "CA",
"provinceCode": "AB",
"city": "Calgary",
"street": "Tower str",
"postalCode": "013-T43",
"building": 12,
"unit": 5
},
"postalAddress": {
"countryCode": "CA",
"addressLine": "69 Eagle Road Bonnyville, AB T9N 3X4"
}
},
"financialInfo": {
"netAnnualIncomeValue": "LESS_THAN_30K",
"netAssetsValue": "LESS_THAN_100K",
"netFinancialAssetsValue": "LESS_THAN_100K",
"dualIncome": true,
"lessThanTwoYearsIncome": true,
"occupation": {
"employmentType": "EMPLOYED",
"employmentInfo": {
"employerName": "Microsoft",
"typeOfBusiness": "ACCOUNTING",
"jobTitle": "ACCOUNTANT",
"customJobTitle": "string"
},
"unemploymentInfo": {
"sourceOfIncome": "OTHER",
"otherSourceOfIncome": "Received an inheritance"
}
}
},
"accountType": "INVESTING_IN_DIGITAL_CURRENCY",
"platformReference": {
"platformReferenceType": "Other",
"otherPlatformReference": "Telegram channel"
},
"kyc": {
"creditBureau": {
"creditBureau": "Bureau ABC",
"fileCreatedAt": "2025-11-14T13:20:09.487Z",
"fileCheckedAt": "2025-11-14T13:20:09.487Z",
"creditBureauFileNumber": "X423425T5442"
}
},
"language": "en"
}
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| userInfo | BrokerUserInfo | true | none | none |
| financialInfo | BrokerUserFinancialInfo | false | none | none |
| accountType | AccountType | false | none | User account type |
| platformReference | PlatformReference | false | none | none |
| kyc | BrokerUserKycInfo | true | none | Only one KYC method is allowed |
| language | Language | false | none | none |
ReopenBrokerUserOptions
{
"userId": "string",
"externalUserId": "string",
"personalInfo": {
"userInfo": {
"firstName": "John",
"middleName": "J",
"lastName": "Doe",
"phoneNumber": "+15263696352",
"email": "[email protected]",
"dob": "1994-12-12",
"sin": 123123123,
"address": {
"countryCode": "CA",
"provinceCode": "AB",
"city": "Calgary",
"street": "Tower str",
"postalCode": "013-T43",
"building": 12,
"unit": 5
},
"postalAddress": {
"countryCode": "CA",
"addressLine": "69 Eagle Road Bonnyville, AB T9N 3X4"
}
},
"financialInfo": {
"netAnnualIncomeValue": "LESS_THAN_30K",
"netAssetsValue": "LESS_THAN_100K",
"netFinancialAssetsValue": "LESS_THAN_100K",
"dualIncome": true,
"lessThanTwoYearsIncome": true,
"occupation": {
"employmentType": "EMPLOYED",
"employmentInfo": {
"employerName": "Microsoft",
"typeOfBusiness": "ACCOUNTING",
"jobTitle": "ACCOUNTANT",
"customJobTitle": "string"
},
"unemploymentInfo": {
"sourceOfIncome": "OTHER",
"otherSourceOfIncome": "Received an inheritance"
}
}
},
"accountType": "INVESTING_IN_DIGITAL_CURRENCY",
"platformReference": {
"platformReferenceType": "Other",
"otherPlatformReference": "Telegram channel"
},
"kyc": {
"creditBureau": {
"creditBureau": "Bureau ABC",
"fileCreatedAt": "2025-11-14T13:20:09.487Z",
"fileCheckedAt": "2025-11-14T13:20:09.487Z",
"creditBureauFileNumber": "X423425T5442"
}
},
"language": "en"
}
}
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| userId | string | false | none | none |
| externalUserId | string | false | none | none |
| personalInfo | ReopenBrokerUserPersonalInfo | false | none | none |
CloseBrokerUserResponse
{
"liquidationId": "string"
}
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| liquidationId | string | true | none | none |
InfoCheckUserForm
{
"firstName": "John",
"middleName": "string",
"lastName": "Doe",
"phoneNumber": "+15263696352",
"dob": "1994-12-12",
"sin": "string",
"address": {
"countryCode": "CA",
"provinceCode": "AB",
"city": "Calgary",
"street": "Tower str",
"postalCode": "013-T43",
"building": 12,
"unit": 5
},
"postalAddress": {
"countryCode": "CA",
"addressLine": "69 Eagle Road Bonnyville, AB T9N 3X4"
}
}
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| firstName | string | true | none | none |
| middleName | string | false | none | none |
| lastName | string | true | none | none |
| phoneNumber | string | true | none | none |
| dob | string | true | none | none |
| sin | string | false | none | none |
| address | BrokerUserAddress | false | none | none |
| postalAddress | BrokerUserPostalAddress | false | none | none |
SubmitInfoCheckRequest
{
"userId": "c2c78a6f-9929-4625-9b02-39acffcb421d",
"externalUserId": 5555,
"userInfo": {
"firstName": "John",
"middleName": "string",
"lastName": "Doe",
"phoneNumber": "+15263696352",
"dob": "1994-12-12",
"sin": "string",
"address": {
"countryCode": "CA",
"provinceCode": "AB",
"city": "Calgary",
"street": "Tower str",
"postalCode": "013-T43",
"building": 12,
"unit": 5
},
"postalAddress": {
"countryCode": "CA",
"addressLine": "69 Eagle Road Bonnyville, AB T9N 3X4"
}
},
"financialInfo": {
"netAnnualIncomeValue": "LESS_THAN_30K",
"netAssetsValue": "LESS_THAN_100K",
"netFinancialAssetsValue": "LESS_THAN_100K",
"dualIncome": true,
"lessThanTwoYearsIncome": true,
"occupation": {
"employmentType": "EMPLOYED",
"employmentInfo": {
"employerName": "Microsoft",
"typeOfBusiness": "ACCOUNTING",
"jobTitle": "ACCOUNTANT",
"customJobTitle": "string"
},
"unemploymentInfo": {
"sourceOfIncome": "OTHER",
"otherSourceOfIncome": "Received an inheritance"
}
}
},
"accountType": "INVESTING_IN_DIGITAL_CURRENCY"
}
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| userId | string | false | none | none |
| externalUserId | string | false | none | none |
| userInfo | InfoCheckUserForm | true | none | none |
| financialInfo | BrokerUserFinancialInfo | true | none | none |
| accountType | AccountType | true | none | User account type |
QuoteSide
"BUY"
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| anonymous | string | false | none | none |
Enumerated Values
| Property | Value |
|---|---|
| anonymous | BUY |
| anonymous | SELL |
QuoteStatus
"PENDING"
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| anonymous | string | false | none | none |
Enumerated Values
| Property | Value |
|---|---|
| anonymous | PENDING |
| anonymous | PROCESSING |
| anonymous | FULLY_EXECUTED |
| anonymous | EXPIRED |
| anonymous | CANCELLED |
| anonymous | REJECTED |
| anonymous | FAILED |
QuoteRejectReason
"INSUFFICIENT_MARKET_LIQUIDITY"
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| anonymous | string | false | none | none |
Enumerated Values
| Property | Value |
|---|---|
| anonymous | INSUFFICIENT_MARKET_LIQUIDITY |
| anonymous | INSUFFICIENT_USER_FUNDS |
| anonymous | INSUFFICIENT_BROKER_FUNDS |
| anonymous | ONE_TIME_TRADE_LIMIT_EXCEEDED |
| anonymous | DAILY_TRADE_LIMIT_EXCEEDED |
| anonymous | SLIPPAGE_THRESHOLD_EXCEEDED |
| anonymous | QUOTE_EXECUTION_HALTED |
| anonymous | COMPLIANCE_LIMIT_EXCEEDED |
CreateQuoteOptions
{
"idempotencyId": "f04506eb-fe1b-47b9-ac0c-914341d168f7",
"userId": "c2c78a6f-9929-4625-9b02-39acffcb421d",
"externalUserId": 5555,
"side": "BUY",
"value": 50,
"instrumentId": 5,
"feeTier": 0
}
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| idempotencyId | string | false | none | none |
| userId | string | false | none | none |
| externalUserId | string | false | none | none |
| side | QuoteSide | true | none | none |
| value | string | true | none | none |
| instrumentId | number | true | none | none |
| feeTier | number | true | none | none |
TradeStatus
"PENDING"
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| anonymous | string | false | none | none |
Enumerated Values
| Property | Value |
|---|---|
| anonymous | PENDING |
| anonymous | PROCESSING |
| anonymous | COMPLETED |
| anonymous | FAILED |
| anonymous | REJECTED |
OrderFeeResponse
{
"productId": 1,
"amount": 0.00000136,
"notionalValue": 0.1987790824,
"percentage": 0.2
}
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| productId | integer | true | none | none |
| amount | string | true | none | none |
| notionalValue | string | true | none | none |
| percentage | string | true | none | none |
BrokerFeeResponse
{
"tier": 1,
"tierFeePercentage": 0.2,
"amount": 0.02,
"productId": 5,
"notionalValue": 0.02,
"percentage": 0.2
}
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| tier | integer | true | none | none |
| tierFeePercentage | string | true | none | none |
| amount | string | true | none | none |
| productId | integer | true | none | none |
| notionalValue | string | true | none | none |
| percentage | string | true | none | none |
QuoteResponse
{
"quoteId": "c2c78a6f-9929-4625-9b02-39acffcb421d",
"brokerUserId": "c2c78a6f-9929-4625-9b02-39acffcb4211",
"instrumentId": 5,
"fromProductId": 1,
"toProductId": 5,
"side": "BUY",
"status": "PENDING",
"rejectReason": "INSUFFICIENT_MARKET_LIQUIDITY",
"enteredAmount": 50,
"estimatedPrice": 129323.47,
"estimatedAmount": 0.00038,
"estimatedOrderFee": {
"productId": 1,
"amount": 0.00000136,
"notionalValue": 0.1987790824,
"percentage": 0.2
},
"brokerFee": {
"tier": 1,
"tierFeePercentage": 0.2,
"amount": 0.02,
"productId": 5,
"notionalValue": 0.02,
"percentage": 0.2
},
"createdAt": "string",
"expirationDate": "string",
"trade": {
"tradeId": "c2c78a6f-9929-4625-9b02-39acffcb421d",
"instrumentId": 5,
"fromProductId": 1,
"toProductId": 5,
"side": "BUY",
"enteredAmount": 50,
"status": "PENDING",
"sentAmount": 48.43,
"receivedAmount": 0.00035928,
"price": 124543.54,
"orderFee": {
"productId": 1,
"amount": 0.00000136,
"notionalValue": 0.1987790824,
"percentage": 0.2
},
"brokerFee": {
"tier": 1,
"tierFeePercentage": 0.2,
"amount": 0.02,
"productId": 5,
"notionalValue": 0.02,
"percentage": 0.2
},
"createdAt": "2025-07-30T11:59:44.195Z",
"completedAt": "2025-07-30T11:59:48.512Z"
}
}
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| quoteId | string | true | none | none |
| brokerUserId | string | true | none | none |
| instrumentId | number | true | none | none |
| fromProductId | number | true | none | none |
| toProductId | number | true | none | none |
| side | QuoteSide | true | none | none |
| status | QuoteStatus | true | none | none |
| rejectReason | QuoteRejectReason | false | none | none |
| enteredAmount | string | true | none | none |
| estimatedPrice | string | true | none | none |
| estimatedAmount | string | true | none | none |
| estimatedOrderFee | OrderFeeResponse | true | none | none |
| brokerFee | BrokerFeeResponse | true | none | none |
| createdAt | string | true | none | none |
| expirationDate | string | true | none | none |
| trade | TradeResponse | false | none | none |
BrokerInstrumentConfig
{
"instrumentId": 5,
"instrumentSymbol": "BTCCAD",
"product1Id": 1,
"product1Symbol": "BTC",
"product2Id": 5,
"product2Symbol": "CAD",
"minQuantity": 0.0001,
"quantityIncrement": 0.0001,
"priceIncrement": 0.001
}
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| instrumentId | number | true | none | none |
| instrumentSymbol | string | true | none | none |
| product1Id | number | true | none | Identifier of base product |
| product1Symbol | string | true | none | Symbol of base product |
| product2Id | number | true | none | Identifier of quote product |
| product2Symbol | string | true | none | Symbol of quote product |
| minQuantity | number | true | none | Minimum quantity of product1 could be executed in quote |
| quantityIncrement | number | true | none | Minimum non-dividable unit of quantity |
| priceIncrement | number | true | none | Minimum non-dividable unit of price |
ProductType
"CryptoCurrency"
Type of asset
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| anonymous | string | false | none | Type of asset |
Enumerated Values
| Property | Value |
|---|---|
| anonymous | Unknown |
| anonymous | NationalCurrency |
| anonymous | CryptoCurrency |
| anonymous | Contract |
BrokerProductResponse
{
"productId": 1,
"symbol": "BTC",
"fullName": "Bitcoin",
"type": "CryptoCurrency",
"image": "https://res.cloudinary.com/ndaxio/image/upload/v1707474049/uploads/3c67b092-82e6-431b-9ca4-8b6a569c160c.svg",
"decimalPlaces": 8,
"homepageLink": "http://www.bitcoin.org",
"whitePaperLink": "https://bitcoin.org/bitcoin.pdf",
"marketCapRank": 1,
"marketCap": 3193551674487.55,
"circulatingSupply": 19941106,
"totalSupply": 19941106,
"depositConfigs": [
{
"_id": "string",
"type": "FROM_EXTERNAL_WALLET",
"disabled": true,
"fee": 0,
"accountProviderId": 0,
"templateForm": "ADDRESS_ONLY",
"canGenerateDepositKeys": true,
"depositKeyPattern": [
"DEFAULT"
],
"note": "string",
"network": {
"name": "string",
"suspended": true,
"blockchainExplorer": {
"address": "string",
"transaction": "string"
},
"addressValidatorRegex": "string",
"tagValidatorRegex": "string"
}
}
]
}
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| productId | number | true | none | Product identifier |
| symbol | string | true | none | Product symbol |
| fullName | string | true | none | Product full name |
| type | ProductType | true | none | Type of asset |
| image | string | false | none | Product logo image url |
| decimalPlaces | number | true | none | Product decimal places |
| homepageLink | string | false | none | none |
| whitePaperLink | string | false | none | none |
| marketCapRank | number | false | none | none |
| marketCap | string | false | none | none |
| circulatingSupply | string | false | none | none |
| totalSupply | string | false | none | none |
| depositConfigs | [ExternalWalletDepositConfig] | true | none | [Deposit configuration for external wallet deposits, as defined in @ndaxio/asset-manager-ts-client.] |
BrokerUserLimitInfo
{
"total": 2000,
"used": 340
}
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| total | string | true | none | Total trading limit |
| used | string | true | none | none |
BrokerUserLimitGroup
{
"oneTimeLimit": 1000,
"daily": {
"total": 2000,
"used": 340
}
}
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| oneTimeLimit | string | false | none | none |
| daily | BrokerUserLimitInfo | false | none | none |
BrokerUserTradingLimits
{
"buy": {
"oneTimeLimit": 1000,
"daily": {
"total": 2000,
"used": 340
}
},
"sell": {
"oneTimeLimit": 1000,
"daily": {
"total": 2000,
"used": 340
}
}
}
The object describes trading limits for the broker user
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| buy | BrokerUserLimitGroup | true | none | none |
| sell | BrokerUserLimitGroup | true | none | none |
AppropriatenessQuestionnaireRequiredAction
{
"nextAttemptDate": "string"
}
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| nextAttemptDate | string | false | none | none |
BrokerUserInfoRequiredActions
{
"infoCheck": true,
"appropriatenessQuestionnaire": {
"nextAttemptDate": "string"
}
}
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| infoCheck | boolean | false | none | none |
| appropriatenessQuestionnaire | AppropriatenessQuestionnaireRequiredAction | false | none | none |
BrokerUserCloseReason
"FRAUD"
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| anonymous | string | false | none | none |
Enumerated Values
| Property | Value |
|---|---|
| anonymous | FRAUD |
| anonymous | SANCTIONS_AND_ADVERSE_MEDIA |
| anonymous | DUPLICATE |
| anonymous | RESIDENCY |
| anonymous | DOC_SELFIE_INCONSISTENCY |
| anonymous | THIRD_PARTY_ENGAGEMENT |
| anonymous | UNDERAGE |
| anonymous | SELF_CLOSED |
| anonymous | NO_EMAIL_NOTIFICATION |
| anonymous | UNRESPONSIVE_USER |
| anonymous | APPROPRIATENESS_QUESTIONNAIRE_FAILED |
| anonymous | ESTATE_ACCOUNT |
| anonymous | OTHER |
BrokerUserStatus
"ACTIVE"
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| anonymous | string | false | none | none |
Enumerated Values
| Property | Value |
|---|---|
| anonymous | ACTIVE |
| anonymous | LIQUIDATING |
| anonymous | CLOSED |
BrokerUserAccountReopenPolicy
"NO_PERSONAL_INFO_REQUIRED"
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| anonymous | string | false | none | none |
Enumerated Values
| Property | Value |
|---|---|
| anonymous | NO_PERSONAL_INFO_REQUIRED |
| anonymous | PERSONAL_INFO_REQUIRED |
BrokerUserAllowedActions
{
"deletePersonalInfoOnAccountClosure": true,
"reopenAccount": "NO_PERSONAL_INFO_REQUIRED"
}
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| deletePersonalInfoOnAccountClosure | boolean | false | none | none |
| reopenAccount | BrokerUserAccountReopenPolicy | false | none | none |
BrokerUserResponse
{
"id": "c2c78a6f-9929-4625-9b02-39acffcb421d",
"externalId": "c2c78a6f-9929-4625-9b02-39acffcb421d",
"firstName": "Doe",
"middleName": "string",
"lastName": "string",
"email": "[email protected]",
"phoneNumber": "+15263696352",
"status": "ACTIVE",
"closeReason": "FRAUD",
"activeLiquidationId": "c2c78a6f-9929-4625-9b02-39acffcb421d",
"tradingLimits": {
"buy": {
"oneTimeLimit": 1000,
"daily": {
"total": 2000,
"used": 340
}
},
"sell": {
"oneTimeLimit": 1000,
"daily": {
"total": 2000,
"used": 340
}
}
},
"allowedActions": {
"deletePersonalInfoOnAccountClosure": true,
"reopenAccount": "NO_PERSONAL_INFO_REQUIRED"
},
"requiredActions": {
"infoCheck": true,
"appropriatenessQuestionnaire": {
"nextAttemptDate": "string"
}
},
"language": "en"
}
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| id | any | true | none | none |
| externalId | string(any) | true | none | none |
| firstName | string | true | none | none |
| middleName | string | false | none | none |
| lastName | string | true | none | none |
| string | true | none | none | |
| phoneNumber | string | true | none | none |
| status | BrokerUserStatus | true | none | none |
| closeReason | BrokerUserCloseReason | false | none | none |
| activeLiquidationId | string | false | none | none |
| tradingLimits | BrokerUserTradingLimits | true | none | The object describes trading limits for the broker user |
| allowedActions | BrokerUserAllowedActions | true | none | none |
| requiredActions | BrokerUserInfoRequiredActions | true | none | none |
| language | Language | true | none | none |
BalancesResponse
{
"totalNotionalValue": 13200,
"holdNotionalValue": 100,
"availableNotionalValue": 13100,
"notionalProductId": 5,
"notionalProductSymbol": "CAD",
"positions": [
{
"productId": 5,
"productSymbol": "BTC",
"total": 0.1,
"totalNotionalValue": 12300,
"available": 0.1,
"availableNotionalValue": 12300,
"hold": 0,
"holdNotionalValue": 0
}
]
}
The object contains balance information of an account
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| totalNotionalValue | string | false | none | Total notional value |
| holdNotionalValue | string | false | none | none |
| availableNotionalValue | string | false | none | none |
| notionalProductId | number | false | none | none |
| notionalProductSymbol | string | false | none | none |
| positions | [AccountPosition] | false | none | none |
AccountPosition
{
"productId": 5,
"productSymbol": "BTC",
"total": 0.1,
"totalNotionalValue": 12300,
"available": 0.1,
"availableNotionalValue": 12300,
"hold": 0,
"holdNotionalValue": 0
}
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| productId | number | true | none | none |
| productSymbol | string | true | none | none |
| total | string | true | none | none |
| totalNotionalValue | string | true | none | none |
| available | string | true | none | none |
| availableNotionalValue | string | true | none | none |
| hold | string | true | none | none |
| holdNotionalValue | string | true | none | none |
PolicyGroupType
"TRADE_BUY"
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| anonymous | string | false | none | none |
Enumerated Values
| Property | Value |
|---|---|
| anonymous | TRADE_BUY |
PolicyIdentifierType
"INSTRUMENT"
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| anonymous | string | false | none | none |
Enumerated Values
| Property | Value |
|---|---|
| anonymous | INSTRUMENT |
BrokerStatus
"ENABLED"
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| anonymous | string | false | none | none |
Enumerated Values
| Property | Value |
|---|---|
| anonymous | ENABLED |
| anonymous | DISABLED |
ReportFormat
"PDF"
Report format
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| anonymous | string | false | none | Report format |
Enumerated Values
| Property | Value |
|---|---|
| anonymous | |
| anonymous | CSV |
ReportType
"TRADES"
Report type
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| anonymous | string | false | none | Report type |
Enumerated Values
| Property | Value |
|---|---|
| anonymous | TRADES |
ReportStatus
"PENDING"
Report status
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| anonymous | string | false | none | Report status |
Enumerated Values
| Property | Value |
|---|---|
| anonymous | PENDING |
| anonymous | PROCESSING |
| anonymous | PROCESSED |
| anonymous | FAILED |
| anonymous | ARCHIVED |
ReportResponse
{
"id": "string",
"status": "PENDING",
"format": "PDF",
"type": "TRADES",
"createdAt": "2019-08-24T14:15:22Z",
"completedAt": "2019-08-24T14:15:22Z",
"from": "2019-08-24T14:15:22Z",
"to": "2019-08-24T14:15:22Z",
"productOrInstrumentId": 1
}
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| id | string | false | none | none |
| status | ReportStatus | true | none | Report status |
| format | ReportFormat | true | none | Report format |
| type | ReportType | true | none | Report type |
| createdAt | string(date-time) | true | none | none |
| completedAt | string(date-time) | false | none | none |
| from | string(date-time) | false | none | none |
| to | string(date-time) | false | none | none |
| productOrInstrumentId | integer | false | none | none |
PaginatedReportResponse
{
"list": [
{
"id": "string",
"status": "PENDING",
"format": "PDF",
"type": "TRADES",
"createdAt": "2019-08-24T14:15:22Z",
"completedAt": "2019-08-24T14:15:22Z",
"from": "2019-08-24T14:15:22Z",
"to": "2019-08-24T14:15:22Z",
"productOrInstrumentId": 1
}
],
"total": 0
}
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| list | [ReportResponse] | true | none | none |
| total | integer | true | none | none |
GenerateReportOptions
{
"userId": "c2c78a6f-9929-4625-9b02-39acffcb421d",
"externalUserId": 5555,
"type": "TRADES",
"format": "PDF",
"from": "2025-07-20T11:59:44.195Z",
"to": "2025-07-30T11:59:44.195Z",
"productOrInstrumentId": 1
}
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| userId | string | false | none | none |
| externalUserId | string | false | none | none |
| type | ReportType | true | none | Report type |
| format | ReportFormat | true | none | Report format |
| from | string | false | none | none |
| to | string | false | none | none |
| productOrInstrumentId | number | false | none | none |
UpdatedReportResponse
{
"id": "string",
"status": "PENDING",
"completedAt": "2019-08-24T14:15:22Z"
}
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| id | string | false | none | none |
| status | ReportStatus | true | none | Report status |
| completedAt | string(date-time) | false | none | none |
PolicyType
"AML_POLICY"
Properties
allOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| anonymous | AcknowledgeablePolicyType | false | none | none |
and
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| anonymous | string | false | none | none |
Enumerated Values
| Property | Value |
|---|---|
| anonymous | AML_POLICY |
| anonymous | BOUNTY_BUG_POLICY |
| anonymous | DISCLAIMER |
| anonymous | SECURITY_POLICY |
| anonymous | DEPOSIT_OF_NON_SUPPORTED_VIRTUAL_ASSET |
AcknowledgeablePolicyType
"API_POLICY"
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| anonymous | string | false | none | none |
Enumerated Values
| Property | Value |
|---|---|
| anonymous | API_POLICY |
| anonymous | USER_AGREEMENT |
| anonymous | PRIVACY_POLICY |
| anonymous | COOKIES_CONSENT |
| anonymous | RISK_DISCLOSURE |
| anonymous | CUSTODY_AGREEMENT |
| anonymous | WITHDRAWAL_CRYPTO_RISK_DISCLOSURE |
| anonymous | STAKING_OPT_IN_POLICY |
| anonymous | STAKING_OPT_OUT_POLICY |
| anonymous | RELATIONSHIP_DISCLOSURE_DOCUMENT |
| anonymous | CONFLICT_OF_INTEREST_STATEMENT |
| anonymous | COMPLAINT_AND_DISPUTE_RESOLUTION |
| anonymous | BROKER_SUPPLEMENT_AGREEMENT |
DynamicPolicyGroup
"STAKING_OPT_IN"
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| anonymous | string | false | none | none |
Enumerated Values
| Property | Value |
|---|---|
| anonymous | STAKING_OPT_IN |
| anonymous | WITHDRAWS |
| anonymous | TRADE_BUY |
DynamicPolicyIdentifierType
"PRODUCT"
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| anonymous | string | false | none | none |
Enumerated Values
| Property | Value |
|---|---|
| anonymous | PRODUCT |
| anonymous | INSTRUMENT |
PolicyLanguage
"en"
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| anonymous | string | false | none | none |
Enumerated Values
| Property | Value |
|---|---|
| anonymous | en |
| anonymous | fr |
PolicyInfo
{
"id": 4,
"version": 0.2,
"type": "AML_POLICY",
"content": "ZnNkZ...nNkZnM=",
"previousVersions": [
0.1
],
"requireAcknowledgement": true,
"createdAt": "2025-07-30T11:59:44.195Z",
"updatedAt": "2025-07-30T11:59:44.195Z",
"reviewedAt": "2025-07-30T11:59:44.195Z"
}
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| id | integer | true | none | none |
| version | string | true | none | none |
| type | PolicyType | true | none | none |
| content | string | false | none | none |
| previousVersions | [string] | true | none | none |
| requireAcknowledgement | boolean | true | none | none |
| createdAt | string | true | none | none |
| updatedAt | string | true | none | none |
| reviewedAt | string | true | none | none |
DynamicPolicyInfo
{
"id": 0,
"version": "string",
"group": "STAKING_OPT_IN",
"identifier": 0,
"identifierType": "PRODUCT",
"content": "string",
"previousVersions": [
"string"
],
"requireAcknowledgement": true,
"createdAt": "string",
"updatedAt": "string",
"reviewedAt": "string"
}
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| id | integer | true | none | none |
| version | string | true | none | none |
| group | DynamicPolicyGroup | true | none | none |
| identifier | integer | true | none | none |
| identifierType | DynamicPolicyIdentifierType | false | none | none |
| content | string | false | none | none |
| previousVersions | [string] | true | none | none |
| requireAcknowledgement | boolean | true | none | none |
| createdAt | string | true | none | none |
| updatedAt | string | true | none | none |
| reviewedAt | string | true | none | none |
PolicyIdentifier
{
"type": "API_POLICY",
"version": 0.2,
"language": "en"
}
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| type | AcknowledgeablePolicyType | true | none | none |
| version | string | true | none | none |
| language | PolicyLanguage | false | none | none |
AcknowledgeRegularPoliciesOptions
{
"userId": "c2c78a6f-9929-4625-9b02-39acffcb421d",
"externalUserId": 5555,
"policies": [
{
"type": "API_POLICY",
"version": 0.2,
"language": "en"
}
]
}
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| userId | string | false | none | none |
| externalUserId | string | false | none | none |
| policies | [PolicyIdentifier] | true | none | none |
UnaknowledgedDynamicPolicy
{
"dynamicPolicyId": 0,
"group": "STAKING_OPT_IN",
"identifier": 0,
"version": "string"
}
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| dynamicPolicyId | integer | true | none | Internal identifier |
| group | DynamicPolicyGroup | true | none | none |
| identifier | integer | true | none | Identifier of related resource (BUY) |
| version | string | true | none | none |
PortfolioInfoResponse
{
"totalInvested": 0.1,
"totalWithdrawal": 0.1,
"totalProfit": 0.1,
"portfolioGrowth": 0.1,
"assets": [
{
"productId": 1,
"purchasePrice": 94344.54,
"realizedGain": 1.43,
"unrealizedGain": 23.4,
"change": 0.4
}
]
}
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| totalInvested | number(float) | true | none | Total invested amount |
| totalWithdrawal | number(float) | true | none | Total withdrawn amount |
| totalProfit | number(float) | true | none | Total profit amount |
| portfolioGrowth | number(float) | true | none | Portfolio growth |
| assets | [AssetInfo] | true | none | none |
AssetInfo
{
"productId": 1,
"purchasePrice": 94344.54,
"realizedGain": 1.43,
"unrealizedGain": 23.4,
"change": 0.4
}
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| productId | integer(int32) | true | none | Product ID |
| purchasePrice | number(float) | true | none | Avg purchase price |
| realizedGain | number(float) | true | none | Realized gain |
| unrealizedGain | number(float) | true | none | Unrealized gain |
| change | number(float) | true | none | Portfolio change percent |
PortfolioPerformanceChartResponse
"[\n [\n 1753920000000,\n [\n [\n 6,\n 54.628615891599566,\n 34.77363543159958,\n 0.11052649999999994,\n 0,\n 34.77363543159958\n ],\n [\n 7,\n 197082.00560990928,\n 157636.6183407743,\n 20.49686089026732,\n 0,\n 157636.6183407743\n ]\n ]\n ],\n [\n 1753833600000,\n [\n [\n 6,\n 55.430524968143686,\n 35.57554450814369,\n 0.11052649999999994,\n 0,\n 35.57554450814369\n ],\n [\n 7,\n 197007.6348799469,\n 157562.24761081193,\n 20.49686089026732,\n 0,\n 157562.24761081193\n ]\n ]\n ]\n]\n"
Performance response contains array of array that represent one day or hour (depending on range) and contains timestamp and array of data for each product. | Each product entry is array of 6 elements 0. ProductId 1. Amount in CAD 2. Performance (currentCost) in CAD 3. Average purchase price in CAD 4. Realized gain in CAD 5. Unrealized gain in CAD
Properties
oneOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| anonymous | integer | false | none | none |
xor
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| anonymous | array | false | none | none |
PortfolioRange
"24H"
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| anonymous | string | false | none | none |
Enumerated Values
| Property | Value |
|---|---|
| anonymous | 24H |
| anonymous | 7D |
| anonymous | 1M |
| anonymous | 3M |
| anonymous | 6M |
| anonymous | ALL |
TradeResponse
{
"tradeId": "c2c78a6f-9929-4625-9b02-39acffcb421d",
"instrumentId": 5,
"fromProductId": 1,
"toProductId": 5,
"side": "BUY",
"enteredAmount": 50,
"status": "PENDING",
"sentAmount": 48.43,
"receivedAmount": 0.00035928,
"price": 124543.54,
"orderFee": {
"productId": 1,
"amount": 0.00000136,
"notionalValue": 0.1987790824,
"percentage": 0.2
},
"brokerFee": {
"tier": 1,
"tierFeePercentage": 0.2,
"amount": 0.02,
"productId": 5,
"notionalValue": 0.02,
"percentage": 0.2
},
"createdAt": "2025-07-30T11:59:44.195Z",
"completedAt": "2025-07-30T11:59:48.512Z"
}
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| tradeId | string(UUID) | true | none | Trade ID |
| instrumentId | number | true | none | Instrument ID |
| fromProductId | number | true | none | Product ID that was debited from broker user account |
| toProductId | number | true | none | Product ID that was credited to broker user account |
| side | QuoteSide | true | none | none |
| enteredAmount | string | false | none | Amount of "fromProductId" entered by user |
| status | TradeStatus | true | none | none |
| sentAmount | string | false | none | Amount of "fromProductId" that was exchanged |
| receivedAmount | string | false | none | Gross received amount of "toProductId" |
| price | string | false | none | Executed avg price |
| orderFee | OrderFeeResponse | false | none | none |
| brokerFee | BrokerFeeResponse | false | none | none |
| createdAt | string(ISO8680) | true | none | Created at |
| completedAt | string(ISO8680) | false | none | Completed at |
TradesPaginatedResponse
{
"list": [
{
"tradeId": "c2c78a6f-9929-4625-9b02-39acffcb421d",
"instrumentId": 5,
"fromProductId": 1,
"toProductId": 5,
"side": "BUY",
"enteredAmount": 50,
"status": "PENDING",
"sentAmount": 48.43,
"receivedAmount": 0.00035928,
"price": 124543.54,
"orderFee": {
"productId": 1,
"amount": 0.00000136,
"notionalValue": 0.1987790824,
"percentage": 0.2
},
"brokerFee": {
"tier": 1,
"tierFeePercentage": 0.2,
"amount": 0.02,
"productId": 5,
"notionalValue": 0.02,
"percentage": 0.2
},
"createdAt": "2025-07-30T11:59:44.195Z",
"completedAt": "2025-07-30T11:59:48.512Z"
}
],
"total": 0
}
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| list | [TradeResponse] | true | none | Array of trades |
| total | number | true | none | Total number of trades by the filter |
BrokerTickerResponse
{
"instrumentId": 0,
"bestBid": "string",
"bestOffer": "string",
"lastTradedPrice": "string",
"bidQty": "string",
"askQty": "string",
"rolling24HrVolume": "string",
"rolling24HrPxChange": "string",
"rolling24HrPxChangePercent": "string",
"sessionOpen": "string",
"sessionHigh": "string",
"sessionLow": "string",
"sessionClose": "string"
}
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| instrumentId | integer(int32) | true | none | Numeric ID of the instrument |
| bestBid | string | true | none | Best bid price |
| bestOffer | string | true | none | Best offer price |
| lastTradedPrice | string | true | none | Last traded price |
| bidQty | string | true | none | Bid quantity |
| askQty | string | true | none | Ask quantity |
| rolling24HrVolume | string | true | none | 24-hour rolling trading volume |
| rolling24HrPxChange | string | true | none | 24-hour rolling absolute price change |
| rolling24HrPxChangePercent | string | true | none | 24-hour rolling price change in percent |
| sessionOpen | string | true | none | Session opening price (Session starts at 00:00 UTC) |
| sessionHigh | string | true | none | Session highest price (Session starts at 00:00 UTC) |
| sessionLow | string | true | none | Session lowest price (Session starts at 00:00 UTC) |
| sessionClose | string | true | none | Session closing price (Session starts at 00:00 UTC) |
TradingConfirmationType
"OTC"
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| anonymous | string | false | none | none |
Enumerated Values
| Property | Value |
|---|---|
| anonymous | OTC |
| anonymous | REGULAR |
DailyTradeConfirmationResponse
{
"brokerId": "12354686-52f1-43ba-aec6-c3d863112232",
"userId": "c2c78a6f-9929-4625-9b02-39acffcb421d",
"omsAccountId": 0,
"type": "OTC",
"date": "string"
}
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| brokerId | string | true | none | none |
| userId | string | true | none | none |
| omsAccountId | integer | true | none | none |
| type | TradingConfirmationType | true | none | none |
| date | string | true | none | none |
BrokerRuleResponse
{
"id": "string",
"brokerId": "12354686-52f1-43ba-aec6-c3d863112232",
"enabled": true,
"type": "Slippage",
"value": "string"
}
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| id | string | true | none | none |
| brokerId | string | true | none | none |
| enabled | boolean | true | none | none |
| type | BrokerRuleType | true | none | none |
| value | string | true | none | none |
BrokerRuleType
"Slippage"
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| anonymous | string | false | none | none |
Enumerated Values
| Property | Value |
|---|---|
| anonymous | Slippage |
| anonymous | HaltQuotesExecution |
| anonymous | QuoteExpirationTimeout |
| anonymous | OneTimeBuyNotionalLimit |
| anonymous | DailyBuyNotionalLimit |
| anonymous | OneTimeSellNotionalLimit |
| anonymous | DailySellNotionalLimit |
CreateBrokerRuleOptions
{
"type": "Slippage",
"value": "string"
}
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| type | BrokerRuleType | true | none | none |
| value | string | false | none | none |
UpdateBrokerRuleOptions
{
"value": "string"
}
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| value | string | false | none | none |
LocalizedText
{
"en": "string",
"fr": "string"
}
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| en | string | true | none | none |
| fr | string | true | none | none |
AppropriatenessQuestionnaireOptionResponse
{
"id": "string",
"text": {
"en": "string",
"fr": "string"
}
}
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| id | string | true | none | none |
| text | LocalizedText | true | none | none |
AppropriatenessQuestionnaireQuestionResponse
{
"id": "string",
"title": {
"en": "string",
"fr": "string"
},
"text": {
"en": "string",
"fr": "string"
},
"tooltip": {
"en": "string",
"fr": "string"
},
"options": [
{
"id": "string",
"text": {
"en": "string",
"fr": "string"
}
}
]
}
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| id | string | true | none | none |
| title | LocalizedText | true | none | none |
| text | LocalizedText | true | none | none |
| tooltip | LocalizedText | false | none | none |
| options | [AppropriatenessQuestionnaireOptionResponse] | true | none | none |
AppropriatenessQuestionnaireStatus
"ACCOUNT_CLOSED"
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| anonymous | string | false | none | none |
Enumerated Values
| Property | Value |
|---|---|
| anonymous | ACCOUNT_CLOSED |
| anonymous | WAITING_NEXT_ATTEMPT |
| anonymous | COMPLETED |
AppropriatenessQuestionnaireSubmissionResponse
{
"status": "ACCOUNT_CLOSED",
"nextAttemptDate": "string"
}
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| status | AppropriatenessQuestionnaireStatus | true | none | none |
| nextAttemptDate | string | false | none | none |
AppropriatenessQuestionnaireAnswer
{
"questionId": "string",
"optionId": "string"
}
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| questionId | string | true | none | none |
| optionId | string | true | none | none |
AppropriatenessQuestionnaireSubmitRequest
{
"userId": "c2c78a6f-9929-4625-9b02-39acffcb421d",
"externalUserId": 5555,
"answers": [
{
"questionId": "string",
"optionId": "string"
}
]
}
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| userId | string | false | none | none |
| externalUserId | string | false | none | none |
| answers | [AppropriatenessQuestionnaireAnswer] | true | none | none |
LiquidationStatus
"PROCESSING"
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| anonymous | string | false | none | none |
Enumerated Values
| Property | Value |
|---|---|
| anonymous | PROCESSING |
| anonymous | COMPLETED |
| anonymous | FAILED |
LiquidationPositionStatus
"PENDING"
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| anonymous | string | false | none | none |
Enumerated Values
| Property | Value |
|---|---|
| anonymous | PENDING |
| anonymous | PROCESSING |
| anonymous | COMPLETED |
| anonymous | FAILED |
LiquidationPositionResponse
{
"productId": 0,
"amount": "string",
"status": "PENDING"
}
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| productId | integer | true | none | none |
| amount | string | true | none | none |
| status | LiquidationPositionStatus | true | none | none |
LiquidationResponse
{
"id": "string",
"brokerId": "string",
"userId": "string",
"deletePersonalInfo": true,
"liquidationFeeTier": 0,
"status": "PROCESSING",
"positions": [
{
"productId": 0,
"amount": "string",
"status": "PENDING"
}
],
"createdAt": "string"
}
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| id | string | true | none | none |
| brokerId | string | true | none | none |
| userId | string | true | none | none |
| deletePersonalInfo | boolean | true | none | none |
| liquidationFeeTier | integer | true | none | none |
| status | LiquidationStatus | true | none | none |
| positions | [LiquidationPositionResponse] | true | none | none |
| createdAt | string | true | none | none |
IrocStatementStatus
"COMPLETE"
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| anonymous | string | false | none | none |
Enumerated Values
| Property | Value |
|---|---|
| anonymous | COMPLETE |
| anonymous | PENDING |
| anonymous | ERROR |
| anonymous | PROCESSING |
| anonymous | READY_TO_NOTIFY_CUSTOMER |
| anonymous | FAILED_ATTEMPT |
IrocStatementType
"MONTHLY"
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| anonymous | string | false | none | none |
Enumerated Values
| Property | Value |
|---|---|
| anonymous | MONTHLY |
| anonymous | QUARTERLY |
| anonymous | ANNUALLY |
PaginatedIrocStatement
{
"list": [
{
"brokerId": "string",
"userId": "string",
"omsAccountId": 0,
"month": 0,
"quarter": 0,
"status": "COMPLETE",
"statementId": "string",
"generatedDate": "2019-08-24T14:15:22Z",
"startDate": "2019-08-24T14:15:22Z",
"endDate": "2019-08-24T14:15:22Z",
"statementType": "MONTHLY"
}
],
"total": 0
}
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| list | [IrocStatementResponse] | true | none | none |
| total | integer | true | none | none |
IrocStatementResponse
{
"brokerId": "string",
"userId": "string",
"omsAccountId": 0,
"month": 0,
"quarter": 0,
"status": "COMPLETE",
"statementId": "string",
"generatedDate": "2019-08-24T14:15:22Z",
"startDate": "2019-08-24T14:15:22Z",
"endDate": "2019-08-24T14:15:22Z",
"statementType": "MONTHLY"
}
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| brokerId | string | true | none | none |
| userId | string | true | none | none |
| omsAccountId | integer | true | none | none |
| month | integer | false | none | none |
| quarter | integer | false | none | none |
| status | IrocStatementStatus | true | none | none |
| statementId | string | true | none | none |
| generatedDate | string(date-time) | true | none | none |
| startDate | string(date-time) | true | none | none |
| endDate | string(date-time) | true | none | none |
| statementType | IrocStatementType | true | none | none |
GenerateMonthlyIrocStatementRequest
{
"month": 0,
"year": 0,
"userId": "string",
"externalUserId": "string"
}
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| month | integer | true | none | none |
| year | integer | true | none | none |
| userId | string | false | none | none |
| externalUserId | string | false | none | none |
GenerateQuarterlyIrocStatementRequest
{
"userId": "string",
"externalUserId": "string",
"quarter": 0,
"year": 0
}
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| userId | string | false | none | none |
| externalUserId | string | false | none | none |
| quarter | integer | true | none | none |
| year | integer | true | none | none |
GenerateAnnualyIrocStatementRequest
{
"userId": "string",
"externalUserId": "string",
"year": 0
}
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| userId | string | false | none | none |
| externalUserId | string | false | none | none |
| year | integer | true | none | none |
WebhookType
"REGULAR_POLICY_NEW_VERSION_PUBLISHED"
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| anonymous | string | false | none | none |
Enumerated Values
| Property | Value |
|---|---|
| anonymous | REGULAR_POLICY_NEW_VERSION_PUBLISHED |
| anonymous | REGULAR_POLICY_UPDATED |
| anonymous | BUY_CRYPTO_POLICY_NEW_VERSION_PUBLISHED |
| anonymous | BUY_CRYPTO_POLICY_UPDATED |
| anonymous | DEPOSIT_FULLY_PROCESSED |
BuyCryptoPolicyWebhookPayload
{
"version": "string",
"instrumentId": 0,
"timestamp": 0
}
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| version | string | true | none | none |
| instrumentId | integer | true | none | none |
| timestamp | integer | true | none | none |
RegularPolicyWebhookPayload
{
"version": "string",
"type": "AML_POLICY",
"timestamp": 0
}
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| version | string | true | none | none |
| type | PolicyType | true | none | none |
| timestamp | integer | true | none | none |
DepositFullyProcessedWebhookPayload
{
"depositTicketId": 0,
"productId": 0,
"accountProviderId": 0,
"userId": "string",
"externalUserId": "string",
"amount": "string",
"status": "NEW",
"txHash": "string",
"senderAddress": "string",
"notionalValue": "string",
"createdAt": "2019-08-24T14:15:22Z"
}
Properties
None
WebhookRequest
{
"webhookId": "string",
"brokerId": "string",
"webhookType": "REGULAR_POLICY_NEW_VERSION_PUBLISHED",
"payload": {
"version": "string",
"type": "AML_POLICY",
"timestamp": 0
}
}
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| webhookId | string | true | none | none |
| brokerId | string | true | none | none |
| webhookType | WebhookType | true | none | none |
| payload | any | true | none | none |
oneOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | RegularPolicyWebhookPayload | false | none | none |
xor
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | BuyCryptoPolicyWebhookPayload | false | none | none |
xor
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | DepositFullyProcessedWebhookPayload | false | none | none |
MaintenanceStatus
"SCHEDULED"
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| anonymous | string | false | none | none |
Enumerated Values
| Property | Value |
|---|---|
| anonymous | SCHEDULED |
| anonymous | IN_PROGRESS |
| anonymous | COMPLETED |
| anonymous | CANCELED |
MaintenanceResponse
{
"id": "string",
"status": "SCHEDULED",
"startAt": "string",
"endAt": "string"
}
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| id | string | true | none | none |
| status | MaintenanceStatus | true | none | none |
| startAt | string | true | none | none |
| endAt | string | true | none | none |
MaintenancePaginatedResponse
{
"total": 0,
"list": [
{
"id": "string",
"status": "SCHEDULED",
"startAt": "string",
"endAt": "string"
}
]
}
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| total | number | true | none | none |
| list | [MaintenanceResponse] | true | none | none |
GenerateDepositKeyRequest
{
"userId": 0,
"externalUserId": "string",
"accountProviderId": 0
}
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| userId | integer | false | none | none |
| externalUserId | string | false | none | none |
| accountProviderId | integer | true | none | none |
DepositKey
{
"address": "string",
"tag": "string",
"legacyAddress": "string"
}
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| address | string | true | none | none |
| tag | string | false | none | none |
| legacyAddress | string | false | none | none |
DepositTicketStatus
"NEW"
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| anonymous | string | false | none | none |
Enumerated Values
| Property | Value |
|---|---|
| anonymous | NEW |
| anonymous | PROCESSING |
| anonymous | REJECTED |
| anonymous | FULLY_PROCESSED |
| anonymous | FAILED |
| anonymous | PENDING |
DepositTicket
{
"depositTicketId": 0,
"productId": 0,
"accountProviderId": 0,
"userId": "string",
"externalUserId": "string",
"amount": "string",
"status": "NEW",
"txHash": "string",
"senderAddress": "string",
"notionalValue": "string",
"createdAt": "2019-08-24T14:15:22Z"
}
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| depositTicketId | integer | true | none | none |
| productId | integer | true | none | none |
| accountProviderId | integer | true | none | none |
| userId | string | true | none | none |
| externalUserId | string | true | none | none |
| amount | string | true | none | none |
| status | DepositTicketStatus | true | none | none |
| txHash | string | false | none | none |
| senderAddress | string | false | none | none |
| notionalValue | string | true | none | none |
| createdAt | string(date-time) | true | none | none |
DepositConfigType
"FROM_EXTERNAL_WALLET"
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| anonymous | string | false | none | none |
Enumerated Values
| Property | Value |
|---|---|
| anonymous | FROM_EXTERNAL_WALLET |
| anonymous | FIAT_DEPOSIT |
| anonymous | TRANSFER |
| anonymous | LIGHTNING |
DepositTemplateForm
"ADDRESS_ONLY"
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| anonymous | string | false | none | none |
Enumerated Values
| Property | Value |
|---|---|
| anonymous | ADDRESS_ONLY |
| anonymous | ADDRESS_AND_DESTINATION_TAG |
| anonymous | ADDRESS_AND_MEMO |
DepositKeyPatternElement
"DEFAULT"
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| anonymous | string | false | none | none |
Enumerated Values
| Property | Value |
|---|---|
| anonymous | DEFAULT |
| anonymous | LEGACY |
| anonymous | SEGWIT |
ExternalWalletDepositConfig
{
"_id": "string",
"type": "FROM_EXTERNAL_WALLET",
"disabled": true,
"fee": 0,
"accountProviderId": 0,
"templateForm": "ADDRESS_ONLY",
"canGenerateDepositKeys": true,
"depositKeyPattern": [
"DEFAULT"
],
"note": "string",
"network": {
"name": "string",
"suspended": true,
"blockchainExplorer": {
"address": "string",
"transaction": "string"
},
"addressValidatorRegex": "string",
"tagValidatorRegex": "string"
}
}
Deposit configuration for external wallet deposits, as defined in @ndaxio/asset-manager-ts-client.
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| _id | string | true | none | none |
| type | DepositConfigType | true | none | none |
| disabled | boolean | true | none | none |
| fee | number | false | none | none |
| accountProviderId | integer | true | none | none |
| templateForm | DepositTemplateForm | true | none | none |
| canGenerateDepositKeys | boolean | true | none | none |
| depositKeyPattern | [DepositKeyPatternElement] | true | none | none |
| note | string | false | none | none |
| network | NetworkInfo | true | none | none |
BlockchainExplorerLinks
{
"address": "string",
"transaction": "string"
}
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| address | string | true | none | none |
| transaction | string | true | none | none |
NetworkInfo
{
"name": "string",
"suspended": true,
"blockchainExplorer": {
"address": "string",
"transaction": "string"
},
"addressValidatorRegex": "string",
"tagValidatorRegex": "string"
}
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| name | string | true | none | none |
| suspended | boolean | true | none | none |
| blockchainExplorer | BlockchainExplorerLinks | false | none | none |
| addressValidatorRegex | string | false | none | none |
| tagValidatorRegex | string | false | none | none |
LeftoverTransferRequest
{
"idempotencyKey": "string",
"productId": 0,
"userId": "2c4a230c-5085-4924-a3e1-25fb4fc5965b",
"externalUserId": "string"
}
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| idempotencyKey | string | true | none | Idempotency key for the transfer request |
| productId | integer | true | none | OMS product ID (e.g. CAD) |
| userId | string(uuid) | false | none | Broker user ID (provide one of userId or externalUserId) |
| externalUserId | string | false | none | External broker user ID (provide one of userId or externalUserId) |
LeftoverTransferStatus
"PENDING"
Leftover transfer status
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| anonymous | string | false | none | Leftover transfer status |
Enumerated Values
| Property | Value |
|---|---|
| anonymous | PENDING |
| anonymous | COMPLETED |
| anonymous | FAILED |
LeftoverTransferResponse
{
"id": "string",
"brokerId": "string",
"brokerUserId": "string",
"status": "PENDING",
"productId": 0,
"amount": "string",
"idempotencyKey": "string",
"ledgerEntryId": "string",
"createdAt": "2019-08-24T14:15:22Z",
"completedAt": "2019-08-24T14:15:22Z"
}
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| id | string | true | none | Id of the transfer (e.g. UUID) |
| brokerId | string | true | none | Broker identifier |
| brokerUserId | string | true | none | Broker user identifier |
| status | LeftoverTransferStatus | true | none | Leftover transfer status |
| productId | integer | true | none | OMS product ID |
| amount | string | true | none | Transferred amount |
| idempotencyKey | string | true | none | Idempotency key from the request |
| ledgerEntryId | string | false | none | OMS ledger entry id (when available) |
| createdAt | string(date-time) | true | none | When the transfer was created |
| completedAt | string(date-time) | false | none | When the transfer completed (when status is COMPLETED or FAILED) |
BrokerPermission
"auth:revoke"
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| anonymous | string | false | none | none |
Enumerated Values
| Property | Value |
|---|---|
| anonymous | auth:revoke |
| anonymous | user:read |
| anonymous | user:create |
| anonymous | user:manage |
| anonymous | user:portfolio:read |
| anonymous | user:balance:read |
| anonymous | liquidation:read |
| anonymous | broker:rule:read |
| anonymous | broker:rule:manage |
| anonymous | broker:balance:read |
| anonymous | product:read |
| anonymous | instrument:read |
| anonymous | ticker:read |
| anonymous | quote:read |
| anonymous | quote:manage |
| anonymous | trade:read |
| anonymous | policy:read |
| anonymous | policy:manage |
| anonymous | report:read |
| anonymous | report:manage |
| anonymous | statement:read |
| anonymous | questionnaire:read |
| anonymous | questionnaire:submit |
| anonymous | maintenances:read |
| anonymous | leftover-transfer:create |
| anonymous | deposit-tickets:read |
| anonymous | deposit-keys:read |
| anonymous | deposit-keys:generate |
| anonymous | key:read |
| anonymous | key:manage |
BrokerKeyResponse
{
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
"name": "string",
"enabled": true,
"permissions": [
"auth:revoke"
],
"expiresAt": "2019-08-24T14:15:22Z",
"createdAt": "2019-08-24T14:15:22Z"
}
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| id | string(uuid) | true | none | Unique key identifier |
| name | string | true | none | Human-readable label for the key |
| enabled | boolean | true | none | Whether this key is currently active for authentication |
| permissions | [BrokerPermission] | true | none | List of permissions granted to this key |
| expiresAt | string(date-time)¦null | true | none | When this key expires (null if no expiry) |
| createdAt | string(date-time) | true | none | When this key was created |
CreateBrokerKeyRequest
{
"name": "string",
"publicKey": "string",
"permissions": [
"auth:revoke"
],
"ttlSeconds": 1
}
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| name | string | true | none | Human-readable label for the key |
| publicKey | string | true | none | PEM-encoded RSA public key |
| permissions | [BrokerPermission] | true | none | Permissions to grant. Defaults to the signing key's permission set. Cannot exceed the signing key's permissions. |
| ttlSeconds | integer | false | none | Seconds until the key automatically expires. Omit for no expiry. |
UpdateBrokerKeyRequest
{
"name": "string",
"ttlSeconds": 1
}
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| name | string | false | none | New display name for the key |
| ttlSeconds | integer | false | none | Resets the expiry to now + ttlSeconds |