Skip to main content
The Tender on-ramp converts a fiat bank payment (e.g. NGN transfer) into cryptocurrency and delivers it to a wallet address on the customer’s chosen blockchain — all in a single integration.

How it works

1

Get a quote

Call POST /onramp/quote with the fiat amount and target cryptocurrency. Tender returns a live exchange rate, an estimated crypto output, and a quoteId that is valid for a short window (typically 60 seconds).
2

Initiate the on-ramp

Call POST /onramp/initiate with the quoteId, the customer’s wallet address, and their contact details. Tender creates a virtual bank account and returns the transfer details to show your customer.
3

Customer pays

Customer makes a local bank transfer to the virtual account. No crypto wallet or exchange account is needed on their side — just a standard bank transfer.
4

Tender processes automatically

Once payment is confirmed, Tender runs the pipeline automatically:
  • Forwards the fiat to the swap provider
  • Swaps fiat → intermediate crypto (USDT on Tron)
  • Delivers the final crypto to the targetAddress on the targetChain
5

Poll for completion

Call GET /onramp/{reference} to track progress. The stages object shows exactly where the pipeline is at any moment.

Pipeline stages

After payment is confirmed, the on-ramp moves through these stages in order: Each stage has a status of pending, in_progress, completed, failed, or skipped.

Overall status values


Key concepts

Quotes are required and single-use

Before initiating, you must call /onramp/quote to lock in a rate. The returned quoteId is:
  • Time-limited — expires after time_to_lock seconds (shown as expiresAt)
  • Single-use — consumed the moment it is passed to /onramp/initiate
Attempting to initiate with an expired or already-used quote returns a 400 error.

Virtual bank accounts expire

The virtual bank account returned by /onramp/initiate expires after 1 hour. If the customer does not pay within that window, the on-ramp request moves to failed status.

Supported chains and currencies

Use the discovery endpoints to present your customers with what is available:
  • GET /onramp/chains — chains that support on-ramp delivery
  • GET /onramp/coins — cryptocurrencies available, optionally filtered by chain

Integration

This section walks through every step of a real on-ramp integration, from discovery to polling for completion. All examples use the sandbox environment.

Prerequisites

  • A Tender merchant account with API credentials
  • Your TENDER_ACCESS_ID and TENDER_ACCESS_SECRET set as environment variables

Authentication guide

Onramp endpoints use Signed (HMAC) authentication — an HMAC-SHA256 signature is required on every request. Follow the authentication guide for full details and code examples in Node.js, Python, and PHP before continuing.
The examples below assume you have a makeHeaders() helper and a BASE constant as described in that guide:

Step 1 — Discover available chains and coins

Show your customers which blockchains and currencies they can receive.

Step 2 — Get a quote

Once the customer has chosen a target currency and entered their fiat amount, fetch a live quote.
Quotes expire at expiresAt. Display a countdown and call /onramp/quote again if the customer lets it lapse before confirming.

Step 3 — Show the quote to your customer

Display the estimated output and ask for confirmation before initiating.
The estimated amount is based on the rate at quote time. The actual amount delivered may differ slightly if the quote expires and a fresh rate is applied internally.

Step 4 — Initiate the on-ramp

After the customer confirms, call /onramp/initiate with the quoteId and their wallet address.
Error cases to handle:

Step 5 — Display bank transfer details

Show the returned bankTransfer details so the customer knows where to send money.
Store the reference — you will use it to poll for status.

Step 6 — Poll for completion

Poll GET /onramp/{reference} until status is crypto_sent or completed.
Rather than polling, configure a webhook to receive a notification when the status changes. See Webhooks for setup instructions.

Inspecting stage progress

The stages object in the status response shows the exact state of each pipeline step.

Error handling