From f8797ac0391185c7f49070851b5e7a8d213340cf Mon Sep 17 00:00:00 2001 From: carlosmiei <43336371+carlosmiei@users.noreply.github.com> Date: Sat, 29 Nov 2025 11:57:35 +0000 Subject: [PATCH 01/10] fix(package): include types folder --- package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 69a2c8b2..a076b282 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,8 @@ }, "files": [ "dist", - "index.d.ts" + "index.d.ts", + "types" ], "scripts": { "build": "rm -rf dist && babel src -d dist", From 89c5f125e0c594d9c4772a09e1941f564f6d5e70 Mon Sep 17 00:00:00 2001 From: carlosmiei <43336371+carlosmiei@users.noreply.github.com> Date: Sat, 29 Nov 2025 11:57:50 +0000 Subject: [PATCH 02/10] release: cut the 0.13.3 release --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index a076b282..58deb211 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "binance-api-node", - "version": "0.13.2", + "version": "0.13.3", "description": "A node API wrapper for Binance", "main": "dist", "browser": { From 95b2bab76f1798c57c0c6513415f19ea8255bfce Mon Sep 17 00:00:00 2001 From: carlosmiei <43336371+carlosmiei@users.noreply.github.com> Date: Sat, 29 Nov 2025 11:58:09 +0000 Subject: [PATCH 03/10] release: cut the 0.13.4 release --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 58deb211..c7887f64 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "binance-api-node", - "version": "0.13.3", + "version": "0.13.4", "description": "A node API wrapper for Binance", "main": "dist", "browser": { From 81a6de897c3924e2e188b89dde248ee59bfcb067 Mon Sep 17 00:00:00 2001 From: carlosmiei <43336371+carlosmiei@users.noreply.github.com> Date: Mon, 8 Dec 2025 14:05:35 +0000 Subject: [PATCH 04/10] chore: update readme --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index bffddd79..be0852b6 100644 --- a/README.md +++ b/README.md @@ -28,6 +28,7 @@ Import the module and create a new client. Passing api keys is optional only if you don't plan on doing authenticated calls. You can create an api key [here](https://www.binance.com/userCenter/createApi.html). If you want to create demo/testnet keys click [here](https://demo.binance.com/) + ```js import Binance from 'binance-api-node' @@ -91,6 +92,7 @@ client.ws.ticker('BTCUSDT', ticker => console.log(ticker)) ``` **Notes:** +- `binance-api-node` fully supports the new algo service introduced on the Decemeber 9th of 2025 - Proxy support is only available in Node.js environment - Browsers use system/OS proxy settings automatically - Supports HTTP and HTTPS proxies (use `http://` or `https://` protocol) From 99d2fc564ae9a2dc1d7a74fd35a280e43987efe2 Mon Sep 17 00:00:00 2001 From: carlosmiei <43336371+carlosmiei@users.noreply.github.com> Date: Tue, 16 Dec 2025 18:47:08 +0000 Subject: [PATCH 05/10] feat(client): add updateOrder and futuresUpdateOrder --- src/http-client.js | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/http-client.js b/src/http-client.js index 39f7e74a..457cef71 100644 --- a/src/http-client.js +++ b/src/http-client.js @@ -486,6 +486,7 @@ export default opts => { // Order endpoints order: payload => order(privCall, payload, '/api/v3/order'), + updateOrder: payload => privCall('/api/v3/order/cancelReplace', payload, 'POST'), orderOco: payload => orderOco(privCall, payload, '/api/v3/order/oco'), orderTest: payload => order(privCall, payload, '/api/v3/order/test'), getOrder: payload => privCall('/api/v3/order', payload), @@ -598,6 +599,15 @@ export default opts => { // Use regular order endpoint return order(privCall, payload, '/fapi/v1/order') }, + futuresUpdateOrder: payload => { + if (payload && 'conditional' in payload) { + // for now it is not supported + // const payloadCopy = { ...payload } + // delete payloadCopy.conditional + // return privCall('/fapi/v1/algoOrder', payloadCopy, 'PUT') + } + return privCall('/fapi/v1/order', payload, 'PUT') + }, futuresBatchOrders: payload => privCall('/fapi/v1/batchOrders', payload, 'POST'), futuresGetOrder: payload => { // Check if this is a request for a conditional/algo order From 19fdb5312870fd1b82d3bf2a9f65c0dffa1a11ab Mon Sep 17 00:00:00 2001 From: carlosmiei <43336371+carlosmiei@users.noreply.github.com> Date: Wed, 17 Dec 2025 09:48:11 +0000 Subject: [PATCH 06/10] add types --- types/futures.d.ts | 40 +++++++++++++++++++++++++++ types/order.d.ts | 69 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 109 insertions(+) diff --git a/types/futures.d.ts b/types/futures.d.ts index 1d57e6d7..2789e64a 100644 --- a/types/futures.d.ts +++ b/types/futures.d.ts @@ -184,6 +184,46 @@ export interface FuturesEndpoints extends BinanceRestClient { commissionAsset: string; }>; }>; + futuresUpdateOrder(payload: { + orderId?: number; + origClientOrderId?: string; + symbol: string; + side: OrderSide; + type: OrderType; + quantity?: string; + price?: string; + priceMatch?: string; + }): Promise<{ + symbol: string; + orderId: number; + orderListId: number; + clientOrderId: string; + transactTime: number; + price: string; + origQty: string; + executedQty: string; + cumQuote: string; + status: OrderStatus; + timeInForce: TimeInForce; + type: OrderType; + side: OrderSide; + marginBuyBorrowAmount: string; + marginBuyBorrowAsset: string; + stopPrice?: string; + workingType?: string; + priceProtect?: string; + origType?: string; + priceMatch?: string; + selfTradePreventionMode?: string; + goodTillDate?: number; + updateTime?: number; + fills: Array<{ + price: string; + qty: string; + commission: string; + commissionAsset: string; + }>; + }>; futuresBatchOrders(payload: { batchOrders: Array<{ symbol: string; side: OrderSide; diff --git a/types/order.d.ts b/types/order.d.ts index c7c40165..c411b58b 100644 --- a/types/order.d.ts +++ b/types/order.d.ts @@ -38,6 +38,75 @@ export interface OrderEndpoints extends BinanceRestClient { commissionAsset: string; }>; }>; + updateOrder(payload: { + symbol: string; + side: OrderSide; + type: OrderType; + quantity?: string; + cancelReplaceMode?: string; + price?: string; + cancelNewClientOrderId?: string; + quoteOrderQty?: string; + cancelOrigClientOrderId?: string; + cancelOrderId?: number; + newClientOrderId?: string; + strategyId?: number; + strategyType?: number; + stopPrice?: string; + trailingDelta?: number; + trailingTime?: number; + icebergQty?: string; + newOrderRespType?: string; + selfTradePreventionMode?: string; + cancelRestrictions?: string; + orderRateLimitExceededMode?: string; + pegPriceType?: string; + pegOffsetValue?: string; + pegOffsetType?: string; + }): Promise<{ + cancelResult: string; + newOrderResult: string; + cancelResponse: { + symbol: string; + origClientOrderId: string; + orderId: number; + orderListId: number; + clientOrderId: string; + transactTime: number; + price: string; + origQty: string; + executedQty: string; + cummulativeQuoteQty: string; + status: OrderStatus; + timeInForce: TimeInForce; + type: OrderType; + side: OrderSide; + }; + newOrderResponse: { + symbol: string; + orderId: number; + orderListId: number; + clientOrderId: string; + transactTime: number; + price: string; + origQty: string; + executedQty: string; + origQuoteOrderQty: string; + cummulativeQuoteQty: string; + status: OrderStatus; + timeInForce: TimeInForce; + type: OrderType; + side: OrderSide; + workingTime: number; + fills: Array<{ + price: string; + qty: string; + commission: string; + commissionAsset: string; + }>; + selfTradePreventionMode: string; + }; + }>; orderOco(payload: { symbol: string; side: OrderSide; From 7487f7c01f00a45feea3cb8fdcd7c055075ae71c Mon Sep 17 00:00:00 2001 From: carlosmiei <43336371+carlosmiei@users.noreply.github.com> Date: Wed, 17 Dec 2025 09:58:26 +0000 Subject: [PATCH 07/10] update updateOrder type --- types/order.d.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/types/order.d.ts b/types/order.d.ts index c411b58b..29a1713d 100644 --- a/types/order.d.ts +++ b/types/order.d.ts @@ -50,6 +50,7 @@ export interface OrderEndpoints extends BinanceRestClient { cancelOrigClientOrderId?: string; cancelOrderId?: number; newClientOrderId?: string; + timeInForce?: TimeInForce; strategyId?: number; strategyType?: number; stopPrice?: string; From 8f18fd735581404af62289153d98d2d8ee86cb8a Mon Sep 17 00:00:00 2001 From: carlosmiei <43336371+carlosmiei@users.noreply.github.com> Date: Wed, 17 Dec 2025 10:06:19 +0000 Subject: [PATCH 08/10] update readme --- README.md | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 61 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index be0852b6..6adcd38e 100644 --- a/README.md +++ b/README.md @@ -155,6 +155,7 @@ Following examples will use the `await` form, which requires some configuration - [delivery markPrice](#delivery-markprice) - [Authenticated REST Endpoints](#authenticated-rest-endpoints) - [order](#order) + - [updateOrder](#updateorder) - [orderTest](#ordertest) - [orderOco](#orderoco) - [getOrder](#getorder) @@ -207,6 +208,8 @@ Following examples will use the `await` form, which requires some configuration - [Portfolio Margin Endpoints](#portfolio-margin-endpoints) - [getPortfolioMarginAccountInfo](#getportfoliomarginaccountinfo) - [Futures Authenticated REST endpoints](#futures-authenticated-rest-endpoints) + - [futuresOrder](#futuresorder) + - [futuresUpdateOrder](#futuresupdateorder) - [futuresGetOrder](#futuresgetorder) - [futuresAllOrders](#futuresallorders) - [futuresBatchOrders](#futuresbatchorders) @@ -1377,7 +1380,8 @@ the request. #### order -Creates a new order. +- Creates a new order. +- see https://developers.binance.com/docs/binance-spot-api-docs/rest-api/trading-endpoints#new-order-trade ```js console.log( @@ -1453,6 +1457,26 @@ Test new order creation and signature/recvWindow. Creates and validates a new or Same API as above, but does not return any output on success. + +#### updateOrder + +- updates an order +- see https://developers.binance.com/docs/binance-spot-api-docs/rest-api/trading-endpoints#cancel-an-existing-order-and-send-a-new-order-trade + +```Js + + const order = await client.updateOrder({ + symbol: 'LTCUSDT', + cancelOrderId: 12345678, + side: 'BUY', + type: 'LIMIT', + quantity: 1, + price: 80, + timeInForce: 'GTC', + }) + +``` + #### orderOco Creates a new OCO order. @@ -3617,6 +3641,42 @@ console.log(await client.getPortfolioMarginAccountInfo()) ### Futures Authenticated REST endpoints +#### futuresOrder + +- Creates a futures order +- see https://developers.binance.com/docs/derivatives/usds-margined-futures/trade/rest-api + +```js +console.log( + await client.futuresOrder({ + symbol: 'LTCUSDT', + side: 'BUY', + type: 'LIMIT', + quantity: 1, + price: 80, + timeInForce: 'GTC', + }) +) +``` + +#### futuresUpdateOrder +- Updates a futures order +- see https://developers.binance.com/docs/derivatives/usds-margined-futures/trade/rest-api/Modify-Order + +```js +console.log( + await client.futuresUpdateOrder({ + orderId: 23423423423, + symbol: 'LTCUSDT', + side: 'BUY', + type: 'LIMIT', + quantity: 1, + price: 80, + timeInForce: 'GTC', + }) +) +``` + #### futuresGetOrder Check an order's status. From b97875529d729a49ec342f809fb9ccc5a2e5f181 Mon Sep 17 00:00:00 2001 From: carlosmiei <43336371+carlosmiei@users.noreply.github.com> Date: Wed, 17 Dec 2025 10:15:52 +0000 Subject: [PATCH 09/10] add tests --- src/http-client.js | 23 ++++++++++++++++++++++- test/static-tests.js | 39 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+), 1 deletion(-) diff --git a/src/http-client.js b/src/http-client.js index 457cef71..6d342903 100644 --- a/src/http-client.js +++ b/src/http-client.js @@ -404,6 +404,27 @@ const orderOco = (privCall, payload = {}, url) => { ) } +const updateOrder = (privCall, payload = {}, url) => { + + const newPayload = { ...payload } + + if (!newPayload.cancelReplaceMode) { + newPayload.cancelReplaceMode = 'STOP_ON_FAILURE' + } + + if (!newPayload.timeInForce) { + newPayload.timeInForce = 'GTC' + } + + if (!newPayload.newClientOrderId) { + newPayload.newClientOrderId = spotP() + } + + return ( + checkParams('updateOrder', newPayload, ['symbol', 'side', 'type']) && privCall(url, newPayload, 'POST') + ) +} + /** * Zip asks and bids reponse from order book */ @@ -486,7 +507,7 @@ export default opts => { // Order endpoints order: payload => order(privCall, payload, '/api/v3/order'), - updateOrder: payload => privCall('/api/v3/order/cancelReplace', payload, 'POST'), + updateOrder: payload => updateOrder(privCall, payload, '/api/v3/order/cancelReplace'), orderOco: payload => orderOco(privCall, payload, '/api/v3/order/oco'), orderTest: payload => order(privCall, payload, '/api/v3/order/test'), getOrder: payload => privCall('/api/v3/order', payload), diff --git a/test/static-tests.js b/test/static-tests.js index 417de2a4..fd4f1323 100644 --- a/test/static-tests.js +++ b/test/static-tests.js @@ -37,6 +37,13 @@ test.serial.beforeEach(t => { interceptedBody = requestBody return { success: true } }) + nock(/.*/) + .put(/.*/) + .reply(200, function (uri, requestBody) { + interceptedUrl = `${this.req.options.proto}://${this.req.options.hostname}${uri}` + interceptedBody = requestBody + return { success: true } + }) nock(/.*/) .delete(/.*/) .reply(200, function (uri, requestBody) { @@ -277,6 +284,24 @@ test.serial('[REST] Futures LimitSell', async t => { t.true(obj.newClientOrderId.startsWith(CONTRACT_PREFIX)) }) +test.serial('[REST] Futures update/edit order', async t => { + await binance.futuresUpdateOrder({ + symbol: 'LTCUSDT', + side: 'SELL', + type: 'LIMIT', + quantity: 0.5, + price: 100, + orderId: 1234, + }) + t.true(interceptedUrl.startsWith('https://fapi.binance.com/fapi/v1/order')) + const obj = urlToObject(interceptedUrl.replace('https://fapi.binance.com/fapi/v1/order?', '')) + t.is(obj.symbol, 'LTCUSDT') + t.is(obj.side, 'SELL') + t.is(obj.type, 'LIMIT') + t.is(obj.quantity, '0.5') + t.is(obj.orderId, '1234') +}) + test.serial('[REST] Futures cancel order', async t => { await binance.futuresCancelOrder({ symbol: 'LTCUSDT', orderId: '34234234' }) const url = 'https://fapi.binance.com/fapi/v1/order' @@ -298,6 +323,20 @@ test.serial('[REST] MarketBuy test', async t => { t.true(obj.newClientOrderId.startsWith(SPOT_PREFIX)) }) +test.serial('[REST] update spot order', async t => { + await binance.updateOrder({ symbol: 'LTCUSDT', side: 'BUY', type: 'MARKET', quantity: 0.5, cancelOrderId: 1234 }) + t.true(interceptedUrl.startsWith('https://api.binance.com/api/v3/order/cancelReplace')) + const body = interceptedUrl.replace('https://api.binance.com/api/v3/order/cancelReplace', '') + const obj = urlToObject(body) + t.is(obj.symbol, 'LTCUSDT') + t.is(obj.side, 'BUY') + t.is(obj.type, 'MARKET') + t.is(obj.quantity, '0.5') + t.is(obj.cancelReplaceMode, 'STOP_ON_FAILURE') + t.is(obj.cancelOrderId, '1234') + t.true(obj.newClientOrderId.startsWith(SPOT_PREFIX)) +}) + test.serial('[REST] spot open orders', async t => { await binance.openOrders({ symbol: 'LTCUSDT' }) t.true(interceptedUrl.startsWith('https://api.binance.com/api/v3/openOrders')) From 521dec70cda32e56c7e1bdb0ab7abb20d43cc39d Mon Sep 17 00:00:00 2001 From: carlosmiei <43336371+carlosmiei@users.noreply.github.com> Date: Wed, 17 Dec 2025 10:17:16 +0000 Subject: [PATCH 10/10] fix linting --- src/http-client.js | 4 ++-- test/static-tests.js | 8 +++++++- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/http-client.js b/src/http-client.js index 6d342903..7b5d6130 100644 --- a/src/http-client.js +++ b/src/http-client.js @@ -405,7 +405,6 @@ const orderOco = (privCall, payload = {}, url) => { } const updateOrder = (privCall, payload = {}, url) => { - const newPayload = { ...payload } if (!newPayload.cancelReplaceMode) { @@ -421,7 +420,8 @@ const updateOrder = (privCall, payload = {}, url) => { } return ( - checkParams('updateOrder', newPayload, ['symbol', 'side', 'type']) && privCall(url, newPayload, 'POST') + checkParams('updateOrder', newPayload, ['symbol', 'side', 'type']) && + privCall(url, newPayload, 'POST') ) } diff --git a/test/static-tests.js b/test/static-tests.js index fd4f1323..811511e8 100644 --- a/test/static-tests.js +++ b/test/static-tests.js @@ -324,7 +324,13 @@ test.serial('[REST] MarketBuy test', async t => { }) test.serial('[REST] update spot order', async t => { - await binance.updateOrder({ symbol: 'LTCUSDT', side: 'BUY', type: 'MARKET', quantity: 0.5, cancelOrderId: 1234 }) + await binance.updateOrder({ + symbol: 'LTCUSDT', + side: 'BUY', + type: 'MARKET', + quantity: 0.5, + cancelOrderId: 1234, + }) t.true(interceptedUrl.startsWith('https://api.binance.com/api/v3/order/cancelReplace')) const body = interceptedUrl.replace('https://api.binance.com/api/v3/order/cancelReplace', '') const obj = urlToObject(body)