P2P trading and all other Bitania services are temporarily disabled until further notice. Only swaps are available for now.
REST API Endpoint

List swappable pairs

POST /swap/pairs

List every swappable currency permutation. Every supported currency can be swapped to every other one, in both directions, and every pair is direct: Bitania prices from the market and pays from its own liquidity, so there is no routing through a hub. The type and via fields are kept for compatibility with older integrations. GET is accepted as well.

Authentication: HMAC-signed (v2) request — X-API-KEY, X-API-SIGN, X-API-TIMESTAMP, X-API-NONCE headers. See the Swap Aggregator Guide.

Response 200

Success

{
  code: integer, e.g. 0 — 0 = success, 1 = error
  msg: string, e.g. "" — Error message (empty on success)
  data: array — All swappable pairs (72 today: 9 currencies in both directions)
    {
      from: string, e.g. "XMR" — Source currency code
      to: string, e.g. "LTC" — Destination currency code
      type: string, e.g. "direct" — Always direct
      via: array, e.g. [] — Always empty
      available: boolean, e.g. true — false while the pair (or one of its coins) is under maintenance
      fixed: boolean, e.g. true — Whether you may request fixed-rate quotes on it (your key's fixed_rate_enabled, and the pair available)
      min: number, e.g. 0.05 — Minimum send amount for this pair
    }
}
// POST /v1/swap/pairs  →  data:
[
  { "from": "BTC", "to": "USDTTRC", "type": "direct", "via": [], "available": true, "fixed": true, "min": 0.001 },
  { "from": "XMR", "to": "LTC",     "type": "direct", "via": [], "available": true, "fixed": true, "min": 0.05 },
  { "from": "TRX", "to": "XMR",     "type": "direct", "via": [], "available": true, "fixed": true, "min": 100 }
]

Response 400

Validation or business error

{
  code: integer, e.g. 1 — Error code (1)
  msg: string, e.g. "Missing required fields: from, to, amount" — Error message
  data: null
}

Response 401

Authentication failed: unknown or disabled key, IP not whitelisted (Invalid credentials), or a bad signature, stale timestamp or reused nonce (Invalid signature)

{
  code: integer, e.g. 1
  msg: string, e.g. "Invalid credentials"
  data: null
}

Response 429

Rate limit of this endpoint exhausted; wait retry_after seconds (also sent as the Retry-After header)

{
  code: integer, e.g. 1
  msg: string, e.g. "Rate limit exceeded. Please retry after 12 seconds."
  data: null
  retry_after: integer, e.g. 12
}