curl -H "Authorization: Bearer lid_live_..." \
https://api.liddie.io/api/v1/conversions/66b1f0c2a4d9e8f1b2c3d4e5
const res = await fetch(
'https://api.liddie.io/api/v1/conversions/66b1f0c2a4d9e8f1b2c3d4e5',
{ headers: { Authorization: 'Bearer lid_live_...' } }
)
const conversion = await res.json()
// conversion.status: keep polling until "completed" or "failed"
{
"_id": "66b1f0c2a4d9e8f1b2c3d4e5",
"merchantId": "6650a1b2c3d4e5f6a7b8c9d0",
"fromCurrency": "USDT_BASE",
"toCurrency": "USDC_SOL",
"fromAmount": 412.55,
"status": "processing",
"executionMode": "external",
"creditAmountStr": "409.211044",
"requestedAt": "2026-07-29T10:15:02.114Z",
"createdAt": "2026-07-29T10:15:01.980Z",
"updatedAt": "2026-07-29T10:15:03.020Z"
}
Conversions
Get a conversion
Fetch a single Liddie conversion by id — the status source of truth to poll until external-mode settlement completes and funds are credited.
GET
/
api
/
v1
/
conversions
/
{conversionId}
curl -H "Authorization: Bearer lid_live_..." \
https://api.liddie.io/api/v1/conversions/66b1f0c2a4d9e8f1b2c3d4e5
const res = await fetch(
'https://api.liddie.io/api/v1/conversions/66b1f0c2a4d9e8f1b2c3d4e5',
{ headers: { Authorization: 'Bearer lid_live_...' } }
)
const conversion = await res.json()
// conversion.status: keep polling until "completed" or "failed"
{
"_id": "66b1f0c2a4d9e8f1b2c3d4e5",
"merchantId": "6650a1b2c3d4e5f6a7b8c9d0",
"fromCurrency": "USDT_BASE",
"toCurrency": "USDC_SOL",
"fromAmount": 412.55,
"status": "processing",
"executionMode": "external",
"creditAmountStr": "409.211044",
"requestedAt": "2026-07-29T10:15:02.114Z",
"createdAt": "2026-07-29T10:15:01.980Z",
"updatedAt": "2026-07-29T10:15:03.020Z"
}
Returns one conversion record. This is the status source of truth: in external mode, poll this endpoint until
Never returned (stripped at the API boundary): the internal
status is completed or failed — never treat the execute 201 as final. Detail reads keep working even while conversions are disabled platform-wide.
Authorization
Dual auth — a secret API key with theconversions:read scope, or a dashboard JWT with the conversions:view permission. Dashboard sessions must belong to a merchant_admin, merchant_member or super_admin role; API-key callers are gated by scope only. See the Authentication guide.
Rate limit: the global default.
curl -H "Authorization: Bearer lid_live_..." \
https://api.liddie.io/api/v1/conversions/66b1f0c2a4d9e8f1b2c3d4e5
const res = await fetch(
'https://api.liddie.io/api/v1/conversions/66b1f0c2a4d9e8f1b2c3d4e5',
{ headers: { Authorization: 'Bearer lid_live_...' } }
)
const conversion = await res.json()
// conversion.status: keep polling until "completed" or "failed"
{
"_id": "66b1f0c2a4d9e8f1b2c3d4e5",
"merchantId": "6650a1b2c3d4e5f6a7b8c9d0",
"fromCurrency": "USDT_BASE",
"toCurrency": "USDC_SOL",
"fromAmount": 412.55,
"status": "processing",
"executionMode": "external",
"creditAmountStr": "409.211044",
"requestedAt": "2026-07-29T10:15:02.114Z",
"createdAt": "2026-07-29T10:15:01.980Z",
"updatedAt": "2026-07-29T10:15:03.020Z"
}
On
completed, reconcile your books against creditAmountStr — the exact amount actually credited, as a decimal string — never against toAmount or the quote. It is normally at least the quoted minimum, but a late-deposit shortfall fill can complete below it. On failed, the full source amount (commission included) was credited back; render merchantMessage.Path parameters
string
required
The conversion id. A malformed id is
400 INVALID_ID; a foreign or unknown id is 404 CONVERSION_NOT_FOUND (the response never reveals whether an id exists under another account).Response fields
The full record shape is documented in Conversion record fields. Key fields for polling:string
One of
initializing, pending, processing, completed, failed, cancelled — see the status lifecycle. Poll until completed or failed.string
External mode: the exact amount credited as a decimal string — normally at least the quoted minimum, but a late-deposit shortfall fill can be lower. Reconcile on this, not on
toAmount or the quote.string
Merchant-safe explanation of a terminal outcome. The only failure text you should ever render.
error text, the provider request id, the provider deposit address, the exact funding amounts and both on-chain transaction hashes. Do not build against them.
Errors
| Status | Body | Why |
|---|---|---|
| 400 | { "ok": false, "error": { "code": "INVALID_ID", "message": "…" } } | conversionId is not a valid id. |
| 400 | { "ok": false, "error": { "code": "INVALID_CONVERSION_ID", "message": "…" } } | Id could not be resolved. |
| 400 | { "ok": false, "error": { "code": "NO_MERCHANT_CONTEXT", "message": "…" } } | No merchant context on the credential. |
| 404 | { "ok": false, "error": { "code": "CONVERSION_NOT_FOUND", "message": "…" } } | Unknown or another merchant’s conversion — the response never reveals which. |
See also
- Execute a conversion: the call whose
201this endpoint finishes — full record field list included. - List conversions: paginated history when you need more than one row.
- Conversions Overview: the status lifecycle and what each terminal state means for your funds.