On-Ramp Transactions

Buy tokens with a bank transfer and receive them in your organisation wallet, from lookups and bank details to confirming the transfer and tracking delivery

An on-ramp transaction (type: ONRAMP) converts fiat into tokens. You create the transaction, get Skyline's bank details, send a bank transfer, and confirm that you sent it. Skyline matches your funds and delivers the tokens to your organisation wallet.

Read Transactions first for statuses, preconditions and errors.

Prerequisites

  • On-ramp enabled for your organisation. It is off by default. Contact Skyline to enable it. Check it with GET /users/me: selectedOrganisation.features includes ONRAMPS. Without it, create returns 403 Onramps are not allowed in this method.
  • A destination wallet. Tokens go to one of your organisation's own wallets, which must have passed screening and ownership verification. See Wallets.
  • An API user with the authorized role, 2FA off, in an ACTIVE organisation.

Step 1: Look Up the Ids

CallWhat you take from it
GET /transactions/min-onramp-amountminAmount, in USD. The amount you transfer, converted to USD, must reach it.
GET /transactions/onramp-currenciesThe currencies you can transfer. Keep the currency _id.
GET /receivers/selfYour organisation's own receiver. Keep its _id.
GET /networks/client-visibleThe network to receive on. Keep its _id and chainId.
GET /tokens?tradableInFiat=true&limit=300The token's isoCode. Pick a token with an ERC20Address entry for the network's chainId.
GET /users/meselectedOrganisation.wallets: your organisation wallet on that network. Keep its _id and address.

GET /transactions/min-onramp-amount returns:

{ "minAmount": 1000, "currency": "USD" }

Step 2: Validate on Your Side

The server does not check all of these. Check them before you create:

  • amount is a positive decimal string, in the currency you chose.
  • amount converted to USD is at least minAmount. Below it, create returns 400 Minimum amount is $….
  • expectedTransferDate is today or later. The server accepts past dates.
  • The destination wallet is on the network you chose.

Step 3: Create the Transaction

POST /transactions

{
  "type": "ONRAMP",
  "network": "6650a1f2c3d4e5f6a7b8c9d0",
  "amountCurrency": "6650d4a5b6c7d8e9f0a1b2c3",
  "payments": [
    {
      "type": "ONRAMP",
      "receiver": { "id": "6650e5b6c7d8e9f0a1b2c3d4" },
      "wallet": "6650f6c7d8e9f0a1b2c3d4e5",
      "walletAddress": "0x4b1c2d3e4f5a6b7c8d9e0f1a2b3c4d5e6f7a8b9c",
      "tokenIsoCode": "USDC",
      "amount": "25000",
      "reason": "onramp",
      "expectedTransferDate": "2026-10-02"
    }
  ]
}

Transaction fields:

FieldRequiredDescription
typeYesONRAMP.
networkYesThe network _id you receive on.
amountCurrencyYesThe _id of the currency you transfer, from GET /transactions/onramp-currencies.
paymentsYesOne payment.

An on-ramp has no top-level token or walletAddress. The token and the destination are set on the payment.

Payment fields:

FieldRequiredDescription
typeYesONRAMP.
receiver.idYesYour organisation's own receiver, from GET /receivers/self.
walletYesYour organisation wallet _id. It must belong to your organisation.
walletAddressYesThat wallet's address.
tokenIsoCodeYesThe token you receive.
amountYesThe fiat amount you will transfer, as a decimal string.
expectedTransferDateYesThe date you will send the transfer, YYYY-MM-DD.
reasonNoA short label, for example onramp.

The response is the transaction in DRAFT. payments[].estimatedRate is an indicative rate at creation, not a locked quote. On-ramp has no validate or allowance step.

Step 4: Submit

POST /transactions/:id/submit with no body.

The transaction moves to WAITING_ACCEPTANCE. There is no quote window: an on-ramp does not expire.

Step 5: Get the Bank Details

GET /transactions/:id/bank-details returns an array of accounts you can pay into. Field names are in snake_case.

[
  {
    "bank_display": "EUR account",
    "bank_name": "Skyline Digital Ltd",
    "account_number_iban": "GB00XXXX00000000000000",
    "swift": "XXXXGB2L",
    "sort_code": "000000",
    "address": "1 Example Street, London",
    "reference": "6651a7d8e9f0a1b2c3d4e5f6"
  }
]
FieldMeaning
bank_displayA label for the account.
bank_nameThe account holder name.
account_number_ibanThe account number or IBAN.
swiftThe BIC/SWIFT code.
sort_codeUK sort code, when relevant.
addressThe bank address, when available.
referenceThe payment reference to use. See below.

The reference:

  • If your organisation has a dedicated account, reference is empty. Transfers into that account are already yours; no reference is needed.
  • Otherwise reference is the transaction _id. You must put it in the transfer's reference field. Without it, Skyline cannot match your funds to the transaction.

Step 6: Send the Bank Transfer

From your bank, transfer:

  • the exact amount,
  • in the currency you chose,
  • to one of the accounts above,
  • with the reference, when it is not empty.

Step 7: Confirm You Sent the Funds

POST /transactions/:id/accept with no body. This means "I have sent the funds".

Accept requires WAITING_ACCEPTANCE. It returns 403 if the destination wallet has not passed screening and ownership verification.

On success the transaction moves to PROCESSING. For an on-ramp, PROCESSING means you declared the transfer sent. It does not mean Skyline has received the funds.

Step 8: Track Delivery

Skyline matches your transfer and delivers the tokens to your wallet. Poll GET /transactions/:id every 30 to 60 seconds. Bank transfers can take hours or days, so expect a long PROCESSING phase.

StatusMeaning
PROCESSINGYou confirmed the transfer. Skyline is waiting for or processing the funds.
RELEASEDThe tokens are on their way to your wallet.
COMPLETEDSettled. Final.
FAILEDRead statusInfo. Contact Skyline if your funds were sent.
REJECTED_BY_SKYLINERejected by Skyline's review. Final.

Endpoint Reference

EndpointMethodPurpose
/transactions/min-onramp-amountGETMinimum amount in USD
/transactions/onramp-currenciesGETCurrencies you can transfer
/receivers/selfGETYour organisation's own receiver
/transactionsPOSTCreate the transaction
/transactions/:idPUTReplace the transaction body
/transactions/:id/submitPOSTMove to WAITING_ACCEPTANCE
/transactions/:id/bank-detailsGETWhere to send the transfer
/transactions/:id/acceptPOSTConfirm you sent the funds
/transactions/:idGETRead status

On this page