GDAX
The official Node.js library for Coinbase's GDAX API.
Features
- Easy functionality to use in programmatic trading
- A customizable, websocket-synced Order Book implementation
- API clients with convenient methods for every API endpoint
- Abstracted interfaces – don't worry about HMAC signing or JSON formatting; the
library does it for you
Installation
npm install gdax
npm install coinbase/gdax-node
You can learn about the API responses of each endpoint by reading our
documentation.
Quick Start
The GDAX API has both public and private endpoints. If you're only interested in
the public endpoints, you should use a PublicClient
.
const Gdax = require('gdax');
const publicClient = new Gdax.PublicClient();
All methods, unless otherwise specified, can be used with either a promise or
callback API.
Using Promises
publicClient
.getProducts()
.then(data => {
})
.catch(error => {
});
The promise API can be used as expected in async
functions in ES2017+
environments:
async function yourFunction() {
try {
const products = await publicClient.getProducts();
} catch(error) {
}
}
Using Callbacks
Your callback should accept two arguments:
error
: contains an error message (string
), or null
if no was error
encounteredresponse
: a generic HTTP response abstraction created by the request
librarydata
: contains data returned by the GDAX API, or undefined
if an error was
encountered
publicClient.getProducts((error, response, data) => {
if (error) {
} else {
}
});
NOTE: if you supply a callback, no promise will be returned. This is to
prevent potential UnhandledPromiseRejectionWarning
s, which will cause future
versions of Node to terminate.
const myCallback = (err, response, data) => { };
const result = publicClient.getProducts(myCallback);
result.then(() => { });
Optional Parameters
Some methods accept optional parameters, e.g.
publicClient
.getProductOrderBook('BTC-USD', { level: 3 })
.then(book => { });
To use optional parameters with callbacks, supply the options as the first
parameter(s) and the callback as the last parameter:
publicClient
.getProductOrderBook('ETH-USD', { level: 3 }, (error, response, book) => { });
The Public API Client
const publicClient = new Gdax.PublicClient(endpoint);
productID
optional - defaults to 'BTC-USD' if not specified.endpoint
optional - defaults to 'https://api.gdax.com' if not specified.
Public API Methods
publicClient.getProducts(callback);
publicClient.getProductOrderBook('BTC-USD', callback);
publicClient.getProductOrderBook('LTC-USD', { level: 3 }, callback);
publicClient.getProductTicker('ETH-USD', callback);
publicClient.getProductTrades('BTC-USD', callback);
publicClient.getProductTrades('BTC-USD', { after: 1000 }, callback);
Wraps around getProductTrades
, fetches all trades with IDs >= tradesFrom
and
<= tradesTo
. Handles pagination and rate limits.
const trades = publicClient.getProductTradeStream('BTC-USD', 8408000, 8409000);
const trades = publicClient.getProductTradeStream('BTC-USD', 8408000, trade => Date.parse(trade.time) >= 1463068e6);
publicClient.getProductHistoricRates('BTC-USD', callback);
publicClient.getProductHistoricRates('BTC-USD', { granularity: 3000 }, callback);
publicClient.getProduct24HrStats('BTC-USD', callback);
publicClient.getCurrencies(callback);
publicClient.getTime(callback);
The Authenticated API Client
The private exchange API endpoints require you
to authenticate with a GDAX API key. You can create a new API key in your
exchange account's settings. You can also specify
the API URI (defaults to https://api.gdax.com
).
const key = 'your_api_key';
const secret = 'your_b64_secret';
const passphrase = 'your_passphrase';
const apiURI = 'https://api.gdax.com';
const sandboxURI = 'https://api-public.sandbox.gdax.com';
const authedClient = new Gdax.AuthenticatedClient(key, secret, passphrase, apiURI);
Like PublicClient
, all API methods can be used with either callbacks or will
return promises.
AuthenticatedClient
inherits all of the API methods from
PublicClient
, so if you're hitting both public and private API endpoints you
only need to create a single client.
Private API Methods
authedClient.getCoinbaseAccounts(callback);
authedClient.getPaymentMethods(callback);
authedClient.getAccounts(callback);
const accountID = '7d0f7d8e-dd34-4d9c-a846-06f431c381ba';
authedClient.getAccount(accountID, callback);
const accountID = '7d0f7d8e-dd34-4d9c-a846-06f431c381ba';
authedClient.getAccountHistory(accountID, callback);
authedClient.getAccountHistory(accountID, { before: 3000 }, callback);
const accountID = '7d0f7d8e-dd34-4d9c-a846-06f431c381ba';
authedClient.getAccountHolds(accountID, callback);
authedClient.getAccountHolds(accountID, { before: 3000 }, callback);
const buyParams = {
'price': '100.00',
'size': '1',
'product_id': 'BTC-USD',
};
authedClient.buy(buyParams, callback);
const sellParams = {
'price': '110.00',
'size': '1',
'product_id': 'BTC-USD',
};
authedClient.sell(sellParams, callback);
const params = {
'side': 'buy',
'price': '75.00',
'size': '1',
'product_id': 'LTC-USD',
};
authedClient.placeOrder(params, callback);
const orderID = 'd50ec984-77a8-460a-b958-66f114b0de9b';
authedClient.cancelOrder(orderID, callback);
authedClient.cancelOrders(callback);
authedClient.cancelAllOrders({product_id: 'BTC-USD'}, callback);
authedClient.getOrders(callback);
authedClient.getOrders({ after: 3000 }, callback);
const orderID = 'd50ec984-77a8-460a-b958-66f114b0de9b';
authedClient.getOrder(orderID, callback);
authedClient.getFills(callback);
authedClient.getFills({ before: 3000 }, callback);
authedClient.getFundings({}, callback);
const params = {
'amount': '2000.00',
'currency': 'USD'
};
authedClient.repay(params, callback);
const params =
'margin_profile_id': '45fa9e3b-00ba-4631-b907-8a98cbdf21be',
'type': 'deposit',
'currency': 'USD',
'amount': 2
};
authedClient.marginTransfer(params, callback);
const params = {
'repay_only': false
};
authedClient.closePosition(params, callback);
const depositParamsUSD = {
'amount': '100.00',
'currency': 'USD',
'coinbase_account_id': '60680c98bfe96c2601f27e9c',
};
authedClient.deposit(depositParamsUSD, callback);
const withdrawParamsUSD = {
'amount': '100.00',
'currency': 'USD',
'coinbase_account_id': '60680c98bfe96c2601f27e9c',
};
authedClient.withdraw(withdrawParamsUSD, callback);
const depositParamsBTC = {
'amount': '2.0',
'currency': 'BTC',
'coinbase_account_id': '536a541fa9393bb3c7000023',
};
authedClient.deposit(depositParamsBTC, callback);
const withdrawParamsBTC = {
'amount': '2.0',
'currency': 'BTC',
'coinbase_account_id': '536a541fa9393bb3c7000023',
};
authedClient.withdraw(withdrawParamsBTC, callback);
const withdrawAddressParams = {
'amount': 10.00,
'currency': 'BTC',
'crypto_address': '15USXR6S4DhSWVHUxXRCuTkD1SA6qAdy'
}
authedClient.withdrawCrypto(withdrawAddressParams, callback);
authedClient.getTrailingVolume(callback);
Websocket Client
The WebsocketClient
allows you to connect and listen to the exchange
websocket messages.
const websocket = new Gdax.WebsocketClient(['BTC-USD', 'ETH-USD']);
websocket.on('message', data => { });
websocket.on('error', err => { });
websocket.on('close', () => { });
Optionally set the heartbeat mode or websocket URI.
const websocket = new Gdax.WebsocketClient(
['BTC-USD','ETH-USD'],
'https://api-public.sandbox.gdax.com',
{
key: 'suchkey',
secret: 'suchsecret',
passphrase: 'muchpassphrase',
},
{ heartbeat: true }
);
The following events can be emitted from the WebsocketClient
:
Orderbook
Orderbook
is a data structure that can be used to store a local copy of the
orderbook.
const orderbook = new Gdax.Orderbook();
The orderbook has the following methods:
state(book)
get(orderId)
add(order)
remove(orderId)
match(match)
change(change)
Orderbook Sync
OrderbookSync
creates a local mirror of the orderbook on GDAX using
Orderbook
and WebsocketClient
as described
here.
const orderbookSync = new Gdax.OrderbookSync(['BTC-USD', 'ETH-USD']);
console.log(orderbookSync.books['ETH-USD'].state());
Testing
npm test
npm install -g nsp
nsp check --output summary