Liquidity Docs

Getting Started

Account setup, API keys, and your first trade on Liquidity.io

This guide takes you from account creation to your first executed trade. It covers KYC, API key provisioning, sandbox access, authentication, rate limits, and SDK quick starts across all supported languages.

Account Setup

1. Create an Account

Register at exchange.liquidity.io. You need:

  • Valid email address
  • Phone number (for 2FA)
  • Government-issued photo ID (for KYC)

2. Complete KYC

Identity verification is handled through our Simplici integration. The process takes 5-10 minutes for most applicants.

Individual accounts:

  1. Navigate to Settings > Identity Verification
  2. Upload government-issued photo ID (passport, driver's license, or national ID)
  3. Complete the selfie verification step
  4. Verification completes in under 2 minutes for most submissions

Institutional accounts (KYB):

  1. Contact institutional@liquidity.io with your legal entity name
  2. Provide: certificate of incorporation, beneficial ownership documentation, authorized signers
  3. KYB review typically completes within 1-2 business days

3. Accreditation (if trading private securities)

Private securities (Reg D 506b/506c, pre-IPO) require accreditation verification:

RegulationVerification TypeMethod
Reg D 506bSelf-certificationAttestation form in-app
Reg D 506cThird-party verificationIncome/asset verification via Simplici

Public equities, crypto, fixed income, commodities, and forex do not require accreditation.

4. Fund Your Account

Fiat deposits:

MethodProcessing TimeMinimumMaximum
ACH transfer1-3 business days$10$250,000/day
Wire transferSame business day$1,000No limit
Plaid instantInstant$10$10,000/day

Crypto deposits:

Deposit BTC, ETH, USDC, or other supported assets to your Liquidity.io custody wallet. Deposit addresses are generated in the dashboard under Wallet > Deposit.

API Key Provisioning

Create an API Key

  1. Navigate to Settings > API Keys
  2. Click "Create New Key"
  3. Select permissions:
    • read -- Market data, account balances, order history
    • trade -- Place and cancel orders
    • transfer -- Deposits and withdrawals (use with caution)
  4. (Optional) Set IP allowlist
  5. (Optional) Set position and daily loss limits
  6. Copy both the API key and API secret. The secret is shown only once.

Key Security

  • Store keys in environment variables or a secrets manager
  • Never commit keys to source control
  • Use separate keys for development (sandbox) and production
  • Rotate keys quarterly
  • Revoke immediately if compromised -- all open orders from that key are cancelled automatically

Environments

EnvironmentBase URLPurpose
Productionhttps://api.liquidity.io/v1Live trading with real funds
Staginghttps://api.stage.liquidity.io/v1Pre-release testing
Sandboxhttps://api.next.liquidity.io/v1Development and integration testing

The sandbox environment provides:

  • Full API compatibility with production
  • Test funds pre-loaded on account creation
  • Simulated order matching
  • No real money at risk
  • Same authentication flow as production

Use the sandbox for all development and integration testing before going live.

Authentication

All API requests require HMAC-SHA256 signed authentication.

Request Signing

Every request includes three headers:

HeaderValue
X-API-KEYYour API key
X-TIMESTAMPCurrent Unix timestamp in milliseconds
X-SIGNATUREHMAC-SHA256 of the request payload

Signature Computation

signature = HMAC-SHA256(
  key: api_secret,
  message: timestamp + method + path + body
)

TypeScript Example

import crypto from 'node:crypto';

function signRequest(
  apiSecret: string,
  method: string,
  path: string,
  body: string = ''
): { timestamp: string; signature: string } {
  const timestamp = String(Date.now());
  const message = timestamp + method.toUpperCase() + path + body;
  const signature = crypto
    .createHmac('sha256', apiSecret)
    .update(message)
    .digest('hex');

  return { timestamp, signature };
}

// Usage
const { timestamp, signature } = signRequest(
  process.env.LIQUIDITYIO_API_SECRET!,
  'GET',
  '/v1/ticker/BTC-USD'
);

const response = await fetch('https://api.liquidity.io/v1/ticker/BTC-USD', {
  headers: {
    'X-API-KEY': process.env.LIQUIDITYIO_API_KEY!,
    'X-TIMESTAMP': timestamp,
    'X-SIGNATURE': signature,
  },
});

curl Example

#!/bin/bash
API_KEY="your-api-key"
API_SECRET="your-api-secret"
BASE_URL="https://api.liquidity.io/v1"

TIMESTAMP=$(date +%s%3N)
METHOD="GET"
PATH="/v1/ticker/BTC-USD"
BODY=""

SIGNATURE=$(echo -n "${TIMESTAMP}${METHOD}${PATH}${BODY}" \
  | openssl dgst -sha256 -hmac "${API_SECRET}" -hex | awk '{print $2}')

curl -H "X-API-KEY: ${API_KEY}" \
     -H "X-TIMESTAMP: ${TIMESTAMP}" \
     -H "X-SIGNATURE: ${SIGNATURE}" \
     "${BASE_URL}/ticker/BTC-USD"

IAM OIDC Flow (Web Applications)

For web applications, use the Liquidity IAM OIDC flow instead of API keys:

  1. Redirect to https://iam.next.liquidity.io/oauth/authorize?client_id=YOUR_CLIENT_ID&redirect_uri=YOUR_REDIRECT&response_type=code&scope=trading
  2. User authenticates and grants permissions
  3. Exchange the authorization code for an access token at https://iam.next.liquidity.io/oauth/token
  4. Include the access token as Authorization: Bearer <token> in API requests
  5. Tokens expire after 1 hour. Use the refresh token to obtain new access tokens.

Rate Limits

Endpoint CategoryLimitWindow
Market data (quotes, orderbook)120 requestsper minute
Account data (balances, orders)60 requestsper minute
Order placement30 requestsper minute
Order cancellation60 requestsper minute
WebSocket connections5 concurrentper API key

Rate limit headers are included in every response:

X-RateLimit-Limit: 120
X-RateLimit-Remaining: 118
X-RateLimit-Reset: 1742400060

When a rate limit is exceeded, the API returns 429 Too Many Requests with a Retry-After header.

Institutional Tier

For higher limits, contact institutional@liquidity.io. Institutional accounts receive:

  • 600 market data requests/minute
  • 120 order placements/minute
  • 20 concurrent WebSocket connections
  • Dedicated order matching priority

SDKs

TypeScript

npm install @liquidityio/trading
import { Client, Config, NativeVenueConfig } from '@liquidityio/trading';

const config = new Config()
  .withNative('liquidity', NativeVenueConfig.liquidDex('https://api.liquidity.io/v1'))
  .withVenuePriority(['liquidity']);

const client = new Client(config);
await client.connect();

const order = await client.buy('AAPL', 10);
console.log(`Filled at ${order.average_price}`);

await client.disconnect();

Python

pip install lx-trading
import asyncio
from decimal import Decimal
from lx_trading import Client, Config
from lx_trading.config import NativeVenueConfig

async def main():
    config = Config()
    config.with_native("liquidity", NativeVenueConfig.liquid_dex("https://api.liquidity.io/v1"))

    client = Client(config)
    await client.connect()

    order = await client.buy("AAPL", Decimal("10"))
    print(f"Filled at {order.average_price}")

    await client.disconnect()

asyncio.run(main())

Go

go get github.com/liquidityio/dex/sdk/go
package main

import (
    "fmt"
    "log"

    lxdex "github.com/liquidityio/dex/sdk/go"
)

func main() {
    client := lxdex.NewClient(lxdex.Config{
        APIURL:    "https://api.liquidity.io/v1",
        APIKey:    "your-api-key",
        APISecret: "your-api-secret",
    })

    order, err := client.PlaceOrder("AAPL", "buy", "market", 0, 10)
    if err != nil {
        log.Fatal(err)
    }

    fmt.Printf("Filled at %v\n", order.AveragePrice)
}

Rust

[dependencies]
liquidityio-trading = "0.1"
use liquidityio_trading::{Client, Config, NativeVenueConfig};

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let config = Config::new()
        .with_native("liquidity", NativeVenueConfig::liquid_dex("https://api.liquidity.io/v1"))
        .with_api_key("your-api-key");

    let client = Client::new(config);
    client.connect().await?;

    let order = client.buy("AAPL", 10.0).await?;
    println!("Filled at {}", order.average_price);

    Ok(())
}

