Skip to main content
The onramp flow lets your users pay in local currency (NGN, GHS, KES) and receive crypto (USDT, USDC, BTC, ETH) in their wallet. Partna handles the payment collection, currency conversion, and crypto delivery.

How it works

1

Create a user account

Register your user with Partna using Create Account. This creates a permanent account that can receive payments at any time.
2

Complete KYC

Your user must verify their identity before transacting. See Accounts and KYC for the full verification flow. Users only need to verify once.
3

Fetch a rate

Call Get Rate with fromCurrency=NGN and toCurrency=USDT (or your desired fiat/crypto). Save the key from the response.
curl --request GET \
  --url 'https://staging-api.getpartna.com/v4/rate?fromCurrency=NGN&toCurrency=USDT&fromAmount=10000' \
  --header 'x-api-key: YOUR_API_KEY' \
  --header 'x-api-user: YOUR_USERNAME'
4

Initiate the onramp

Call Onramp and Offramp with type: "fiatToCrypto". Include the rate key, amounts, currency pair, and the user’s crypto wallet address.
curl --request POST \
  --url https://staging-api.getpartna.com/v4/ramp \
  --header 'Content-Type: application/json' \
  --header 'x-api-key: YOUR_API_KEY' \
  --header 'x-api-user: YOUR_USERNAME' \
  --data '{
    "type": "fiatToCrypto",
    "fromCurrency": "NGN",
    "fromNetwork": "naira",
    "fromAmount": 10000,
    "toCurrency": "USDT",
    "toNetwork": "tron",
    "cryptoAddress": "TXyz123...userWalletAddress",
    "rateKey": "RATE_KEY_FROM_STEP_3",
    "rampReference": "your-unique-reference-id"
  }'
The response includes a bank account (accountName, accountNumber, bankName) where the user should send their NGN payment.
5

User makes payment

The user transfers the specified NGN amount to the bank account returned in step 4. This can be done via bank transfer or any supported local payment method.
6

Partna converts and delivers

Once Partna confirms the fiat payment, the equivalent crypto is sent to the user’s wallet address. A webhook event is dispatched to your endpoint.

Example response (step 4)

{
  "data": {
    "accountName": "JANE DOE",
    "accountNumber": "9003001002",
    "bankName": "Paystack-Titan",
    "currentRate": 0.000597221725,
    "discountApplied": "0",
    "expiryDate": 1755873600,
    "feeInFromCurrency": 16.74,
    "feeInToCurrency": 0.01,
    "fromAmount": 10000,
    "fromCurrency": "NGN",
    "fromNetwork": "naira",
    "rampReference": "f32c3925063447a54905d31305a14da5",
    "toAmount": 5.872,
    "toCurrency": "USDT",
    "toNetwork": "tron",
    "totalFeesInFromCurrency": 16.74,
    "totalFeesInToCurrency": 0.01
  },
  "message": "request completed"
}

Key parameters

ParameterDescription
typeMust be fiatToCrypto for onramp
fromCurrencyThe local currency the user is paying in (e.g., NGN)
fromNetworkThe payment network for the local currency (e.g., naira, mobileMoney, mpesa)
toCurrencyThe crypto the user will receive (e.g., USDT, USDC, BTC)
toNetworkThe blockchain network for delivery (e.g., tron, ethereum, solana)
cryptoAddressThe user’s wallet address to receive crypto
rateKeyThe rate key from Get Rate
rampReferenceYour unique reference for this transaction (use for idempotency)
fromAmountThe amount in local currency
cancelPendingRampRequestSet to true to cancel any existing pending request for this user. Default: false.
expireActionWhat happens if the rate expires: useCurrentRate (default) or deposit
rampExpTimeCustom expiration time in seconds. Default: 1 hour.

Handling pending requests

Each user can only have one active ramp request at a time. If you need to create a new request while one is pending, set cancelPendingRampRequest: true in your request body.

Tracking status

Use Get Ramp Requests to check the status of a ramp request. You will also receive webhook notifications as the transaction progresses through each stage.