Coinbase GDAX NodeJS - Invalid API Key

927 Views Asked by At

I'm trying to write a script that will cancel all my orders on GDAX. According to the documentation for Cancel an Order I need to send a DELETE request to /delete. But I assume before I can do that I need to sign the message first.

When I submit the request using fetch in Node, I get this response: { message: 'Invalid API Key' }

Here is the a code sample I am working on, with the confidential stuff replaced of course:

var crypto = require('crypto');
var fetch = require('fetch');

const coinbaseSecret = 'abc...';
const coinbaseAPIKey = 'abc...';
const coinbasePassword = 'abc...';
const coinbaseRestAPIURL = "https://api-public.sandbox.gdax.com";

function start(){
 getTime(function(time){
  cancelAll(time, function(){
   console.log('done');
  });
 });
}

function getTime(callback){
 fetch.fetchUrl(coinbaseRestAPIURL + '/time', null, function(error, meta, body){
  var response = JSON.parse(body.toString());
  console.log('response', response);

  var timeStamp = response.epoch;
  callback(timeStamp);
 });
}

function cancelAll(timeStamp, callback) {
 // Refer to https://docs.gdax.com/#cancel-an-order

 var signature = getSignature('DELETE', '/delete', "");
 console.log('signature', signature);
 
 var headers = {
  'Content-Type': 'application/json',
  'CB-ACCESS-KEY': coinbaseAPIKey,
  'CB-ACCESS-SIGN': signature,
  'CB-ACCESS-TIMESTAMP': timeStamp, //Date.now() / 1000,
  'CB-ACCESS-PASSPHRASE': coinbasePassword
 };
 console.log('headers', headers);

 fetch.fetchUrl(coinbaseRestAPIURL + '/delete', {
  method: 'DELETE',
  headers: headers
 }, function(error, meta, body){
  var response = JSON.parse(body.toString());
  console.log('response', response);
  callback();
 })
}

function getSignature(method, requestPath, body) {
 // Refer to https://docs.gdax.com/#signing-a-message

 const secret = coinbaseSecret;
 const timestamp = Date.now() / 1000;
 const what = timestamp + method + requestPath + body;
 const key = Buffer(secret, 'base64');
 const hmac = crypto.createHmac('sha256', key);
 const signature = hmac.update(what).digest('base64');

 return signature;
}

start();

1

There are 1 best solutions below

0
On

Go to the Gdax-Node Github repo and take a look at their code and examples.

1) Create an authenticatedClient by configuring it with your api details, 2) Then simply use the authedClient object and calncelAllOrders method:

authedClient.cancelAllOrders({product_id: 'BTC-USD'}, callback);

You could wrap this with a function to call 'x' amount of times (it states in the documentation), or you cold think of something fancier if you'd like.

Note:- make sure you pull the github repo and do not install from npm directly as there are a few bugs and issues that have been fixed on the git repo but NOT pushed to npm.

...so use npm install coinbase/gdax-node when downloading your gdax package.

Hope that helps a little...