Skip to main content

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 stepIn the Bridge section it is…
Skipo sends tokens to the counterpartya withdrawal (/v2/bridge/withdrawals)
The counterparty pays Skipo (a payment or a refund)a deposit (/v2/bridge/deposits)
Where the counterparty pays Skipoa 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 for the bridge counterparty

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​

MethodPathReturns
GET/v2/bridge/deposit-addressesA 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.

FieldTypeDescription
assetSymbolstringThe settled asset code, for example USDT.
networkIdstringThe address's network, in the GET /v2/assets vocabulary: BSC, ETH, TRON.
networkNamestringThe network's name, for display only.
addressstringThe bridge deposit address on that network.
tagstring | nullnull on BSC, ETH and TRON. Never "".
tagRequiredbooleanfalse on BSC, ETH and TRON.
tagTypestring | nullnull on BSC, ETH and TRON.
tagLabelstring | nullnull on BSC, ETH and TRON.
minimumDepositdecimal stringThe 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.

ParameterDescription
pagePage number. Starts at 1. Default 1.
limitItems per page, from 1 to 100. Default 25.
startDateInclusive lower bound on createdAt, in ISO-8601.
endDateExclusive upper bound on createdAt, in ISO-8601.
assetFormatbase or rebased (the default). On the bridge both give the same figures, with multiplier "1".
assetSymbolExact settled asset code, for example USDT.
statusPENDING, IN_PROGRESS, COMPLETED or FAILED, matched as a string. An unknown value answers an empty page.
subTypeOnly EXTERNAL_CRYPTO has rows. Any other enum value answers an empty page.
transactionHashThe exact transaction hash. Hex digits match in either case.
clientReferenceIdWithdrawals 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, createdAt is 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:

  • subType is always EXTERNAL_CRYPTO.
  • fee is always "0" and amount equals total. On a send, amount is exactly the tokens sent. On a receipt, it is what arrived on chain, truncated to the asset's amountIncrement.
  • multiplier is "1" and base repeats the top-level values in either assetFormat.
  • bankReference is null. On receipts, senderName, senderNationalId, senderBankId, senderAccount, bankDescription and valueDate are null too.
  • 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, 0x plus 64 lowercase hex digits; on TRON, 64 lowercase hex digits with no prefix. The top-level transactionHash equals the copy inside withdrawalData or depositData.
  • A row in a final status (COMPLETED or FAILED) never changes again.

withdrawalData​

KeyDescription
networkId, networkName, networkNativeAsset, evmChainId, assetTypeThe chain block, as on GET /v2/withdrawals.
transactionHashThe send's hash, equal to the top-level one.
destinationAddressThe counterparty's address the tokens were sent to.
destinationTagnull.
sourceAddressThe Skipo custody address that made the send.
clientReferenceIdThe reference Skipo gave the counterparty for this send. It is opaque: compare it as is.
networkFee, networkFeeAssetSymbolThe gas Skipo paid for a COMPLETED send, in the network's native coin. Informational only, and null on any other row.
statusReasonnull unless FAILED, where it is REVERTED or DROPPED.
updatedAtWhen the row last changed.
completedAtWhen the row became COMPLETED; null in any other status.

depositData​

KeyDescription
networkId, networkName, networkNativeAsset, evmChainId, assetTypeThe chain block, as on GET /v2/deposits.
transactionHashThe receipt's hash, equal to the top-level one.
sourceAddressThe address that sent the tokens on chain.
depositAddressThe bridge deposit address that received the tokens.
depositTagnull.
statusReasonnull unless FAILED, where it is DROPPED.
updatedAtWhen the row last changed.
completedAtWhen the row became COMPLETED; null in any other status.

Statuses​

statusOn a sendOn a receipt
PENDINGIn 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_PROGRESSIn flight: the transaction was broadcast to the chain and is waiting for confirmations.In flight: the transaction is waiting for confirmations.
COMPLETEDFinal. The tokens are at the counterparty's address.Final. Skipo credited the receipt.
FAILEDFinal. 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:

statusReasonWhereMeaning
REVERTEDSendsThe transaction ran on chain and failed. It moved no tokens.
DROPPEDSendsThe transaction never became final on chain: it was dropped or replaced. It moved no tokens.
DROPPEDReceiptsThe receipt failed and Skipo will not credit it.

Errors​

HTTPcodeWhen
400validation_errorAn 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.
404not_foundA read by id of an id that is not a bridge send or receipt of your account.
502downstream_unavailableA 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.