REST API · Trading automation

IONLOOP.TRADE Developer Portal

Build trading tools, automate workflows, and connect your systems with the ionloop.trade REST API.

Example request GET

https://api.ionloop.trade/v1/markets

HTTP
GET https://api.ionloop.trade/v1/markets
Authorization: Bearer YOUR_API_KEY

On this page

Overview

The ionloop.trade REST API exposes versioned resources for market data, trading, portfolio, wallets, transactions, webhooks, and system status. Every response uses the same JSON envelope so bots, dashboards, and back-office tools share one integration pattern.

Success envelope

{
  "success": true,
  "data": {},
  "meta": {
    "requestId": "req_123456",
    "timestamp": "2026-05-14T12:00:00Z"
  }
}

Quick start

Go from signup to your first automated trade flow in six steps.

1

Create your developer account

Register at ionloop.trade and complete identity checks required for trading APIs.

2

Generate an API key

Open Developer Settings, create a key, and assign scopes (markets, orders, portfolio, webhooks).

3

Authenticate requests

Send Authorization: Bearer YOUR_API_KEY on every HTTPS call.

4

Fetch market data

Call GET /v1/markets and /v1/markets/:symbol/ticker to validate connectivity.

5

Place a test order

Submit a small limit order on a sandbox or low-risk pair; verify status via GET /v1/orders/:id.

6

Subscribe to webhook events

Register POST /v1/webhooks and verify HMAC signatures on delivery.

Authentication

Authenticate with a bearer token issued from the ionloop.trade developer console. Keys are scoped; trading endpoints require explicit orders:write (and related) grants.

Header pattern: Authorization: Bearer YOUR_API_KEY
cURL
curl https://api.ionloop.trade/v1/markets \
  -H 'Authorization: Bearer YOUR_API_KEY'
JavaScript fetch
const res = await fetch('https://api.ionloop.trade/v1/markets', {
  headers: {
    Authorization: 'Bearer YOUR_API_KEY',
    Accept: 'application/json'
  }
});
Node.js axios
const axios = require('axios');
const client = axios.create({
  baseURL: 'https://api.ionloop.trade',
  headers: { Authorization: 'Bearer YOUR_API_KEY' }
});
const { data } = await client.get('/v1/markets');
Python requests
import requests

r = requests.get(
    'https://api.ionloop.trade/v1/markets',
    headers={'Authorization': 'Bearer YOUR_API_KEY'},
    timeout=10,
)
print(r.json())

API reference overview

Surface areas map to REST resources on https://api.ionloop.trade. Use “Open reference” to jump to concrete endpoint contracts.

Authentication API

API keys, scopes, rotation, and session-backed issuance from the console.

POST GET
Open reference

Market Data API

Markets, tickers, depth, and reference metadata for listings.

GET
Open reference

Trading API

Submit and lifecycle-manage orders with risk checks.

POST DELETE
Open reference

Orders API

Query working and historical orders for the authenticated account.

GET
Open reference

Portfolio API

Aggregate balances available for trading strategies.

GET
Open reference

Wallet API

Per-wallet views across spot and funding accounts.

GET
Open reference

Transactions API

Ledger history including trades, deposits, withdrawals, and fees.

GET
Open reference

Webhooks API

Register HTTPS endpoints for asynchronous trading events.

POST GET
Open reference

Users API

Profile, preferences, and session helpers tied to your ionloop.trade account.

GET PUT
Open reference

System Status API

Operational signals for API and matching engine availability.

GET
Open reference

Endpoints

Contracts below reflect API version v1. Paths are relative to https://api.ionloop.trade.

GET

/v1/markets

List markets — List available trading markets.

Required permissions: None (public). Optional API key for elevated rate limits.

Parameters

NameTypeRequiredDescription
quote string Optional Filter by quote asset (e.g. USDT).

Response example

JSON
{
  "success": true,
  "data": {
    "items": [
      {
        "symbol": "BTC-USDT",
        "status": "online",
        "baseAsset": "BTC",
        "quoteAsset": "USDT"
      }
    ]
  },
  "meta": {
    "requestId": "req_123456",
    "timestamp": "2026-05-14T12:00:00Z"
  }
}

Error responses

429 RATE_LIMITED — Soft throttle without key

Notes

Responses are cache-friendly; use single-market endpoints for low-latency trading.

GET

/v1/markets/:symbol

Market details — Get details for a single market.

Required permissions: markets:read

Parameters

NameTypeRequiredDescription
symbol string Required Market pair, e.g. BTC-USDT.

