{"info":{"_postman_id":"10ca15bf-9d45-4f47-b0b3-4c3ec9a46e1f","name":"NovaBtc public API","description":"<html><head></head><body><h2 id=\"introduction\">Introduction</h2>\n<p>Welcome to the API Documentation for our financial services platform. This document provides comprehensive details on how to interact with our API to perform a wide range of operations, including managing fiat and crypto withdrawals, retrieving requisites, handling exchanges, and more.</p>\n<h2 id=\"authentication\">Authentication</h2>\n<p>Our API uses token-based authentication to ensure secure access. Each request must include a valid token in the header. The token can be obtained through our authentication endpoint.</p>\n<p>Authenticated requests must include both <code>APIKey</code> and <code>APISign</code> HTTP header in the request payload.</p>\n<p>To construct the signature, use the following format:</p>\n<p><code>\"#{canonical_verb}|#{canonical_uri}|#{canonical_query}|#{access_key}\"</code></p>\n<p><strong>where:</strong></p>\n<ul>\n<li><p><strong>canonical_verb</strong>: HTTP request method (e.g., GET, POST, etc.)</p>\n</li>\n<li><p><strong>canonical_uri</strong>: request path starting from the API root URL.</p>\n</li>\n<li><p><strong>canonical_query</strong>: input parameters. For GET requests, these are query parameters; for POST and other methods, these are body parameters.</p>\n</li>\n<li><p><strong>access_key</strong>: access key associated with the API request.</p>\n</li>\n</ul>\n<p>Signature should be coded with <code>HmacSHA256</code> algorithm and subscribed by <code>secret_key</code></p>\n<h2 id=\"code-example\">Code example</h2>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-python\">import hmac\nimport hashlib\nimport requests\nfrom urllib.parse import urlencode\n# Configuration variables\nhttp_method = \"POST\"  # or \"POST\", \"PUT\", etc.\ncanonical_uri = \"/api/v2/deposit_addresses\"  # example endpoint path\naccess_key = \"tGhT343HpEYExsGzJ4qNbMLTTFAwTy3OKd2WGIxc\"\nsecret_key = \"SB9S1L3IO4EHs9xQvsQFnhxnDwiWSzabGLiNNdGr\"\n# Function to flatten an object (to be used for POST/PUT/PATCH/DELETE requests)\ndef flatten_object(obj, parent_key='', res={}):\n    for key in obj:\n        prop_name = f\"{parent_key}_{key}\" if parent_key else key\n        if isinstance(obj[key], dict):\n            flatten_object(obj[key], prop_name, res)\n        else:\n            res[prop_name] = obj[key]\n    return res\n# Function to convert object to query string\ndef object_to_query_string(obj):\n    flat_object = flatten_object(obj)\n    sorted_keys = sorted(flat_object.keys())\n    query_params = [\n        f\"{key}={flat_object[key]}\" for key in sorted_keys\n    ]\n    return '&amp;'.join(query_params)\n# Prepare the message to sign based on HTTP method\nif http_method == \"GET\":\n    # For GET request, use query parameters from the URL (if any)\n    query_params = {\n        \"amount\": \"0.05\",\n        \"input_asset\": \"btc\",\n        \"output_asset\": \"xrp\"\n    }\n    canonical_query = object_to_query_string(query_params)\n    canonical_string = f\"{http_method}|{canonical_uri}|{canonical_query}\"\nelif http_method in [\"POST\", \"PUT\", \"PATCH\", \"DELETE\"]:\n    # For POST/PUT/PATCH/DELETE requests, use the body of the request\n    request_body = {\n        \"dchain\": \"usdc\"\n    }\n    canonical_query = object_to_query_string(request_body)\n    canonical_string = f\"{http_method}|{canonical_uri}|{canonical_query}\"\n# Generate the HMAC SHA256 signature\nsignature = hmac.new(\n    secret_key.encode('utf-8'),\n    canonical_string.encode('utf-8'),\n    hashlib.sha256\n).hexdigest()\n# Prepare the headers\nheaders = {\n    \"accept\": 'application/json',\n    \"APIKey\": access_key,\n    \"APISign\": signature\n}\n# Define the full URL (assuming 'https://api.example.com' is the base URL)\nurl = \"https://api.novabtc.io\" + canonical_uri\n# Send the GET or POST request\nif http_method == \"GET\":\n    response = requests.get(url, headers=headers, params=query_params)  # Use params for GET requests\nelse:\n    response = requests.request(\n        http_method,\n        url,\n        headers=headers,\n        json=request_body\n    )  # Use json for POST/PUT/PATCH/DELETE\n# Check the response\nprint(response.status_code)\nprint(response.text)\n\n</code></pre>\n<h2 id=\"websockets\">Websockets</h2>\n<h3 id=\"description\">Description</h3>\n<p>Updates on system objects can be received through a WebSocket connection.</p>\n<h3 id=\"connection-url\">Connection URL</h3>\n<p><strong>WebSocket URL:</strong> wss://api.novabtc.io</p>\n<p><strong>SocketIO Path</strong>: <code>/zsu/ws/v1</code></p>\n<h3 id=\"authentication-1\">Authentication</h3>\n<p>To connect, you need to use <code>api_key</code>, <code>api_secret</code> (which can be obtained when generating a token in your account api_keys page), <code>user_uuid</code> (which can be obtained by requesting <code>/api/v2/members/me</code> as the <code>uuid</code> attribute), and <code>api_sign</code> - this is an HMAC signature created based on <code>canonicalString</code>. More details in the example.</p>\n<h3 id=\"example-connection-in-python\">Example Connection in Python</h3>\n<p>Here is an example of connecting to the WebSocket server in Python using the <code>python-socketio[client]</code> library:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-python\">import socketio\nimport hmac\nimport hashlib\nSERVER_URL = 'wss://api.novabtc.io'\nAPI_KEY = 'kjdh723ncs73ncdsnc72ncs73kds32L3skD2'\nAPI_SECRET = 'GJSsaK3PpwOjgLK2lkPmQ5TZRtF2pPoQBZ9yyuAa'\nUSER_UUID = 'novabtcz1agv'\ndef generate_hmac(canonical_string: str, secret: str) -&gt; str:\n    return hmac.new(secret.encode(), canonical_string.encode(), hashlib.sha256).hexdigest()\ncanonical_string = f'{USER_UUID}|{API_KEY}'\napi_sign = generate_hmac(canonical_string, API_SECRET)\nsio = socketio.Client()\n@sio.event\ndef connect():\n    print(f'Connected to: {SERVER_URL}')\n    print(f'With this api_key: {API_KEY}')\n@sio.event\ndef disconnect():\n    print('Disconnected')\n@sio.event\ndef close(data):\n    print(f'Connection closed: {data}')\n@sio.event\ndef connect_error(data):\n    print(f'Connection error: {data}')\n@sio.on('account')\ndef on_account(data):\n    print('Message from server (account):', data)\n@sio.on('deposit_address')\ndef on_deposit_address(data):\n    print('Message from server (deposit_address):', data)\n@sio.on('deposit')\ndef on_deposit(data):\n    print('Message from server (deposit):', data)\n@sio.on('withdrawal')\ndef on_withdrawal(data):\n    print('Message from server (withdrawal):', data)\nurl = f\"{SERVER_URL}?api_key={API_KEY}&amp;api_sign={api_sign}\"\nsio.connect(url, transports=['websocket'], socketio_path='/zsu/ws/v1')\nsio.wait()\n\n</code></pre>\n<h3 id=\"possible-subscription-objects\">Possible Subscription Objects</h3>\n<ul>\n<li><p>customer</p>\n</li>\n<li><p>deposit</p>\n</li>\n<li><p>order</p>\n</li>\n<li><p>withdrawal</p>\n</li>\n<li><p>trade</p>\n</li>\n<li><p>deposit_address</p>\n</li>\n<li><p>account</p>\n</li>\n</ul>\n<h3 id=\"example-response\">Example Response</h3>\n<p><strong>Example data for the</strong> <code>account</code> object received from the server:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"version\": \"1\",\n  \"action\": \"update\",\n  \"object\": {\n    \"aml_locked\": \"0.0\",\n    \"balance\": \"0.0\",\n    \"bonus\": \"0.0\",\n    \"coin_type\": \"crypto\",\n    \"currency\": \"usdt\",\n    \"launchpad\": \"0.0\",\n    \"locked\": \"0.0\",\n    \"name\": \"Tether USD\",\n    \"savings\": \"0.0\",\n    \"stacking\": \"0.0\",\n    \"tag\": null,\n    \"total\": \"0.0\"\n  }\n}\n\n</code></pre>\n<p>This example demonstrates how a client can connect to the WebSocket server and process the messages received from it. Use the appropriate <code>api_key</code>, <code>api_secret</code>, and <code>user_uuid</code> for your connection.</p>\n</body></html>","schema":"https://schema.getpostman.com/json/collection/v2.0.0/collection.json","toc":[],"owner":"20449810","collectionId":"10ca15bf-9d45-4f47-b0b3-4c3ec9a46e1f","publishedId":"2sB2cbZJCK","public":true,"customColor":{"top-bar":"FFFFFF","right-sidebar":"303030","highlight":"FF6C37"},"publishDate":"2025-04-23T09:18:50.000Z"},"item":[{"name":"members","item":[{"name":"me","event":[{"listen":"prerequest","script":{"exec":["const secretKey = pm.collectionVariables.get(\"secret_key\");","const method = pm.request.method;","const endpoint = pm.request.url.getPath();","console.log(endpoint)","","let dataToSign;","","function objectToQueryString(obj) {","    const flatObject = flattenObject(obj);","    const sortedKeys = Object.keys(flatObject).sort();","    const queryParams = sortedKeys.map(key => `${key}=${flatObject[key]}`);","    return queryParams.join('&');","}","","function flattenObject(obj, parentKey = '', res = {}) {","    for (let key in obj) {","        const propName = parentKey ? parentKey + '_' + key : key;","        if (typeof obj[key] === 'object' && obj[key] !== null && !Array.isArray(obj[key]))","            flattenObject(obj[key], propName, res);","        else","            res[propName] = obj[key];","    }","    return res;","}","","if (method === \"GET\") {","    const queryParams = pm.request.url.query.all();","    queryParams.sort((a, b) => a.key.localeCompare(b.key));","    dataToSign = queryParams.map(param => `${param.key}=${param.value}`).join('&');","} else if ([\"POST\", \"PUT\", \"PATCH\", \"DELETE\"].includes(method)) {","    const requestBody = JSON.parse(pm.request.body.raw || '{}');","    dataToSign = objectToQueryString(requestBody);","}","","const message = `${method}|${endpoint}|${dataToSign}`;","","const signature = CryptoJS.HmacSHA256(message, secretKey).toString(CryptoJS.enc.Hex);","pm.collectionVariables.set(\"signature\", signature);","console.log([\"script_message\", message]);",""],"type":"text/javascript","packages":{},"id":"2efd47b6-27ce-4e73-9570-8335cd80c359"}},{"listen":"test","script":{"exec":[""],"type":"text/javascript","packages":{},"id":"a47aaa55-b57e-4532-8f35-393824e4d99c"}}],"id":"8d07b38f-1b18-4205-a669-b9f2a8cf10b3","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"accept","value":"application/json"},{"key":"APIKey","value":"","type":"text"},{"key":"APISign","value":"","type":"text"}],"url":"https://api.novabtc.io/api/v2/members/me","urlObject":{"path":["api","v2","members","me"],"host":["https://api.novabtc.io"],"query":[],"variable":[]}},"response":[],"_postman_id":"8d07b38f-1b18-4205-a669-b9f2a8cf10b3"},{"name":"total_balance","event":[{"listen":"prerequest","script":{"exec":["const secretKey = pm.collectionVariables.get(\"secret_key\");","const method = pm.request.method;","const endpoint = pm.request.url.getPath();","","let dataToSign;","","function objectToQueryString(obj) {","    const flatObject = flattenObject(obj);","    const sortedKeys = Object.keys(flatObject).sort();","    const queryParams = sortedKeys.map(key => `${key}=${flatObject[key]}`);","    return queryParams.join('&');","}","","function flattenObject(obj, parentKey = '', res = {}) {","    for (let key in obj) {","        const propName = parentKey ? parentKey + '_' + key : key;","        if (typeof obj[key] === 'object' && obj[key] !== null && !Array.isArray(obj[key]))","            flattenObject(obj[key], propName, res);","        else","            res[propName] = obj[key];","    }","    return res;","}","","if (method === \"GET\") {","    const queryParams = pm.request.url.query.all();","    queryParams.sort((a, b) => a.key.localeCompare(b.key));","    dataToSign = queryParams.map(param => `${param.key}=${param.value}`).join('&');","} else if ([\"POST\", \"PUT\", \"PATCH\", \"DELETE\"].includes(method)) {","    const requestBody = JSON.parse(pm.request.body.raw || '{}');","    dataToSign = objectToQueryString(requestBody);","}","","const message = `${method}|${endpoint}|${dataToSign}`;","","const signature = CryptoJS.HmacSHA256(message, secretKey).toString(CryptoJS.enc.Hex);","pm.collectionVariables.set(\"signature\", signature);","console.log([\"script_message\", message]);",""],"type":"text/javascript","packages":{},"id":"6bf0deed-4b5c-4752-88e9-ff6b062e3f18"}}],"id":"d6a5c7e6-cda8-4e33-8010-5ded5509b0b2","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"accept","value":"application/json"},{"key":"APIKey","value":"","type":"text"},{"key":"APISign","value":"","type":"text"}],"url":"https://api.novabtc.io/api/v2/members/total_balance?output_asset=usdt","urlObject":{"path":["api","v2","members","total_balance"],"host":["https://api.novabtc.io"],"query":[{"key":"output_asset","value":"usdt"}],"variable":[]}},"response":[],"_postman_id":"d6a5c7e6-cda8-4e33-8010-5ded5509b0b2"}],"id":"30019717-c345-4024-9df9-fe3a266db6a0","_postman_id":"30019717-c345-4024-9df9-fe3a266db6a0","description":""},{"name":"deposit_addresses","item":[{"name":"list","event":[{"listen":"prerequest","script":{"exec":["const secretKey = pm.collectionVariables.get(\"secret_key\");","const method = pm.request.method;","const endpoint = pm.request.url.getPath();","","let dataToSign;","","function objectToQueryString(obj) {","    const flatObject = flattenObject(obj);","    const sortedKeys = Object.keys(flatObject).sort();","    const queryParams = sortedKeys.map(key => `${key}=${flatObject[key]}`);","    return queryParams.join('&');","}","","function flattenObject(obj, parentKey = '', res = {}) {","    for (let key in obj) {","        const propName = parentKey ? parentKey + '_' + key : key;","        if (typeof obj[key] === 'object' && obj[key] !== null && !Array.isArray(obj[key]))","            flattenObject(obj[key], propName, res);","        else","            res[propName] = obj[key];","    }","    return res;","}","","if (method === \"GET\") {","    const queryParams = pm.request.url.query.all();","    queryParams.sort((a, b) => a.key.localeCompare(b.key));","    dataToSign = queryParams.map(param => `${param.key}=${param.value}`).join('&');","} else if ([\"POST\", \"PUT\", \"PATCH\", \"DELETE\"].includes(method)) {","    const requestBody = JSON.parse(pm.request.body.raw || '{}');","    dataToSign = objectToQueryString(requestBody);","}","","const message = `${method}|${endpoint}|${dataToSign}`;","","const signature = CryptoJS.HmacSHA256(message, secretKey).toString(CryptoJS.enc.Hex);","pm.collectionVariables.set(\"signature\", signature);","console.log([\"script_message\", message]);",""],"type":"text/javascript","packages":{},"id":"23f3447c-ba72-4778-b762-099cb2a33920"}}],"id":"9c76ea68-b161-4711-bed5-26e24c6b2b2f","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"accept","value":"application/json"},{"key":"APIKey","value":"","type":"text"},{"key":"APISign","value":"","type":"text"}],"url":"https://api.novabtc.io/api/v2/deposit_addresses","urlObject":{"path":["api","v2","deposit_addresses"],"host":["https://api.novabtc.io"],"query":[],"variable":[]}},"response":[],"_postman_id":"9c76ea68-b161-4711-bed5-26e24c6b2b2f"},{"name":"create","event":[{"listen":"prerequest","script":{"id":"6c50555e-a963-48ea-967b-af93c9acddbc","exec":["const secretKey = pm.collectionVariables.get(\"secret_key\");","const method = pm.request.method;","const endpoint = pm.request.url.getPath();","","function replaceVariables(str) {","    return str.replace(/\\{\\{(\\w+)\\}\\}/g, (match, variableName) => {","        return pm.variables.get(variableName) || pm.collectionVariables.get(variableName) || match;","    });","}","","function objectToQueryString(obj) {","    const flatObject = flattenObject(obj);","    const sortedKeys = Object.keys(flatObject).sort();","    const queryParams = sortedKeys.map(key => `${key}=${replaceVariables(flatObject[key])}`);","    return queryParams.join('&');","}","","function flattenObject(obj, parentKey = '', res = {}) {","    for (let key in obj) {","        const propName = parentKey ? parentKey + '_' + key : key;","        if (typeof obj[key] === 'object' && obj[key] !== null && !Array.isArray(obj[key]))","            flattenObject(obj[key], propName, res);","        else","            res[propName] = obj[key];","    }","    return res;","}","","let dataToSign;","if (method === \"GET\") {","    const queryParams = pm.request.url.query.all();","    queryParams.sort((a, b) => a.key.localeCompare(b.key));","    dataToSign = queryParams.map(param => `${param.key}=${replaceVariables(param.value)}`).join('&');","} else if ([\"POST\", \"PUT\", \"PATCH\", \"DELETE\"].includes(method)) {","    const requestBody = JSON.parse(replaceVariables(pm.request.body.raw || '{}'));","    dataToSign = objectToQueryString(requestBody);","}","","const message = `${method}|${endpoint}|${dataToSign}`;","","const signature = CryptoJS.HmacSHA256(message, secretKey).toString(CryptoJS.enc.Hex);","pm.collectionVariables.set(\"signature\", signature);","console.log([\"script_message\", message]);",""],"type":"text/javascript","packages":{}}},{"listen":"test","script":{"id":"16dcbddc-4b6a-449d-bc60-305c78f0c629","exec":[""],"type":"text/javascript","packages":{}}}],"id":"4187aba3-45ca-468d-b240-bc8baf908069","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"accept","value":"application/json"},{"key":"Content-Type","value":"application/json","type":"text"},{"key":"APISign","value":"","type":"text"},{"key":"APIKey","value":"","type":"text"}],"body":{"mode":"raw","raw":"{\n  \"dchain\": \"trc20usdt\"\n}","options":{"raw":{"language":"json"}}},"url":"https://api.novabtc.io/api/v2/deposit_addresses","description":"<p>Creates a new deposit address on a specific blockchain network.</p>\n<h4 id=\"how-to-find-the-dchain\">How to find the <code>dchain</code></h4>\n<p>The <code>dchain</code> should be taken from the GET <code>/api/v2/assets</code> endpoint response:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"items\": [\n    {\n      \"asset_id\": \"usdt\", // USDT as an example\n      \"dchains\": [\n        {\n          \"display_name\": \"TRC20\",\n          \"dchain_id\": \"trc20usdt\" // &lt;--- Use this value as the dchain parameter\n        }\n      ]\n    },\n    ...\n  ]\n}\n\n</code></pre>\n","urlObject":{"path":["api","v2","deposit_addresses"],"host":["https://api.novabtc.io"],"query":[],"variable":[]}},"response":[],"_postman_id":"4187aba3-45ca-468d-b240-bc8baf908069"}],"id":"de115efd-3323-4e2a-b738-022201e2955c","_postman_id":"de115efd-3323-4e2a-b738-022201e2955c","description":""},{"name":"assets","item":[{"name":"list","event":[{"listen":"prerequest","script":{"exec":[""],"type":"text/javascript","packages":{},"id":"bfd684c8-5c21-4b0d-abfb-3dd7b50264c6"}}],"id":"b9f7796a-ada8-4691-b1ba-cfa2e0819d24","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"accept","value":"application/json"}],"url":"https://api.novabtc.io/api/v2/assets","urlObject":{"path":["api","v2","assets"],"host":["https://api.novabtc.io"],"query":[],"variable":[]}},"response":[],"_postman_id":"b9f7796a-ada8-4691-b1ba-cfa2e0819d24"},{"name":"info","event":[{"listen":"prerequest","script":{"exec":[""],"type":"text/javascript","packages":{},"id":"b4870a9b-4fa9-40cd-ba55-c5e1e8b25eb7"}}],"id":"e3e2e56a-ce85-47c6-895a-e8a8bfc859a0","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"accept","value":"application/json"}],"url":"https://api.novabtc.io/api/v2/assets/{{asset_code}}?code={{asset_code}}","urlObject":{"path":["api","v2","assets","{{asset_code}}"],"host":["https://api.novabtc.io"],"query":[{"key":"code","value":"{{asset_code}}"}],"variable":[]}},"response":[],"_postman_id":"e3e2e56a-ce85-47c6-895a-e8a8bfc859a0"}],"id":"00859c0b-daea-443d-a0f4-d88cb4a1ff47","_postman_id":"00859c0b-daea-443d-a0f4-d88cb4a1ff47","description":""},{"name":"markets","item":[{"name":"list","event":[{"listen":"prerequest","script":{"exec":[""],"type":"text/javascript","packages":{},"id":"356d2f4f-349d-4bfd-942f-be2fca2b93ce"}}],"id":"ca16bbff-a2df-4964-9450-0f3963ccbb09","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"accept","value":"application/json"},{"key":"APIKey","value":"","type":"text"},{"key":"APISign","value":"","type":"text"}],"url":"https://api.novabtc.io/api/v2/markets","urlObject":{"path":["api","v2","markets"],"host":["https://api.novabtc.io"],"query":[],"variable":[]}},"response":[],"_postman_id":"ca16bbff-a2df-4964-9450-0f3963ccbb09"},{"name":"info","event":[{"listen":"prerequest","script":{"exec":[""],"type":"text/javascript","packages":{},"id":"ce7ba2d2-77be-4a38-94f1-1d38e38be3b6"}}],"id":"33dd403f-66fc-4149-9529-6d45a5d2461b","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"accept","value":"application/json"},{"key":"APIKey","value":"","type":"text"},{"key":"APISign","value":"","type":"text"}],"url":"https://api.novabtc.io/api/v2/markets/{{market}}?market={{market}}","urlObject":{"path":["api","v2","markets","{{market}}"],"host":["https://api.novabtc.io"],"query":[{"key":"market","value":"{{market}}"}],"variable":[]}},"response":[],"_postman_id":"33dd403f-66fc-4149-9529-6d45a5d2461b"}],"id":"2279fc62-b731-4d45-bb60-ba9dc2326497","_postman_id":"2279fc62-b731-4d45-bb60-ba9dc2326497","description":""},{"name":"transactions","item":[{"name":"deposits","event":[{"listen":"prerequest","script":{"exec":["const secretKey = pm.collectionVariables.get(\"secret_key\");","const method = pm.request.method;","const endpoint = pm.request.url.getPath();","","let dataToSign;","","function objectToQueryString(obj) {","    const flatObject = flattenObject(obj);","    const sortedKeys = Object.keys(flatObject).sort();","    const queryParams = sortedKeys.map(key => `${key}=${flatObject[key]}`);","    return queryParams.join('&');","}","","function flattenObject(obj, parentKey = '', res = {}) {","    for (let key in obj) {","        const propName = parentKey ? parentKey + '_' + key : key;","        if (typeof obj[key] === 'object' && obj[key] !== null && !Array.isArray(obj[key]))","            flattenObject(obj[key], propName, res);","        else","            res[propName] = obj[key];","    }","    return res;","}","","if (method === \"GET\") {","    const queryParams = pm.request.url.query.all();","    queryParams.sort((a, b) => a.key.localeCompare(b.key));","    dataToSign = queryParams.map(param => `${param.key}=${param.value}`).join('&');","} else if ([\"POST\", \"PUT\", \"PATCH\", \"DELETE\"].includes(method)) {","    const requestBody = JSON.parse(pm.request.body.raw || '{}');","    dataToSign = objectToQueryString(requestBody);","}","","const message = `${method}|${endpoint}|${dataToSign}`;","","const signature = CryptoJS.HmacSHA256(message, secretKey).toString(CryptoJS.enc.Hex);","pm.collectionVariables.set(\"signature\", signature);","console.log([\"script_message\", message]);",""],"type":"text/javascript","packages":{},"id":"7167c027-941e-4fc7-9575-e5d96202b7d2"}}],"id":"84f4288e-2494-467d-b17e-9cf384a894c9","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"accept","value":"application/json"},{"key":"APIKey","value":"","type":"text"},{"key":"APISign","value":"","type":"text"}],"url":"https://api.novabtc.io/api/v2/transactions/deposits","urlObject":{"path":["api","v2","transactions","deposits"],"host":["https://api.novabtc.io"],"query":[{"disabled":true,"key":"sort_by","value":"dfgdfgdfg"},{"disabled":true,"key":"sort","value":"asc"}],"variable":[]}},"response":[],"_postman_id":"84f4288e-2494-467d-b17e-9cf384a894c9"},{"name":"withdrawals","event":[{"listen":"prerequest","script":{"exec":["const secretKey = pm.collectionVariables.get(\"secret_key\");","const method = pm.request.method;","const endpoint = pm.request.url.getPath();","","let dataToSign;","","function objectToQueryString(obj) {","    const flatObject = flattenObject(obj);","    const sortedKeys = Object.keys(flatObject).sort();","    const queryParams = sortedKeys.map(key => `${key}=${flatObject[key]}`);","    return queryParams.join('&');","}","","function flattenObject(obj, parentKey = '', res = {}) {","    for (let key in obj) {","        const propName = parentKey ? parentKey + '_' + key : key;","        if (typeof obj[key] === 'object' && obj[key] !== null && !Array.isArray(obj[key]))","            flattenObject(obj[key], propName, res);","        else","            res[propName] = obj[key];","    }","    return res;","}","","if (method === \"GET\") {","    const queryParams = pm.request.url.query.all();","    queryParams.sort((a, b) => a.key.localeCompare(b.key));","    dataToSign = queryParams.map(param => `${param.key}=${param.value}`).join('&');","} else if ([\"POST\", \"PUT\", \"PATCH\", \"DELETE\"].includes(method)) {","    const requestBody = JSON.parse(pm.request.body.raw || '{}');","    dataToSign = objectToQueryString(requestBody);","}","","const message = `${method}|${endpoint}|${dataToSign}`;","","const signature = CryptoJS.HmacSHA256(message, secretKey).toString(CryptoJS.enc.Hex);","pm.collectionVariables.set(\"signature\", signature);","console.log([\"script_message\", message]);",""],"type":"text/javascript","packages":{},"id":"0cf41af3-4d6e-46dc-8670-00f97c419de2"}}],"id":"979971c0-8ff8-46b9-9959-b9e8b677bcd6","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"accept","value":"application/json"},{"key":"APIKey","value":"","type":"text"},{"key":"APISign","value":"","type":"text"}],"url":"https://api.novabtc.io/api/v2/transactions/withdrawals","urlObject":{"path":["api","v2","transactions","withdrawals"],"host":["https://api.novabtc.io"],"query":[],"variable":[]}},"response":[],"_postman_id":"979971c0-8ff8-46b9-9959-b9e8b677bcd6"}],"id":"b8d9a93a-87f0-4100-a4c8-4737c0742fe7","_postman_id":"b8d9a93a-87f0-4100-a4c8-4737c0742fe7","description":""},{"name":"requisites","item":[{"name":"list","event":[{"listen":"prerequest","script":{"exec":["const secretKey = pm.collectionVariables.get(\"secret_key\");","const method = pm.request.method;","const endpoint = pm.request.url.getPath();","","let dataToSign;","","function objectToQueryString(obj) {","    const flatObject = flattenObject(obj);","    const sortedKeys = Object.keys(flatObject).sort();","    const queryParams = sortedKeys.map(key => `${key}=${flatObject[key]}`);","    return queryParams.join('&');","}","","function flattenObject(obj, parentKey = '', res = {}) {","    for (let key in obj) {","        const propName = parentKey ? parentKey + '_' + key : key;","        if (typeof obj[key] === 'object' && obj[key] !== null && !Array.isArray(obj[key]))","            flattenObject(obj[key], propName, res);","        else","            res[propName] = obj[key];","    }","    return res;","}","","if (method === \"GET\") {","    const queryParams = pm.request.url.query.all();","    queryParams.sort((a, b) => a.key.localeCompare(b.key));","    dataToSign = queryParams.map(param => `${param.key}=${param.value}`).join('&');","} else if ([\"POST\", \"PUT\", \"PATCH\", \"DELETE\"].includes(method)) {","    const requestBody = JSON.parse(pm.request.body.raw || '{}');","    dataToSign = objectToQueryString(requestBody);","}","","const message = `${method}|${endpoint}|${dataToSign}`;","","const signature = CryptoJS.HmacSHA256(message, secretKey).toString(CryptoJS.enc.Hex);","pm.collectionVariables.set(\"signature\", signature);","console.log([\"script_message\", message]);",""],"type":"text/javascript","packages":{},"id":"45973cca-50de-49b7-b1f4-a33513cb30ba"}}],"id":"420ecf8a-b213-4d92-93e0-dfe8be00aa98","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"accept","value":"application/json"},{"key":"APIKey","value":"","type":"text"},{"key":"APISign","value":"","type":"text"}],"url":"https://api.novabtc.io/api/v2/requisites","urlObject":{"path":["api","v2","requisites"],"host":["https://api.novabtc.io"],"query":[],"variable":[]}},"response":[],"_postman_id":"420ecf8a-b213-4d92-93e0-dfe8be00aa98"}],"id":"60cc295a-022c-45eb-93da-148cd0386b94","_postman_id":"60cc295a-022c-45eb-93da-148cd0386b94","description":""},{"name":"withdrawals","item":[{"name":"create","event":[{"listen":"prerequest","script":{"exec":["const secretKey = pm.collectionVariables.get(\"secret_key\");","const method = pm.request.method;","const endpoint = pm.request.url.getPath();","","let dataToSign;","","function objectToQueryString(obj) {","    const flatObject = flattenObject(obj);","    const sortedKeys = Object.keys(flatObject).sort();","    const queryParams = sortedKeys.map(key => `${key}=${flatObject[key]}`);","    return queryParams.join('&');","}","","function flattenObject(obj, parentKey = '', res = {}) {","    for (let key in obj) {","        const propName = parentKey ? parentKey + '_' + key : key;","        if (typeof obj[key] === 'object' && obj[key] !== null && !Array.isArray(obj[key]))","            flattenObject(obj[key], propName, res);","        else","            res[propName] = obj[key];","    }","    return res;","}","","if (method === \"GET\") {","    const queryParams = pm.request.url.query.all();","    queryParams.sort((a, b) => a.key.localeCompare(b.key));","    dataToSign = queryParams.map(param => `${param.key}=${param.value}`).join('&');","} else if ([\"POST\", \"PUT\", \"PATCH\", \"DELETE\"].includes(method)) {","    const requestBody = JSON.parse(pm.request.body.raw || '{}');","    dataToSign = objectToQueryString(requestBody);","}","","const message = `${method}|${endpoint}|${dataToSign}`;","","const signature = CryptoJS.HmacSHA256(message, secretKey).toString(CryptoJS.enc.Hex);","pm.collectionVariables.set(\"signature\", signature);","console.log([\"script_message\", message]);",""],"type":"text/javascript","packages":{},"id":"989567ba-9a1a-4a54-885b-59a6042b5ad7"}}],"id":"86bf5cb0-5ff4-4c32-9ced-c46363bfa7d5","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"accept","value":"application/json"},{"key":"Content-Type","value":"application/json","type":"text"},{"key":"APISign","value":"","type":"text"},{"key":"APIKey","value":"","type":"text"}],"body":{"mode":"raw","raw":"{\n  \"dchain\": \"trx\",\n  \"destination\": \"TVQN9hN2u9idKzCFxNQeEzQALaXzuwzucw\",\n  \"amount\": 41\n}","options":{"raw":{"language":"json"}}},"url":"https://api.novabtc.io/api/v2/withdrawals","urlObject":{"path":["api","v2","withdrawals"],"host":["https://api.novabtc.io"],"query":[],"variable":[]}},"response":[],"_postman_id":"86bf5cb0-5ff4-4c32-9ced-c46363bfa7d5"}],"id":"527ecdda-2a33-41b8-89ff-6e62ff6a66da","_postman_id":"527ecdda-2a33-41b8-89ff-6e62ff6a66da","description":""},{"name":"exchanges","item":[{"name":"list","event":[{"listen":"prerequest","script":{"exec":["const secretKey = pm.collectionVariables.get(\"secret_key\");","const method = pm.request.method;","const endpoint = pm.request.url.getPath();","","let dataToSign;","","function objectToQueryString(obj) {","    const flatObject = flattenObject(obj);","    const sortedKeys = Object.keys(flatObject).sort();","    const queryParams = sortedKeys.map(key => `${key}=${flatObject[key]}`);","    return queryParams.join('&');","}","","function flattenObject(obj, parentKey = '', res = {}) {","    for (let key in obj) {","        const propName = parentKey ? parentKey + '_' + key : key;","        if (typeof obj[key] === 'object' && obj[key] !== null && !Array.isArray(obj[key]))","            flattenObject(obj[key], propName, res);","        else","            res[propName] = obj[key];","    }","    return res;","}","","if (method === \"GET\") {","    const queryParams = pm.request.url.query.all();","    queryParams.sort((a, b) => a.key.localeCompare(b.key));","    dataToSign = queryParams.map(param => `${param.key}=${param.value}`).join('&');","} else if ([\"POST\", \"PUT\", \"PATCH\", \"DELETE\"].includes(method)) {","    const requestBody = JSON.parse(pm.request.body.raw || '{}');","    dataToSign = objectToQueryString(requestBody);","}","","const message = `${method}|${endpoint}|${dataToSign}`;","","const signature = CryptoJS.HmacSHA256(message, secretKey).toString(CryptoJS.enc.Hex);","pm.collectionVariables.set(\"signature\", signature);","console.log([\"script_message\", message]);",""],"type":"text/javascript","packages":{},"id":"ca9b591b-33eb-4bf9-a20c-347af27d0c19"}}],"id":"54556fef-230c-4efc-9caf-b98eb2e39bbf","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"accept","value":"application/json"},{"key":"APIKey","value":"","type":"text"},{"key":"APISign","value":"","type":"text"}],"url":"https://api.novabtc.io/api/v2/exchanges","urlObject":{"path":["api","v2","exchanges"],"host":["https://api.novabtc.io"],"query":[],"variable":[]}},"response":[],"_postman_id":"54556fef-230c-4efc-9caf-b98eb2e39bbf"},{"name":"create","event":[{"listen":"prerequest","script":{"exec":["const secretKey = pm.collectionVariables.get(\"secret_key\");","const method = pm.request.method;","const endpoint = pm.request.url.getPath();","","let dataToSign;","","function objectToQueryString(obj) {","    const flatObject = flattenObject(obj);","    const sortedKeys = Object.keys(flatObject).sort();","    const queryParams = sortedKeys.map(key => `${key}=${flatObject[key]}`);","    return queryParams.join('&');","}","","function flattenObject(obj, parentKey = '', res = {}) {","    for (let key in obj) {","        const propName = parentKey ? parentKey + '_' + key : key;","        if (typeof obj[key] === 'object' && obj[key] !== null && !Array.isArray(obj[key]))","            flattenObject(obj[key], propName, res);","        else","            res[propName] = obj[key];","    }","    return res;","}","","if (method === \"GET\") {","    const queryParams = pm.request.url.query.all();","    queryParams.sort((a, b) => a.key.localeCompare(b.key));","    dataToSign = queryParams.map(param => `${param.key}=${param.value}`).join('&');","} else if ([\"POST\", \"PUT\", \"PATCH\", \"DELETE\"].includes(method)) {","    const requestBody = JSON.parse(pm.request.body.raw || '{}');","    dataToSign = objectToQueryString(requestBody);","}","","const message = `${method}|${endpoint}|${dataToSign}`;","","const signature = CryptoJS.HmacSHA256(message, secretKey).toString(CryptoJS.enc.Hex);","pm.collectionVariables.set(\"signature\", signature);","console.log([\"script_message\", message]);",""],"type":"text/javascript","packages":{},"id":"d8fc45f3-5afa-44f7-a241-ad5a08e6ecab"}}],"id":"7c9e1390-2c41-4380-985a-0f4441c8bec7","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"accept","value":"application/json"},{"key":"Content-Type","value":"application/json","type":"text"},{"key":"APISign","value":"","type":"text"},{"key":"APIKey","value":"","type":"text"}],"body":{"mode":"raw","raw":"{\n  \"input_asset\": \"xrp\",\n  \"output_asset\": \"btc\",\n  \"amount\": 20\n}","options":{"raw":{"language":"json"}}},"url":"https://api.novabtc.io/api/v2/exchanges","urlObject":{"path":["api","v2","exchanges"],"host":["https://api.novabtc.io"],"query":[],"variable":[]}},"response":[],"_postman_id":"7c9e1390-2c41-4380-985a-0f4441c8bec7"},{"name":"estimate","event":[{"listen":"prerequest","script":{"exec":["const secretKey = pm.collectionVariables.get(\"secret_key\");","const method = pm.request.method;","const endpoint = pm.request.url.getPath();","","let dataToSign;","","function objectToQueryString(obj) {","    const flatObject = flattenObject(obj);","    const sortedKeys = Object.keys(flatObject).sort();","    const queryParams = sortedKeys.map(key => `${key}=${flatObject[key]}`);","    return queryParams.join('&');","}","","function flattenObject(obj, parentKey = '', res = {}) {","    for (let key in obj) {","        const propName = parentKey ? parentKey + '_' + key : key;","        if (typeof obj[key] === 'object' && obj[key] !== null && !Array.isArray(obj[key]))","            flattenObject(obj[key], propName, res);","        else","            res[propName] = obj[key];","    }","    return res;","}","","if (method === \"GET\") {","    const queryParams = pm.request.url.query.all();","    queryParams.sort((a, b) => a.key.localeCompare(b.key));","    dataToSign = queryParams.map(param => `${param.key}=${param.value}`).join('&');","} else if ([\"POST\", \"PUT\", \"PATCH\", \"DELETE\"].includes(method)) {","    const requestBody = JSON.parse(pm.request.body.raw || '{}');","    dataToSign = objectToQueryString(requestBody);","}","","const message = `${method}|${endpoint}|${dataToSign}`;","","const signature = CryptoJS.HmacSHA256(message, secretKey).toString(CryptoJS.enc.Hex);","pm.collectionVariables.set(\"signature\", signature);","console.log([\"script_message\", message]);",""],"type":"text/javascript","packages":{},"id":"244ba1dc-4271-47b7-b3e1-808df7f883da"}}],"id":"32fa0532-95fa-4d57-ba78-5eccf5e7ce9e","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"accept","value":"application/json"},{"key":"Content-Type","value":"application/json","type":"text"},{"key":"APISign","value":"","type":"text"},{"key":"APIKey","value":"","type":"text"}],"body":{"mode":"raw","raw":"","options":{"raw":{"language":"json"}}},"url":"https://api.novabtc.io/api/v2/exchanges/estimate?input_asset=btc&output_asset=xrp&amount=0.05","urlObject":{"path":["api","v2","exchanges","estimate"],"host":["https://api.novabtc.io"],"query":[{"key":"input_asset","value":"btc"},{"key":"output_asset","value":"xrp"},{"key":"amount","value":"0.05"}],"variable":[]}},"response":[],"_postman_id":"32fa0532-95fa-4d57-ba78-5eccf5e7ce9e"}],"id":"bee996f8-8f99-4588-acce-94ac03917180","_postman_id":"bee996f8-8f99-4588-acce-94ac03917180","description":""},{"name":"orders","item":[{"name":"list","event":[{"listen":"prerequest","script":{"exec":["const secretKey = pm.collectionVariables.get(\"secret_key\");","const method = pm.request.method;","const endpoint = pm.request.url.getPath();","","let dataToSign;","","function objectToQueryString(obj) {","    const flatObject = flattenObject(obj);","    const sortedKeys = Object.keys(flatObject).sort();","    const queryParams = sortedKeys.map(key => `${key}=${flatObject[key]}`);","    return queryParams.join('&');","}","","function flattenObject(obj, parentKey = '', res = {}) {","    for (let key in obj) {","        const propName = parentKey ? parentKey + '_' + key : key;","        if (typeof obj[key] === 'object' && obj[key] !== null && !Array.isArray(obj[key]))","            flattenObject(obj[key], propName, res);","        else","            res[propName] = obj[key];","    }","    return res;","}","","if (method === \"GET\") {","    const queryParams = pm.request.url.query.all();","    queryParams.sort((a, b) => a.key.localeCompare(b.key));","    dataToSign = queryParams.map(param => `${param.key}=${param.value}`).join('&');","} else if ([\"POST\", \"PUT\", \"PATCH\", \"DELETE\"].includes(method)) {","    const requestBody = JSON.parse(pm.request.body.raw || '{}');","    dataToSign = objectToQueryString(requestBody);","}","","const message = `${method}|${endpoint}|${dataToSign}`;","","const signature = CryptoJS.HmacSHA256(message, secretKey).toString(CryptoJS.enc.Hex);","pm.collectionVariables.set(\"signature\", signature);","console.log([\"script_message\", message]);",""],"type":"text/javascript","packages":{},"id":"80a9a311-42c8-419e-a090-65a8e54fa9a2"}}],"id":"ecae083d-8d0d-40fb-93d0-2547e20b601b","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"accept","value":"application/json"},{"key":"APIKey","value":"","type":"text"},{"key":"APISign","value":"","type":"text"}],"url":"https://api.novabtc.io/api/v2/orders","urlObject":{"path":["api","v2","orders"],"host":["https://api.novabtc.io"],"query":[],"variable":[]}},"response":[],"_postman_id":"ecae083d-8d0d-40fb-93d0-2547e20b601b"},{"name":"info","event":[{"listen":"prerequest","script":{"exec":["const secretKey = pm.collectionVariables.get(\"secret_key\");","const method = pm.request.method;","const endpoint = pm.request.url.getPath();","","function replaceVariables(str) {","    return str.replace(/\\{\\{(\\w+)\\}\\}/g, (match, variableName) => {","        return pm.variables.get(variableName) || pm.collectionVariables.get(variableName) || match;","    });","}","","function objectToQueryString(obj) {","    const flatObject = flattenObject(obj);","    const sortedKeys = Object.keys(flatObject).sort();","    const queryParams = sortedKeys.map(key => `${key}=${replaceVariables(flatObject[key])}`);","    return queryParams.join('&');","}","","function flattenObject(obj, parentKey = '', res = {}) {","    for (let key in obj) {","        const propName = parentKey ? parentKey + '_' + key : key;","        if (typeof obj[key] === 'object' && obj[key] !== null && !Array.isArray(obj[key]))","            flattenObject(obj[key], propName, res);","        else","            res[propName] = obj[key];","    }","    return res;","}","","let dataToSign;","if (method === \"GET\") {","    const queryParams = pm.request.url.query.all();","    queryParams.sort((a, b) => a.key.localeCompare(b.key));","    dataToSign = queryParams.map(param => `${param.key}=${replaceVariables(param.value)}`).join('&');","} else if ([\"POST\", \"PUT\", \"PATCH\", \"DELETE\"].includes(method)) {","    const requestBody = JSON.parse(replaceVariables(pm.request.body.raw || '{}'));","    dataToSign = objectToQueryString(requestBody);","}","","const message = `${method}|${endpoint}|${dataToSign}`;","","const signature = CryptoJS.HmacSHA256(message, secretKey).toString(CryptoJS.enc.Hex);","pm.collectionVariables.set(\"signature\", signature);","console.log([\"script_message\", message]);",""],"type":"text/javascript","packages":{},"id":"6c631a49-2eb8-44f9-97a9-6b68eec07cd5"}}],"id":"e698d332-b3c9-4384-9567-b3fc1d018d64","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"accept","value":"application/json"},{"key":"APIKey","value":"","type":"text"},{"key":"APISign","value":"","type":"text"}],"url":"https://api.novabtc.io/api/v2/orders/1","urlObject":{"path":["api","v2","orders","1"],"host":["https://api.novabtc.io"],"query":[],"variable":[]}},"response":[],"_postman_id":"e698d332-b3c9-4384-9567-b3fc1d018d64"},{"name":"cancel","event":[{"listen":"prerequest","script":{"exec":["const secretKey = pm.collectionVariables.get(\"secret_key\");","const method = pm.request.method;","const endpoint = pm.request.url.getPath();","","let dataToSign;","","function objectToQueryString(obj) {","    const flatObject = flattenObject(obj);","    const sortedKeys = Object.keys(flatObject).sort();","    const queryParams = sortedKeys.map(key => `${key}=${flatObject[key]}`);","    return queryParams.join('&');","}","","function flattenObject(obj, parentKey = '', res = {}) {","    for (let key in obj) {","        const propName = parentKey ? parentKey + '_' + key : key;","        if (typeof obj[key] === 'object' && obj[key] !== null && !Array.isArray(obj[key]))","            flattenObject(obj[key], propName, res);","        else","            res[propName] = obj[key];","    }","    return res;","}","","if (method === \"GET\") {","    const queryParams = pm.request.url.query.all();","    queryParams.sort((a, b) => a.key.localeCompare(b.key));","    dataToSign = queryParams.map(param => `${param.key}=${param.value}`).join('&');","} else if ([\"POST\", \"PUT\", \"PATCH\", \"DELETE\"].includes(method)) {","    const requestBody = JSON.parse(pm.request.body.raw || '{}');","    dataToSign = objectToQueryString(requestBody);","}","","const message = `${method}|${endpoint}|${dataToSign}`;","","const signature = CryptoJS.HmacSHA256(message, secretKey).toString(CryptoJS.enc.Hex);","pm.collectionVariables.set(\"signature\", signature);","console.log([\"script_message\", message]);",""],"type":"text/javascript","packages":{},"id":"705705e8-9089-4af0-aa62-0a4c25bb1a68"}}],"id":"74f5ac8b-a3ad-44d2-8720-1c5487148443","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"DELETE","header":[{"key":"accept","value":"application/json"},{"key":"APIKey","value":"","type":"text"},{"key":"APISign","value":"","type":"text"}],"url":"https://api.novabtc.io/api/v2/orders/1","urlObject":{"path":["api","v2","orders","1"],"host":["https://api.novabtc.io"],"query":[],"variable":[]}},"response":[],"_postman_id":"74f5ac8b-a3ad-44d2-8720-1c5487148443"},{"name":"cancel_all","event":[{"listen":"prerequest","script":{"exec":["const secretKey = pm.collectionVariables.get(\"secret_key\");","const method = pm.request.method;","const endpoint = pm.request.url.getPath();","","let dataToSign;","","function objectToQueryString(obj) {","    const flatObject = flattenObject(obj);","    const sortedKeys = Object.keys(flatObject).sort();","    const queryParams = sortedKeys.map(key => `${key}=${flatObject[key]}`);","    return queryParams.join('&');","}","","function flattenObject(obj, parentKey = '', res = {}) {","    for (let key in obj) {","        const propName = parentKey ? parentKey + '_' + key : key;","        if (typeof obj[key] === 'object' && obj[key] !== null && !Array.isArray(obj[key]))","            flattenObject(obj[key], propName, res);","        else","            res[propName] = obj[key];","    }","    return res;","}","","if (method === \"GET\") {","    const queryParams = pm.request.url.query.all();","    queryParams.sort((a, b) => a.key.localeCompare(b.key));","    dataToSign = queryParams.map(param => `${param.key}=${param.value}`).join('&');","} else if ([\"POST\", \"PUT\", \"PATCH\", \"DELETE\"].includes(method)) {","    const requestBody = JSON.parse(pm.request.body.raw || '{}');","    dataToSign = objectToQueryString(requestBody);","}","","const message = `${method}|${endpoint}|${dataToSign}`;","","const signature = CryptoJS.HmacSHA256(message, secretKey).toString(CryptoJS.enc.Hex);","pm.collectionVariables.set(\"signature\", signature);","console.log([\"script_message\", message]);",""],"type":"text/javascript","packages":{},"id":"36b0f780-a639-423e-8cb6-4e5c70913bd3"}}],"id":"7b8042b3-7223-4aa6-808e-0503c3bedab6","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"DELETE","header":[{"key":"accept","value":"application/json"},{"key":"APIKey","value":"","type":"text"},{"key":"APISign","value":"","type":"text"}],"url":"https://api.novabtc.io/api/v2/orders","urlObject":{"path":["api","v2","orders"],"host":["https://api.novabtc.io"],"query":[],"variable":[]}},"response":[],"_postman_id":"7b8042b3-7223-4aa6-808e-0503c3bedab6"},{"name":"create","event":[{"listen":"prerequest","script":{"exec":["const secretKey = pm.collectionVariables.get(\"master_secret_key\");","const method = pm.request.method;","const endpoint = pm.request.url.getPath();","","let dataToSign;","","function objectToQueryString(obj) {","    const flatObject = flattenObject(obj);","    const sortedKeys = Object.keys(flatObject).sort();","    const queryParams = sortedKeys.map(key => `${key}=${flatObject[key]}`);","    return queryParams.join('&');","}","","function flattenObject(obj, parentKey = '', res = {}) {","    for (let key in obj) {","        const propName = parentKey ? parentKey + '_' + key : key;","        if (typeof obj[key] === 'object' && obj[key] !== null && !Array.isArray(obj[key]))","            flattenObject(obj[key], propName, res);","        else","            res[propName] = obj[key];","    }","    return res;","}","","if (method === \"GET\") {","    const queryParams = pm.request.url.query.all();","    queryParams.sort((a, b) => a.key.localeCompare(b.key));","    dataToSign = queryParams.map(param => `${param.key}=${param.value}`).join('&');","} else if ([\"POST\", \"PUT\", \"PATCH\", \"DELETE\"].includes(method)) {","    const requestBody = JSON.parse(pm.request.body.raw || '{}');","    dataToSign = objectToQueryString(requestBody);","}","","const message = `${method}|${endpoint}|${dataToSign}`;","","const signature = CryptoJS.HmacSHA256(message, secretKey).toString(CryptoJS.enc.Hex);","pm.collectionVariables.set(\"master_signature\", signature);","console.log([\"script_message\", message]);",""],"type":"text/javascript","packages":{},"id":"40a9048d-d06e-4173-9427-f63070045a0f"}}],"id":"25d544c1-28dc-4566-a92a-13d25475caf2","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"accept","value":"application/json"},{"key":"Content-Type","value":"application/json","type":"text"},{"key":"APISign","value":"","type":"text"},{"key":"APIKey","value":"","type":"text"}],"body":{"mode":"raw","raw":"{\n\n  \"volume\": 20,\n  \"market\": \"trxusdt\",\n  \"side\": \"sell\",\n  \"ord_type\": \"market\"\n}","options":{"raw":{"language":"json"}}},"url":"https://api.novabtc.io/api/v2/orders","urlObject":{"path":["api","v2","orders"],"host":["https://api.novabtc.io"],"query":[],"variable":[]}},"response":[],"_postman_id":"25d544c1-28dc-4566-a92a-13d25475caf2"}],"id":"553480ce-6ec0-4007-80b1-ed59738fa295","_postman_id":"553480ce-6ec0-4007-80b1-ed59738fa295","description":""},{"name":"trades","item":[{"name":"list","event":[{"listen":"prerequest","script":{"exec":["const secretKey = pm.collectionVariables.get(\"secret_key\");","const method = pm.request.method;","const endpoint = pm.request.url.getPath();","","function replaceVariables(str) {","    return str.replace(/\\{\\{(\\w+)\\}\\}/g, (match, variableName) => {","        return pm.variables.get(variableName) || pm.collectionVariables.get(variableName) || match;","    });","}","","function objectToQueryString(obj) {","    const flatObject = flattenObject(obj);","    const sortedKeys = Object.keys(flatObject).sort();","    const queryParams = sortedKeys.map(key => `${key}=${replaceVariables(flatObject[key])}`);","    return queryParams.join('&');","}","","function flattenObject(obj, parentKey = '', res = {}) {","    for (let key in obj) {","        const propName = parentKey ? parentKey + '_' + key : key;","        if (typeof obj[key] === 'object' && obj[key] !== null && !Array.isArray(obj[key]))","            flattenObject(obj[key], propName, res);","        else","            res[propName] = obj[key];","    }","    return res;","}","","let dataToSign;","if (method === \"GET\") {","    const queryParams = pm.request.url.query.all();","    queryParams.sort((a, b) => a.key.localeCompare(b.key));","    dataToSign = queryParams.map(param => `${param.key}=${replaceVariables(param.value)}`).join('&');","} else if ([\"POST\", \"PUT\", \"PATCH\", \"DELETE\"].includes(method)) {","    const requestBody = JSON.parse(replaceVariables(pm.request.body.raw || '{}'));","    dataToSign = objectToQueryString(requestBody);","}","","const message = `${method}|${endpoint}|${dataToSign}`;","","const signature = CryptoJS.HmacSHA256(message, secretKey).toString(CryptoJS.enc.Hex);","pm.collectionVariables.set(\"signature\", signature);","console.log([\"script_message\", message]);",""],"type":"text/javascript","packages":{},"id":"6a7a34b7-66c5-4d41-8e1b-7c21b6ecd135"}},{"listen":"test","script":{"exec":[],"type":"text/javascript","id":"85976b7d-b632-4306-b99a-bbb6892de0e1"}}],"id":"692a1670-8ff5-4886-b476-8fbf0e2805c6","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"accept","value":"application/json"},{"key":"APIKey","value":"","type":"text"},{"key":"APISign","value":"","type":"text"}],"url":"https://api.novabtc.io/api/v2/trades?market={{market}}","urlObject":{"path":["api","v2","trades"],"host":["https://api.novabtc.io"],"query":[{"key":"market","value":"{{market}}"}],"variable":[]}},"response":[],"_postman_id":"692a1670-8ff5-4886-b476-8fbf0e2805c6"}],"id":"b0fd9ec4-abd4-4b74-a0ac-e87db1cfefed","_postman_id":"b0fd9ec4-abd4-4b74-a0ac-e87db1cfefed","description":""},{"name":"settings","item":[{"name":"markets","event":[{"listen":"prerequest","script":{"exec":["const secretKey = pm.collectionVariables.get(\"secret_key\");","const method = pm.request.method;","const endpoint = pm.request.url.getPath();","","let dataToSign;","","function objectToQueryString(obj) {","    const flatObject = flattenObject(obj);","    const sortedKeys = Object.keys(flatObject).sort();","    const queryParams = sortedKeys.map(key => `${key}=${flatObject[key]}`);","    return queryParams.join('&');","}","","function flattenObject(obj, parentKey = '', res = {}) {","    for (let key in obj) {","        const propName = parentKey ? parentKey + '_' + key : key;","        if (typeof obj[key] === 'object' && obj[key] !== null && !Array.isArray(obj[key]))","            flattenObject(obj[key], propName, res);","        else","            res[propName] = obj[key];","    }","    return res;","}","","if (method === \"GET\") {","    const queryParams = pm.request.url.query.all();","    queryParams.sort((a, b) => a.key.localeCompare(b.key));","    dataToSign = queryParams.map(param => `${param.key}=${param.value}`).join('&');","} else if ([\"POST\", \"PUT\", \"PATCH\", \"DELETE\"].includes(method)) {","    const requestBody = JSON.parse(pm.request.body.raw || '{}');","    dataToSign = objectToQueryString(requestBody);","}","","const message = `${method}|${endpoint}|${dataToSign}`;","","const signature = CryptoJS.HmacSHA256(message, secretKey).toString(CryptoJS.enc.Hex);","pm.collectionVariables.set(\"signature\", signature);","console.log([\"script_message\", message]);",""],"type":"text/javascript","packages":{},"id":"125f92ef-882e-4470-9f3e-7a0280a4418e"}}],"id":"da91a68f-5049-43a9-a431-a57b16825a66","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"accept","value":"application/json"},{"key":"APIKey","value":"","type":"text"},{"key":"APISign","value":"","type":"text"}],"url":"https://api.novabtc.io/api/v2/settings/markets","urlObject":{"path":["api","v2","settings","markets"],"host":["https://api.novabtc.io"],"query":[],"variable":[]}},"response":[],"_postman_id":"da91a68f-5049-43a9-a431-a57b16825a66"},{"name":"currencies","event":[{"listen":"prerequest","script":{"exec":["const secretKey = pm.collectionVariables.get(\"secret_key\");","const method = pm.request.method;","const endpoint = pm.request.url.getPath();","","let dataToSign;","","function objectToQueryString(obj) {","    const flatObject = flattenObject(obj);","    const sortedKeys = Object.keys(flatObject).sort();","    const queryParams = sortedKeys.map(key => `${key}=${flatObject[key]}`);","    return queryParams.join('&');","}","","function flattenObject(obj, parentKey = '', res = {}) {","    for (let key in obj) {","        const propName = parentKey ? parentKey + '_' + key : key;","        if (typeof obj[key] === 'object' && obj[key] !== null && !Array.isArray(obj[key]))","            flattenObject(obj[key], propName, res);","        else","            res[propName] = obj[key];","    }","    return res;","}","","if (method === \"GET\") {","    const queryParams = pm.request.url.query.all();","    queryParams.sort((a, b) => a.key.localeCompare(b.key));","    dataToSign = queryParams.map(param => `${param.key}=${param.value}`).join('&');","} else if ([\"POST\", \"PUT\", \"PATCH\", \"DELETE\"].includes(method)) {","    const requestBody = JSON.parse(pm.request.body.raw || '{}');","    dataToSign = objectToQueryString(requestBody);","}","","const message = `${method}|${endpoint}|${dataToSign}`;","","const signature = CryptoJS.HmacSHA256(message, secretKey).toString(CryptoJS.enc.Hex);","pm.collectionVariables.set(\"signature\", signature);","console.log([\"script_message\", message]);",""],"type":"text/javascript","packages":{},"id":"39816032-9212-4296-badc-72252bcee77b"}}],"id":"6a9db5ce-75a4-4312-b571-49da40155095","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"accept","value":"application/json"},{"key":"APIKey","value":"","type":"text"},{"key":"APISign","value":"","type":"text"}],"url":"https://api.novabtc.io/api/v2/settings/currencies","urlObject":{"path":["api","v2","settings","currencies"],"host":["https://api.novabtc.io"],"query":[],"variable":[]}},"response":[],"_postman_id":"6a9db5ce-75a4-4312-b571-49da40155095"}],"id":"f660271e-2b3f-44a2-a17d-e0102562ef57","_postman_id":"f660271e-2b3f-44a2-a17d-e0102562ef57","description":""},{"name":"tools","item":[{"name":"info","event":[{"listen":"prerequest","script":{"exec":[""],"type":"text/javascript","packages":{},"id":"273d87b5-d6c7-469d-b74c-f55ec86fe0c3"}}],"id":"bbb3d41d-a340-4f36-80d2-928c8b16b0e7","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"accept","value":"application/json"}],"url":"https://api.novabtc.io/api/v2/tools/info","urlObject":{"path":["api","v2","tools","info"],"host":["https://api.novabtc.io"],"query":[],"variable":[]}},"response":[],"_postman_id":"bbb3d41d-a340-4f36-80d2-928c8b16b0e7"},{"name":"services","event":[{"listen":"prerequest","script":{"exec":[""],"type":"text/javascript","packages":{},"id":"0032d121-095a-426f-8b10-03a543adb204"}}],"id":"170d8d15-51a4-4126-a105-6b54d47b7c49","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"accept","value":"application/json"}],"url":"https://api.novabtc.io/api/v2/tools/services","urlObject":{"path":["api","v2","tools","services"],"host":["https://api.novabtc.io"],"query":[],"variable":[]}},"response":[],"_postman_id":"170d8d15-51a4-4126-a105-6b54d47b7c49"},{"name":"timestamp","event":[{"listen":"prerequest","script":{"exec":[""],"type":"text/javascript","packages":{},"id":"fd293045-179b-4287-bbd0-64b224265b89"}}],"id":"4d2999b9-1827-4224-8fa9-be35fcc23f0e","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"accept","value":"application/json"}],"url":"https://api.novabtc.io/api/v2/tools/timestamp","urlObject":{"path":["api","v2","tools","timestamp"],"host":["https://api.novabtc.io"],"query":[],"variable":[]}},"response":[],"_postman_id":"4d2999b9-1827-4224-8fa9-be35fcc23f0e"}],"id":"d117feb3-9fbb-44e9-a5e6-57970787cac8","_postman_id":"d117feb3-9fbb-44e9-a5e6-57970787cac8","description":""}],"event":[{"listen":"prerequest","script":{"type":"text/javascript","packages":{},"exec":["const secretKey = pm.collectionVariables.get(\"secret_key\");","const method = pm.request.method;","const endpoint = pm.request.url.getPath();","","let dataToSign;","","function objectToQueryString(obj) {","    const flatObject = flattenObject(obj);","    const sortedKeys = Object.keys(flatObject).sort();","    const queryParams = sortedKeys.map(key => `${key}=${flatObject[key]}`);","    return queryParams.join('&');","}","","function flattenObject(obj, parentKey = '', res = {}) {","    for (let key in obj) {","        const propName = parentKey ? parentKey + '_' + key : key;","        if (typeof obj[key] === 'object' && obj[key] !== null && !Array.isArray(obj[key]))","            flattenObject(obj[key], propName, res);","        else","            res[propName] = obj[key];","    }","    return res;","}","","if (method === \"GET\") {","    const queryParams = pm.request.url.query.all();","    queryParams.sort((a, b) => a.key.localeCompare(b.key));","    dataToSign = queryParams.map(param => `${param.key}=${param.value}`).join('&');","} else if ([\"POST\", \"PUT\", \"PATCH\", \"DELETE\"].includes(method)) {","    const requestBody = JSON.parse(pm.request.body.raw || '{}');","    dataToSign = objectToQueryString(requestBody);","}","","// const message = `${method}|${endpoint}|${dataToSign}`;","const message = 'GET|/api/v2/exchanges/estimate|amount=0.05&input_asset=btc&output_asset=xrp';","","const signature = CryptoJS.HmacSHA256(message, secretKey).toString(CryptoJS.enc.Hex);","pm.collectionVariables.set(\"signature\", signature);","console.log([\"script_message\", message]);",""],"id":"40a880e7-189d-452b-980b-d9175adbc160"}},{"listen":"test","script":{"type":"text/javascript","packages":{},"exec":[""],"id":"ef21cf32-7ae8-47c3-91ec-9affbd4baf29"}}],"variable":[{"key":"base_url","value":"https://api.novabtc.io","type":"string"},{"key":"access_key","value":"","type":"string"},{"key":"secret_key","value":"","type":"string"},{"key":"signature","value":""}]}