NAV
Shell HTTP JavaScript Ruby Python PHP Java Go

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

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 PDF
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:

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 Facebook
anonymous Reddit
anonymous Twitter
anonymous Google
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
email 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
email 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 PDF
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

{
  "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