Skip to main content

Install the Client SDK

The recommended way to interact with Cryptorobot.ai is via the official typed client package over WebSockets:
npm install @cryptorobot.ai/client

Connect & Authenticate

import { createClient } from '@cryptorobot.ai/client';

// Connect via WebSocket (recommended)
const client = createClient('https://api.cryptorobot.ai');

// Authenticate with email/password
const { accessToken, user } = await client.authenticate({
  strategy: 'local',
  email: 'you@example.com',
  password: 'your-password'
});

console.log('Logged in as:', user.email);

Using Services

All API endpoints are exposed as typed services:
// List strategies (paginated)
const strategies = await client.service('strategies').find({
  query: { $limit: 10, $sort: { createdAt: -1 } }
});
console.log(strategies.total, strategies.data);

// Get a single resource
const strategy = await client.service('strategies').get('507f1f77bcf86cd799439011');

// Create a resource
const exchange = await client.service('exchanges').create({
  name: 'binance',
  apiKey: 'your-api-key',
  secret: 'your-secret'
});

// Update a resource
await client.service('strategies').patch('507f1f77bcf86cd799439011', {
  name: 'Updated Strategy Name'
});

// Delete a resource
await client.service('strategies').remove('507f1f77bcf86cd799439011');

Real-Time Events

The WebSocket connection automatically receives real-time events for services you interact with:
// Listen for new pod events
client.service('traders/pods/events').on('created', (event) => {
  console.log('New pod event:', event);
});

// Listen for ticker updates
client.service('exchanges/ticker').on('patched', (ticker) => {
  console.log('Price update:', ticker.symbol, ticker.last);
});

// Listen for trade executions
client.service('trades').on('created', (trade) => {
  console.log('Trade executed:', trade.side, trade.amount, trade.symbol);
});

REST Alternative

For environments where WebSockets aren’t available, you can use REST:
import { createClient } from '@cryptorobot.ai/client';

const client = createClient('https://api.cryptorobot.ai', { transport: 'rest' });

await client.authenticate({
  strategy: 'local',
  email: 'you@example.com',
  password: 'your-password'
});

const strategies = await client.service('strategies').find();

Base URL

https://api.cryptorobot.ai

Required Headers (REST only)

HeaderValueRequired
Content-Typeapplication/jsonFor POST/PATCH/PUT
AuthorizationBearer <token> or ApiKey <key>For authenticated endpoints

Query Parameters

Pagination

// SDK
await client.service('strategies').find({ query: { $limit: 10, $skip: 20 } });

// REST
// GET /strategies?$limit=10&$skip=20

Sorting

// Sort by createdAt descending
await client.service('strategies').find({ query: { $sort: { createdAt: -1 } } });

// REST: GET /strategies?$sort[createdAt]=-1

Field Selection

// Only return name and type fields
await client.service('strategies').find({ query: { $select: ['name', 'type'] } });

// REST: GET /strategies?$select[]=name&$select[]=type

Filtering

// Exact match
await client.service('strategies').find({ query: { type: 'momentum' } });

// Comparison operators
await client.service('trades').find({
  query: { createdAt: { $gte: '2024-01-01', $lte: '2024-12-31' } }
});

// In array
await client.service('exchanges').find({
  query: { name: { $in: ['binance', 'bybit'] } }
});

Response Format

Paginated List (Find)

{
  "total": 42,
  "limit": 25,
  "skip": 0,
  "data": [{ "_id": "...", "name": "Strategy A" }]
}

Single Resource (Get / Create / Patch)

{
  "_id": "507f1f77bcf86cd799439011",
  "name": "My Strategy",
  "createdAt": "2024-01-15T10:30:00.000Z",
  "updatedAt": "2024-01-15T10:30:00.000Z"
}

Error

{
  "name": "NotAuthenticated",
  "message": "Invalid access token",
  "code": 401,
  "className": "not-authenticated"
}