> For the complete documentation index, see [llms.txt](https://www.pionex.com/docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://www.pionex.com/docs/api-docs/earn-dual-api/dual.md).

# Dual

Dual Investment endpoints

## List supported trading pairs

> Returns all trading pairs supported by Dual Investment, optionally filtered by base currency. Weight: 1.\
> \
> Supported quote currencies include: \`USDT\`, \`USDC\`, \`USD\`, \`USDXO\`.\
> \
> Example request:\
> \`\`\`\
> GET /api/v1/earn/dual/symbols?base=BTC\
> \`\`\`\
> \
> Example response:\
> \`\`\`json\
> {\
> &#x20; "result": true,\
> &#x20; "data": {\
> &#x20;   "coins": \[\
> &#x20;     {\
> &#x20;       "base": "BTC",\
> &#x20;       "quote": "USDT",\
> &#x20;       "currency": "USDT",\
> &#x20;       "basePrecision": 8,\
> &#x20;       "currencyPrecision": 8,\
> &#x20;       "baseMin": "0.00001",\
> &#x20;       "currencyMin": "1",\
> &#x20;       "baseMax": "80",\
> &#x20;       "currencyMax": "2000000"\
> &#x20;     }\
> &#x20;   ]\
> &#x20; },\
> &#x20; "timestamp": 1774959429596\
> }\
> \`\`\`<br>

````json
{"openapi":"3.0.3","info":{"title":"Pionex Earn Open API - Dual Investment","version":"1.0.0"},"tags":[{"name":"Dual","description":"Dual Investment endpoints"}],"servers":[{"url":"https://api.pionex.com","description":"Production"}],"security":[],"paths":{"/api/v1/earn/dual/symbols":{"get":{"tags":["Dual"],"summary":"List supported trading pairs","description":"Returns all trading pairs supported by Dual Investment, optionally filtered by base currency. Weight: 1.\n\nSupported quote currencies include: `USDT`, `USDC`, `USD`, `USDXO`.\n\nExample request:\n```\nGET /api/v1/earn/dual/symbols?base=BTC\n```\n\nExample response:\n```json\n{\n  \"result\": true,\n  \"data\": {\n    \"coins\": [\n      {\n        \"base\": \"BTC\",\n        \"quote\": \"USDT\",\n        \"currency\": \"USDT\",\n        \"basePrecision\": 8,\n        \"currencyPrecision\": 8,\n        \"baseMin\": \"0.00001\",\n        \"currencyMin\": \"1\",\n        \"baseMax\": \"80\",\n        \"currencyMax\": \"2000000\"\n      }\n    ]\n  },\n  \"timestamp\": 1774959429596\n}\n```\n","operationId":"dualSymbols","parameters":[{"name":"base","in":"query","required":false,"description":"Base currency filter (e.g. `BTC`, `ETH`). Omit to return all supported pairs.","schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/BaseResponse"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/DualSymbolsData"}}}]}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}}},"components":{"schemas":{"BaseResponse":{"type":"object","properties":{"result":{"type":"boolean","description":"Whether the request succeeded"},"timestamp":{"type":"integer","format":"int64","description":"Response timestamp in milliseconds"}}},"DualSymbolsData":{"type":"object","properties":{"coins":{"type":"array","items":{"$ref":"#/components/schemas/DualCoinSymbol"}}}},"DualCoinSymbol":{"type":"object","properties":{"base":{"type":"string","description":"Base currency"},"quote":{"type":"string","description":"Quote currency. Supported values: `USDT`, `USDC`, `USD`, `USDXO`"},"currency":{"type":"string","description":"Investment currency (the currency used to place the order)"},"basePrecision":{"type":"integer","format":"int64","description":"Decimal precision for base currency amounts"},"currencyPrecision":{"type":"integer","format":"int64","description":"Decimal precision for investment currency amounts"},"baseMin":{"type":"string","description":"Minimum investment amount in base currency"},"currencyMin":{"type":"string","description":"Minimum investment amount in investment currency"},"baseMax":{"type":"string","description":"Maximum investment amount in base currency"},"currencyMax":{"type":"string","description":"Maximum investment amount in investment currency"}}},"ErrorResponse":{"type":"object","properties":{"result":{"type":"boolean"},"code":{"type":"string","description":"Error code (e.g. `DUAL_PARAMETER_ERROR`)"},"message":{"type":"string","description":"Human-readable error message"},"timestamp":{"type":"integer","format":"int64"}}}},"responses":{"BadRequest":{"description":"Bad request — invalid parameters. Common error code: `DUAL_PARAMETER_ERROR`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}}
````

## List open products

> Returns currently open Dual Investment products for a specific trading pair and type. Weight: 1.\
> \
> \*\*Type semantics:\*\*\
> \- \`DUAL\_BASE\`: invest in base currency (e.g. BTC); if price rises above strike at expiry, principal + yield are returned in base currency, otherwise converted to quote currency\
> \- \`DUAL\_CURRENCY\`: invest in quote/investment currency (e.g. USDT); if price falls below strike at expiry, principal + yield are returned in quote currency, otherwise converted to base currency\
> \
> \*\*Quote currency rules:\*\*\
> \- \`base=BTC\` or \`base=ETH\`: use \`quote=USDXO\`, \`currency=USDT\` or \`USDC\`\
> \- All other base currencies: use \`quote=USDT\`, \`currency=USDT\`\
> \
> Example request (BTC, DUAL\_BASE):\
> \`\`\`\
> GET /api/v1/earn/dual/openProducts?base=BTC\&quote=USDXO\&currency=USDT\&type=DUAL\_BASE\
> \`\`\`\
> \
> Example request (XRP, DUAL\_BASE):\
> \`\`\`\
> GET /api/v1/earn/dual/openProducts?base=XRP\&quote=USDT\&currency=USDT\&type=DUAL\_BASE\
> \`\`\`\
> \
> Example response:\
> \`\`\`json\
> {\
> &#x20; "result": true,\
> &#x20; "data": {\
> &#x20;   "products": \[\
> &#x20;     {\
> &#x20;       "productId": "BTC-USDXO-260401-69000-C-USDT",\
> &#x20;       "base": "BTC",\
> &#x20;       "quote": "USDXO",\
> &#x20;       "currency": "USDT",\
> &#x20;       "type": "DUAL\_BASE",\
> &#x20;       "createTime": 1774686600000,\
> &#x20;       "expireTime": 1775030400000,\
> &#x20;       "strike": "69000",\
> &#x20;       "expired": false\
> &#x20;     }\
> &#x20;   ]\
> &#x20; },\
> &#x20; "timestamp": 1775025855477\
> }\
> \`\`\`<br>

````json
{"openapi":"3.0.3","info":{"title":"Pionex Earn Open API - Dual Investment","version":"1.0.0"},"tags":[{"name":"Dual","description":"Dual Investment endpoints"}],"servers":[{"url":"https://api.pionex.com","description":"Production"}],"security":[],"paths":{"/api/v1/earn/dual/openProducts":{"get":{"tags":["Dual"],"summary":"List open products","description":"Returns currently open Dual Investment products for a specific trading pair and type. Weight: 1.\n\n**Type semantics:**\n- `DUAL_BASE`: invest in base currency (e.g. BTC); if price rises above strike at expiry, principal + yield are returned in base currency, otherwise converted to quote currency\n- `DUAL_CURRENCY`: invest in quote/investment currency (e.g. USDT); if price falls below strike at expiry, principal + yield are returned in quote currency, otherwise converted to base currency\n\n**Quote currency rules:**\n- `base=BTC` or `base=ETH`: use `quote=USDXO`, `currency=USDT` or `USDC`\n- All other base currencies: use `quote=USDT`, `currency=USDT`\n\nExample request (BTC, DUAL_BASE):\n```\nGET /api/v1/earn/dual/openProducts?base=BTC&quote=USDXO&currency=USDT&type=DUAL_BASE\n```\n\nExample request (XRP, DUAL_BASE):\n```\nGET /api/v1/earn/dual/openProducts?base=XRP&quote=USDT&currency=USDT&type=DUAL_BASE\n```\n\nExample response:\n```json\n{\n  \"result\": true,\n  \"data\": {\n    \"products\": [\n      {\n        \"productId\": \"BTC-USDXO-260401-69000-C-USDT\",\n        \"base\": \"BTC\",\n        \"quote\": \"USDXO\",\n        \"currency\": \"USDT\",\n        \"type\": \"DUAL_BASE\",\n        \"createTime\": 1774686600000,\n        \"expireTime\": 1775030400000,\n        \"strike\": \"69000\",\n        \"expired\": false\n      }\n    ]\n  },\n  \"timestamp\": 1775025855477\n}\n```\n","operationId":"dualProducts","parameters":[{"name":"base","in":"query","required":true,"description":"Base currency (e.g. `BTC`, `ETH`, `XRP`)","schema":{"type":"string"}},{"name":"quote","in":"query","required":true,"description":"Quote currency. Use `USDXO` for BTC/ETH; use `USDT` for all other base currencies.","schema":{"type":"string","enum":["USDT","USDC","USDXO"]}},{"name":"type","in":"query","required":true,"description":"`DUAL_BASE` — invest in base currency; `DUAL_CURRENCY` — invest in quote/investment currency","schema":{"type":"string","enum":["DUAL_BASE","DUAL_CURRENCY"]}},{"name":"currency","in":"query","required":false,"description":"Investment currency filter. For BTC/ETH pairs: `USDT` or `USDC`. For other pairs: `USDT`.","schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/BaseResponse"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/DualProductsData"}}}]}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}}},"components":{"schemas":{"BaseResponse":{"type":"object","properties":{"result":{"type":"boolean","description":"Whether the request succeeded"},"timestamp":{"type":"integer","format":"int64","description":"Response timestamp in milliseconds"}}},"DualProductsData":{"type":"object","properties":{"products":{"type":"array","items":{"$ref":"#/components/schemas/DualProduct"}}}},"DualProduct":{"type":"object","properties":{"productId":{"type":"string","description":"Unique product ID. Format: `{BASE}-{QUOTE}-{YYMMDD}-{STRIKE}-{C|P}-{CURRENCY}`. `C` = DUAL_BASE, `P` = DUAL_CURRENCY."},"base":{"type":"string","description":"Base currency"},"quote":{"type":"string","description":"Quote currency"},"currency":{"type":"string","description":"Investment currency"},"type":{"type":"string","description":"`DUAL_BASE` — invest in base currency; `DUAL_CURRENCY` — invest in quote/investment currency","enum":["DUAL_BASE","DUAL_CURRENCY"]},"createTime":{"type":"integer","format":"int64","description":"Product creation timestamp in milliseconds"},"expireTime":{"type":"integer","format":"int64","description":"Product expiry timestamp in milliseconds"},"strike":{"type":"string","description":"Strike price — the threshold price at settlement"},"expired":{"type":"boolean","description":"Whether the product has already expired"}}},"ErrorResponse":{"type":"object","properties":{"result":{"type":"boolean"},"code":{"type":"string","description":"Error code (e.g. `DUAL_PARAMETER_ERROR`)"},"message":{"type":"string","description":"Human-readable error message"},"timestamp":{"type":"integer","format":"int64"}}}},"responses":{"BadRequest":{"description":"Bad request — invalid parameters. Common error code: `DUAL_PARAMETER_ERROR`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}}
````

## Get product prices

> Returns the latest yield rate and investability status for Dual Investment products. Weight: 1.\
> \
> \*\*All three parameters are required:\*\* \`base\`, \`quote\`, and \`productIds\`.\
> Omitting any one of them will return a \`DUAL\_PARAMETER\_ERROR\`.\
> \
> \`productIds\` is a comma-separated list of product IDs. Works for both \`USDT\` and \`USDXO\` quoted pairs.\
> \
> When \`canInvest\` is \`false\`, \`profit\` and \`baseSize\` will be empty strings.\
> \
> \> \*\*Workflow note:\*\* Always call this endpoint before placing an order. The \`profit\` value returned here must be passed as-is to \`POST /api/v1/earn/dual/invest\`. Submitting a stale or mismatched \`profit\` will be rejected.\
> \
> Example request (USDT pair):\
> \`\`\`\
> GET /api/v1/earn/dual/prices?base=LRC\&quote=USDT\&productIds=LRC-USDT-260410-0.03-C-USDT,LRC-USDT-260410-0.02-C-USDT\
> \`\`\`\
> \
> Example request (USDXO pair):\
> \`\`\`\
> GET /api/v1/earn/dual/prices?base=ETH\&quote=USDXO\&productIds=ETH-USDXO-260410-3000-C-USDT,ETH-USDXO-260410-2900-C-USDT\
> \`\`\`\
> \
> Example response:\
> \`\`\`json\
> {\
> &#x20; "result": true,\
> &#x20; "data": {\
> &#x20;   "products": \[\
> &#x20;     {\
> &#x20;       "productId": "LRC-USDT-260410-0.02-C-USDT",\
> &#x20;       "canInvest": true,\
> &#x20;       "profit": "0.01242",\
> &#x20;       "baseSize": "8000000",\
> &#x20;       "updateTime": 1775026225630\
> &#x20;     },\
> &#x20;     {\
> &#x20;       "productId": "LRC-USDT-260410-0.03-C-USDT",\
> &#x20;       "canInvest": false,\
> &#x20;       "profit": "0",\
> &#x20;       "baseSize": "",\
> &#x20;       "updateTime": 0\
> &#x20;     }\
> &#x20;   ]\
> &#x20; },\
> &#x20; "timestamp": 1775026244892\
> }\
> \`\`\`<br>

````json
{"openapi":"3.0.3","info":{"title":"Pionex Earn Open API - Dual Investment","version":"1.0.0"},"tags":[{"name":"Dual","description":"Dual Investment endpoints"}],"servers":[{"url":"https://api.pionex.com","description":"Production"}],"security":[],"paths":{"/api/v1/earn/dual/prices":{"get":{"tags":["Dual"],"summary":"Get product prices","description":"Returns the latest yield rate and investability status for Dual Investment products. Weight: 1.\n\n**All three parameters are required:** `base`, `quote`, and `productIds`.\nOmitting any one of them will return a `DUAL_PARAMETER_ERROR`.\n\n`productIds` is a comma-separated list of product IDs. Works for both `USDT` and `USDXO` quoted pairs.\n\nWhen `canInvest` is `false`, `profit` and `baseSize` will be empty strings.\n\n> **Workflow note:** Always call this endpoint before placing an order. The `profit` value returned here must be passed as-is to `POST /api/v1/earn/dual/invest`. Submitting a stale or mismatched `profit` will be rejected.\n\nExample request (USDT pair):\n```\nGET /api/v1/earn/dual/prices?base=LRC&quote=USDT&productIds=LRC-USDT-260410-0.03-C-USDT,LRC-USDT-260410-0.02-C-USDT\n```\n\nExample request (USDXO pair):\n```\nGET /api/v1/earn/dual/prices?base=ETH&quote=USDXO&productIds=ETH-USDXO-260410-3000-C-USDT,ETH-USDXO-260410-2900-C-USDT\n```\n\nExample response:\n```json\n{\n  \"result\": true,\n  \"data\": {\n    \"products\": [\n      {\n        \"productId\": \"LRC-USDT-260410-0.02-C-USDT\",\n        \"canInvest\": true,\n        \"profit\": \"0.01242\",\n        \"baseSize\": \"8000000\",\n        \"updateTime\": 1775026225630\n      },\n      {\n        \"productId\": \"LRC-USDT-260410-0.03-C-USDT\",\n        \"canInvest\": false,\n        \"profit\": \"0\",\n        \"baseSize\": \"\",\n        \"updateTime\": 0\n      }\n    ]\n  },\n  \"timestamp\": 1775026244892\n}\n```\n","operationId":"dualPrices","parameters":[{"name":"base","in":"query","required":true,"description":"Base currency (e.g. `BTC`, `ETH`, `LRC`)","schema":{"type":"string"}},{"name":"quote","in":"query","required":true,"description":"Quote currency. Use `USDXO` for BTC/ETH pairs; use `USDT` for all other base currencies.","schema":{"type":"string","enum":["USDT","USDC","USDXO"]}},{"name":"productIds","in":"query","required":true,"description":"Comma-separated product ID list. Multiple IDs are supported (e.g. `ETH-USDXO-260410-3000-C-USDT,ETH-USDXO-260410-2900-C-USDT`). Obtain IDs from `/openProducts`.","schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/BaseResponse"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/DualPricesData"}}}]}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}}},"components":{"schemas":{"BaseResponse":{"type":"object","properties":{"result":{"type":"boolean","description":"Whether the request succeeded"},"timestamp":{"type":"integer","format":"int64","description":"Response timestamp in milliseconds"}}},"DualPricesData":{"type":"object","properties":{"products":{"type":"array","items":{"$ref":"#/components/schemas/DualPrice"}}}},"DualPrice":{"type":"object","properties":{"productId":{"type":"string","description":"Product ID"},"canInvest":{"type":"boolean","description":"Whether the product is currently open for new investment"},"profit":{"type":"string","description":"Annualized yield rate (e.g. `0.0215` = 2.15%)"},"baseSize":{"type":"string","description":"Base currency amount per unit"},"updateTime":{"type":"integer","format":"int64","description":"Last price update timestamp in milliseconds"}}},"ErrorResponse":{"type":"object","properties":{"result":{"type":"boolean"},"code":{"type":"string","description":"Error code (e.g. `DUAL_PARAMETER_ERROR`)"},"message":{"type":"string","description":"Human-readable error message"},"timestamp":{"type":"integer","format":"int64"}}}},"responses":{"BadRequest":{"description":"Bad request — invalid parameters. Common error code: `DUAL_PARAMETER_ERROR`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}}
````

## Get underlying index price

> Returns the real-time index price for a Dual Investment underlying asset. Weight: 1.\
> \
> Both \`base\` and \`quote\` are required. Works for both \`USDT\` and \`USDXO\` quoted pairs.\
> \
> The index price is the reference price used at settlement to determine whether the strike price was hit.\
> \
> Example request (USDXO pair):\
> \`\`\`\
> GET /api/v1/earn/dual/index?base=BTC\&quote=USDXO\
> \`\`\`\
> \
> Example request (USDT pair):\
> \`\`\`\
> GET /api/v1/earn/dual/index?base=LRC\&quote=USDT\
> \`\`\`\
> \
> Example response:\
> \`\`\`json\
> {\
> &#x20; "result": true,\
> &#x20; "data": {\
> &#x20;   "index": "69142.6",\
> &#x20;   "base": "BTC",\
> &#x20;   "quote": "USDXO",\
> &#x20;   "updateTime": 1775025942486\
> &#x20; },\
> &#x20; "timestamp": 1775025942754\
> }\
> \`\`\`<br>

````json
{"openapi":"3.0.3","info":{"title":"Pionex Earn Open API - Dual Investment","version":"1.0.0"},"tags":[{"name":"Dual","description":"Dual Investment endpoints"}],"servers":[{"url":"https://api.pionex.com","description":"Production"}],"security":[],"paths":{"/api/v1/earn/dual/index":{"get":{"tags":["Dual"],"summary":"Get underlying index price","description":"Returns the real-time index price for a Dual Investment underlying asset. Weight: 1.\n\nBoth `base` and `quote` are required. Works for both `USDT` and `USDXO` quoted pairs.\n\nThe index price is the reference price used at settlement to determine whether the strike price was hit.\n\nExample request (USDXO pair):\n```\nGET /api/v1/earn/dual/index?base=BTC&quote=USDXO\n```\n\nExample request (USDT pair):\n```\nGET /api/v1/earn/dual/index?base=LRC&quote=USDT\n```\n\nExample response:\n```json\n{\n  \"result\": true,\n  \"data\": {\n    \"index\": \"69142.6\",\n    \"base\": \"BTC\",\n    \"quote\": \"USDXO\",\n    \"updateTime\": 1775025942486\n  },\n  \"timestamp\": 1775025942754\n}\n```\n","operationId":"dualIndex","parameters":[{"name":"base","in":"query","required":true,"description":"Base currency (e.g. `BTC`, `ETH`, `LRC`)","schema":{"type":"string"}},{"name":"quote","in":"query","required":true,"description":"Quote currency. Use `USDXO` for BTC/ETH pairs; use `USDT` for all other base currencies.","schema":{"type":"string","enum":["USDT","USDC","USDXO"]}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/BaseResponse"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/DualIndexData"}}}]}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}}},"components":{"schemas":{"BaseResponse":{"type":"object","properties":{"result":{"type":"boolean","description":"Whether the request succeeded"},"timestamp":{"type":"integer","format":"int64","description":"Response timestamp in milliseconds"}}},"DualIndexData":{"type":"object","properties":{"index":{"type":"string","description":"Current real-time index price"},"base":{"type":"string","description":"Base currency"},"quote":{"type":"string","description":"Quote currency"},"updateTime":{"type":"integer","format":"int64","description":"Last update timestamp in milliseconds"}}},"ErrorResponse":{"type":"object","properties":{"result":{"type":"boolean"},"code":{"type":"string","description":"Error code (e.g. `DUAL_PARAMETER_ERROR`)"},"message":{"type":"string","description":"Human-readable error message"},"timestamp":{"type":"integer","format":"int64"}}}},"responses":{"BadRequest":{"description":"Bad request — invalid parameters. Common error code: `DUAL_PARAMETER_ERROR`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}}
````

## Get historical delivery prices

> Returns historical settlement delivery prices for a Dual Investment pair. Weight: 1.\
> \
> The delivery price is the index price recorded at the exact moment of each product's expiry,\
> used to determine the settlement direction (base or quote currency payout).\
> \
> \`base\` is required. \`quote\` is optional but recommended to narrow results — use \`USDXO\` for BTC/ETH pairs and \`USDT\` for all other base currencies.\
> \
> Example request (BTC/USDXO):\
> \`\`\`\
> GET /api/v1/earn/dual/deliveryPrices?base=BTC\&quote=USDXO\
> \`\`\`\
> \
> Example request (XRP/USDT):\
> \`\`\`\
> GET /api/v1/earn/dual/deliveryPrices?base=XRP\&quote=USDT\
> \`\`\`\
> \
> Example response:\
> \`\`\`json\
> {\
> &#x20; "result": true,\
> &#x20; "data": {\
> &#x20;   "prices": \[\
> &#x20;     {\
> &#x20;       "delivery": "69142.6",\
> &#x20;       "date": "2026-04-01",\
> &#x20;       "deliveryTime": 1775030400000\
> &#x20;     }\
> &#x20;   ]\
> &#x20; },\
> &#x20; "timestamp": 1775026529937\
> }\
> \`\`\`<br>

````json
{"openapi":"3.0.3","info":{"title":"Pionex Earn Open API - Dual Investment","version":"1.0.0"},"tags":[{"name":"Dual","description":"Dual Investment endpoints"}],"servers":[{"url":"https://api.pionex.com","description":"Production"}],"security":[],"paths":{"/api/v1/earn/dual/deliveryPrices":{"get":{"tags":["Dual"],"summary":"Get historical delivery prices","description":"Returns historical settlement delivery prices for a Dual Investment pair. Weight: 1.\n\nThe delivery price is the index price recorded at the exact moment of each product's expiry,\nused to determine the settlement direction (base or quote currency payout).\n\n`base` is required. `quote` is optional but recommended to narrow results — use `USDXO` for BTC/ETH pairs and `USDT` for all other base currencies.\n\nExample request (BTC/USDXO):\n```\nGET /api/v1/earn/dual/deliveryPrices?base=BTC&quote=USDXO\n```\n\nExample request (XRP/USDT):\n```\nGET /api/v1/earn/dual/deliveryPrices?base=XRP&quote=USDT\n```\n\nExample response:\n```json\n{\n  \"result\": true,\n  \"data\": {\n    \"prices\": [\n      {\n        \"delivery\": \"69142.6\",\n        \"date\": \"2026-04-01\",\n        \"deliveryTime\": 1775030400000\n      }\n    ]\n  },\n  \"timestamp\": 1775026529937\n}\n```\n","operationId":"deliveryPrices","parameters":[{"name":"base","in":"query","required":true,"description":"Base currency (e.g. `BTC`, `XRP`)","schema":{"type":"string"}},{"name":"quote","in":"query","required":false,"description":"Quote currency filter. Use `USDXO` for BTC/ETH pairs; use `USDT` for all other base currencies.","schema":{"type":"string","enum":["USDT","USDC","USDXO"]}},{"name":"startTime","in":"query","required":false,"description":"Start timestamp in milliseconds","schema":{"type":"integer","format":"int64"}},{"name":"endTime","in":"query","required":false,"description":"End timestamp in milliseconds","schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/BaseResponse"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/DeliveryPricesData"}}}]}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}}},"components":{"schemas":{"BaseResponse":{"type":"object","properties":{"result":{"type":"boolean","description":"Whether the request succeeded"},"timestamp":{"type":"integer","format":"int64","description":"Response timestamp in milliseconds"}}},"DeliveryPricesData":{"type":"object","properties":{"prices":{"type":"array","items":{"$ref":"#/components/schemas/DeliveryPrice"}}}},"DeliveryPrice":{"type":"object","properties":{"delivery":{"type":"string","description":"Settlement delivery price (index price at expiry)"},"date":{"type":"string","description":"Delivery date in `YYYY-MM-DD` format"},"deliveryTime":{"type":"integer","format":"int64","description":"Delivery timestamp in milliseconds"}}},"ErrorResponse":{"type":"object","properties":{"result":{"type":"boolean"},"code":{"type":"string","description":"Error code (e.g. `DUAL_PARAMETER_ERROR`)"},"message":{"type":"string","description":"Human-readable error message"},"timestamp":{"type":"integer","format":"int64"}}}},"responses":{"BadRequest":{"description":"Bad request — invalid parameters. Common error code: `DUAL_PARAMETER_ERROR`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}}
````

## Get user balances

> Returns the authenticated user's Dual Investment account balances. Requires \`View\` permission. Weight: 1.\
> \
> Example request:\
> \`\`\`\
> GET /api/v1/earn/dual/balances?timestamp=1774959429596\
> \`\`\`\
> \
> Example response:\
> \`\`\`json\
> {\
> &#x20; "result": true,\
> &#x20; "data": {\
> &#x20;   "balances": \[\
> &#x20;     {\
> &#x20;       "base": "BTC",\
> &#x20;       "coin": "USDT",\
> &#x20;       "free": "100.00",\
> &#x20;       "frozen": "50.00",\
> &#x20;       "updateTime": 1774959429596\
> &#x20;     }\
> &#x20;   ]\
> &#x20; },\
> &#x20; "timestamp": 1774959429596\
> }\
> \`\`\`<br>

````json
{"openapi":"3.0.3","info":{"title":"Pionex Earn Open API - Dual Investment","version":"1.0.0"},"tags":[{"name":"Dual","description":"Dual Investment endpoints"}],"servers":[{"url":"https://api.pionex.com","description":"Production"}],"security":[{"apiKey":[]}],"components":{"securitySchemes":{"apiKey":{"type":"apiKey","in":"header","name":"PIONEX-KEY","description":"API Key authentication. Requires two headers:\n- `PIONEX-KEY`: Your API Key\n- `PIONEX-SIGNATURE`: HMAC SHA256 hex signature\n\nAnd a `timestamp` query parameter (milliseconds).\n"}},"parameters":{"Timestamp":{"name":"timestamp","in":"query","required":true,"description":"Current timestamp in milliseconds (valid range +/- 20 seconds)","schema":{"type":"integer","format":"int64"}}},"schemas":{"BaseResponse":{"type":"object","properties":{"result":{"type":"boolean","description":"Whether the request succeeded"},"timestamp":{"type":"integer","format":"int64","description":"Response timestamp in milliseconds"}}},"DualBalancesData":{"type":"object","properties":{"balances":{"type":"array","items":{"$ref":"#/components/schemas/DualBalance"}}}},"DualBalance":{"type":"object","properties":{"base":{"type":"string","description":"Base currency this balance is associated with"},"coin":{"type":"string","description":"The actual currency of the balance"},"free":{"type":"string","description":"Available (unlocked) balance"},"frozen":{"type":"string","description":"Frozen balance currently locked in active orders"},"updateTime":{"type":"integer","format":"int64","description":"Last update timestamp in milliseconds"}}},"ErrorResponse":{"type":"object","properties":{"result":{"type":"boolean"},"code":{"type":"string","description":"Error code (e.g. `DUAL_PARAMETER_ERROR`)"},"message":{"type":"string","description":"Human-readable error message"},"timestamp":{"type":"integer","format":"int64"}}}},"responses":{"BadRequest":{"description":"Bad request — invalid parameters. Common error code: `DUAL_PARAMETER_ERROR`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"Unauthorized":{"description":"Authentication failed — missing or invalid API Key / signature","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"paths":{"/api/v1/earn/dual/balances":{"get":{"tags":["Dual"],"summary":"Get user balances","description":"Returns the authenticated user's Dual Investment account balances. Requires `View` permission. Weight: 1.\n\nExample request:\n```\nGET /api/v1/earn/dual/balances?timestamp=1774959429596\n```\n\nExample response:\n```json\n{\n  \"result\": true,\n  \"data\": {\n    \"balances\": [\n      {\n        \"base\": \"BTC\",\n        \"coin\": \"USDT\",\n        \"free\": \"100.00\",\n        \"frozen\": \"50.00\",\n        \"updateTime\": 1774959429596\n      }\n    ]\n  },\n  \"timestamp\": 1774959429596\n}\n```\n","operationId":"dualBalances","parameters":[{"$ref":"#/components/parameters/Timestamp"},{"name":"merge","in":"query","required":false,"description":"When `true`, merges balances with the same coin across different base currencies","schema":{"type":"boolean"}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/BaseResponse"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/DualBalancesData"}}}]}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}}}}}}
````

## Create investment order

> Creates a new Dual Investment order. Requires \`Earn\` permission. Weight: 1.\
> \
> Provide either \`baseAmount\` (invest in base currency) or \`currencyAmount\` (invest in investment currency), not both.\
> \
> \> \*\*Workflow:\*\* Call \`GET /api/v1/earn/dual/prices\` first to obtain the current \`profit\` value, then pass it unchanged to this endpoint. The \`profit\` field must match the live price — a stale or mismatched value will be rejected.\
> \
> Example request body:\
> \`\`\`json\
> {\
> &#x20; "base": "BTC",\
> &#x20; "productId": "BTC-USDXO-260402-68000-P-USDT",\
> &#x20; "clientDualId": "my-order-001",\
> &#x20; "currencyAmount": "100",\
> &#x20; "profit": "0.0039"\
> }\
> \`\`\`\
> \
> Example response:\
> \`\`\`json\
> {\
> &#x20; "result": true,\
> &#x20; "data": {\
> &#x20;   "clientDualId": "my-order-001",\
> &#x20;   "state": "CONFIRMED"\
> &#x20; },\
> &#x20; "timestamp": 1775027817297\
> }\
> \`\`\`<br>

````json
{"openapi":"3.0.3","info":{"title":"Pionex Earn Open API - Dual Investment","version":"1.0.0"},"tags":[{"name":"Dual","description":"Dual Investment endpoints"}],"servers":[{"url":"https://api.pionex.com","description":"Production"}],"security":[{"apiKey":[]}],"components":{"securitySchemes":{"apiKey":{"type":"apiKey","in":"header","name":"PIONEX-KEY","description":"API Key authentication. Requires two headers:\n- `PIONEX-KEY`: Your API Key\n- `PIONEX-SIGNATURE`: HMAC SHA256 hex signature\n\nAnd a `timestamp` query parameter (milliseconds).\n"}},"parameters":{"Timestamp":{"name":"timestamp","in":"query","required":true,"description":"Current timestamp in milliseconds (valid range +/- 20 seconds)","schema":{"type":"integer","format":"int64"}}},"schemas":{"DualInvestRequest":{"type":"object","required":["base"],"properties":{"base":{"type":"string","description":"Base currency"},"clientDualId":{"type":"string","description":"Client-assigned order ID used as an idempotency key. Recommended to avoid duplicate orders."},"productId":{"type":"string","description":"Product ID to invest in"},"baseAmount":{"type":"string","description":"Investment amount in base currency (e.g. BTC). Mutually exclusive with `currencyAmount`."},"currencyAmount":{"type":"string","description":"Investment amount in investment currency (e.g. USDT). Mutually exclusive with `baseAmount`."},"profit":{"type":"string","description":"Expected yield rate. Must match the current price from `/prices`."}}},"BaseResponse":{"type":"object","properties":{"result":{"type":"boolean","description":"Whether the request succeeded"},"timestamp":{"type":"integer","format":"int64","description":"Response timestamp in milliseconds"}}},"DualInvestData":{"type":"object","properties":{"clientDualId":{"type":"string","description":"Client-assigned dual investment order ID"},"state":{"type":"string","description":"Investment state after creation (e.g. `CONFIRMED`)"}}},"ErrorResponse":{"type":"object","properties":{"result":{"type":"boolean"},"code":{"type":"string","description":"Error code (e.g. `DUAL_PARAMETER_ERROR`)"},"message":{"type":"string","description":"Human-readable error message"},"timestamp":{"type":"integer","format":"int64"}}}},"responses":{"BadRequest":{"description":"Bad request — invalid parameters. Common error code: `DUAL_PARAMETER_ERROR`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"Unauthorized":{"description":"Authentication failed — missing or invalid API Key / signature","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"paths":{"/api/v1/earn/dual/invest":{"post":{"tags":["Dual"],"summary":"Create investment order","description":"Creates a new Dual Investment order. Requires `Earn` permission. Weight: 1.\n\nProvide either `baseAmount` (invest in base currency) or `currencyAmount` (invest in investment currency), not both.\n\n> **Workflow:** Call `GET /api/v1/earn/dual/prices` first to obtain the current `profit` value, then pass it unchanged to this endpoint. The `profit` field must match the live price — a stale or mismatched value will be rejected.\n\nExample request body:\n```json\n{\n  \"base\": \"BTC\",\n  \"productId\": \"BTC-USDXO-260402-68000-P-USDT\",\n  \"clientDualId\": \"my-order-001\",\n  \"currencyAmount\": \"100\",\n  \"profit\": \"0.0039\"\n}\n```\n\nExample response:\n```json\n{\n  \"result\": true,\n  \"data\": {\n    \"clientDualId\": \"my-order-001\",\n    \"state\": \"CONFIRMED\"\n  },\n  \"timestamp\": 1775027817297\n}\n```\n","operationId":"dualInvest","parameters":[{"$ref":"#/components/parameters/Timestamp"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DualInvestRequest"}}}},"responses":{"200":{"description":"Order created successfully","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/BaseResponse"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/DualInvestData"}}}]}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}}}}}}
````

## Revoke investment order

> Revokes a pending Dual Investment order before it is matched. Requires \`Earn\` permission. Weight: 1.\
> \
> Parameters are passed as a JSON request body, not query string.\
> Only orders in a pending/unmatched state can be revoked.\
> \
> Example request body:\
> \`\`\`json\
> {\
> &#x20; "base": "BTC",\
> &#x20; "productId": "BTC-USDXO-260402-68000-P-USDT",\
> &#x20; "clientDualId": "my-order-001"\
> }\
> \`\`\`\
> \
> Example response:\
> \`\`\`json\
> {\
> &#x20; "result": true,\
> &#x20; "data": {\
> &#x20;   "clientDualId": "my-order-001"\
> &#x20; },\
> &#x20; "timestamp": 1775027817297\
> }\
> \`\`\`<br>

````json
{"openapi":"3.0.3","info":{"title":"Pionex Earn Open API - Dual Investment","version":"1.0.0"},"tags":[{"name":"Dual","description":"Dual Investment endpoints"}],"servers":[{"url":"https://api.pionex.com","description":"Production"}],"security":[{"apiKey":[]}],"components":{"securitySchemes":{"apiKey":{"type":"apiKey","in":"header","name":"PIONEX-KEY","description":"API Key authentication. Requires two headers:\n- `PIONEX-KEY`: Your API Key\n- `PIONEX-SIGNATURE`: HMAC SHA256 hex signature\n\nAnd a `timestamp` query parameter (milliseconds).\n"}},"parameters":{"Timestamp":{"name":"timestamp","in":"query","required":true,"description":"Current timestamp in milliseconds (valid range +/- 20 seconds)","schema":{"type":"integer","format":"int64"}}},"schemas":{"DualRevokeInvestRequest":{"type":"object","required":["base","productId","clientDualId"],"properties":{"base":{"type":"string","description":"Base currency"},"productId":{"type":"string","description":"Product ID of the order to revoke"},"clientDualId":{"type":"string","description":"Client-assigned dual investment order ID"}}},"BaseResponse":{"type":"object","properties":{"result":{"type":"boolean","description":"Whether the request succeeded"},"timestamp":{"type":"integer","format":"int64","description":"Response timestamp in milliseconds"}}},"DualRevokeInvestData":{"type":"object","properties":{"clientDualId":{"type":"string","description":"Client-assigned dual investment order ID"}}},"ErrorResponse":{"type":"object","properties":{"result":{"type":"boolean"},"code":{"type":"string","description":"Error code (e.g. `DUAL_PARAMETER_ERROR`)"},"message":{"type":"string","description":"Human-readable error message"},"timestamp":{"type":"integer","format":"int64"}}}},"responses":{"BadRequest":{"description":"Bad request — invalid parameters. Common error code: `DUAL_PARAMETER_ERROR`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"Unauthorized":{"description":"Authentication failed — missing or invalid API Key / signature","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"paths":{"/api/v1/earn/dual/invest":{"delete":{"tags":["Dual"],"summary":"Revoke investment order","description":"Revokes a pending Dual Investment order before it is matched. Requires `Earn` permission. Weight: 1.\n\nParameters are passed as a JSON request body, not query string.\nOnly orders in a pending/unmatched state can be revoked.\n\nExample request body:\n```json\n{\n  \"base\": \"BTC\",\n  \"productId\": \"BTC-USDXO-260402-68000-P-USDT\",\n  \"clientDualId\": \"my-order-001\"\n}\n```\n\nExample response:\n```json\n{\n  \"result\": true,\n  \"data\": {\n    \"clientDualId\": \"my-order-001\"\n  },\n  \"timestamp\": 1775027817297\n}\n```\n","operationId":"dualRevokeInvest","parameters":[{"$ref":"#/components/parameters/Timestamp"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DualRevokeInvestRequest"}}}},"responses":{"200":{"description":"Order revoked successfully","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/BaseResponse"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/DualRevokeInvestData"}}}]}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}}}}}}
````