C++

#include <liquidityio/trading.h>
#include <iostream>

int main() {
    auto config = lx::Config()
        .withNative("liquidity", lx::NativeVenueConfig::liquidDex("https://api.liquidity.io/v1"))
        .withApiKey("your-api-key");

    auto client = lx::Client(config);
    client.connect();

    auto order = client.buy("AAPL", 10);
    std::cout << "Filled at " << order.averagePrice << std::endl;

    return 0;
}

Quick Start: First Trade in 5 Minutes

Step 1: Get Your API Key (1 minute)

Log into exchange.liquidity.io, go to Settings > API Keys, create a key with read + trade permissions.

Step 2: Set Environment Variables (30 seconds)

export LIQUIDITYIO_API_KEY="your-api-key"
export LIQUIDITYIO_API_SECRET="your-api-secret"
export LIQUIDITYIO_API_URL="https://api.next.liquidity.io/v1"  # sandbox

Step 3: Install the SDK (30 seconds)

npm install @liquidityio/trading

Step 4: Run Your First Trade (1 minute)

Create first-trade.ts:

import { DEX } from '@liquidityio/trading';

const dex = await DEX({
  rpcUrl: process.env.LIQUIDITYIO_API_URL!,
  apiKey: process.env.LIQUIDITYIO_API_KEY!,
});