Response example

JSON
{
  "success": true,
  "data": {
    "symbol": "BTC-USDT",
    "status": "online",
    "tickSize": "0.01",
    "stepSize": "0.000001",
    "minNotional": "10"
  },
  "meta": {
    "requestId": "req_123456",
    "timestamp": "2026-05-14T12:00:00Z"
  }
}

Error responses

404 NOT_FOUND — Unknown symbol · 403 FORBIDDEN

Notes

Symbol must match active listing; retired markets return NOT_FOUND.

GET

/v1/markets/:symbol/ticker

Ticker — Get latest price and 24h market statistics.

Required permissions: markets:read

Parameters

NameTypeRequiredDescription
symbol string Required Market pair.

Response example

JSON
{
  "success": true,
  "data": {
    "symbol": "BTC-USDT",
    "lastPrice": "65102.45",
    "bid": "65100.10",
    "ask": "65103.80",
    "volume24h": "18293.441",
    "high24h": "65880.00",
    "low24h": "64110.00"
  },
  "meta": {
    "requestId": "req_123456",
    "timestamp": "2026-05-14T12:00:00Z"
  }
}

Error responses

404 NOT_FOUND · 503 MARKET_CLOSED

Notes

Polling faster than 1s may hit throttle; prefer websocket feeds for HFT-style workloads.

GET

/v1/markets/:symbol/orderbook

Order book — Get current order book depth.

Required permissions: markets:read

Parameters

NameTypeRequiredDescription
symbol string Required Market pair.
depth integer Optional Levels per side (default 50, max 500).

Response example

JSON
{
  "success": true,
  "data": {
    "symbol": "BTC-USDT",
    "bids": [["65100.10", "0.542"]],
    "asks": [["65103.80", "0.318"]],
    "sequence": 92881102
  },
  "meta": {
    "requestId": "req_123456",
    "timestamp": "2026-05-14T12:00:00Z"
  }
}

Error responses

404 NOT_FOUND · 429 RATE_LIMITED

Notes

Sequence numbers increase monotonically; drop clients if gap detected.

POST

/v1/orders

Create order — Create a new order.

Required permissions: orders:write

Parameters

NameTypeRequiredDescription
No query parameters.

Request body

JSON
{
  "symbol": "BTC-USDT",
  "side": "buy",
  "type": "limit",
  "quantity": "0.01",
  "price": "65000.00",
  "timeInForce": "GTC"
}

Response example

JSON
{
  "success": true,
  "data": {
    "id": "ord_9x82k1",
    "symbol": "BTC-USDT",
    "side": "buy",
    "type": "limit",
    "status": "open",
    "quantity": "0.01",
    "filledQuantity": "0",
    "price": "65000.00",
    "createdAt": "2026-05-14T12:00:00Z"
  },
  "meta": {
    "requestId": "req_123456",
    "timestamp": "2026-05-14T12:00:00Z"
  }
}

Error responses

422 VALIDATION_ERROR · 402 INSUFFICIENT_BALANCE · 409 ORDER_REJECTED · 503 MARKET_CLOSED

Notes

Send Idempotency-Key to prevent duplicate submissions on retries.

GET

/v1/orders

List orders — List user orders.

Required permissions: orders:read

Parameters

NameTypeRequiredDescription
symbol string Optional Filter by market.
status string Optional open | filled | cancelled · comma-separated.
page integer Optional Page index.

Response example

JSON
{
  "success": true,
  "data": {
    "items": [
      {
        "id": "ord_9x82k1",
        "symbol": "BTC-USDT",
        "side": "buy",
        "status": "open",
        "quantity": "0.01",
        "filledQuantity": "0"
      }
    ],
    "page": 1,
    "pageSize": 50
  },
  "meta": {
    "requestId": "req_123456",
    "timestamp": "2026-05-14T12:00:00Z"
  }
}

Error responses

401 UNAUTHORIZED · 403 FORBIDDEN

Notes

Only returns orders for the authenticated account.

GET

/v1/orders/:id

Get order — Get one order by ID.

Required permissions: orders:read

Parameters

NameTypeRequiredDescription
id string Required Order identifier.

Response example

JSON
{
  "success": true,
  "data": {
    "id": "ord_9x82k1",
    "symbol": "BTC-USDT",
    "side": "buy",
    "type": "limit",
    "status": "open",
    "quantity": "0.01",
    "filledQuantity": "0",
    "price": "65000.00",
    "createdAt": "2026-05-14T12:00:00Z"
  },
  "meta": {
    "requestId": "req_123456",
    "timestamp": "2026-05-14T12:00:00Z"
  }
}

