Requests and responses follow standard HTTP response status codes for success and failures.
Request bodies should have content type application/json and be valid JSON. For instructions on creating a valid X-CB-ACCESS-SIGNATURE, see API Authentication.
// native NodeJS https moduleconst https = require("https");// Google's crypto-js package via https://www.npmjs.com/package/crypto-jsconst CryptoJS = require("crypto-js");// Derived from your Coinbase Prime API Key// SIGNING_KEY: the signing key provided as a part of your API key// ACCESS_KEY: the access key provided as a part of your API key// PASSPHRASE: the PASSPHRASE key provided as a part of your API keyconst SIGNING_KEY = process.env.SIGNING_KEY;const ACCESS_KEY = process.env.ACCESS_KEY;const PASSPHRASE = process.env.PASSPHRASE;const REST_METHODS = { GET: "GET", POST: "POST", PUT: "PUT", DELETE: "DELETE",};// Your unique entity IDconst ENTITY_ID = process.env.ENTITY_ID;// A specific portfolio ID (only necessary if relevant to the request you're making)const PORTFOLIO_ID = process.env.PORTFOLIO_ID;// The base URL of the APIconst PROD_URL = "api.prime.coinbase.com";// The path of the API endpoint being calledlet requestPath = `/v1/portfolios/${PORTFOLIO_ID}`;// The method of the request: GET, POST, PUT, DELETE, etclet method = REST_METHODS.GET;// Request signatures require a current UNIX timestamp in seconds that is// embedded in the signed payload to verify against server clock.const currentTimeInSecs = Math.floor(Date.now() / 1000);// Body will be JSON (POST) or empty string (GET)const body = "";// Function to generate a signature using CryptoJSfunction sign(str, secret) { const hash = CryptoJS.HmacSHA256(str, secret); return hash.toString(CryptoJS.enc.Base64);}// Function to build the payload required to signfunction buildPayload(ts, method, requestPath, body) { return `${ts}${method}${requestPath}${body}`;}// Build the string we want to sign using information defined aboveconst strToSign = buildPayload(currentTimeInSecs, method, requestPath, body);// Sign it!const sig = sign(strToSign, SIGNING_KEY);// Use Postman's scripting objects to append the header valuesconst headers = new Map();headers.set("X-CB-ACCESS-KEY", ACCESS_KEY);headers.set("X-CB-ACCESS-PASSPHRASE", PASSPHRASE);headers.set("X-CB-ACCESS-SIGNATURE", sig);headers.set("X-CB-ACCESS-TIMESTAMP", currentTimeInSecs);headers.set("Content-Type", "application/json");const requestOptions = { hostname: PROD_URL, path: requestPath, method: REST_METHODS.GET, headers: Object.fromEntries(headers),};https .get(requestOptions, (res) => { let data = []; console.log("Status Code:", res.statusCode); res.on("data", (chunk) => { data.push(chunk); }); res.on("end", () => { console.log("Response ended: "); const parsedResponse = JSON.parse(Buffer.concat(data).toString()); console.log(parsedResponse); }); }) .on("error", (err) => { console.log("Error: ", err.message); });
Unless otherwise stated, bad requests respond with HTTP 4xx or 5xx status codes. The body also contains a message parameter indicating the cause.
Your implementation language’s HTTP library should be configured to provide message bodies for non-2xx requests so that you can read the message field from the body.
A successful response is indicated by HTTP status code 200 and may contain an optional body. If the response has a body, it will be documented under the related endpoint resource below.