## Batch query investment orders

> Returns details for a batch of Dual Investment orders by client order ID list. Requires \`View\` permission. Weight: 1.\
> \
> Example request body:\
> \`\`\`json\
> {\
> &#x20; "base": "BTC",\
> &#x20; "clientDualIds": \["my-order-001", "my-order-002"]\
> }\
> \`\`\`<br>

````json
{"openapi":"3.0.3","info":{"title":"Pionex Earn Open API - Dual Investment","version":"1.0.0"},"tags":[{"name":"Dual","description":"Dual Investment endpoints"}],"servers":[{"url":"https://api.pionex.com","description":"Production"}],"security":[{"apiKey":[]}],"components":{"securitySchemes":{"apiKey":{"type":"apiKey","in":"header","name":"PIONEX-KEY","description":"API Key authentication. Requires two headers:\n- `PIONEX-KEY`: Your API Key\n- `PIONEX-SIGNATURE`: HMAC SHA256 hex signature\n\nAnd a `timestamp` query parameter (milliseconds).\n"}},"parameters":{"Timestamp":{"name":"timestamp","in":"query","required":true,"description":"Current timestamp in milliseconds (valid range +/- 20 seconds)","schema":{"type":"integer","format":"int64"}}},"schemas":{"DualGetInvestsRequest":{"type":"object","properties":{"base":{"type":"string","description":"Base currency"},"clientDualIds":{"type":"array","items":{"type":"string"},"description":"List of client-assigned dual investment order IDs to query"}}},"BaseResponse":{"type":"object","properties":{"result":{"type":"boolean","description":"Whether the request succeeded"},"timestamp":{"type":"integer","format":"int64","description":"Response timestamp in milliseconds"}}},"DualInvestRecordsData":{"type":"object","properties":{"records":{"type":"array","items":{"$ref":"#/components/schemas/DualRecord"}}}},"DualRecord":{"type":"object","properties":{"clientDualId":{"type":"string","description":"Client-assigned dual investment order ID"},"state":{"type":"string","description":"Investment state"},"productId":{"type":"string","description":"Product ID"},"type":{"type":"string","description":"`DUAL_BASE` — invest in base currency; `DUAL_CURRENCY` — invest in quote/investment currency","enum":["DUAL_BASE","DUAL_CURRENCY"]},"base":{"type":"string","description":"Base currency"},"quote":{"type":"string","description":"Quote currency"},"currency":{"type":"string","description":"Investment currency"},"strike":{"type":"string","description":"Strike price"},"expireTime":{"type":"integer","format":"int64","description":"Product expiry timestamp in milliseconds"},"baseAmount":{"type":"string","description":"Investment amount in base currency"},"currencyAmount":{"type":"string","description":"Investment amount in investment currency"},"profit":{"type":"string","description":"Yield rate at time of investment (e.g. `0.0215` = 2.15%)"},"baseFilled":{"type":"string","description":"Matched/filled amount in base currency"},"currencyFilled":{"type":"string","description":"Matched/filled amount in investment currency"},"settlementState":{"type":"string","description":"Settlement state"},"settlementTime":{"type":"integer","format":"int64","description":"Settlement timestamp in milliseconds"},"settlementBase":{"type":"string","description":"Currency received as principal at settlement"},"settlementCurrency":{"type":"string","description":"Currency received as earnings at settlement"},"deliveryPrice":{"type":"string","description":"Index price recorded at settlement"},"createTime":{"type":"integer","format":"int64","description":"Order creation timestamp in milliseconds"},"updateTime":{"type":"integer","format":"int64","description":"Last update timestamp in milliseconds"}}},"ErrorResponse":{"type":"object","properties":{"result":{"type":"boolean"},"code":{"type":"string","description":"Error code (e.g. `DUAL_PARAMETER_ERROR`)"},"message":{"type":"string","description":"Human-readable error message"},"timestamp":{"type":"integer","format":"int64"}}}},"responses":{"BadRequest":{"description":"Bad request — invalid parameters. Common error code: `DUAL_PARAMETER_ERROR`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"Unauthorized":{"description":"Authentication failed — missing or invalid API Key / signature","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"paths":{"/api/v1/earn/dual/invests":{"post":{"tags":["Dual"],"summary":"Batch query investment orders","description":"Returns details for a batch of Dual Investment orders by client order ID list. Requires `View` permission. Weight: 1.\n\nExample request body:\n```json\n{\n  \"base\": \"BTC\",\n  \"clientDualIds\": [\"my-order-001\", \"my-order-002\"]\n}\n```\n","operationId":"dualGetInvests","parameters":[{"$ref":"#/components/parameters/Timestamp"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DualGetInvestsRequest"}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/BaseResponse"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/DualInvestRecordsData"}}}]}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}}}}}}
````

## Get investment history

> Returns paginated Dual Investment history for the authenticated user. Requires \`View\` permission. Weight: 1.\
> \
> Example request:\
> \`\`\`\
> GET /api/v1/earn/dual/records?base=BTC\&quote=USDXO\&limit=10\&endTime=1775027817297\&timestamp=1775027817297\
> \`\`\`<br>

````json
{"openapi":"3.0.3","info":{"title":"Pionex Earn Open API - Dual Investment","version":"1.0.0"},"tags":[{"name":"Dual","description":"Dual Investment endpoints"}],"servers":[{"url":"https://api.pionex.com","description":"Production"}],"security":[{"apiKey":[]}],"components":{"securitySchemes":{"apiKey":{"type":"apiKey","in":"header","name":"PIONEX-KEY","description":"API Key authentication. Requires two headers:\n- `PIONEX-KEY`: Your API Key\n- `PIONEX-SIGNATURE`: HMAC SHA256 hex signature\n\nAnd a `timestamp` query parameter (milliseconds).\n"}},"parameters":{"Timestamp":{"name":"timestamp","in":"query","required":true,"description":"Current timestamp in milliseconds (valid range +/- 20 seconds)","schema":{"type":"integer","format":"int64"}}},"schemas":{"BaseResponse":{"type":"object","properties":{"result":{"type":"boolean","description":"Whether the request succeeded"},"timestamp":{"type":"integer","format":"int64","description":"Response timestamp in milliseconds"}}},"DualInvestRecordsData":{"type":"object","properties":{"records":{"type":"array","items":{"$ref":"#/components/schemas/DualRecord"}}}},"DualRecord":{"type":"object","properties":{"clientDualId":{"type":"string","description":"Client-assigned dual investment order ID"},"state":{"type":"string","description":"Investment state"},"productId":{"type":"string","description":"Product ID"},"type":{"type":"string","description":"`DUAL_BASE` — invest in base currency; `DUAL_CURRENCY` — invest in quote/investment currency","enum":["DUAL_BASE","DUAL_CURRENCY"]},"base":{"type":"string","description":"Base currency"},"quote":{"type":"string","description":"Quote currency"},"currency":{"type":"string","description":"Investment currency"},"strike":{"type":"string","description":"Strike price"},"expireTime":{"type":"integer","format":"int64","description":"Product expiry timestamp in milliseconds"},"baseAmount":{"type":"string","description":"Investment amount in base currency"},"currencyAmount":{"type":"string","description":"Investment amount in investment currency"},"profit":{"type":"string","description":"Yield rate at time of investment (e.g. `0.0215` = 2.15%)"},"baseFilled":{"type":"string","description":"Matched/filled amount in base currency"},"currencyFilled":{"type":"string","description":"Matched/filled amount in investment currency"},"settlementState":{"type":"string","description":"Settlement state"},"settlementTime":{"type":"integer","format":"int64","description":"Settlement timestamp in milliseconds"},"settlementBase":{"type":"string","description":"Currency received as principal at settlement"},"settlementCurrency":{"type":"string","description":"Currency received as earnings at settlement"},"deliveryPrice":{"type":"string","description":"Index price recorded at settlement"},"createTime":{"type":"integer","format":"int64","description":"Order creation timestamp in milliseconds"},"updateTime":{"type":"integer","format":"int64","description":"Last update timestamp in milliseconds"}}},"ErrorResponse":{"type":"object","properties":{"result":{"type":"boolean"},"code":{"type":"string","description":"Error code (e.g. `DUAL_PARAMETER_ERROR`)"},"message":{"type":"string","description":"Human-readable error message"},"timestamp":{"type":"integer","format":"int64"}}}},"responses":{"BadRequest":{"description":"Bad request — invalid parameters. Common error code: `DUAL_PARAMETER_ERROR`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"Unauthorized":{"description":"Authentication failed — missing or invalid API Key / signature","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"paths":{"/api/v1/earn/dual/records":{"get":{"tags":["Dual"],"summary":"Get investment history","description":"Returns paginated Dual Investment history for the authenticated user. Requires `View` permission. Weight: 1.\n\nExample request:\n```\nGET /api/v1/earn/dual/records?base=BTC&quote=USDXO&limit=10&endTime=1775027817297&timestamp=1775027817297\n```\n","operationId":"dualInvestRecords","parameters":[{"$ref":"#/components/parameters/Timestamp"},{"name":"base","in":"query","required":true,"description":"Base currency (e.g. `BTC`)","schema":{"type":"string"}},{"name":"quote","in":"query","required":false,"description":"Quote currency filter (e.g. `USDT`)","schema":{"type":"string"}},{"name":"currency","in":"query","required":false,"description":"Investment currency filter (e.g. `USDT`, `BTC`)","schema":{"type":"string"}},{"name":"filter","in":"query","required":false,"description":"Status filter","schema":{"type":"string"}},{"name":"startTime","in":"query","required":false,"description":"Start timestamp in milliseconds","schema":{"type":"integer","format":"int64"}},{"name":"endTime","in":"query","required":true,"description":"End timestamp in milliseconds","schema":{"type":"integer","format":"int64"}},{"name":"limit","in":"query","required":false,"description":"Maximum number of records to return per page","schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/BaseResponse"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/DualInvestRecordsData"}}}]}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}}}}}}
````

## Collect settled earnings

> Collects settled Dual Investment earnings into the user's spot account. Requires \`Earn\` permission. Weight: 1.\
> \
> Only orders in a settled state can be collected.\
> \
> Example request body:\
> \`\`\`json\
> {\
> &#x20; "base": "BTC",\
> &#x20; "clientDualId": "my-order-001"\
> }\
> \`\`\`\
> \
> Example response:\
> \`\`\`json\
> {\
> &#x20; "result": true,\
> &#x20; "data": {\
> &#x20;   "clientDualId": "my-order-001"\
> &#x20; },\
> &#x20; "timestamp": 1774959429596\
> }\
> \`\`\`<br>

````json
{"openapi":"3.0.3","info":{"title":"Pionex Earn Open API - Dual Investment","version":"1.0.0"},"tags":[{"name":"Dual","description":"Dual Investment endpoints"}],"servers":[{"url":"https://api.pionex.com","description":"Production"}],"security":[{"apiKey":[]}],"components":{"securitySchemes":{"apiKey":{"type":"apiKey","in":"header","name":"PIONEX-KEY","description":"API Key authentication. Requires two headers:\n- `PIONEX-KEY`: Your API Key\n- `PIONEX-SIGNATURE`: HMAC SHA256 hex signature\n\nAnd a `timestamp` query parameter (milliseconds).\n"}},"parameters":{"Timestamp":{"name":"timestamp","in":"query","required":true,"description":"Current timestamp in milliseconds (valid range +/- 20 seconds)","schema":{"type":"integer","format":"int64"}}},"schemas":{"DualCollectRequest":{"type":"object","required":["base","clientDualId","productId"],"properties":{"base":{"type":"string","description":"Base currency"},"clientDualId":{"type":"string","description":"Client-assigned dual investment order ID to collect"},"productId":{"type":"string","description":"Product ID"}}},"BaseResponse":{"type":"object","properties":{"result":{"type":"boolean","description":"Whether the request succeeded"},"timestamp":{"type":"integer","format":"int64","description":"Response timestamp in milliseconds"}}},"DualCollectData":{"type":"object","properties":{"clientDualId":{"type":"string","description":"Client-assigned dual investment order ID"}}},"ErrorResponse":{"type":"object","properties":{"result":{"type":"boolean"},"code":{"type":"string","description":"Error code (e.g. `DUAL_PARAMETER_ERROR`)"},"message":{"type":"string","description":"Human-readable error message"},"timestamp":{"type":"integer","format":"int64"}}}},"responses":{"BadRequest":{"description":"Bad request — invalid parameters. Common error code: `DUAL_PARAMETER_ERROR`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"Unauthorized":{"description":"Authentication failed — missing or invalid API Key / signature","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"paths":{"/api/v1/earn/dual/collect":{"post":{"tags":["Dual"],"summary":"Collect settled earnings","description":"Collects settled Dual Investment earnings into the user's spot account. Requires `Earn` permission. Weight: 1.\n\nOnly orders in a settled state can be collected.\n\nExample request body:\n```json\n{\n  \"base\": \"BTC\",\n  \"clientDualId\": \"my-order-001\"\n}\n```\n\nExample response:\n```json\n{\n  \"result\": true,\n  \"data\": {\n    \"clientDualId\": \"my-order-001\"\n  },\n  \"timestamp\": 1774959429596\n}\n```\n","operationId":"dualCollect","parameters":[{"$ref":"#/components/parameters/Timestamp"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DualCollectRequest"}}}},"responses":{"200":{"description":"Collect succeeded","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/BaseResponse"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/DualCollectData"}}}]}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}}}}}}
````