Error responses

404 NOT_FOUND

Notes

Historical fills appear under transactions once completed.

DELETE

/v1/orders/:id

Cancel order — Cancel an open order.

Required permissions: orders:write

Parameters

NameTypeRequiredDescription
id string Required Order identifier.

Response example

JSON
{
  "success": true,
  "data": {
    "id": "ord_9x82k1",
    "status": "cancelled",
    "cancelledAt": "2026-05-14T12:01:05Z"
  },
  "meta": {
    "requestId": "req_123456",
    "timestamp": "2026-05-14T12:00:00Z"
  }
}

Error responses

404 NOT_FOUND · 409 ORDER_REJECTED — Already terminal state

Notes

Webhook order.cancelled emits after matching engine acknowledges.

GET

/v1/portfolio

Portfolio — Get account portfolio balances.

Required permissions: portfolio:read

Parameters

NameTypeRequiredDescription
No query parameters.

Response example

JSON
{
  "success": true,
  "data": {
    "balances": [
      { "asset": "USDT", "available": "12540.22", "locked": "250.00" },
      { "asset": "BTC", "available": "0.845", "locked": "0.010" }
    ]
  },
  "meta": {
    "requestId": "req_123456",
    "timestamp": "2026-05-14T12:00:00Z"
  }
}

Error responses

401 UNAUTHORIZED

Notes

Locked amounts include working orders and pending withdrawals.

GET

/v1/wallets

Wallets — List wallet balances.

Required permissions: wallet:read

Parameters

NameTypeRequiredDescription
type string Optional spot | funding

Response example

JSON
{
  "success": true,
  "data": {
    "wallets": [
      {
        "id": "wal_main",
        "type": "spot",
        "balances": [
          { "asset": "USDT", "available": "12540.22", "locked": "250.00" }
        ]
      }
    ]
  },
  "meta": {
    "requestId": "req_123456",
    "timestamp": "2026-05-14T12:00:00Z"
  }
}

Error responses

403 FORBIDDEN

Notes

Use with transactions for reconciliation across chains and internal rails.

GET

/v1/transactions

Transactions — List account transactions.

Required permissions: transactions:read

Parameters

NameTypeRequiredDescription
type string Optional trade | deposit | withdrawal | fee
from datetime Optional ISO8601 start.
to datetime Optional ISO8601 end.

Response example

JSON
{
  "success": true,
  "data": {
    "items": [
      {
        "id": "txn_77aa",
        "type": "trade",
        "symbol": "BTC-USDT",
        "quantity": "0.01",
        "fee": "0.65",
        "createdAt": "2026-05-14T11:58:00Z"
      }
    ],
    "page": 1,
    "pageSize": 100
  },
  "meta": {
    "requestId": "req_123456",
    "timestamp": "2026-05-14T12:00:00Z"
  }
}

Error responses

400 VALIDATION_ERROR — Invalid window

Notes

Exports for tax reporting available via dashboard CSV.

POST

/v1/webhooks

Create webhook — Create a webhook endpoint.

Required permissions: webhooks:write

Parameters

NameTypeRequiredDescription
No query parameters.

Request body

JSON
{
  "url": "https://hooks.yourapp.com/ionloop",
  "events": ["order.filled", "trade.executed"],
  "secret": "whsec_generate_in_console"
}

Response example

JSON
{
  "success": true,
  "data": {
    "id": "wh_44291",
    "url": "https://hooks.yourapp.com/ionloop",
    "status": "active"
  },
  "meta": {
    "requestId": "req_123456",
    "timestamp": "2026-05-14T12:00:00Z"
  }
}

Error responses

422 VALIDATION_ERROR — Invalid URL or event list

Notes

HTTPS required; secret used for HMAC signature verification.

GET

/v1/system/status

System status — Get API and trading system status.

Required permissions: None (public).

Parameters

NameTypeRequiredDescription
No query parameters.

Response example

JSON
{
  "success": true,
  "data": {
    "api": "operational",
    "matchingEngine": "operational",
    "withdrawals": "degraded",
    "incidents": []
  },
  "meta": {
    "requestId": "req_123456",
    "timestamp": "2026-05-14T12:00:00Z"
  }
}

Error responses

503 INTERNAL_ERROR — Rare aggregation failure

Notes

Poll at most once every 15s; subscribe to status page for human updates.

SDK / examples

