Partner API

Quickstart

From server credentials to a ready managed account.

1. Obtain approved access

CRISP supplies an API origin, key ID (cpk_…), one-time secret (cps_…) and scopes through a secure channel. The production origin is https://partner-api.crisp.trade; paths start with /v1. Use the origin CRISP approves for testing. There is no implied publicly available sandbox.

Store credentials only on your backend. Example variable names below belong to your integration, not the CRISP dashboard:

CRISP_API_ORIGIN=https://partner-api.crisp.trade
CRISP_PARTNER_KEY_ID=provided-securely
CRISP_PARTNER_SECRET=provided-securely

2. Make a read-only request

Save the Node.js client alongside this script. Use Node 24. Do not import the client into a browser bundle.

import { createPartnerClient } from './partner-client.mjs';

const request = createPartnerClient({
  origin: process.env.CRISP_API_ORIGIN,
  keyId: process.env.CRISP_PARTNER_KEY_ID,
  secret: process.env.CRISP_PARTNER_SECRET,
});
const result = await request('/v1/capabilities');
if (!result.ok) throw new Error(`CRISP request failed: ${result.status}`);
console.log(result.payload.data); // Do not log credentials or full user payloads.

accounts:read is required. Capabilities describe environment enablement, not permission to bypass your key's scopes. Request GET /v1/trading-status with markets:read to show service restrictions in your product.

3. Provision an account

Only run this after CRISP approves your test account. Authenticate your own user first. Persist the external ID and intent key before sending the request.

const externalUserId = 'example:user-123'; // Stable ID chosen by your backend.
const created = await request('/v1/accounts', {
  method: 'POST',
  idempotencyKey: 'provision-example-user-123',
  body: {
    externalUserId,
    externalIdentity: { label: 'Username', value: '@example' },
  },
});
// Inspect created.ok and created.payload; 202 means provisioning was accepted.
const status = await request(`/v1/accounts/${encodeURIComponent(externalUserId)}`);

Requires accounts:write; status needs accounts:read. Use bounded exponential backoff (for example 1, 2, 4, 8, then 15 seconds) while provisioning. Stop on terminal failure/revocation; do not fund or trade until status is ready.

4. Integrate incrementally

Read wallet/funding instructions, choose a real market/outcome from market data, then test a small user-approved order. An HTTP acceptance is not a confirmed fill. Implement order lifecycle and recovery before enabling the submit button. Complete the launch checklist.

CRISP Partner Developer Documentation