// Check the price
const ticker = await dex.ticker('BTC-USD');
console.log(`BTC-USD: bid=${ticker.bid} ask=${ticker.ask}`);

// Place a small market buy (sandbox)
const order = await dex.buy('BTC-USD', '0.001');
console.log(`Order ${order.orderId}: ${order.status}`);
console.log(`Filled ${order.filledQuantity} at ${order.averagePrice}`);

Run it:

npx tsx first-trade.ts

Step 5: Try with curl (1 minute)

# Get BTC-USD quote
TIMESTAMP=$(date +%s%3N)
SIGNATURE=$(echo -n "${TIMESTAMP}GET/v1/ticker/BTC-USD" \
  | openssl dgst -sha256 -hmac "$LIQUIDITYIO_API_SECRET" -hex | awk '{print $2}')

curl -s -H "X-API-KEY: $LIQUIDITYIO_API_KEY" \
     -H "X-TIMESTAMP: $TIMESTAMP" \
     -H "X-SIGNATURE: $SIGNATURE" \
     "$LIQUIDITYIO_API_URL/ticker/BTC-USD" | jq .

Expected output:

{
  "symbol": "BTC-USD",
  "bid": "84248.00",
  "ask": "84252.00",
  "last": "84250.00",
  "volume24h": "1234.56",
  "timestamp": 1742400000000
}

Next Steps

TopicLink
Full API referenceAPI Reference
Order types and lifecycleTrading
Order managementOrders
Real-time data via WebSocketWebSocket
SDK referenceSDK
AI-assisted tradingAgentic Trading
MCP server setupModel Context Protocol
Trading skills librarySkills
Regulatory complianceCompliance

Support

ChannelContact
Technical supportsupport@liquidity.io
Institutional onboardinginstitutional@liquidity.io
API statusstatus.liquidity.io
Documentation issuesgithub.com/liquidityio/docs/issues

On this page