Coinbase Pro
Note: The gdax
package is deprecated and might have to be removed from NPM.
Please migrate to the coinbase-pro
package to ensure future compatibility.
The official Node.js library for Coinbase's Pro 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 coinbase-pro
You can learn about the API responses of each endpoint by reading our
documentation.
Quick Start
The Coinbase Pro API has both public and private endpoints. If you're only interested in
the public endpoints, you should use a PublicClient
.
const CoinbasePro = require('coinbase-pro');
const publicClient = new CoinbasePro.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 three arguments:
error
: contains an error message (string
), or null
if no error was
encounteredresponse
: a generic HTTP response abstraction created by the request
librarydata
: contains data returned by the Coinbase Pro 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 CoinbasePro.PublicClient(endpoint);
productID
optional - defaults to 'BTC-USD' if not specified.endpoint
optional - defaults to 'https://api.pro.coinbase.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: 3600 },
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 Coinbase Pro 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.pro.coinbase.com
).
const key = 'your_api_key';
const secret = 'your_b64_secret';
const passphrase = 'your_passphrase';
const apiURI = 'https://api.pro.coinbase.com';
const sandboxURI = 'https://api-public.sandbox.pro.coinbase.com';
const authedClient = new CoinbasePro.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.getAccountTransfers(accountID, callback);
authedClient.getAccountTransfers(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, status: 'open' }, callback);
const orderID = 'd50ec984-77a8-460a-b958-66f114b0de9b';
authedClient.getOrder(orderID, callback);
const params = {
product_id: 'LTC-USD',
};
authedClient.getFills(params, 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 params = {
from: 'USD',
to: 'USDC',
amount: '100',
};
authedClient.convert(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 depositAddressParams = {
currency: 'BTC',
};
authedClient.depositCrypto(depositAddressParams, callback);
const withdrawAddressParams = {
amount: 10.0,
currency: 'BTC',
crypto_address: '15USXR6S4DhSWVHUxXRCuTkD1SA6qAdy',
};
authedClient.withdrawCrypto(withdrawAddressParams, callback);
const depositPaymentParamsUSD = {
amount: '100.00',
currency: 'USD',
payment_method_id: 'bc6d7162-d984-5ffa-963c-a493b1c1370b',
};
authedClient.depositPayment(depositPaymentParamsUSD, callback);
const withdrawPaymentParamsUSD = {
amount: '100.00',
currency: 'USD',
payment_method_id: 'bc6d7162-d984-5ffa-963c-a493b1c1370b',
};
authedClient.withdrawPayment(withdrawPaymentParamsUSD, callback);
authedClient.getTrailingVolume(callback);
Websocket Client
The WebsocketClient
allows you to connect and listen to the exchange
websocket messages.
const websocket = new CoinbasePro.WebsocketClient(['BTC-USD', 'ETH-USD']);
websocket.on('message', data => {
});
websocket.on('error', err => {
});
websocket.on('close', () => {
});
The client will automatically subscribe to the heartbeat
channel. By
default, the full
channel will be subscribed to unless other channels are
requested.
const websocket = new CoinbasePro.WebsocketClient(
['BTC-USD', 'ETH-USD'],
'wss://ws-feed-public.sandbox.pro.coinbase.com',
{
key: 'suchkey',
secret: 'suchsecret',
passphrase: 'muchpassphrase',
},
{ channels: ['full', 'level2'] }
);
Optionally, change subscriptions at runtime:
websocket.unsubscribe({ channels: ['full'] });
websocket.subscribe({ product_ids: ['LTC-USD'], channels: ['ticker', 'user'] });
websocket.subscribe({
channels: [
{
name: 'user',
product_ids: ['ETH-USD'],
},
],
});
websocket.unsubscribe({
channels: [
{
name: 'user',
product_ids: ['LTC-USD'],
},
{
name: 'user',
product_ids: ['ETH-USD'],
},
],
});
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 CoinbasePro.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 Coinbase Pro using
Orderbook
and WebsocketClient
as described
here.
const orderbookSync = new CoinbasePro.OrderbookSync(['BTC-USD', 'ETH-USD']);
console.log(orderbookSync.books['ETH-USD'].state());
Testing
npm test
npm install -g nsp
nsp check --output summary