Integration snippets you can paste into scripts or services.

JavaScript · list markets

JavaScript
const r = await fetch('https://api.ionloop.trade/v1/markets', {
  headers: { Authorization: 'Bearer YOUR_API_KEY', Accept: 'application/json' }
});
const body = await r.json();
console.log(body.data.items.map((m) => m.symbol));

Node.js · ticker

Node.js
const axios = require('axios');
const { data } = await axios.get(
  'https://api.ionloop.trade/v1/markets/BTC-USDT/ticker',
  { headers: { Authorization: 'Bearer YOUR_API_KEY' } }
);
console.log(data.data.lastPrice);

Python · create order

Python
import requests

payload = {
    "symbol": "BTC-USDT",
    "side": "buy",
    "type": "limit",
    "quantity": "0.01",
    "price": "65000.00",
    "timeInForce": "GTC",
}
r = requests.post(
    "https://api.ionloop.trade/v1/orders",
    headers={"Authorization": "Bearer YOUR_API_KEY"},
    json=payload,
    timeout=15,
)
print(r.json())

cURL · cancel order

cURL
curl -s -X DELETE "https://api.ionloop.trade/v1/orders/ord_9x82k1" \
  -H "Authorization: Bearer YOUR_API_KEY"

Python · portfolio balances

Python
import requests

r = requests.get(
    "https://api.ionloop.trade/v1/portfolio",
    headers={"Authorization": "Bearer YOUR_API_KEY"},
    timeout=10,
)
for row in r.json()["data"]["balances"]:
    print(row["asset"], row["available"], row["locked"])

Webhooks

ionloop.trade delivers trading lifecycle events to your HTTPS endpoints. Each request includes X-Ionloop-Signature (HMAC-SHA256 of the raw body with your webhook secret) and X-Ionloop-Event-Id for idempotent processing.

Event types

  • order.created · order.updated · order.filled · order.cancelled
  • trade.executed
  • wallet.deposit.created · wallet.withdrawal.created
  • transaction.completed
  • price.alert.triggered
  • account.updated

Retries & delivery logs

Transient failures retry with exponential backoff for up to 24 hours. Respond with 2xx within 10 seconds to acknowledge.

The developer console stores delivery logs: timestamps, HTTP status, latency, and truncated response bodies for debugging.

Example payload · order.filled

JSON
{
  "id": "evt_k92qa",
  "type": "order.filled",
  "version": "2026-05-01",
  "createdAt": "2026-05-14T12:00:02Z",
  "data": {
    "orderId": "ord_9x82k1",
    "symbol": "BTC-USDT",
    "filledQuantity": "0.01",
    "averagePrice": "65012.40"
  }
}

Signing & security

Verify HMAC before trusting payloads; rotate secrets per environment. Allow-list ionloop egress IPs where your infrastructure supports it.

Errors

Failures use the same envelope as successes so observability stacks can join on requestId.

JSON
{
  "success": false,
  "error": {
    "code": "UNAUTHORIZED",
    "message": "Missing or invalid API token"
  },
  "meta": {
    "requestId": "req_123456",
    "timestamp": "2026-05-14T12:00:00Z"
  }
}
CodeHTTPWhen
UNAUTHORIZED401Missing, malformed, or expired API key.
FORBIDDEN403Authenticated but lacking scopes or account state blocks trading.
VALIDATION_ERROR422Schema or field validation failed.
RATE_LIMITED429Quota exceeded — honour Retry-After.
NOT_FOUND404Unknown order, market, or resource id.
ORDER_REJECTED409Matching engine rejected the instruction (size, price band, self-trade).
INSUFFICIENT_BALANCE402Not enough available balance for order or withdrawal.
MARKET_CLOSED503Market halted or in post-only maintenance.
INTERNAL_ERROR500Unexpected server fault — retry with backoff.

Status, limits & pagination

API operational

Production targets high availability; subscribe to the public status channel for incident timelines.

Rate limits

Authenticated traffic defaults to 1200 requests / minute per API key with burst control on order routes.

429 responses include RATE_LIMITED and Retry-After.

Pagination

List endpoints accept page and pageSize (max 100). Results are stable within a page token window; use time filters for audit pulls.

API versioning

All routes documented here live under /v1/. Breaking changes ship only in new major versions with a published migration window.

Sandbox

Use https://api-sandbox.ionloop.trade with sandbox keys for integration tests — ledger balances are isolated from production.

Support

Developer support covers REST onboarding, webhook debugging, and quota adjustments.