Skip to content
API v1 is deprecated. It stays supported, but new integrations should use the Khalani API. See Migrate to v2.
API v1 · Deprecated

Limits and reliability (v1)

v1 endpoints take no API key. Anyone can call them.

X-Integrator-Id is an optional header on POST /v1/quotes. It only selects fee configuration; it is not authentication.

  • The format is a lowercase slug, a hyphen and 8 hex characters, such as acme-1a2b3c4d. Khalani assigns it.
  • A malformed header is ignored, not rejected. An unknown or disabled id falls back to the default fees.
  • The id is stored with the quote, so the build and the submit need no header.
  • The body field integratorId does the same. The header wins when both are sent.

v2 requires an API key. See Migrate to v2.

Route Per wallet Per IP
POST /v1/deposit/build 60 / minute 300 / minute
  • Per wallet means per from in the build body. A build without from counts against a per-IP bucket of the same size instead.
  • A build must pass both limits. Other traffic from a shared egress IP can use up the per-IP allowance.
  • Limits are counted per edge location and are approximate.
  • A 429 has the body { "errorCode": "RATE_LIMITED", "message": "Too many requests, please retry later" } and no Retry-After header. Back off and retry.

POST /v1/quotes is not rate limited, and neither are the submit and the order reads. Quote as often as your UI needs, but quote on user intent, not on a tight timer, because every quote asks every route for a price.

During maintenance, POST /v1/quotes and POST /v1/deposit/build return 503 with Retry-After: 300:

{ "name": "MaintenanceException", "message": "SystemMaintenance" }

They pause together, so no quote is offered that the next build would refuse. PUT /v1/deposit/submit and the order reads keep working. A user who deposited before maintenance began can still submit and be tracked.

An API outage stops new quotes and builds, and delays submits and order status. It does not move funds that are already deposited:

  • Native route. A deposited order is an intent with its output, recipient, refund address and deadline already fixed. It fills, or it is refunded after its deadline. Refunds and status updates can lag while services recover.
  • External routes. Across, deBridge and Glacis settle the order themselves, without the API.

If the user deposited but the submit could not reach the API, submit the same hash once the API is back. The quote stays stored until 60 seconds after its validBefore. After that, the submit returns 404, so contact Khalani with the transaction hash.

Contact Khalani through your partner channel. Include the orderId if there is one, the quoteId, the routeId, the deposit’s transaction hash, the x-request-id of the failing response, and the time of the call.