Bridge
The bridge moves Skipo's tokens from one network to another through a counterparty: Skipo sends tokens
to the counterparty on one network, and the counterparty pays Skipo on another. The Bridge section
(/v2/bridge) publishes Skipo's records of each of those transfers. Every route in it is a read
(GET).
Resources keep Skipo's perspective, like the rest of v2:
| Bridge step | In the Bridge section it is… |
|---|---|
| Skipo sends tokens to the counterparty | a withdrawal (/v2/bridge/withdrawals) |
| The counterparty pays Skipo (a payment or a refund) | a deposit (/v2/bridge/deposits) |
| Where the counterparty pays Skipo | a deposit address (/v2/bridge/deposit-addresses) |
The two legs of one transfer join by transactionHash. A send also carries, in
withdrawalData.clientReferenceId, the reference Skipo gave the counterparty for that send.
Only the Skipo account configured as the bridge counterparty sees data. Every other account reads an
empty section: [] from the deposit addresses, a page with an empty data array from the lists, and
404 not_found from a read by id.
Authentication
The Bridge routes are Tier 1: a bearer key with the transfers:read scope. It is the same
authentication and the same scope that GET /v2/withdrawals, GET /v2/deposits and
GET /v2/deposit-addresses use, and no other scope is required. See
Authentication.
GET /v2/bridge/deposit-addresses HTTP/1.1
Host: api.skipo.com
Authorization: Bearer skp_live_<placeholder>
Endpoints
| Method | Path | Returns |
|---|---|---|
GET | /v2/bridge/deposit-addresses | A bare array of the bridge deposit addresses. |
GET | /v2/bridge/withdrawals | {data, pagination} with Skipo's sends to the counterparty. |
GET | /v2/bridge/withdrawals/{id} | One send. |
GET | /v2/bridge/deposits | {data, pagination} with the receipts from the counterparty. |
GET | /v2/bridge/deposits/{id} | One receipt. |
The parameter and schema tables of each route are in the Bridge endpoint reference.
Deposit addresses
GET /v2/bridge/deposit-addresses returns a bare array, with no pagination envelope, holding one row
per (assetSymbol, networkId) pair the bridge offers.
| Field | Type | Description |
|---|---|---|
assetSymbol | string | The settled asset code, for example USDT. |
networkId | string | The address's network, in the GET /v2/assets vocabulary: BSC, ETH, TRON. |
networkName | string | The network's name, for display only. |
address | string | The bridge deposit address on that network. |
tag | string | null | null on BSC, ETH and TRON. Never "". |
tagRequired | boolean | false on BSC, ETH and TRON. |
tagType | string | null | null on BSC, ETH and TRON. |
tagLabel | string | null | null on BSC, ETH and TRON. |
minimumDeposit | decimal string | The minimum deposit at this address, in assetSymbol. The counterparty keeps every payment and every refund to this address at or above it. |
It takes one optional parameter, assetSymbol, which restricts the list to one asset. An asset the
bridge does not offer answers [], not an error.
[
{
"assetSymbol": "USDT",
"networkId": "ETH",
"networkName": "Ethereum (ERC20)",
"address": "0x3333333333333333333333333333333333333333",
"tag": null,
"tagRequired": false,
"tagType": null,
"tagLabel": null,
"minimumDeposit": "0.1"
},
{
"assetSymbol": "USDT",
"networkId": "BSC",
"networkName": "BNB Smart Chain (BEP20)",
"address": "0x3333333333333333333333333333333333333333",
"tag": null,
"tagRequired": false,
"tagType": null,
"tagLabel": null,
"minimumDeposit": "0.1"
},
{
"assetSymbol": "USDT",
"networkId": "TRON",
"networkName": "Tron (TRC20)",
"address": "T333333333333333333333333333333333",
"tag": null,
"tagRequired": false,
"tagType": null,
"tagLabel": null,
"minimumDeposit": "0.1"
}
]
Sends and receipts
GET /v2/bridge/withdrawals lists Skipo's sends to the counterparty, and GET /v2/bridge/deposits the
receipts from it: its payments and its refunds. Both return the {data, pagination} envelope described
in Pagination.
| Parameter | Description |
|---|---|
page | Page number. Starts at 1. Default 1. |
limit | Items per page, from 1 to 100. Default 25. |
startDate | Inclusive lower bound on createdAt, in ISO-8601. |
endDate | Exclusive upper bound on createdAt, in ISO-8601. |
assetFormat | base or rebased (the default). On the bridge both give the same figures, with multiplier "1". |
assetSymbol | Exact settled asset code, for example USDT. |
status | PENDING, IN_PROGRESS, COMPLETED or FAILED, matched as a string. An unknown value answers an empty page. |
subType | Only EXTERNAL_CRYPTO has rows. Any other enum value answers an empty page. |
transactionHash | The exact transaction hash. Hex digits match in either case. |
clientReferenceId | Withdrawals only. Exact match on withdrawalData.clientReferenceId. |
Rows come newest first: createdAt descending and, for equal createdAt, id descending.
- A send is listed only once it carries its
transactionHash, which happens before Skipo notifies the counterparty of the send. - On a receipt,
createdAtis when Skipo first detected it.
GET /v2/bridge/withdrawals?page=1&limit=100&startDate=2026-10-02T14:00:00Z&endDate=2026-10-05T14:00:00.512Z&assetFormat=base HTTP/1.1
Host: api.skipo.com
Authorization: Bearer skp_live_<placeholder>
Read by id
GET /v2/bridge/withdrawals/{id} and GET /v2/bridge/deposits/{id} return one row with the same
content it has on the list, and take the same assetFormat. An id that is not a bridge send (or
receipt) of your account answers 404 not_found.
GET /v2/bridge/withdrawals/00000000-0000-4000-8000-000000000184?assetFormat=base HTTP/1.1
Host: api.skipo.com
Authorization: Bearer skp_live_<placeholder>
Record conventions
Sends use the v2 WithdrawalResource and receipts the DepositResource, with these values fixed on the
bridge:
subTypeis alwaysEXTERNAL_CRYPTO.feeis always"0"andamountequalstotal. On a send,amountis exactly the tokens sent. On a receipt, it is what arrived on chain, truncated to the asset'samountIncrement.multiplieris"1"andbaserepeats the top-level values in eitherassetFormat.bankReferenceisnull. On receipts,senderName,senderNationalId,senderBankId,senderAccount,bankDescriptionandvalueDatearenulltoo.- Every documented key is always present. A missing value is
null, never"". - Timestamps are ISO-8601 in UTC with milliseconds, for example
2026-10-05T14:03:05.118Z. - Hashes come in their network's canonical form: on EVM,
0xplus 64 lowercase hex digits; on TRON, 64 lowercase hex digits with no prefix. The top-leveltransactionHashequals the copy insidewithdrawalDataordepositData. - A row in a final status (
COMPLETEDorFAILED) never changes again.
withdrawalData
| Key | Description |
|---|---|
networkId, networkName, networkNativeAsset, evmChainId, assetType | The chain block, as on GET /v2/withdrawals. |
transactionHash | The send's hash, equal to the top-level one. |
destinationAddress | The counterparty's address the tokens were sent to. |
destinationTag | null. |
sourceAddress | The Skipo custody address that made the send. |
clientReferenceId | The reference Skipo gave the counterparty for this send. It is opaque: compare it as is. |
networkFee, networkFeeAssetSymbol | The gas Skipo paid for a COMPLETED send, in the network's native coin. Informational only, and null on any other row. |
statusReason | null unless FAILED, where it is REVERTED or DROPPED. |
updatedAt | When the row last changed. |
completedAt | When the row became COMPLETED; null in any other status. |
depositData
| Key | Description |
|---|---|
networkId, networkName, networkNativeAsset, evmChainId, assetType | The chain block, as on GET /v2/deposits. |
transactionHash | The receipt's hash, equal to the top-level one. |
sourceAddress | The address that sent the tokens on chain. |
depositAddress | The bridge deposit address that received the tokens. |
depositTag | null. |
statusReason | null unless FAILED, where it is DROPPED. |
updatedAt | When the row last changed. |
completedAt | When the row became COMPLETED; null in any other status. |
Statuses
status | On a send | On a receipt |
|---|---|---|
PENDING | In flight: Skipo recorded the send and it is not yet confirmed on chain. | In flight: Skipo detected the receipt and it is not yet confirmed. |
IN_PROGRESS | In flight: the transaction was broadcast to the chain and is waiting for confirmations. | In flight: the transaction is waiting for confirmations. |
COMPLETED | Final. The tokens are at the counterparty's address. | Final. Skipo credited the receipt. |
FAILED | Final. No tokens reached the counterparty through this transaction. | Final. Skipo did not credit the receipt. |
PENDING and IN_PROGRESS are in-flight statuses: read the row by id again until it reaches a final
status.
statusReason is null unless status is FAILED:
statusReason | Where | Meaning |
|---|---|---|
REVERTED | Sends | The transaction ran on chain and failed. It moved no tokens. |
DROPPED | Sends | The transaction never became final on chain: it was dropped or replaced. It moved no tokens. |
DROPPED | Receipts | The receipt failed and Skipo will not credit it. |
Errors
| HTTP | code | When |
|---|---|---|
400 | validation_error | An unknown parameter, or a value that fails validation: a subType outside the enum, an invalid assetFormat, a malformed date, or a limit outside 1–100. |
404 | not_found | A read by id of an id that is not a bridge send or receipt of your account. |
502 | downstream_unavailable | A Skipo internal service did not answer. Safe to retry. |
The other v2 codes (401, 403, 429, 500 and 503) behave as on every other route. See
Errors.
Examples
Every value is a placeholder.
A list of sends
{
"data": [
{
"id": "00000000-0000-4000-8000-000000000184",
"type": "WITHDRAWAL",
"subType": "EXTERNAL_CRYPTO",
"assetSymbol": "USDT",
"amount": "25000",
"fee": "0",
"total": "25000",
"status": "COMPLETED",
"createdAt": "2026-10-05T13:59:41.120Z",
"transactionHash": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"bankReference": null,
"assetFormat": "base",
"multiplier": "1",
"base": { "asset": "USDT", "amount": "25000", "fee": "0", "total": "25000" },
"withdrawalData": {
"networkId": "ETH",
"networkName": "Ethereum (ERC20)",
"networkNativeAsset": "ETH",
"evmChainId": 1,
"assetType": "ERC20",
"transactionHash": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"destinationAddress": "0x2222222222222222222222222222222222222222",
"destinationTag": null,
"sourceAddress": "0x1111111111111111111111111111111111111111",
"clientReferenceId": "skp-br-000184",
"networkFee": "0.000412",
"networkFeeAssetSymbol": "ETH",
"statusReason": null,
"updatedAt": "2026-10-05T14:03:05.118Z",
"completedAt": "2026-10-05T14:03:05.118Z"
}
}
],
"pagination": { "page": 1, "limit": 100, "totalItems": 1, "totalPages": 1 }
}
A list of receipts
{
"data": [
{
"id": "00000000-0000-5000-8000-000000000501",
"type": "DEPOSIT",
"subType": "EXTERNAL_CRYPTO",
"assetSymbol": "USDT",
"amount": "24999",
"fee": "0",
"total": "24999",
"status": "COMPLETED",
"createdAt": "2026-10-05T14:07:30.004Z",
"transactionHash": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
"bankReference": null,
"senderName": null,
"senderNationalId": null,
"senderBankId": null,
"senderAccount": null,
"bankDescription": null,
"valueDate": null,
"assetFormat": "base",
"multiplier": "1",
"base": { "asset": "USDT", "amount": "24999", "fee": "0", "total": "24999" },
"depositData": {
"networkId": "TRON",
"networkName": "Tron (TRC20)",
"networkNativeAsset": "TRX",
"evmChainId": null,
"assetType": "TRC20",
"transactionHash": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
"sourceAddress": "T444444444444444444444444444444444",
"depositAddress": "T333333333333333333333333333333333",
"depositTag": null,
"statusReason": null,
"updatedAt": "2026-10-05T14:08:40.300Z",
"completedAt": "2026-10-05T14:08:40.300Z"
}
}
],
"pagination": { "page": 1, "limit": 100, "totalItems": 1, "totalPages": 1 }
}
See also: Bridge · Withdrawals · Deposits · Pagination.