# Authentication
Source: https://docs.alphapo.net/api-reference/authentication
Learn how to authenticate API requests and avoid common setup issues.
## Required headers
Include the following headers with every request, except for [/ping](/api-reference/endpoints/ping):
| Header | Required | Description |
| :----------------------- | :------- | :------------------------------------------------------------------------- |
| `Content-Type` | Yes | Must be `application/json` |
| `X-Processing-Key` | Yes | Your API key |
| `X-Processing-Signature` | Yes | HMAC-SHA512 signature of the request body, generated using your secret key |
## How to generate the signature
Generate the signature from the exact JSON string sent in the request body:
1. Take the exact request body string that you are going to send.
2. Use your **secret key** as the HMAC key.
3. Compute the HMAC signature using the SHA-512 algorithm and encode the result as a lowercase hexadecimal string.
4. Send that value in the `X-Processing-Signature` header.
The signature must be generated from the exact request body sent to the API.
If the body changes after signing, the request will be rejected.
Make sure that:
* The JSON is not reformatted or pretty-printed after signing
* Field order does not change
* No extra whitespace or line breaks are added
* Your HTTP client does not modify the body before sending it
## Verify your implementation
Generate a signature for the following JSON body using `AbCdEfG123456` as the secret key:
```json theme={null}
{"currency":"BTC","foreign_id":"123456"}
```
Expected result:
```text theme={null}
03c25fcf7cd35e7d995e402cd5d51edd72d48e1471e865907967809a0c189ba55b90815f20e2bb10f82c7a9e9d865546fda58989c2ae9e8e2ff7bc29195fa1ec
```
## Common pitfalls
Most authentication errors are caused by differences between the signed body and the sent body.
Check the following:
* The JSON used for signing is identical to the JSON sent
* Field order has not changed
* No additional whitespace or line breaks were introduced
* Your HTTP client did not modify the request body
* The signature is **hex-encoded** (not Base64)
* Header names match exactly:
* `X-Processing-Key`
* `X-Processing-Signature`
# Callbacks overview
Source: https://docs.alphapo.net/api-reference/callbacks/callbacks-overview
A callback is an automatic notification sent by AlphaPo to your system about status changes for [deposits](/api-reference/callbacks/deposit-callbacks), [withdrawals](/api-reference/callbacks/withdrawal-callbacks), [exchange transactions](/api-reference/callbacks/exchange-callbacks), and [payment requests](/api-reference/callbacks/payment-request-callbacks).
## Processing callbacks
Set up an HTTPS webhook endpoint where AlphaPo can send callbacks. Your webhook URL must use HTTPS, use a domain name, and be considered safe by VirusTotal and similar scanners.
After you create the endpoint, register it in AlphaPo. In your merchant settings, open the **Callbacks** tab and enter your endpoint address in the **Callback URL** field.
When AlphaPo sends a callback to your endpoint, your system should:
Generate an HMAC-SHA512 signature for the callback request body using your secret key, then compare it with the value in the `X-Processing-Signature` header.
Check whether the callback is a duplicate by verifying that its transaction ID has not already been processed. If it has not, process the event, for example by updating the customer’s balance in your system.
No response body is required.
For additional security, you can whitelist the AlphaPo IP addresses used for callback delivery. Contact Support for the current list of IP addresses.
## Retry schedule
If your system does not respond with **HTTP 200 OK** to a callback, AlphaPo keeps the callback in the sending queue and retries delivery 12 times after the initial attempt.
Each retry is scheduled relative to the previous attempt: +1 minute, then +5, +15, +30, +60, +90, +120, +180, +240, +240, +240, +240 minutes.
The retry schedule is not configurable.
# Deposit callbacks
Source: https://docs.alphapo.net/api-reference/callbacks/deposit-callbacks
## Processing deposit callbacks
Deposit callbacks are sent whenever funds are received at an address created via the [/addresses/take](/api-reference/endpoints/addresses-take) endpoint.
Use the `foreign_id` field to identify which customer made the deposit. This value is the same as the `foreign_id` you provided when calling `/addresses/take`.
Handle callback statuses as follows:
* `"status": "confirmed"` — the deposit has been fully confirmed, and it is safe to perform business actions such as crediting the customer’s balance in your system.
* `"status": "not_confirmed"` — the deposit has been detected but is still being processed. In this case, we recommend creating the transaction on your side with a `pending` or `processing` status and informing the customer that the deposit is still being confirmed.
Amount fields included in the callback:
* `currency_sent.amount` — the amount sent by the customer in the deposit currency
* `currency_received.amount` — the amount received after processing or conversion
* `currency_received.amount_minus_fee` — the amount credited to your merchant balance after fees
## Deposit callback payload examples
Sent when a deposit has been successfully confirmed and can be treated as final on your side. At this stage, it is safe to perform business actions such as crediting the customer's balance.
```json highlight={9,18-19,43} theme={null}
{
"id": 1,
"end_user_reference": "user_12345",
"type": "deposit",
"crypto_address": {
"id": 1,
"currency": "BTC",
"address": "39mFf3X46YzUtfdwVQpYXPCMydc74ccbAZ",
"foreign_id": "12345",
"tag": null
},
"currency_sent": {
"currency": "BTC",
"amount": "6.53157512"
},
"currency_received": {
"currency": "BTC",
"amount": "6.53157512",
"amount_minus_fee": "6.5119800"
},
"transactions": [
{
"id": 1,
"currency": "BTC",
"transaction_type": "blockchain",
"type": "deposit",
"address": "39mFf3X46YzUtfdwVQpYXPCMydc74ccbAZ",
"tag": null,
"amount": "6.53157512",
"txid": "3950ad8149421a850d01dff88f024810e363ac18c9e8dd9bc0b9116e7937ad93",
"riskscore": "0.5",
"confirmations": 3
}
],
"fees": [
{
"type": "deposit",
"currency": "BTC",
"amount": "0.01959472"
}
],
"error": "",
"status": "confirmed"
}
```
Sent when funds are received at an address configured with automatic conversion. In this case, the deposited amount is received in the address currency, and then converted into the `convert_to` currency before being credited to your balance.
```json highlight={7-8,11,17-21,53} theme={null}
{
"id": 2686510,
"end_user_reference": "user_12345",
"type": "deposit_exchange",
"crypto_address": {
"id": 382270,
"currency": "BTC",
"convert_to": "EUR",
"address": "39mFf3X46YzUtfdwVQpYXPCMydc74ccbAZ",
"tag": null,
"foreign_id": "12345"
},
"currency_sent": {
"currency": "BTC",
"amount": "0.01000000"
},
"currency_received": {
"currency": "EUR",
"amount": "84.17070222",
"amount_minus_fee": "79.96216711"
},
"transactions": [
{
"id": 714576,
"currency": "BTC",
"transaction_type": "blockchain",
"type": "deposit",
"address": "39mFf3X46YzUtfdwVQpYXPCMydc74ccbAZ",
"tag": null,
"amount": "0.01000000",
"txid": "3a491da90a1ce5a318d0aeff6867ab98a03219abae29ed68d702291703c3538b",
"riskscore": "0.42",
"confirmations": "1"
},
{
"id": 714577,
"currency": "BTC",
"currency_to": "EUR",
"transaction_type": "exchange",
"type": "exchange",
"amount": "0.01000000",
"amount_to": "84.17070222"
}
],
"fees": [
{
"type": "exchange",
"currency": "EUR",
"amount": "4.20853511"
}
],
"error": "",
"status": "confirmed"
}
```
Sent when a user deposits a currency different from the one originally assigned to the address. In this case, the callback includes `expected_currency`, and `crypto_address.cross_currency` is set to `true`.
```json highlight={5,11} theme={null}
{
"id": 2686510,
"end_user_reference": "user_12345",
"type": "deposit",
"expected_currency": "USDC",
"crypto_address": {
"id": 382270,
"currency": "ETH",
"address": "0xd61180ff0cf74dc3ee8e264751f18c47060729b9",
"tag": null,
"cross_currency": true,
"foreign_id": "12345"
},
"currency_sent": {
"currency": "ETH",
"amount": "0.01000000"
},
"currency_received": {
"currency": "ETH",
"amount": "0.01000000",
"amount_minus_fee": "0.00900000"
},
"transactions": [
{
"id": 714576,
"currency": "ETH",
"transaction_type": "blockchain",
"type": "deposit",
"address": "0xd61180ff0cf74dc3ee8e264751f18c47060729b9",
"tag": null,
"amount": "0.01000000",
"txid": "3a491da90a1ce5a318d0aeff6867ab98a03219abae29ed68d702291703c3538b",
"riskscore": "0.72",
"confirmations": "9"
},
],
"fees": [
{
"type": "transfer",
"currency": "ETH",
"amount": "0.00037336"
},
],
"error": "",
"status": "confirmed"
}
```
Sent when the transaction has been detected but is still being processed. You can create the deposit on your side with a `pending` or `processing` status, but should wait for a `confirmed` callback before treating it as final.
```json highlight={9,17-18,36} theme={null}
{
"id": 132506113,
"end_user_reference": "user_12345",
"type": "deposit",
"crypto_address": {
"id": 3776973,
"currency": "ETH",
"address": "0x071B2E45e2CD08011555755b93d5C76D2E62C4Cd",
"tag": null,
"foreign_id": "11"
},
"currency_sent": {
"currency": "ETH",
"amount": "0.01000000"
},
"currency_received": {
"currency": "ETH",
"amount": "0.01000000",
"amount_minus_fee": "0.01000000"
},
"transactions": [
{
"id": 3745588,
"currency": "ETH",
"transaction_type": "blockchain",
"type": "deposit",
"address": "0x071B2E45e2CD08011555755b93d5C76D2E62C4Cd",
"tag": null,
"amount": "0.01000000",
"txid": "0x4c72ffcb2dfcd0b21c4f19c094558865af465abdfa04a2b8c33ee569afa4ef8d",
"riskscore": null,
"confirmations": "1"
}
],
"fees": [],
"error": "",
"status": "not_confirmed"
}
```
Sent when the deposited amount is lower than the minimum allowed for that currency. Such deposits are not credited, and no fees are charged.
```json highlight={10,26-27} theme={null}
{
"id": 2686563,
"end_user_reference": "user_12345",
"type": "deposit",
"crypto_address": {
"id": 381738,
"currency": "ETH",
"address": "0xd61180ff0cf74dc3ee8e264751f18c47060729b9",
"tag": null,
"foreign_id": "12345"
},
"transactions": [
{
"id": 714657,
"currency": "ETH",
"transaction_type": "blockchain",
"type": "deposit",
"address": "0xd61180ff0cf74dc3ee8e264751f18c47060729b9",
"tag": null,
"amount": "0.00000001",
"txid": "0x6b353da88a8ba2df4926c1ccc58991f484a683ba57ec3dde70e812b5c8c7fa1d",
"confirmations": "9"
}
],
"fees": [],
"error": "Transaction amount less than minimum deposit",
"status": "cancelled"
}
```
Sent when a detected deposit is cancelled because of a double-spend event. Since the transaction is not considered valid, you should not credit the customer's balance.
```json highlight={10,27-28} theme={null}
{
"id": 100,
"end_user_reference": "user_12345",
"type": "deposit",
"crypto_address": {
"id": 123,
"currency": "BTC",
"address": "tb1qhaj2ruldumppj49ystync0um6239qsjj44s67e",
"tag": null,
"foreign_id": "12345"
},
"transactions": [
{
"id": 999,
"currency": "BTC",
"transaction_type": "blockchain",
"type": "deposit",
"address": "tb1qhaj2ruldumppj49ystync0um6239qsjj44s67e",
"tag": null,
"amount": "0.002",
"txid": "5d52f01510df872b3115e6f88e9f58a1d15603498a58924d2ea2c1a8e34751c7",
"riskscore": "0.01",
"confirmations": "0"
}
],
"fees": [],
"error": "Double spend",
"status": "cancelled"
}
```
## Callbacks for instant confirmations
For deposits, our system supports instant confirmations. This means some deposits can be confirmed in our system before they are confirmed on the blockchain. In these cases, the system immediately sends a callback with the `confirmed` status. By confirming the transaction early, we assume the risk associated with accepting the funds before on-chain confirmation. No action is required on your side.
In other cases, you will first receive a callback with the `not_confirmed` status. This means we have detected the transaction in the mempool, but we are not yet ready to guarantee that it will be completed. In this case, you can create the transaction on your side and assign it the `pending` status. Then wait for the second callback, in which the `status` parameter will change to `confirmed`.
## Additional deposit callbacks
You can choose whether to receive callbacks for the cases below. By default, these callbacks are enabled:
* deposits below the minimum allowed amount
* deposits received in a currency different from the currency assigned to the crypto address
To configure additional callbacks, follow these steps:
1. In the merchant dashboard, go to **Settings** and open the **Callbacks** tab.
2. Under **Additional callbacks**, click **Manage**.
3. Enable or disable one or both of the following options, then click **Save changes**.
# Exchange callbacks
Source: https://docs.alphapo.net/api-reference/callbacks/exchange-callbacks
## Processing exchange callbacks
Exchange callbacks are sent whenever the status of an exchange created via the [/exchange/fixed](/api-reference/endpoints/exchange-fixed) or [/exchange/now](/api-reference/endpoints/exchange-now) endpoint changes. The callback format is the same for exchanges created with either endpoint.
When you receive a callback with `"status": "confirmed"`, the exchange has been successfully completed. At this stage, your balances for the affected currencies have already been updated. You can retrieve your current account balances via the [/accounts/list](/api-reference/endpoints/accounts-list) endpoint.
## Exchange callback payload example
Below is an example of a callback for a confirmed exchange:
```json highlight={31} theme={null}
{
"id": 134782394,
"type": "exchange",
"currency_sent": {
"currency": "BTC",
"amount": "0.00010000"
},
"currency_received": {
"currency": "ETH",
"amount": "0.00326418"
},
"transactions": [
{
"id": 9628634,
"currency": "BTC",
"currency_to": "ETH",
"transaction_type": "exchange",
"type": "exchange",
"amount": "0.00010000",
"amount_to": "0.00326418"
}
],
"fees": [
{
"type": "fee_crypto_exchange_to_crypto",
"currency": "BTC",
"amount": "0.00000200"
}
],
"error": "",
"status": "confirmed"
}
```
# Payment request callbacks
Source: https://docs.alphapo.net/api-reference/callbacks/payment-request-callbacks
## Processing payment request callbacks
Payment request callbacks are sent whenever the status of a payment request changes.
When you receive a callback with `"status": "paid"`, the payment request has been successfully paid and can be treated as completed on your side.
Use `foreign_id` to identify the payment request or order in your system and map it to the user for whom the payment request was created.
## Payment request callback payload examples
Sent when the payment request is created with a fixed exchange rate and is waiting for payment. At this stage, no funds have been received yet.
```json highlight={5} theme={null}
{
"payment_request_id": "019c0ebf-81e5-751d-aa57-fb9e2cba23c2",
"foreign_id": "order_12345",
"type": "payment_request",
"status": "processing",
"end_user_email": "test@test.com",
"payment_request_address": {
"id": "019c0ebf-84a1-7bdc-a09c-8b62294cc75d",
"currency": {
"iso": "BTC",
"network_name": "bitcoin"
},
"convert_to": {
"iso": "ETH",
"network_name": "ethereum"
},
"address": "tb1qj0d4rsczat6dx3yy065g98rrz5hewkrdcrz7je"
},
"payment_request_amount": {
"currency": {
"iso": "ETH",
"network_name": "ethereum"
},
"amount": "0.3"
},
"currency_sent": {
"currency": {
"iso": "BTC",
"network_name": "bitcoin"
},
"expected_amount": "0.0094",
"received_amount": "0",
"remaining_amount": "0.0094"
},
"fixed_at": 1769773958,
"expires_at": 1769774157,
"valid_until": 1769774157
}
```
Sent when a new payment transaction is detected for the payment request. The payment request remains in `processing` status until the full required amount is received.
```json highlight={5} theme={null}
{
"payment_request_id": "019c0f25-e7db-7ca3-b19f-a7916b5a4905",
"foreign_id": "order_34567",
"type": "payment_request",
"status": "processing",
"end_user_email": "example@example.com",
"payment_request_address": {
"id": "019c0f25-eb0d-70bd-b282-8e58de5d1b7c",
"currency": {
"iso": "ETH",
"network_name": "ethereum"
},
"convert_to": {
"iso": "ETH",
"network_name": "ethereum"
},
"address": "0x114da762447ccb464ac29134B2930e0570139F83"
},
"payment_request_amount": {
"currency": {
"iso": "ETH",
"network_name": "ethereum"
},
"amount": "0.3"
},
"currency_sent": {
"currency": {
"iso": "ETH",
"network_name": "ethereum"
},
"expected_amount": "0.3",
"received_amount": "0.15",
"remaining_amount": "0.15"
},
"transactions": [
{
"id": "019c0f26-25fc-7738-bdf1-85708ec6e67c",
"currency": {
"iso": "ETH",
"network_name": "ethereum"
},
"address": "0x114da762447ccb464ac29134B2930e0570139F83",
"amount": "0.15",
"txid": "0x12882dbbd810304bd0d9707472dbb40f8c2f7d9a1e6b3c4d5f60718293a4b5c6",
"status": "confirmed",
"late_payment": false
}
],
"fixed_at": 1769780669,
"expires_at": 1769780868,
"valid_until": 1769780868
}
```
Sent when the full required amount has been received and the payment request is successfully completed.
```json highlight={5} theme={null}
{
"payment_request_id": "019c0f25-e7db-7ca3-b19f-a7916b5a4905",
"foreign_id": "order_34567",
"type": "payment_request",
"status": "paid",
"end_user_email": "example@example.com",
"payment_request_address": {
"id": "019c0f25-eb0d-70bd-b282-8e58de5d1b7c",
"currency": {
"iso": "ETH",
"network_name": "ethereum"
},
"convert_to": {
"iso": "ETH",
"network_name": "ethereum"
},
"address": "0x114da762447ccb464ac29134B2930e0570139F83"
},
"payment_request_amount": {
"currency": {
"iso": "ETH",
"network_name": "ethereum"
},
"amount": "0.3"
},
"currency_sent": {
"currency": {
"iso": "ETH",
"network_name": "ethereum"
},
"expected_amount": "0.3",
"received_amount": "0.3",
"remaining_amount": "0"
},
"currency_received": {
"currency": {
"iso": "ETH",
"network_name": "ethereum"
},
"amount": "0.3"
},
"transactions": [
{
"id": "019c0f26-25fc-7738-bdf1-85708ec6e67c",
"currency": {
"iso": "ETH",
"network_name": "ethereum"
},
"address": "0x114da762447ccb464ac29134B2930e0570139F83",
"amount": "0.15",
"txid": "0xa3f1c9d8427e6b5c1098d7e6f5a4b3c291807f6e5d4c3b2a1908f7e6d5c4b3a2",
"status": "confirmed",
"late_payment": false
},
{
"id": "6425cf81-da66-4c60-8a53-6dbdf118ce09",
"currency": {
"iso": "ETH",
"network_name": "ethereum"
},
"address": "0x114da762447ccb464ac29134B2930e0570139F83",
"amount": "0.15",
"txid": "0x12882dbbd810304bd0d9707472dbb40f8c2f7d9a1e6b3c4d5f60718293a4b5c6",
"status": "confirmed",
"late_payment": false
}
],
"fees": [
{
"type": "transfer_fee",
"currency": {
"iso": "ETH",
"network_name": "ethereum"
},
"amount": "0.00007808"
},
{
"type": "fee_payment_request_crypto",
"currency": {
"iso": "ETH",
"network_name": "ethereum"
},
"amount": "0.00854354"
}
],
"fixed_at": 1769780669,
"expires_at": 1769780868,
"valid_until": 1769780868
}
```
Sent when the payment request is not successfully completed before expiry. Use the transaction details and amounts to understand what was received.
```json highlight={5} theme={null}
{
"payment_request_id": "019c0de8-4576-7e4f-85c7-43a5cb5e9f2d",
"foreign_id": "order_82652.32794293783",
"type": "payment_request",
"status": "failed",
"end_user_email": "test@test.net",
"payment_request_address": {
"id": "019c0de8-49df-762a-9705-4c304627dfd0",
"currency": {
"iso": "BTC",
"network_name": "bitcoin"
},
"convert_to": {
"iso": "ETH",
"network_name": "ethereum"
},
"address": "tb1qj0d4rsczat6dx3yy065g98rrz5hewkrdcrz7je"
},
"payment_request_amount": {
"currency": {
"iso": "ETH",
"network_name": "ethereum"
},
"amount": "0.3"
},
"currency_sent": {
"currency": {
"iso": "BTC",
"network_name": "bitcoin"
},
"expected_amount": "0.0094",
"received_amount": "0.009",
"remaining_amount": "0.0004"
},
"transactions": [
{
"id": "019c0de8-54a3-7163-b59c-95f38d982a31",
"currency": {
"iso": "BTC",
"network_name": "bitcoin"
},
"address": "tb1qj0d4rsczat6dx3yy065g98rrz5hewkrdcrz7je",
"txid": "cf3c308839d67ab6bce3b2f275fcc197c5c19dc208efc35dbc0a68ff355d78e3",
"amount": "0.009",
"status": "confirmed",
"late_payment": false
}
],
"fixed_at": 1769759853,
"expires_at": 1769760051,
"valid_until": 1769760051
}
```
Sent when the payment request expires before payment is received and no fixed exchange rate was locked for the request.
```json highlight={5} theme={null}
{
"payment_request_id": "019bea8c-7d69-7632-8472-77443ac78a17",
"foreign_id": "order_85566.25193543735",
"type": "payment_request",
"status": "expired",
"end_user_email": "ckane@example.com",
"payment_request_amount": {
"currency": {
"iso": "ETH",
"network_name": "ethereum"
},
"amount": "0.3"
},
"expires_at": 1769166664
}
```
Sent when the payment request expires after a fixed exchange rate was locked, but no sufficient payment was received before expiry.
```json highlight={5} theme={null}
{
"payment_request_id": "019c0ebf-81e5-751d-aa57-fb9e2cba23c2",
"foreign_id": "order_12345",
"type": "payment_request",
"status": "expired",
"end_user_email": "test@test.com",
"payment_request_address": {
"id": "019c0ebf-84a1-7bdc-a09c-8b62294cc75d",
"currency": {
"iso": "BTC",
"network_name": "bitcoin"
},
"convert_to": {
"iso": "ETH",
"network_name": "ethereum"
},
"address": "tb1qj0d4rsczat6dx3yy065g98rrz5hewkrdcrz7je"
},
"payment_request_amount": {
"currency": {
"iso": "ETH",
"network_name": "ethereum"
},
"amount": "0.3"
},
"currency_sent": {
"currency": {
"iso": "BTC",
"network_name": "bitcoin"
},
"expected_amount": "0.0094",
"received_amount": "0",
"remaining_amount": "0.0094"
},
"fixed_at": 1769773958,
"expires_at": 1769774157,
"valid_until": 1769774157
}
```
Sent when a payment is received after the payment request has already expired or failed. Such transactions are marked with `late_payment: true`.
```json highlight={5} theme={null}
{
"payment_request_id": "019c0de8-4576-7e4f-85c7-43a5cb5e9f2d",
"foreign_id": "order_82652.32794293783",
"type": "payment_request",
"status": "failed",
"end_user_email": "test@test.net",
"payment_request_address": {
"id": "019c0de8-49df-762a-9705-4c304627dfd0",
"currency": {
"iso": "BTC",
"network_name": "bitcoin"
},
"convert_to": {
"iso": "ETH",
"network_name": "ethereum"
},
"address": "tb1qj0d4rsczat6dx3yy065g98rrz5hewkrdcrz7je"
},
"payment_request_amount": {
"currency": {
"iso": "ETH",
"network_name": "ethereum"
},
"amount": "0.3"
},
"currency_sent": {
"currency": {
"iso": "BTC",
"network_name": "bitcoin"
},
"expected_amount": "0.0094",
"received_amount": "0.009",
"remaining_amount": "0.0004"
},
"transactions": [
{
"id": "019c0de8-54a3-7163-b59c-95f38d982a31",
"currency": {
"iso": "BTC",
"network_name": "bitcoin"
},
"address": "tb1qj0d4rsczat6dx3yy065g98rrz5hewkrdcrz7je",
"txid": "cf3c308839d67ab6bce3b2f275fcc197c5c19dc208efc35dbc0a68ff355d78e3",
"amount": "0.009",
"status": "confirmed",
"late_payment": false
},
{
"id": "019c0de8-54a3-7163-b59c-95f38d982a32",
"currency": {
"iso": "BTC",
"network_name": "bitcoin"
},
"address": "tb1qj0d4rsczat6dx3yy065g98rrz5hewkrdcrz7je",
"txid": "9b7f2a0c6d3e4f1a8c9d0e1f2a3b4c5d6e7f8091a2b3c4d5e6f708192a3b4c5d",
"amount": "0.0004",
"status": "confirmed",
"late_payment": true
}
],
"fixed_at": 1769759853,
"expires_at": 1769760051,
"valid_until": 1769760051
}
```
Sent when the payer is not allowed to complete the payment.
```json highlight={5,7} theme={null}
{
"payment_request_id": "019c0de8-4576-7e4f-85c7-43a5cb5e9f2d",
"foreign_id": "order_82652.32794293783",
"type": "payment_request",
"status": "failed",
"end_user_email": "test@test.net",
"status_reason": "Service is restricted for the payer. Payments from this payer cannot be processed",
"end_user_reference": "account_14578",
"payment_request_amount": {
"currency": {
"iso": "ETH",
"network_name": "ethereum"
},
"amount": "0.3"
},
"expires_at": 1769166664
}
```
# Withdrawal callbacks
Source: https://docs.alphapo.net/api-reference/callbacks/withdrawal-callbacks
Withdrawal callbacks are sent whenever the status of a withdrawal changes.
Use the `status` field to determine if the operation was successful or not. For cancelled or declined operations, use the `error` field to determine the reason.
Use the `end_user_reference` field to identify the customer who received the withdrawn funds.
Sent when a withdrawal has been successfully completed and can be treated as final on your side.
```json title="Standard withdrawal" highlight={27} theme={null}
{
"id": 123,
"foreign_id": "operation_987",
"end_user_reference": "user_12345",
"type": "withdrawal",
"crypto_address": {
"id": 123,
"currency": "BTC",
"address": "tb1qurv0m4ufsj8xqejvmn0y43kqew33kvqrrxswgm",
"tag": null
},
"transactions": [
{
"id": 999,
"currency": "BTC",
"transaction_type": "blockchain",
"type": "withdrawal",
"address": "tb1qurv0m4ufsj8xqejvmn0y43kqew33kvqrrxswgm",
"tag": null,
"amount": "0.01000000",
"txid": "bb040d895ef7141ea0b06b04227d8f5dd4ee12d5b890e6e5633f6439393a666b",
"confirmations": "0"
}
],
"fees": [],
"error": "",
"status": "confirmed"
}
```
```json title="Instant withdrawal" highlight={38} theme={null}
{
"id": 123,
"foreign_id": "operation_987",
"end_user_reference": "user_12345",
"type": "withdrawal_instant",
"crypto_address": {
"id": 123,
"currency": "BTC",
"address": "tb1qurv0m4ufsj8xqejvmn0y43kqew33kvqrrxswgm",
"tag": null
},
"transactions": [
{
"id": 999,
"currency": "BTC",
"transaction_type": "blockchain",
"type": "withdrawal",
"address": "tb1qurv0m4ufsj8xqejvmn0y43kqew33kvqrrxswgm",
"tag": null,
"amount": "0.01000000",
"txid": "bb040d895ef7141ea0b06b04227d8f5dd4ee12d5b890e6e5633f6439393a666b",
"confirmations": "0"
}
],
"fees": [
{
"type": "mining",
"currency": "BTC",
"amount": "0"
},
{
"type": "fee_crypto_withdrawal_from_crypto",
"currency": "BTC",
"amount": "0.00028735"
}
],
"error": "",
"status": "confirmed"
}
```
Sent when a withdrawal with conversion has been successfully completed and can be treated as final on your side.
```json title="Standard withdrawal" highlight={44} theme={null}
{
"id": 123,
"foreign_id": "operation_987",
"end_user_reference": "user_12345",
"type": "withdrawal_exchange",
"crypto_address": {
"id": 123,
"currency": "BTC",
"address": "tb1qurv0m4ufsj8xqejvmn0y43kqew33kvqrrxswgm",
"tag": null
},
"currency_sent": {
"currency": "EUR",
"amount": "804.25693204"
},
"currency_received": {
"currency": "BTC",
"amount": "0.01000000"
},
"transactions": [
{
"id": 999,
"currency": "BTC",
"transaction_type": "blockchain",
"type": "withdrawal",
"address": "tb1qurv0m4ufsj8xqejvmn0y43kqew33kvqrrxswgm",
"tag": null,
"amount": "0.01000000",
"txid": "bb040d895ef7141ea0b06b04227d8f5dd4ee12d5b890e6e5633f6439393a666b",
"confirmations": "0"
},
{
"id": 1000,
"currency": "EUR",
"currency_to": "BTC",
"transaction_type": "exchange",
"type": "exchange",
"amount": "804.25693204",
"amount_to": "0.01000000"
}
],
"fees": [
{
"type": "fee_crypto_withdrawal_from_fiat",
"currency": "BTC",
"amount": "0.00028735"
}
],
"error": "",
"status": "confirmed"
}
```
```json title="Instant withdrawal" highlight={55} theme={null}
{
"id": 123,
"foreign_id": "operation_987",
"end_user_reference": "user_12345",
"type": "withdrawal_instant_exchange",
"crypto_address": {
"id": 123,
"currency": "BTC",
"address": "tb1qurv0m4ufsj8xqejvmn0y43kqew33kvqrrxswgm",
"tag": null
},
"currency_sent": {
"currency": "EUR",
"amount": "804.25693204"
},
"currency_received": {
"currency": "BTC",
"amount": "0.01000000"
},
"transactions": [
{
"id": 999,
"currency": "BTC",
"transaction_type": "blockchain",
"type": "withdrawal",
"address": "tb1qurv0m4ufsj8xqejvmn0y43kqew33kvqrrxswgm",
"tag": null,
"amount": "0.01000000",
"txid": "bb040d895ef7141ea0b06b04227d8f5dd4ee12d5b890e6e5633f6439393a666b",
"confirmations": "0"
},
{
"id": 1000,
"currency": "EUR",
"currency_to": "BTC",
"transaction_type": "exchange",
"type": "exchange",
"amount": "804.25693204",
"amount_to": "0.01000000"
}
],
"fees": [
{
"type": "mining",
"currency": "BTC",
"amount": "0"
},
{
"type": "fee_crypto_withdrawal_from_fiat",
"currency": "BTC",
"amount": "0.00028735"
}
],
"error": "",
"status": "confirmed"
}
```
Sent when a withdrawal exceeds the configured [withdrawals limits](/merchant-administration/configure-withdrawal-limits) and is awaiting approval from a user with the **Owner** role.
```json title="Standard withdrawal" highlight={21,27} theme={null}
{
"id": 123,
"foreign_id": "operation_987",
"end_user_reference": "user_12345",
"type": "withdrawal",
"crypto_address": {
"id": 123,
"currency": "BTC",
"address": "tb1qurv0m4ufsj8xqejvmn0y43kqew33kvqrrxswgm",
"tag": null
},
"transactions": [
{
"id": 999,
"currency": "BTC",
"transaction_type": "blockchain",
"type": "withdrawal",
"address": "tb1qurv0m4ufsj8xqejvmn0y43kqew33kvqrrxswgm",
"tag": null,
"amount": "0.01000000",
"txid": null,
"confirmations": "0"
}
],
"fees": [],
"error": "",
"status": "pending"
}
```
```json title="Instant withdrawal" highlight={21,27} theme={null}
{
"id": 123,
"foreign_id": "operation_987",
"end_user_reference": "user_12345",
"type": "withdrawal_instant",
"crypto_address": {
"id": 123,
"currency": "BTC",
"address": "tb1qurv0m4ufsj8xqejvmn0y43kqew33kvqrrxswgm",
"tag": null
},
"transactions": [
{
"id": 999,
"currency": "BTC",
"transaction_type": "blockchain",
"type": "withdrawal",
"address": "tb1qurv0m4ufsj8xqejvmn0y43kqew33kvqrrxswgm",
"tag": null,
"amount": "0.01000000",
"txid": null,
"confirmations": "0"
}
],
"fees": [],
"error": "",
"status": "pending"
}
```
Sent when a withdrawal with conversion exceeds the configured [withdrawals limits](/merchant-administration/configure-withdrawal-limits) and is awaiting approval from a user with the **Owner** role.
```json title="Standard withdrawal" theme={null}
{
"id": 132533108,
"foreign_id": "withdrawal_1230203",
"end_user_reference": "user_12345",
"type": "withdrawal_exchange",
"crypto_address": {
"id": 3776985,
"currency": "BTC",
"address": "tb1qj0d4rsczat6dx3yy065g98rrz5hewkrdcrz7je",
"tag": null
},
"transactions": [
{
"id": 3779034,
"currency": "BTC",
"transaction_type": "blockchain",
"type": "withdrawal",
"address": "tb1qj0d4rsczat6dx3yy065g98rrz5hewkrdcrz7je",
"tag": null,
"amount": "0.00000000",
"txid": null,
"riskscore": null,
"confirmations": "0"
},
{
"id": 3779035,
"currency": "EUR",
"currency_to": "BTC",
"transaction_type": "exchange",
"type": "exchange",
"amount": "100.00000000",
"amount_to": "0.00000000"
}
],
"fees": [],
"error": "",
"status": "pending"
}
```
```json title="Instant withdrawal" theme={null}
{
"id": 132533109,
"foreign_id": "withdrawal_123",
"end_user_reference": "user_12345",
"type": "withdrawal_instant_exchange",
"crypto_address": {
"id": 3776985,
"currency": "BTC",
"address": "tb1qj0d4rsczat6dx3yy065g98rrz5hewkrdcrz7je",
"tag": null
},
"transactions": [
{
"id": 3779036,
"currency": "BTC",
"transaction_type": "blockchain",
"type": "withdrawal",
"address": "tb1qj0d4rsczat6dx3yy065g98rrz5hewkrdcrz7je",
"tag": null,
"amount": "0.00000000",
"txid": null,
"riskscore": null,
"confirmations": "0"
},
{
"id": 3779037,
"currency": "EUR",
"currency_to": "BTC",
"transaction_type": "exchange",
"type": "exchange",
"amount": "100.00000000",
"amount_to": "0.00000000"
}
],
"fees": [],
"error": "",
"status": "pending"
}
```
Sent when a user with the **Owner** role declines a withdrawal that exceeds the configured [withdrawals limits](/merchant-administration/configure-withdrawal-limits).
```json title="Standard withdrawal" highlight={21,26-27} theme={null}
{
"id": 123,
"foreign_id": "operation_987",
"end_user_reference": "user_12345",
"type": "withdrawal",
"crypto_address": {
"id": 123,
"currency": "BTC",
"address": "tb1qurv0m4ufsj8xqejvmn0y43kqew33kvqrrxswgm",
"tag": null
},
"transactions": [
{
"id": 999,
"currency": "BTC",
"transaction_type": "blockchain",
"type": "withdrawal",
"address": "tb1qurv0m4ufsj8xqejvmn0y43kqew33kvqrrxswgm",
"tag": null,
"amount": "0.01000000",
"txid": null,
"confirmations": "0"
}
],
"fees": [],
"error": "Declined by user ID:777",
"status": "declined"
}
```
```json title="Instant withdrawal" highlight={21,26-27} theme={null}
{
"id": 123,
"foreign_id": "operation_987",
"end_user_reference": "user_12345",
"type": "withdrawal_instant",
"crypto_address": {
"id": 123,
"currency": "BTC",
"address": "tb1qurv0m4ufsj8xqejvmn0y43kqew33kvqrrxswgm",
"tag": null
},
"transactions": [
{
"id": 999,
"currency": "BTC",
"transaction_type": "blockchain",
"type": "withdrawal",
"address": "tb1qurv0m4ufsj8xqejvmn0y43kqew33kvqrrxswgm",
"tag": null,
"amount": "0.01000000",
"txid": null,
"confirmations": "0"
}
],
"fees": [],
"error": "Declined by user ID:777",
"status": "declined"
}
```
Sent when a withdrawal is cancelled and will not be completed.
```json title="Standard withdrawal" highlight={21,26-27} theme={null}
{
"id": 123,
"foreign_id": "operation_987",
"end_user_reference": "user_12345",
"type": "withdrawal",
"crypto_address": {
"id": 123,
"currency": "BTC",
"address": "tb1qurv0m4ufsj8xqejvmn0y43kqew33kvqrrxswgm",
"tag": null
},
"transactions": [
{
"id": 999,
"currency": "BTC",
"transaction_type": "blockchain",
"type": "withdrawal",
"address": "tb1qurv0m4ufsj8xqejvmn0y43kqew33kvqrrxswgm",
"tag": null,
"amount": "0.01000000",
"txid": null,
"confirmations": "0"
}
],
"fees": [],
"error": "Not enough money on balance",
"status": "cancelled"
}
```
```json title="Instant withdrawal" highlight={21,26-27} theme={null}
{
"id": 123,
"foreign_id": "operation_987",
"end_user_reference": "user_12345",
"type": "withdrawal_instant",
"crypto_address": {
"id": 123,
"currency": "BTC",
"address": "tb1qurv0m4ufsj8xqejvmn0y43kqew33kvqrrxswgm",
"tag": null
},
"transactions": [
{
"id": 999,
"currency": "BTC",
"transaction_type": "blockchain",
"type": "withdrawal",
"address": "tb1qurv0m4ufsj8xqejvmn0y43kqew33kvqrrxswgm",
"tag": null,
"amount": "0.01000000",
"txid": null,
"confirmations": "0"
}
],
"fees": [],
"error": "Not enough money on balance",
"status": "cancelled"
}
```
# API currency codes
Source: https://docs.alphapo.net/api-reference/currency-codes
Use these codes in your API requests
| API code | Cryptocurrency | Name | Network |
| -------- | --------------- | ------------------------- | ---------------------- |
| ADA | ADA | Cardano | Cardano |
| BCH | BCH | Bitcoin Cash | Bitcoin Cash |
| BSV | BSV | Bitcoin Satoshi Vision | Bitcoin Satoshi Vision |
| BNB-BSC | BNB-BSC | BNB | BNB Smart Chain |
| BTC | BTC | Bitcoin | Bitcoin |
| BTCLN | BTC (Lightning) | Bitcoin | Lightning |
| BXBT | BXBT (ERC-20) | BoxBet | Ethereum |
| DAI | DAI (ERC-20) | DAI Stablecoin | Ethereum |
| DOGE | DOGE | Dogecoin | Dogecoin |
| ETHA | ETH (Arbitrum) | Ethereum | Arbitrum |
| ETHBASE | ETH (Base) | Ethereum | Base |
| ETH | ETH | Ethereum | Ethereum |
| EURCE | EURC (ERC-20) | EUR Stablecoin | Ethereum |
| EURCBASE | EURC (Base) | EUR Stablecoin | Base |
| EURCS | EURC (SOL) | EUR Stablecoin | Solana |
| EURS | EURS (ERC-20) | STASIS EURS | Ethereum |
| LTC | LTC | Litecoin | Litecoin |
| MNEE | MNEE (ERC-20) | MNEE | Ethereum |
| POL | POL | Polygon | Polygon |
| SOL | SOL | Solana | Solana |
| TON | GRAM | Gram (previously Toncoin) | TON |
| TRX | TRX | Tron | Tron |
| USDCA | USDC (Arbitrum) | USD Coin | Arbitrum |
| USDCBASE | USDC (Base) | USD Coin | Base |
| USDCB | USDC (BEP-20) | USD Coin | BNB Smart Chain |
| USDC | USDC (ERC-20) | USD Coin | Ethereum |
| USDCP | USDC (POL) | USD Coin | Polygon |
| USDCS | USDC (SOL) | USD Coin | Solana |
| USDGE | USDG (ERC-20) | Global Dollar | Ethereum |
| USDGS | USDG (SOL) | Global Dollar | Solana |
| USDTA | USDT (Arbitrum) | Tether USD | Arbitrum |
| USDTB | USDT (BEP‐20) | Tether USD | Binance Smart Chain |
| USDTE | USDT (ERC‐20) | Tether USD | Ethereum |
| USDTS | USDT (SOL) | Tether USD | Solana |
| USDTTON | USDT (TON) | Tether USD | Ton |
| USDTP | USDT (POL) | Tether USD | Polygon |
| USDTT | USDT (TRC‐20) | Tether USD | Tron |
| XED | XED (ERC-20) | Exeedme | Ethereum |
| XRP | XRP | Ripple | XRP Ledger |
For the [/payments/v1/requests](/api-reference/endpoints/payments) endpoint, use the following currency and network names:
| Currency ISO | Supported network names |
| :----------- | :-------------------------------------------------------------------- |
| `ADA` | `cardano` |
| `BCH` | `bitcoin_cash` |
| `BNB-BSC` | `binance` |
| `BSV` | `bitcoin_sv` |
| `BTC` | `bitcoin` |
| `BXBT` | `ethereum` |
| `DAI` | `ethereum` |
| `DOGE` | `dogecoin` |
| `ETH` | `arbitrum`, `base`, `ethereum` |
| `EURC` | `base`, `ethereum`, `solana` |
| `EURS` | `ethereum` |
| `LTC` | `litecoin` |
| `MNEE` | `ethereum` |
| `POL` | `polygon` |
| `SOL` | `solana` |
| `TON` | `ton` |
| `TRX` | `tron` |
| `USDC` | `arbitrum`, `base`, `binance`, `ethereum`, `polygon`, `solana` |
| `USDG` | `ethereum`, `solana` |
| `USDT` | `arbitrum`, `binance`, `ethereum`, `polygon`, `solana`, `ton`, `tron` |
| `XED` | `ethereum` |
| `XRP` | `ripple` |
# List balances
Source: https://docs.alphapo.net/api-reference/endpoints/accounts-list
POST /accounts/list
Get a list of your balances for each cryptocurrency, including zero balances.
# Generate a user deposit address
Source: https://docs.alphapo.net/api-reference/endpoints/addresses-take
POST /addresses/take
Generate a deposit address for a user
Deposits sent to this address are attributed to the user identified by `foreign_id`.
# Withdraw crypto instantly
Source: https://docs.alphapo.net/api-reference/endpoints/crypto-withdrawal-instant
POST /crypto/withdrawal_instant
Make an [instant withdrawal](/withdrawals#instant-withdrawals) from a cryptocurrency balance.
# Withdraw crypto instantly with conversion
Source: https://docs.alphapo.net/api-reference/endpoints/crypto-withdrawal-instant-exchange
POST /crypto/withdrawal_instant_exchange
Make an [instant withdrawal](/withdrawals#instant-withdrawals) from a cryptocurrency or fiat balance with conversion to cryptocurrency.
# List supported currencies
Source: https://docs.alphapo.net/api-reference/endpoints/currencies-list
POST /currencies/list
Returns a list of available currencies, minimum deposit amounts, and deposit and withdrawal fees.
The list of supported currencies in the sandbox environment is different from the list in the production environment.
# Get exchange rates
Source: https://docs.alphapo.net/api-reference/endpoints/currencies-rates
POST /currencies/rates
Get available currency pairs and exchange rates.
This endpoint returns reference exchange rates only. To get an actual exchange quote, use [/exchange/calculate](/api-reference/endpoints/exchange-calculate).
The list of supported currencies in the sandbox environment is different from the list in the production environment.
# Get a fixed exchange quote
Source: https://docs.alphapo.net/api-reference/endpoints/exchange-calculate
POST /exchange/calculate
Get a fixed exchange quote for a specific amount, which can then be used with [/exchange/fixed](/api-reference/endpoints/exchange-fixed).
# Exchange at a fixed rate
Source: https://docs.alphapo.net/api-reference/endpoints/exchange-fixed
POST /exchange/fixed
Execute an exchange using a valid fixed quote from [/exchange/calculate](/api-reference/endpoints/exchange-calculate).
Execute a fixed exchange using a valid quote from [/exchange/calculate](/api-reference/endpoints/exchange-calculate). The exchange request must be sent before the quote expires and must use the same amount and price as in the quote.
# Exchange at market rate
Source: https://docs.alphapo.net/api-reference/endpoints/exchange-now
POST /exchange/now
Execute an exchange immediately at the currently available market rate, without requesting a fixed quote.
# Create a payment request
Source: https://docs.alphapo.net/api-reference/endpoints/payments
POST /requests
Create a payment request for the client for a specified amount and a configurable expiration time.
Make sure that the URL that you provide in the `url_store` field uses the secure HTTPS protocol, uses domain names (not IP addresses) and is considered clean by VirusTotal and similar scanners.
# Check API status
Source: https://docs.alphapo.net/api-reference/endpoints/ping
GET /ping
Test if your API connection is working.
# Get transaction details
Source: https://docs.alphapo.net/api-reference/endpoints/transactions-info
GET /transactions/info
Get transaction details by `id`, `foreign_id`, or `txid`. Include only one of these parameters in your request.
You can only request data for transactions that were authorized using your API and secret key.
# Withdraw crypto
Source: https://docs.alphapo.net/api-reference/endpoints/withdrawal-crypto
POST /withdrawal/crypto
Withdraw in crypto to any address.
# Errors
Source: https://docs.alphapo.net/api-reference/errors
## 400 Bad Request
### Request body is invalid JSON
```json theme={null}
{"error":"Bad content format", "code":"bad_content_format"}
```
This error can occur for the following reasons:
* **Malformed or invalid JSON.** The request body could not be parsed. Ensure it is valid JSON.
* **Missing Content-Type header.** The `Content-Type` header must be set to `application/json`.
## 403 Forbidden
### Signature header does not match the request body
```json theme={null}
{"error":"Bad signature header", "code":"bad_header_signature"}
```
The value in `X-Processing-Signature` did not match the request body. See [Authentication](/api-reference/authentication) for how to generate the signature correctly. This can happen for several reasons:
* **Signature not converted to string.** The signature is generated from a data array without first converting it to a string. Ensure the signature value is sent as a string.
* **Body modified after signing.** The signed body must be identical to the body that is sent — no reformatting, whitespace changes, or field reordering.
* **Extra characters or spaces.** A code error introduces unexpected characters or spaces. Review your implementation and verify no extra characters are present.
* **Signature built from the full data array.** The signature is created from the entire data array — including the public key and headers — instead of the secret key only. Generate the signature exclusively from the secret key.
* **Public key in wrong parameter (PHP).** In some languages such as PHP, the public key may be mistakenly included in `paramsArray` instead of the request body. Pass the public key in the correct location.
* **Wrong secret key or environment.** Sandbox and production use separate key pairs. Make sure you are using the correct set for the environment you are targeting.
### Signature header is missing
```json theme={null}
{"error":"No signature header", "code":"required_header_signature"}
```
The request does not include the required `X-Processing-Signature` header. Add it with an HMAC-SHA512 signature of the request body.
### API key header does not match your API key
```json theme={null}
{"error":"Bad key header", "code":"bad_header_key"}
```
The value in `X-Processing-Key` did not match any known API key. This can happen for several reasons:
* **Non-whitelisted IP.** If you have configured an IP whitelist in the Merchant Dashboard, requests from any unlisted IP will be rejected. Add the IP to the whitelist, use an already-whitelisted IP, or remove the whitelist entirely.
* **Wrong environment.** Production keys will not work against the sandbox endpoint, and vice versa. Check that the base URL matches the environment your keys belong to.
* **Incorrect or malformed public key.** Verify you are using the correct key. It contains both upper and lower case characters and must be sent exactly as provided — avoid any case transformation in your code.
* **Secret key used instead of public key.** The `X-Processing-Key` header must contain your public key only. The secret key is used exclusively to generate and verify signatures. Refer to [Get your API key](/merchant-administration/generate-and-activate-api-keys) for details.
### API key header is missing
```json theme={null}
{"error":"No key header", "code":"required_header_key"}
```
This error can occur for the following reasons:
* **Missing X-Processing-Key header.** Add the `X-Processing-Key` header with your public API key.
* **Invalid request URL.** Verify the endpoint URL is correct.
# Introduction
Source: https://docs.alphapo.net/api-reference/introduction
This API lets merchants automate key AlphaPo operations, such as listing account balances, retrieving supported currencies and exchange rates, generating deposit addresses, making withdrawals, creating payment requests, performing exchanges, and accessing transaction data.
Generate the credentials required for authenticated API access.
Learn how to authenticate requests with your API key and signature.
Specify the IP address that will be allowed to make API requests.
Explore and test the API faster with the ready-to-use Postman collection.
## Base URLs
The production API uses the following base URL:
```text theme={null}
https://app.alphapo.net/api/v2
```
A separate sandbox environment is available for testing before going live. To request access, contact the Support team.
## Status page
For real-time service availability and incident updates, visit [https://status.alphapo.net/](https://status.alphapo.net/).
# Postman API Testing
Source: https://docs.alphapo.net/api-reference/postman-collection
Postman is a widely used tool for developing and testing APIs. You can use the Postman collection below to test the AlphaPo API in the sandbox environment.
[Download the Postman collection](/api-reference/SandBox_API_Collection.postman_collection.json)
When you click the link, the JSON file opens in a new browser tab rather than downloading automatically. Save it to your computer, then import it into Postman.
After importing it, open the **SandBox API Collection** variables and enter:
* your API key in the `key-v2` field
* your secret key in the `secret-v2` field
* your sandbox environment URL in the `url` field
Once these values are set, you can start sending requests.
The list of supported currencies in the sandbox environment is different from the list in the production environment.
# Confirmations and limits
Source: https://docs.alphapo.net/confirmations-and-limits
## Default deposit & withdrawal minimums and confirmation requirements
The table below shows the default limits. These limits can be changed on request through our Support team. To see the limits that apply to your account, check the **Your invoice, deposit, and withdrawal limits** section below.
To retrieve the complete and up-to-date information on the number of required confirmations and the minimum deposit and withdrawal amounts for your account, use the [/currencies/list](/api-reference/endpoints/currencies-list) API endpoint.
| Currency | Confirmations | Min deposit | Min withdrawal | Explorer |
| --------------- | ------------- | ----------- | -------------- | ---------------------------------------------------------- |
| ADA | 15 | 2 | 2 | [explorer](https://explorer.cardano.org/) |
| BCH | 0\*/2/6\*\* | 0.01 | 0.01 | [explorer](https://www.blockchain.com/explorer/assets/bch) |
| BNB-BSC | 10/25\*\* | 0.01 | 0.01 | [explorer](https://bscscan.com/) |
| BSV | 20 | 0.1 | 0.1 | [explorer](https://whatsonchain.com) |
| BTC | 0\*/1 | 0.0001 | 0.0002 | [explorer](https://btc.bitaps.com/) |
| BTC (Lightning) | N/A\*\*\* | 0.0001 | N/A\*\*\* | N/A\*\*\* |
| BXBT (ERC-20) | 2/10\*\* | 115 | 115 | [explorer](https://etherscan.io/) |
| DAI (ERC-20) | 2/10\*\* | 5 | 5 | [explorer](https://etherscan.io/) |
| DOGE | 3/6\*\* | 1 | 0.01 | [explorer](https://live.blockcypher.com/doge) |
| ETH | 2/10\*\* | 0.002 | 0.002 | [explorer](https://etherscan.io/) |
| ETH (Arbitrum) | 12 | 0.002 | 0.002 | [**explorer**](https://arbiscan.io/) |
| ETH (Base) | 12 | 0.002 | 0.002 | [**explorer**](https://basescan.org/) |
| EURC (ERC-20) | 2/10\*\* | 5 | 5 | [explorer](https://etherscan.io/) |
| EURC (Base) | 12 | 5 | 5 | [**explorer**](https://basescan.org/) |
| EURC (SOL) | 1 | 5 | 5 | [**explorer**](https://explorer.solana.com/) |
| EURS (ERC-20) | 2/10\*\* | 0.01 | 0.01 | [explorer](https://etherscan.io/) |
| LTC | 2/6\*\* | 0.01 | 0.01 | [explorer](https://live.blockcypher.com/ltc) |
| MNEE (ERC-20) | 2/10\*\* | 5 | 5 | [explorer](https://etherscan.io/) |
| POL | 1 | 10 | 10 | [explorer](https://polygonscan.com/) |
| SOL | 1 | 0.05 | 0.05 | [explorer](https://explorer.solana.com/) |
| TON | 1 | 1.35 | 1.35 | [explorer](https://tonviewer.com/) |
| TRX | 3/19\*\* | 10 | 10 | [explorer](https://tronscan.org/) |
| USDC (ERC-20) | 2/10\*\* | 5 | 5 | [explorer](https://etherscan.io/) |
| USDC (Arbitrum) | 12 | 5 | 5 | [**explorer**](https://arbiscan.io/) |
| USDC (Base) | 12 | 5 | 5 | [**explorer**](https://basescan.org/) |
| USDC (BEP-20) | 10/25\*\* | 5 | 5 | [explorer](https://bscscan.com/) |
| USDC (SOL) | 1 | 5 | 5 | [explorer](https://explorer.solana.com/) |
| USDC (POL) | 10 | 5 | 5 | [explorer](https://polygonscan.com/) |
| USDG (ERC-20) | 2/10\*\* | 5 | 5 | [explorer](https://etherscan.io/) |
| USDG (SOL) | 1 | 5 | 5 | [explorer](https://explorer.solana.com/) |
| USDT (ERC-20) | 2/10\*\* | 5 | 5 | [explorer](https://etherscan.io/) |
| USDT (Arbitrum) | 12 | 5 | 5 | [**explorer**](https://arbiscan.io/) |
| USDT (BEP-20) | 10/25\*\* | 5 | 5 | [explorer](https://bscscan.com/) |
| USDT (POL) | 10 | 5 | 5 | [explorer](https://polygonscan.com/) |
| USDT (SOL) | 1 | 5 | 5 | [explorer](https://explorer.solana.com/) |
| USDT (TON) | 1 | 5 | 5 | [explorer](https://tonviewer.com/) |
| USDT (TRC-20) | 3/19\*\* | 5 | 5 | [explorer](https://tronscan.org/) |
| XED (ERC-20) | 2/10\*\* | 0.01 | 0.01 | [explorer](https://etherscan.io/) |
| XRP | 1 | 4 | 2 | [explorer](https://xrpscan.com/) |
Minimum limits for exchange transactions may change dynamically. To see the most up-to-date limits for each currency, make an API request to [/currencies/rates](/api-reference/endpoints/currencies-rates).
Deposits below the configured minimum deposit amount will fail and won’t be credited. No fees will be charged for such deposits.
For BTC and BCH, we use a third-party service to credit deposits faster.
* In most cases, if the transaction is approved by the service, no confirmations are required and the deposit is credited immediately. (\*)
* In some cases, AlphaPo will wait for a certain number of confirmations before crediting the deposit.
For some cryptocurrencies, larger deposits may require additional confirmations before the funds are credited. (\*\*)
Confirmations are not applicable for deposits using the Lightning network because Lightning payments are settled off-chain, so there’s no block-based confirmation count to wait for. Withdrawals are not available in BTCLN; you must first exchange BTCLN to BTC or another currency. Exchanges between BTCLN and BTC are always at a 1:1 rate with no fees. A traditional blockchain explorer is not applicable because Lightning payments don’t appear as individual transactions on the Bitcoin blockchain. (\*\*\*)
When several blocks are released in a short period of time, more confirmations can be required.
## Your payment request, deposit, and withdrawal limits
To view your payment request, deposit, or withdrawal limits:
1. Go to **Settings**.
2. Open the **Operation limits** tab.
In the **Payment request limits** section, you can view your payment request limits. If a default value has been overridden, a special icon appears next to the limit amount.
In the **Deposit and withdrawal limits** section, you can view the minimum deposit and withdrawal amounts for each available currency. If a default value has been overridden, a special icon appears next to the amount.
# Merchant dashboard
Source: https://docs.alphapo.net/dashboard
The merchant dashboard is the web interface for viewing and managing your merchant's activity and adjusting various settings.
## Viewing your balances
Your balances in different currencies are displayed on the **Balances** tab. For each balance, the tab displays both the actual balance and its equivalent in EUR or USD. You can choose the equivalent currency in your account settings. Note that the individual balances are shown only for the currencies that are [enabled in the dashboard settings](#currencies).
In the top right corner, the total balance is displayed in both the fiat equivalent and BTC equivalent. The total balance is calculated based on both enabled and disabled currencies.
Click on a balance to see available operations: [send](/withdrawals) and [receive](/deposits) (for crypto), [withdraw](/fiat/top-up-fiat) and [top up](/fiat/withdraw-fiat) (for fiat), [exchange funds](/exchanges).
## Enabling and disabling currencies
You can choose which currencies should be available for manual operations in the merchant dashboard. This will affect the **Balances** tab and all dialogs for creating new addresses, initiating new withdrawals, etc. This will not affect the existing [transactions history](#viewing-transactions-history) or the available currencies in the [AlphaPo API](/api-reference).
Click on the **Balances** tab or go to the **Settings → Currencies Info** tab where you can manage currencies.
* To enable a new currency, click **Add New Currency**, select it and click **Save**.
* To disable or enable a previously added currency, use the toggle next to it.
## Generating statements
On the **Balances** tab, click **Generate statements** to get a PDF statement about your balances and operations. The statements include both enabled and disabled currencies.
There are three types of statements available:
* The **Balances** statement shows your balances in all currencies at the current time or at the end of a specific day. By default, this statement only shows non-zero balances. Zero balances can be included if you click the corresponding toggle in the statement generation form.
* The **Fees** statement shows how much funds was deducted as fees from your balances between two specific dates. The fees are grouped by their type and currency.
* The **Cashflow** statement shows how much funds was sent or received to your balances between two specific dates. The operations are grouped by their type and currency. This statement also includes the **Fees** statement for the same period.
## Viewing transactions history
There are two main ways to view history in the merchant dashboard.
The **Transactions** tab provides a high-level view of merchant activity. Each transaction is displayed as a single record representing the complete operation, regardless of how many balance movements or processing steps were involved. The list of transactions includes [deposits](/deposits), [payment requests deposits](/payment-requests), [withdrawals](/withdrawals) and [exchanges](/exchanges), including the cancelled or pending ones. For each transaction, a side panel displays detailed information, such as the destination address, the fees paid, and the corresponding [API callback](/api-reference/callbacks).
The **Payments** tab provides a detailed view of balance movements. It shows each underlying operation separately, allowing merchants to see exactly how a transaction affected their balances. Cancelled or pending actions are not represented on this tab. Fees are displayed as separate entries, as sometimes a fee payment may affect a different balance than the main payment.
Both the **Transactions** and **Payments** tabs provide filters for finding the entries you need and an **Export** button for downloading the filtered entries as a CSV file.
There are also dedicated tabs for [payment requests](/payment-requests) and [mass payouts](/mass-payouts) deposits.
# Design a Bitcoin Lightning crypto payment form
Source: https://docs.alphapo.net/deposits/design-lightning-payment-form
To let users deposit Bitcoin faster and with lower fees, you can use the Bitcoin Lightning Network. Lightning is a second-layer protocol built on top of Bitcoin that enables fast, low-cost payments by processing transactions off-chain instead of recording each one directly on the Bitcoin blockchain.
This guide outlines the main features of Lightning payments and provides an example of how to implement a Bitcoin Lightning deposit form using AlphaPo.
## Key characteristics of Lightning payments
Bitcoin Lightning deposits use **Lightning invoices** instead of standard BTC wallet addresses. A **Lightning invoice** is a payment request that contains the amount to pay and the details needed to complete the transaction.
Example Lightning invoice:
```
lnbcrt1m1p5u93tfpp53wwjfugpyypf68mgwjfzq99x8cghlurxwpp680r9uyvd8qxkjulqdqqcqzysxqzuysp5fdzuturj4cttdaafw09j739adh4slxxqynnjpl6n208wqfc8ny6q9qxpqysgqgdgwm5hdt736pm3jkn0spp85zwx0023vlxj8s0fjkha55wtyg5hjxvmkjl6ee4ztxrc75j3q7qzxua7r28qujlvc3ykmaklczwccmkspazvfhu
```
**Lightning invoice rules**
* Each invoice is created for a specific amount and can only be paid once.
* The invoice contains the exact payment amount, so it must be paid in full and exactly as issued. Partial payments and overpayments are not possible.
* The invoice expires 15 minutes after it is created. The exact expiration time is included in the API response when the Lightning invoice is generated.
* The amount cannot be changed after the invoice is created.
* The maximum supported amount is 0.045 BTCLN. For larger deposits, use the Bitcoin network.
## How the payment form can be implemented
Add an **Amount** field for the user to fill in:
After the user enters an amount and clicks **Generate**, your site should send a POST request to the [/addresses/take](/api-reference/endpoints/addresses-take) endpoint.
```text highlight={9,11} theme={null}
POST /api/v2/addresses/take HTTP/1.1
Host: app.alphapo.net
X-Processing-Key:
X-Processing-Signature:
Content-Type: application/json
Accept: */*
{
"currency": "BTCLN",
"foreign_id": "1909242403",
"amount": 0.0025
}
```
Extract the Lightning invoice from the `address` field in the API response:
```text highlight={5} theme={null}
{
"data": {
"id": 240379058,
"currency": "BTCLN",
"address": "lnbcrt1m1p5u93tfpp53wwjfugpyypf68mgwjfzq99x8cghlurxwpp680r9uyvd8qxkjulqdqqcqzysxqzuysp5fdzuturj4cttdaafw09j739adh4slxxqynnjpl6n208wqfc8ny6q9qxpqysgqgdgwm5hdt736pm3jkn0spp85zwx0023vlxj8s0fjkha55wtyg5hjxvmkjl6ee4ztxrc75j3q7qzxua7r28qujlvc3ykmaklczwccmkspazvfhu",
"tag": null,
"foreign_id": "1909242403",
"expires_at": 1774373101
}
}
```
Generate a QR code for the user to scan, or provide an **Open wallet** button:
Wait for a [deposit callback](/api-reference/callbacks/deposit-callbacks) from AlphaPo where `status` is `confirmed`, then show a deposit confirmation message.
## Adding an Open wallet button on mobile
To let users pay Lightning invoices on mobile, you can add an **Open wallet** button with a Lightning deeplink. When the user taps the button, a compatible Lightning wallet opens with the payment details pre-filled.
Lightning deeplink example:
```
lightning:lnbcrt1m1p5u93tfpp53wwjfugpyypf68mgwjfzq99x8cghlurxwpp680r9uyvd8qxkjulqdqqcqzysxqzuysp5fdzuturj4cttdaafw09j739adh4slxxqynnjpl6n208wqfc8ny6q9qxpqysgqgdgwm5hdt736pm3jkn0spp85zwx0023vlxj8s0fjkha55wtyg5hjxvmkjl6ee4ztxrc75j3q7qzxua7r28qujlvc3ykmaklczwccmkspazvfhu
```
**How it works**
1. The customer taps the link on their mobile device.
2. Your site opens the `lightning:lnbc...` deeplink.
3. If the customer has a compatible wallet site installed, it opens with the invoice ready to pay.
4. If no compatible wallet is installed, the deeplink does not open and the customer may see an error such as **No Lightning wallet is installed on your device**.
## Additional details
* Bitcoin withdrawals using the Lightning Network are not supported. To withdraw funds, first exchange BTCLN to BTC or another supported currency. Exchanges between BTCLN and BTC are always at a 1:1 rate with no fees.
* You can also convert BTCLN to any supported currency and withdraw in a single step by using the [/withdrawal/crypto](/api-reference/callbacks/withdrawal-callbacks) endpoint with the `convert_to` parameter set to the target currency.
* For more details about the **/addresses/take** endpoint, refer to [Generate a crypto address](/api-reference/endpoints/addresses-take).
# Design a crypto payment form
Source: https://docs.alphapo.net/deposits/design-payment-form
Here are some tips for creating a convenient payment form for customers on your site.
To make it easier for your customers to make deposits, add a **Copy address** button to your payment form.
We recommend that you generate a QR code with the crypto address. This way, your customer will be able to scan the QR code with their phone and pay in their wallet app. AlphaPo does not generate address QR codes automatically, but you can use any tools you prefer.
Deposits under the minimum amount will not be recognised and credited by AlphaPo. Make sure your customers can clearly see the minimum deposit amount on the payment form.
For more information on minimum deposit amounts, see [Confirmations and limits](/confirmations-and-limits).
If your customer sends a deposit in the wrong currency or on the wrong network, their crypto can be lost or difficult to recover. We recommend highlighting the address's currency and network, as well as the minimum deposit amount, on your payment form.
For more details on how to handle cross-chain deposits, see [Handle deposits sent in the wrong currency](/deposits/recovery).
# Crypto deposit fees
Source: https://docs.alphapo.net/deposits/fees
## Processing fee
For each incoming deposit, a fee will be subtracted from your account. The fees are listed on the **Fees** tab in your merchant dashboard, under the **Deposit operations** section. The exact fee may depend on the currency and on whether the payment involved a conversion between different currencies. Some fees may have a minimum amount that you will pay even for small transactions.
The applicable fees are:
* **Deposit crypto**
* **Deposit crypto exchange to crypto**
* **Deposit crypto exchange to fiat**
* **Crypto Bankroll top up** (for deposits on [merchant top-up addresses](/deposits#merchant-top-up-addresses))
When a deposit is being processed [off-chain](/deposits#off-chain-deposits), the system uses the fees with "internal" in the name:
* **Deposit crypto internal**
* **Deposit crypto exchange to crypto internal**
* **Deposit crypto exchange to fiat internal**
* **Crypto Bankroll top up internal**
## Transfer fee for Ethereum
When receiving ETH funds or ERC-20 tokens, a transfer fee is subtracted from the merchant’s balance, in addition to the [processing fee](#processing-fee). The transfer fee covers the cost of *gas* in the Ethereum network.
The transfer fee amount depends on the current gas price when the deposit is being processed. It is subtracted in the same currency as the deposit itself: for example, the transfer fee for a USDC deposit will be in USDC.
You can see this fee as **Fee transfer** in a deposit's detais panel.
## Minimum deposit fee for Bitcoin
When working with the BTC blockchain, the merchant never pays mining fees directly. Instead, AlphaPo reflects any fee volatility in the *minimum deposit fee*. It only affects smaller transactions, and it never changes more than one time per week.
Every Monday, we check the *average mining fee* in the BTC network for the previous week, beginning and ending at 00:00 UTC on Monday. You can observe this value in public BTC blockchain explorers, for example, on the Blockchain.com's [Fees Per Transaction](https://www.blockchain.com/explorer/charts/fees-usd-per-transaction) graph.
The average mining fee determines the new minimum deposit fee, according to the table below. If it differs from the last week's one, we notify all users about the planned change.
AlphaPo switches to the new minimum deposit fee **at 10:00 UTC on Wednesday**.
| Average mining fee per transaction | Min deposit fee |
| ---------------------------------- | --------------- |
| 0–7 USD | 1 EUR |
| 7–10 USD | 1.5 EUR |
| 10–15 USD | 2.5 EUR |
| 15–20 USD | 3 EUR |
| 20–25 USD | 5 EUR |
| 25–36 USD | 8 EUR |
# Crypto deposits
Source: https://docs.alphapo.net/deposits/index
Deposits are a way for your customers to send you arbitrary amounts of cryptocurrency. Whenever they do so, funds will be added to your balance in AlphaPo. Typically, at this point you may want to add the received amount to the customer's balance on your site.
To start receiving deposits, create a [deposit address](#reusing-addresses) and give it to your customer. AlphaPo constantly monitors the blockchain for new transactions to all deposit addresses ever created. Your balance is updated as soon as the transaction gets the required number of [confirmations](/confirmations-and-limits). Optionally, AlphaPo can perform [automatic conversion](#deposits-with-conversion) of the received funds to another currency.
[Fees](/deposits/fees) and [minimal deposit amounts](/confirmations-and-limits) apply.
## Types of deposit addresses
AlphaPo processes crypto deposits in different ways, based on the way the deposit address was created.
System deposit addresses are created and intended to be used as part of an [automated integration](/deposits/integration-guide) with your site. Typically, your site may generate and show an address to each customer, so that they top up their balance on your site.
To create such an address, use the [API endpoint](/api-reference/endpoints/addresses-take). Enable [automatic conversion](#deposits-with-conversion) if necessary. Each incoming transaction to the address will trigger an [API callback](/api-reference/callbacks/deposit-callbacks).
In the merchant dashboard, these addresses can be found at **Addresses → System Addresses**.
Customer deposit addresses are created and managed by you in **Addresses → My Addresses**. You manually provide such address to your customer, so that they top up their balance on your site. Each address can have a name for easier search, e.g., "Deposits from John Doe".
To create such an address, go to the **Addresses → My Addresses** tab and click **Create address**. Alternatively, select a cryptocurrency on the **Balances** tab, click **Receive**, then click **Create new address**. Enable [automatic conversion](#deposits-with-conversion) if necessary.
AlphaPo does not send API callbacks for the transactions to customer deposit addresses.
Merchant top-up addresses are generated automatically when you enable a new cryptocurrency in your merchant dashboard. You can use these addresses to top up your balance.
These addresses can be found at **Addresses → My Addresses** under the names "BTC deposit address", "ETH deposit address", etc. Alternatively, select a cryptocurrency on the **Balances** tab, click **Receive** and see the default address.
Transactions to these addresses may have different [fees](/deposits/fees) than to the other addresses. These addresses are intended for usage by the merchant team only. You must not share the merchant top-up addresses with your customers.
AlphaPo does not send API callbacks for the transactions to merchant top-up addresses.
## Deposits with conversion
When creating a deposit address in one currency, you can enable automatic conversion of all incoming funds. If enabled, the amount of each deposit to this address will be instantly converted to the specified target currency.
Enabling conversion is possible for system addresses and customer deposit addresses (see [Types of deposit addresses](#reusing-addresses)). The target currency can be crypto or fiat.
Each conversion is made using the current currency rates at the time of processing the transaction.
## Reusing addresses
In cryptocurrencies, an address cannot be "deleted" or "closed": once you created it, your customer can send funds to the address at any time. AlphaPo constantly monitors the blockchain for new transactions to all deposit addresses ever created.
It is good practice to have only one deposit address for one currency per user. This way, the customer can save the address in their wallet app's address book to create new transactions in a more convenient way.
However, you can create more than one deposit address per customer. This is useful if you need to use different [conversion](#deposits-with-conversion) configurations or if your customer has two different balances on your site.
## Off-chain deposits
If the funds come from an address that happens to be controlled by AlphaPo, too, the transaction is being processed *off-chain*. This means that AlphaPo registers the transaction internally, even though it was never sent to the blockchain.
Just like a standard deposit, an off-chain deposit can be found on the **Transactions** tab. However, an off-chain deposit has an internal **TXID** instead of a public one. You can use this **TXID** to find the transaction in the merchant dashboard, but not in a blockchain explorer.
In the [API callback](/api-reference/callbacks/deposit-callbacks), an off-chain deposit has the `transaction.transaction_type` property set to `"internal"` instead of `"blockchain"`.
The [fee](/deposits/fees) for an off-chain deposit may differ from the standard one.
## Further reading
Learn how to integrate the deposit flow into your site
Walk through all scenarios to make sure your integration works correctly
API endpoint
API callbacks
# Crypto deposits integration guide
Source: https://docs.alphapo.net/deposits/integration-guide
You can receive crypto deposits from your customers with and without automatic conversion. Deposits with conversion are automatically converted to your preferred currency.
## Set up crypto deposits
Complete your onboarding in your merchant dashboard and generate an API key. For more details on how to create an API key, see [Get your API key](/merchant-administration/generate-and-activate-api-keys).
Send a request to [/addresses/take](/api-reference/endpoints/addresses-take) and get a crypto deposit address. You can reuse an address if the same customer is making another deposit in the same currency. We recommend using one address for each user.
```json title="Request example" theme={null}
{
"currency": "BTC",
"convert_to": "EUR",
"foreign_id": "user_12345",
"end_user_reference": "user_12345"
}
```
```json title="Response example" theme={null}
{
"data": {
"id": 240407212,
"currency": "BTC",
"convert_to": "EUR",
"address": "tb1qezlewt2mx36azu5qyx9yff7565z0u9p94vn2ha",
"tag": null,
"foreign_id": "user_12345",
"end_user_reference": "user_12345"
}
}
```
Your customer will see their deposit address in your [payment form](/deposits/design-payment-form).
Once your customer makes the deposit, AlphaPo will send you a callback. You will then need to update your customer's balance on your site.
# Bitcoin Lightning support
Source: https://docs.alphapo.net/deposits/lightning
To deposit Bitcoin faster and with lower fees, you can use the Bitcoin Lightning Network. Lightning deposits use a *Lightning invoice* (not an on-chain BTC address). The addresses are generated in the BOLT11 format.
Lightning invoice rules:
* Each invoice is generated for a specific amount.
* It can be paid only once.
* It must be paid for the exact amount specified (no partial/overpayments).
* It expires in 15 minutes.
To create a Lightning invoice, call [/addresses/take](/api-reference/endpoints/addresses-take), set `currency` to `BTCLN`, and include the `amount` parameter. The maximum supported amount is 0.045 BTCLN; for larger deposits, use the Bitcoin network.
Withdrawals via Lightning are not supported. If you need to withdraw, convert `BTCLN` to `BTC` (or another currency) first. Exchanges between `BTCLN` and `BTC` are always at a 1:1 rate with no fees.
# Recover lost deposits
Source: https://docs.alphapo.net/deposits/recovery
Some deposits may not show on your balance automatically or might be lost. Some of these cases can be processes automatically by AlphaPo or recovered manually by the AlphaPo team.
By default, AlphaPo will not send callbacks for these types of deposits. You can [change this behavior](/api-reference/callbacks/deposit-callbacks#additional-deposit-callbacks).
## Deposits that are on the same network
Deposits in these currencies will be credited to your balance automatically. For deposit addresses with exchange, deposits in the wrong currency will also not be exchanged.
| Network | Currencies that share this network |
| ------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ |
| Ethereum, Polygon and BNB Smart Chain (EVM-compatible chains) | ETH, POL, USDC (ERC‐20), USDC (POL), USDT (ERC‐20), USDT (POL), BXBT (ERC‐20), DAI (ERC‐20), EURS (ERC‐20), XED (ERC‐20), BNB‐BSC, USDT (BEP‐20) |
| Solana | SOL, USDC (SOL) |
| Tron | TRX, USDT (TRX) |
These deposits sent without a tag will not be credited to your balance automatically. To recover your deposit, contact our support team at [support@alphapo.net](mailto:support@alphapo.net) or using the widget in your merchant dashboard.
| Network | Currencies that share this network |
| ------- | ---------------------------------- |
| TON | GRAM, USDT (TON) |
If the address is meant for deposits with exchange, deposits in the wrong currency will not be exchanged. For example, if you created an ETH address with conversion to EUR, a USDC ERC-20 deposit sent to this address will not be automatically converted to any currency. You will receive the currency that you or your customer deposited, without conversion.
## Deposits within the same network
All deposits sent to your EVM-compatible addresses (starting with `0x`) will be bridged to the correct chain and credited to your balance automatically. However, they will not be automatically exchanged. This applies to Ethereum and Binance Smart Chain.
If you received a deposit in the wrong currency on the same network that is supported by AlphaPo, it will still appear on your balance. For example, if you generate an Ethereum address for ETH and your customer sends USDC ERC-20 to it, you will still see the USDC deposit on your balance. You can manually convert the customer's deposit to your currency of choice (see [Exchanges](/exchanges)) and credit their balance on your site.
To see transactions that were sent in the wrong currency, go to **Transactions** in your merchant dashboard. Click **Filters** to expand the filter section and select **Only cross-currency** from the Cross-currency dropdown list. To find a specific transaction, enter its TXID (the transaction's hash on the blockchain). All cross-currency transactions will have *Cross currency deposit* in the Note field.
## Deposits in unsupported currencies
You will not see deposits in unsupported currencies in your merchant dashboard. For example, this applies to all unsupported ERC-20 tokens sent to your Ethereum address, unsupported SPL tokens sent to your Solana address and other similar cases. The deposits will be credited to the address on the blockchain, but you will not see them on your balance in your AlphaPo merchant dashboard.
To see if your deposit can be recovered, contact our support team at [support@alphapo.net](mailto:support@alphapo.net) or using the widget in your merchant dashboard.
## XRP or Gram deposits sent without a tag or with the wrong tag
XRP or Gram (previously Toncoin) deposits sent without a tag or with the wrong tag will not be credited to you automatically. To see if your XRP or Gram deposit can be recovered, contact our support team at [support@alphapo.net](mailto:support@alphapo.net) or using the widget in your merchant dashboard.
## Deposits across different networks
If your customer sent a deposit on the wrong network (for example, BTC to an Ethereum address), you will not be able to access it. The only exceptions are Ethereum and Binance Smart Chain. As these are EVM-compatible networks, deposits can be seamlessly bridged between them.
To prevent this in future, always clearly specify the currency name and network when you share the address with your customers. You should also notify customers that deposits sent to the wrong address cannot be recovered, so they should always double-check the currency and the network before they send a transaction.
To see if your deposit can be recovered, contact our support team at [support@alphapo.net](mailto:support@alphapo.net) or using the widget in your merchant dashboard.
# Risk scoring
Source: https://docs.alphapo.net/deposits/risk-scoring
When a crypto transaction uses funds that are linked to previous suspicious transactions, it is often possible to see that in the blockchain. AlphaPo automatically performs such an analysis for deposits in certain currencies. The results are two informational fields that you can see:
* **Risky inflow** — the amount of funds (in USD equivalent) that have originated from transactions that can be considered suspicious.
* **Risk score** — the percentage of suspicious inputs or addresses among their total number.
Both fields are available:
* in each [API callback](/api-reference/callbacks/deposit-callbacks) for types `deposit` and `deposit_exchange`,
* in each deposit's details on the **Transactions** tab in the [merchant dashboard](/dashboard).
Risk scoring is supported for **BTC, BCH, ETH, and LTC**.
It is recommended to manually inspect the transactions with a risk score of about 75% or higher.
The risk score is included for informational purposes only. AlphaPo does not claim any responsibility for any actions or decisions made based on the provided risk score.
# Deposit statuses
Source: https://docs.alphapo.net/deposits/statuses
This section describes the statuses displayed in the merchant dashboard for deposits.
| Status |
Description |
|
Processing
|
The transaction is waiting for the required [number of confirmations](/confirmations-and-limits).
Once it gets the confirmations, the transaction will become Confirmed.
|
|
Confirmed
|
The transaction got the required [number of confirmations](/confirmations-and-limits). The funds are credited to the merchant's balance.
|
|
Failed
|
The transaction cannot be completed. The specific error is shown in the transaction's details panel on the **Transactions** tab.
One possible error is *"Deposited funds less than the lower limit"*, which refers to the minimum withdrawal limit from [Confirmations and limits](/confirmations-and-limits).
|
|
Cancelled
|
The transaction was cancelled by AlphaPo due to some other error. The specific error is shown in the transaction's details panel on the **Transactions** tab.
|
# Tag field
Source: https://docs.alphapo.net/deposits/tags
For most cryptocurrencies, the only field a user needs to specify the recipient is an address. This address can be displayed in your interface directly or encoded as a QR code.
But sometimes the address is not enough for a successful payment. For example, Ripple has a concept of “multiuser addresses” which require a tag field to distinguish between recipients. Sometimes this concept is also known as the “memo” field. AlphaPo provides the tag field for Ripple addresses both in the merchant dashboard and in the API.
In other cryptocurrencies, this field may also be known as “Memo”, “Comment”, “Label”, or “DigitalID”.
When using deposits for such a currency, make sure you provide the user with both the address and the tag field. The absence of the tag field may result in the loss of the funds sent by the user.
# Crypto deposits integration test cases
Source: https://docs.alphapo.net/deposits/test-cases
These are the test cases to help you test your site's integration with AlphaPo [crypto deposits](/deposits/integration-guide).
For each test case, create a new deposit address via the [/api/v2/addresses/take](/api-reference/endpoints/addresses-take) endpoint and then process the relevant [callback](/api-reference/callbacks/deposit-callbacks).
| Procedure |
Expected results |
|
**Successful deposit**
|
|
1. Create a deposit address without exchange.
2. Copy the address into a wallet on your device.
3. Place a payment. Make sure its amount is equal or higher than the [minimum deposit](/confirmations-and-limits).
|
* The site gets two `deposit` callbacks.
* The callback status is first `not_confirmed`, then `confirmed`.
* `currency_sent` describes the amount you sent (minus the network fee).
* `currency_received` describes the amount you received on your balance.
|
|
**Cross-currency deposit**
|
|
1. Go to **Settings → Callbacks** and make sure the **Cross-currency deposits** callback is enabled.
2. Create a deposit address for one currency, e.g., USDC on the Ethereum network.
3. Copy the address into a wallet on your device.
4. Place a payment in a different currency on the same network, e.g., ETH. Make sure its amount is equal or higher than the [minimum deposit](/confirmations-and-limits).
|
* The site gets two `deposit` callbacks.
* The callback status is first `not_confirmed`, then `confirmed`.
* `crypto_address.cross_currency` is true.
* `currency_received.currency` is different from `expected_currency`.
|
|
**Deposit below minimum amount**
|
|
1. Go to **Settings → Callbacks** and make sure the **Deposits less than minimum amount** callback is enabled.
2. Create a deposit address.
3. Copy the address into a wallet on your device.
4. Place a payment lower than the [minimum deposit](/confirmations-and-limits).
|
* The site gets two `deposit` callbacks.
* The callback status is `cancelled`.
* The error is `Transaction amount less than minimum deposit`.
|
# Create an exchange
Source: https://docs.alphapo.net/exchanges/create-an-exchange
Available to roles: Owner Exchange
You can exchange funds between supported currencies — crypto to crypto, crypto to fiat, or fiat to crypto — directly from your merchant dashboard.
Enter an amount in the **Spend** field to specify how much of your selected currency to exchange, or in the **Get** field to specify how much of the target currency you want to receive. Review the exchange rate, fee, and final amount before proceeding.
The exchange rate is fixed for one minute. If you accept before the timer expires, you receive the exact amount shown. If the timer runs out, a new rate is calculated and fixed for another minute. Click **Cancel** to cancel the exchange.
# Exchange fees
Source: https://docs.alphapo.net/exchanges/fees
For each exchange, a fee will be subtracted from your account. The fees are listed on the **Fees** tab in your merchant dashboard, under the **Exchange** section. Some fees may have a minimum amount that you will pay even for a small exchange.
The applicable fees are:
* **Exchange buy crypto for fiat**
* **Exchange sell crypto for fiat**
* **Exchange crypto to crypto**
# Exchanges
Source: https://docs.alphapo.net/exchanges/index
You can exchange different currencies, both crypto and fiat, within your merchant's account. This operation can be performed both [via the merchant dashboard](#exchanges-via-the-merchant-dashboard) and [via the API](#exchanges-via-the-api).
To learn which currencies can be exchanged to which currencies, see [Supported trading pairs](/supported-trading-pairs). Each trading pair is bidirectional.
[Fees](/exchanges/fees) and minimal amounts apply. To learn the minimal amounts, see [/currencies/pairs](/api-reference/endpoints/currencies-pairs).
## Exchanges via the merchant dashboard
In the merchant dashboard, an exchange can be performed on the **Balances** tab by selecting a balance and clicking **Exchange** on the right panel.
In a dialog that appears, select the two currencies and specify the amount in either one of them. The other amount will be calculated automatically using the current exchange rate. Click **Exchange** to fix the rate, then click **Accept** within 60 seconds to perform the exchange.
## Exchanges via the API
The fastest way to perform an exchange using the AlphaPo API is by calling [/exchange/now](/api-reference/endpoints/exchange-now). This will immediately subtract funds from one balance and add to the other, using the current exchange rate. You will find the information about the used rate both in the API response and in the [callback](/api-reference/callbacks/exchange-callbacks).
Another way is a two-step operation: find an exchange rate using [/exchange/calculate](/api-reference/endpoints/exchange-calculate) and, if you agree with it, use it in parameters for [/exchange/fixed](/api-reference/endpoints/exchange-fixed). The second call must be done within 60 seconds after the first one. You will also receive the [callback](/api-reference/callbacks/exchange-callbacks).
# Add a bank account
Source: https://docs.alphapo.net/fiat/add-a-bank-account
**Available to roles**: Owner
Before you can make withdrawals from your fiat balances, you need to add a bank account.
You will be prompted for your bank account details.
Once submitted, AlphaPo will review your bank account details. This usually takes **24 to 48 hours**. If necessary, our compliance team may request additional documents through your account manager.
When your account is verified, you can use it to withdraw fiat funds from your merchant account.
# Top up your fiat balance
Source: https://docs.alphapo.net/fiat/top-up-fiat
**Available to roles**: Owner
Before sending a bank transfer, you must first create a top-up order in AlphaPo and specify the amount. Once the order is created, retrieve the generated transaction ID (TXID) and include it in the transfer details when sending from your bank.
When you top up with crypto, all crypto payments are automatically converted to the fiat currency you selected.
* For a **bank transfer** — you will see the bank details to send a transfer to in your bank app of choice.
* For **crypto** — you will see the wallet address to send the transaction to.
You can track pending crypto transactions on the **Transactions** in the merchant dashboard.
# Withdraw from your fiat balance
Source: https://docs.alphapo.net/fiat/withdraw-fiat
**Available to roles**: Owner
If you have not previously provided a BRL (bank reference letter), it will need to be submitted before your first withdrawal can be processed. Your account manager will reach out with more information.
# Get started with AlphaPo
Source: https://docs.alphapo.net/index
AlphaPo is a crypto payment gateway. We provide secure, compliant and fast crypto payment processing solutions to businesses all over the world.
You can accept payments in 20+ most popular cryptocurrencies with low fees, instantly exchange crypto to traditional currencies and easily withdraw it to your bank account.
See the full list of supported cryptocurrencies, networks, and trading pairs.
## Common use cases
Let customers pay you or top up their balances with crypto. Each user gets a permanent deposit address, and funds are credited automatically.
Create a payment link, share it anywhere, and get paid in crypto. Includes rate lock, hosted checkout, and support for refunds.
Send crypto from your balance to any external wallet. Supports automatic currency conversion and instant processing for select currencies.
## More features
Swap between crypto and fiat currencies within your merchant account, via the dashboard or API.
Disburse crypto to many recipients at once. Supports multiple currencies and amounts in a single batch.
Fund your fiat balance via bank transfer or crypto. Create a top-up order first, then send the transfer from your bank.
Withdraw funds from your fiat balance to a verified bank account directly from the merchant dashboard.
# Initial setup
Source: https://docs.alphapo.net/initial-setup
Complete these steps before you start your integration.
Before you can send your first API request, you need to activate your account, secure it, and configure a few settings in your merchant dashboard.
Activate your account using the invitation email and set up two-factor authentication with an authenticator app.
Set withdrawal limits, configure balance notifications, and automate transfers to cold addresses to protect your funds.
Generate and activate your API key and secret key. You'll need these to authenticate every API request.
Register an HTTPS webhook endpoint where AlphaPo will send event callbacks for deposits, withdrawals, and payments.
Learn how to sign requests using your API key and secret key, and avoid common authentication errors.
Use the List supported currencies endpoint to verify your API key is working and explore what's available in your environment.
# Create a mass payout
Source: https://docs.alphapo.net/mass-payouts/create-a-mass-payout
Available to roles: Owner
Mass payouts let you initiate multiple outgoing crypto transactions at once by uploading a CSV file. Each row in the file creates a separate transaction. Before you begin, prepare your CSV file according to the [required format](/mass-payouts/file-format).
Choose **In cryptocurrency** for a standard payout, or **With conversion** to convert funds from one currency to another before sending.
If AlphaPo detects an error in a row, an exclamation mark appears next to it. Hover over it to see the error message. Fix any errors in your file and click **Reupload file** to upload it again.
This shows the total withdrawal amount and a subtotal for each currency. Note that the equivalent currency amounts are informational — actual costs may vary once fees are applied.
You can track the [status](/mass-payouts/statuses) of your mass payout on the **Mass Payouts** tab. If any transactions fail, see [Retrying failed mass payouts](/mass-payouts/retrying).
# Mass payouts file format
Source: https://docs.alphapo.net/mass-payouts/file-format
To make a mass payout, you need to prepare a CSV file describing all the transactions you want to make. The file must contain no more than **500 data rows**, and its size must not exceed **1 MB**.
The file must start with a header row that lists these columns in the specified order. Each data row must contain five values, separated by either commas or semicolons.
* **Address** — the recipient's address.
* **Tag** — the recipient's [Tag field](/deposits/tags). Leave empty for currencies that do not require a Tag field.
* **Currency** — the ISO code of the currency to send.
* **Amount** — the amount of funds to send.
* **Note** — a note to save in the [transaction history](/dashboard#viewing-transactions-history). Leave empty to skip adding a note for the transaction.
```csv sample.csv theme={null}
Address,Tag,Currency,Amount,Note
bc1qar0srrr7xfkvy5l643lydnw9re59gtzzwf5mdq,,BTC,0.0025,Salary for Alice
0x59E497D1AEf6B696B66F503D85d9b29A0e2930E8,,USDC,120.20,Salary for Bob
r9NEXKYNyfxhzw7VzJp9et8t3onbam98G,2422386,XRP,400,Salary for Charlie
```
* **From Currency** — the currency you want to convert from.
* **Amount to Send** — the amount of funds to send. Fill in either this field or the Amount to Receive.
* **Address** — the recipient's address.
* **Tag** — the recipient's [Tag field](/deposits/tags). Leave empty for currencies that do not require a Tag field.
* **To Currency** — the currency you want to convert to.
* **Amount to Receive** — the amount the recipient will receive. Fill in either this field or the **Amount to Send**.
* **Note** — a note to save in the [transaction history](/dashboard#viewing-transactions-history). Leave empty to skip adding a note for the transaction.
```csv sample_with_conversion.csv theme={null}
From Currency,Amount to Send,Address,Tag,To Currency,Amount to Receive,Note
EUR,100,bc1q5ek0zq6dn4delgxnu5va0ttmlmgkgx3r04xare,,BTC,,Salary for Alice
EUR,,0x7382FD00Ed0EF743044977D81673D7B87b87082C,,USDC,200,Salary for Bob
ETH,1,rPpGnDVzyfqJhjn2bybATLQxsDx1QfdU6c,1278637,XRP,,Salary for Charlie
```
Only fill in either the **Amount to Receive** or the **Amount to Send**. AlphaPo will calculate the other value automatically. If you include both fields, you will get an error message.
# Mass payouts
Source: https://docs.alphapo.net/mass-payouts/index
The **Mass Payouts** tab provides an interface for initiating multiple outgoing crypto transactions at a time. This can include transactions of different amounts made in different cryptocurrencies.
Initiating a mass payout involves processing a special CSV file and creating a transaction based on each data row. Each transaction will then be processed in accordance with the general transaction flow, with the mass payout getting its status based on all the transactions' statuses.
Being an alternative interface to [withdrawals](/withdrawals), this feature works within the same limitations as they do. For example, each individual transaction in a mass payout may be a subject to your merchant's [interface withdrawal limits](/merchant-administration/configure-withdrawal-limits).
## Mass payouts with and without conversion
There are two types of mass payouts available, with and without currency conversion.
If you have crypto on your balance and want to simply transfer it to the recipient, choose standard mass payouts.
If you have fiat (for example, EUR) and the recipient prefers crypto, you can make a fiat transfer and have it converted to the recipient's cryptocurrency of choice automatically.
# Retrying failed mass payouts
Source: https://docs.alphapo.net/mass-payouts/retrying
For a mass payout with at least one failed item in it (either a failure in creating a transaction or an unsuccessful transaction), the panel in the merchant dashboard contains the **Export unsuccessful transactions** button. Click the button to download a modified version of the original CSV file, with all successful transactions removed.
The button for downloading the file appears as soon as at least one failure occurs during the mass payout. The file may change after that if more transactions will be unsuccessful.
Besides the original data, the file contains additional columns:
* **Status** — either the status of an unsuccessful transaction (*Failed*, *Declined*, *Canceled*) or *Not created* if AlphaPo failed to create a transaction based on this data row.
* **Error** — an error message explaining why the transaction was unsuccessful.
If you believe that the cause of the errors is fixed (you added more funds to your balances, you added a missing Tag field, etc.), you can remove the **Status** and **Error columns** from the CSV file and use it for initiating a new mass payout.
# Mass payout statuses
Source: https://docs.alphapo.net/mass-payouts/statuses
This section describes the statuses displayed in the merchant dashboard for mass payouts.
| Status |
Description |
|
Transaction on moderation
|
Some or all transactions are Pending and require manual moderation by the merchant team.
|
|
Processing
|
Some or all transactions are still Processing.
|
|
Completed
|
All transactions are Confirmed.
|
|
Completed with errors
|
Some or all transactions failed. See [Retrying failed mass payouts](/mass-payouts/retrying).
|
# Add a user
Source: https://docs.alphapo.net/merchant-administration/add-a-user
Available to roles: Owner
Add users to your merchant account and assign roles that match their responsibilities. This page explains how to choose the right role, invite a new user, and request **Owner** access when needed.
## Determine which role to use
User roles define what each user can see and do in the merchant dashboard.
Use the principle of least privilege when assigning roles. Give users only the permissions they need to complete their tasks.
Can view account information, fees, cold addresses, transactions, payment requests, mass payouts, withdrawal and operation limits, and contacts. Can also manage deposit addresses, resend transaction callbacks, and create payment requests.
Includes all **View** permissions and allows users to exchange funds.
Includes all **View** permissions and allows users to manage keep-on-hot limits and the minimum transaction amount for automatic transfers to cold wallets.
Has full access to the account and all dashboard sections. Users with the **Owner** role can:
* Add users and update user roles
* Manage API keys
* Configure callbacks
* Configure notifications
* Manage bank accounts
* Manage cold addresses
* Withdraw funds
* Configure withdrawal limits
* Approve withdrawals that exceed the withdrawal limit
To assign the **Owner** role to a user, contact our Support team.
Can contact the **Support** team and create tickets. Cannot view information or perform actions in the merchant dashboard.
## Add a new user
Follow these steps to add a new user:
The user will receive an invitation email at this address with instructions on how to activate their account.
Refer to the section above for information about user roles.
The **Owner** role can be assigned to a user only by contacting our Support team. To create a user with the **Owner** role, first create the user with the **View** role, then contact our Support team and provide the user's email address.
The user will receive an email with their login and temporary password. For instructions on initial account setup, refer to [Log in and configure 2FA](/merchant-administration/log-in-and-configure-2-fa).
## FAQ
### How do I add a user with the Owner role?
First, create a new user with the **View** role. Then, contact our Support team to assign the **Owner** role to this user. You will be asked to complete a special authorization form before the new user is granted the **Owner** role.
### Why can't a Restricted user access the merchant dashboard?
Users with the **Restricted** role do not have access to the merchant dashboard and are logged out immediately after entering their credentials. Users with the **Restricted** role only have access to the help center.
# API configuration
Source: https://docs.alphapo.net/merchant-administration/api-configuration
Before you can start using the AlphaPo API, you need to generate an API key and register a callback URL for receiving webhook notifications. Optionally, you can restrict API access to trusted IP addresses.
For details on authenticating your requests, refer to the [API reference](/api-reference/introduction).
# Change a user role
Source: https://docs.alphapo.net/merchant-administration/change-a-user-role
Available to roles: Owner
Update a user’s account access when their responsibilities change. This page explains how to choose the right role, change an existing user’s role, and request **Owner** access when needed.
## Determine which role to use
User roles define what each user can see and do in the merchant dashboard.
Use the principle of least privilege when assigning roles. Give users only the permissions they need to complete their tasks.
Can view account information, fees, cold addresses, transactions, payment requests, mass payouts, withdrawal and operation limits, and contacts. Can also manage deposit addresses, resend transaction callbacks, and create payment requests.
Includes all **View** permissions and allows users to exchange funds.
Includes all **View** permissions and allows users to manage keep-on-hot limits and the minimum transaction amount for automatic transfers to cold wallets.
Has full access to the account and all dashboard sections. Users with the **Owner** role can:
* Add users and update user roles
* Manage API keys
* Configure callbacks
* Configure notifications
* Manage bank accounts
* Manage cold addresses
* Withdraw funds
* Configure withdrawal limits
* Approve withdrawals that exceed the withdrawal limit
To assign the **Owner** role to a user, contact our Support team.
Can contact the **Support** team and create tickets. Cannot view information or perform actions in the merchant dashboard.
## Change a user role
## FAQ
### How do I change the role of a user with the Owner role?
Only our Support team can change the role of a user with the **Owner** role. To change the role of an **Owner** user, contact our Support team.
### How do I assign the Owner role to a user?
Only our Support team can assign the **Owner** role to a user. To assign the **Owner** role, contact our Support team.
# Configure additional deposit callbacks
Source: https://docs.alphapo.net/merchant-administration/configure-additional-deposit-callbacks
Available to roles: Owner
By default, AlphaPo sends callbacks for these two deposit events: [deposits below the minimum allowed amount](/api-reference/callbacks/deposit-callbacks#below-minimum-amount), and [deposits received in a currency different from the one assigned to the crypto address](/api-reference/callbacks/deposit-callbacks#cross-currency-deposit). You can enable or disable either of these at any time.
# Configure automatic withdrawals to cold addresses
Source: https://docs.alphapo.net/merchant-administration/configure-automatic-withdrawals-to-cold-addresses
Automatic withdrawals send funds to an external cold address once the balance for a given currency reaches a certain level. To enable this flow, you must configure balance limits and a cold address for each currency.
## Configure balance limits
**Available to roles**: Owner Limits
Balance limits define when an automatic withdrawal is triggered and how much remains on the balance afterward.
Configure the following:
* **Keep on Hot** — the amount that remains on the balance after an automatic withdrawal. This is effectively the maximum balance for the selected currency.
* **Min Transaction Amount** — the threshold at which an automatic withdrawal is triggered. Once the balance reaches or exceeds this value, the excess funds are swept to the cold address and the remaining balance is reduced to the Keep on Hot amount.
## Configure a cold addresses
**Available to roles**: Owner
The cold address is the external address that funds are automatically withdrawn to.
Editing a cold address is disabled by default. To modify an existing address, contact the support team to request access — once granted, editing is available for 24 hours. This ensures that only a user with the Owner role, following an official request, can update cold addresses.
# Configure balance amount notifications
Source: https://docs.alphapo.net/merchant-administration/configure-balance-amount-notifications
**Available to roles**: Owner
You can monitor minimum balance thresholds for specific currencies without logging into the merchant dashboard. At a configured interval, the system checks your balances and sends a report to the specified email address listing any currencies that have dropped below their threshold.
Enter the email address, input your 2FA code, and click **Confirm**.
In the pop-up, select the currency, set the minimum balance threshold, enter your 2FA code, and click **Confirm**.
Click **Edit** in the **Rules** section, select the desired interval in hours, enter your 2FA code, and click **Submit**.
# Configure withdrawal limits
Source: https://docs.alphapo.net/merchant-administration/configure-withdrawal-limits
**Available to roles**: Owner
Withdrawal limits can be configured by users with the Owner role to send outgoing transactions for manual approval when they exceed a configured threshold. Limits are configured separately for **interface withdrawals** (created in the merchant dashboard) and **API withdrawals** (created via the API).
When an interface withdrawal exceeds a configured limit, it must be approved by a **different** user with the Owner role — the user who created the withdrawal cannot approve it themselves. For API withdrawals, any user with Owner permissions can approve or decline the transaction.
There are two types of limits:
* **Default limit** — set in your account's main fiat currency (typically EUR) and applies to all currencies. Withdrawals in other currencies are checked against their EUR equivalent. For example, a default limit of 1,000 EUR means any USDC withdrawal over 1,166.70 USDC (≈ 1,000 EUR) will require approval.
* **Custom limit** — set for a specific currency and overrides the default limit. For example, if you set a custom USDC limit of 10,000 USDC, a 1,166.70 USDC withdrawal will no longer require approval, even if it exceeds the default EUR threshold.
Withdrawal limits do not apply to fiat withdrawals to bank accounts.
## Configure the default withdrawal limit
The default limit is defined in your account's main fiat currency (typically EUR) and applies to all currencies. Withdrawals in other currencies are evaluated based on their EUR equivalent — for example, with a default limit of 1,000 EUR, a USDC withdrawal over 1,166.70 USDC (the equivalent of 1,000 EUR) would require approval. To set a different threshold for a specific currency, configure a custom limit for that currency instead.
Select the **Interface withdrawals** tab to set limits for withdrawals created in the merchant dashboard, or the **API withdrawals** tab for withdrawals created via the API.
In the pop-up, configure any of the following options:
* **All withdrawals will be passed through manual moderation** — enable this checkbox to require approval for all withdrawals regardless of amount.
* **One operation limit** — maximum amount per single withdrawal.
* **Per hour limit** — maximum total amount within one hour.
* **Per day limit** — maximum total amount within one day.
## Configure custom withdrawal limits
Custom limits apply to a specific currency and take priority over the default limit. Use custom limits when you need different thresholds for individual fiat or crypto currencies.
Select the **Interface withdrawals** tab to set limits for withdrawals created in the merchant dashboard, or the **API withdrawals** tab for withdrawals created via the API.
In the pop-up, configure the following:
* **Currency** — select the fiat or crypto currency for this limit.
* **All withdrawals will be passed through manual moderation** — enable this checkbox to require approval for all withdrawals in this currency regardless of amount.
* **One operation limit** — maximum amount per single withdrawal.
* **Per hour limit** — maximum total amount within one hour.
* **Per day limit** — maximum total amount within one day.
## Configure notifications for pending approvals
You can configure email notifications to alert you when a withdrawal is sent for manual moderation.
Click **Email** and enter the email address where you want to receive notifications. To add multiple addresses, click **Add** after each entry. To remove an address, click the bin icon next to it.
Click **Test email** to send a test notification to all configured addresses and confirm delivery.
## FAQ
### Can I require approval for all withdrawals regardless of amount?
Yes. When editing the default limit, enable the **All withdrawals will be passed through manual moderation** checkbox. Every withdrawal will then be sent for approval regardless of amount.
Note that this setting is configured independently for interface withdrawals and API withdrawals — if you want it to apply to both, enable it in each tab.
### Can I require approval for all withdrawals in a specific currency?
Yes. Add or edit a custom limit for that currency and enable the **All withdrawals will be passed through manual moderation** checkbox. This overrides the default limit behavior for that currency and sends every withdrawal in it for approval regardless of amount.
Note that this setting is configured independently for interface withdrawals and API withdrawals — if you want it to apply to both, enable it in each tab.
### Why does a withdrawal have the Pending status?
A withdrawal receives the **Pending** status when it is sent for manual moderation because a withdrawal limit was triggered.
To continue processing the withdrawal, an Owner must open the transaction in the merchant dashboard and either approve or decline it.
# Deactivate an API key
Source: https://docs.alphapo.net/merchant-administration/deactivate-an-api-key
Available to roles: Owner
You may need to deactivate your API key if you want to create a new one, if you lost your secret key, or if you think your secret key was compromised.
If you suspect that your secret key was compromised, **deactivate it immediately** and contact our Support team.
## Deactivate an API key
# Generate and activate API keys
Source: https://docs.alphapo.net/merchant-administration/generate-and-activate-api-keys
Available to roles: Owner
You need to generate an API key and a secret key before you can start making API requests:
* **API key** - Specified in the `X-Processing-Key` header in API requests. You can view it in the **API keys** section of your merchant dashboard.
* **Secret key** - Used to generate an HMAC-SHA512 signature of the request body. The signature is specified in the `X-Processing-Signature` header in API requests. You can view the secret key only once, after activating the API key for the first time.
API keys are not tied to a specific user. They are tied to your merchant account. Only one API key and secret key pair can be active for a merchant at a time.
## Generate an API key and activate it
The list of **Generated API keys** will be updated.
Only one API key can be active at a time. If another key is already active, disable it first, then return to this step.
Your secret key will be displayed after you click **Activate**. Make sure no one can see or record your screen.
Specify the public IP addresses from which you will make requests to the API. Use either IPv4 or IPv6 format, and separate multiple IP addresses with commas. If you leave this blank, requests from any IP address will be accepted.
Your secret key is displayed only once. Toggle **Secret key QR code** to display the secret key as a QR code.
If you think your secret key may have been compromised, [deactivate it](/merchant-administration/deactivate-an-api-key) immediately and contact our Support team.
## FAQ
### How can I view my secret key if I lost it?
If you don't have your secret key, you need to [deactivate](/merchant-administration/deactivate-an-api-key) the corresponding API key, and then generate a new API key and secret key.
### What should I do if someone else got access to my secret key?
If you suspect that your secret key was compromised, [deactivate it](/merchant-administration/deactivate-an-api-key) immediately and contact our Support team.
# Log in and configure 2FA
Source: https://docs.alphapo.net/merchant-administration/log-in-and-configure-2-fa
Available to roles: View Exchange Limits Owner Restricted
## First login
Scan the QR code with your authenticator app.
Enter your email address, temporary password, and the 2FA code generated by your authenticator app.
Enter your temporary password, then create and confirm your new password.
## FAQ
### How can I reset my password?
If you forgot your password, please contact the Support team. If you remember your password and want to change it, go to the **Account** section in the merchant dashboard and click **Change** next to the **Password** field.
### I don't have access to my 2FA device
If you've lost access to the device configured for 2FA and don't have a backup, please contact the Support team for assistance.
### How do I change my 2FA device?
You can move your existing 2FA configuration to a new device or application. Refer to your 2FA application's documentation for instructions.
### Why do I get logged out after entering my credentials?
Users with the **Restricted** role do not have access to the merchant dashboard and are logged out immediately after entering their credentials. They only have access to the help center.
# Manage allowed IP addresses for API requests
Source: https://docs.alphapo.net/merchant-administration/manage-allowed-ip-addresses-for-api-requests
Available to roles: Owner
Follow the instructions on this page to update the public IP addresses from which you will make requests to the API.
## Manage allowed IP addresses
Use either IPv4 or IPv6 format, and separate multiple IP addresses with commas.
# Merchant security
Source: https://docs.alphapo.net/merchant-administration/merchant-security
This section covers merchant account settings that help you control fund movements and stay informed about your balances. You can set withdrawal limits to require manual approval for large or suspicious transactions, configure balance notifications to alert you when funds drop below a threshold, and automate withdrawals to cold addresses once balances reach a defined level.
# Remove a user
Source: https://docs.alphapo.net/merchant-administration/remove-a-user
Available to roles: Owner
Remove users from your merchant account when they no longer need access to the merchant dashboard. This page explains how to remove an existing user and what to do when you need to remove or disable an **Owner** user.
## Remove a user
## FAQ
### Can I remove a user with the Owner role?
Only our Support team can remove users with the **Owner** role. To remove a user with the **Owner** role, contact our Support team.
### Can I deactivate a user's account without deleting it?
To temporarily restrict a user's access to the merchant dashboard without deleting their account, contact our Support team and request to disable the user's account.
# Set up callback URL
Source: https://docs.alphapo.net/merchant-administration/set-up-callback-url
Available to roles: Owner
As part of the integration process, you need to set up an HTTPS webhook endpoint where AlphaPo can send [callbacks](/api-reference/callbacks/callbacks-overview). After your create the endpoint, register it in AlphaPo.
## Set up callback URL
Your webhook URL must use HTTPS, use a domain name, and be considered safe by VirusTotal and similar scanners.
Only one callback URL can be active at a time.
For additional security, you can whitelist the AlphaPo IP addresses used for callback delivery. Contact Support for the current list of IP addresses.
# User management
Source: https://docs.alphapo.net/merchant-administration/user-management
Access, secure, and maintain user accounts in the merchant dashboard. Use these articles to set up login credentials, configure 2FA, understand role-based access, and resolve common authentication issues.
# Payment request backlinks
Source: https://docs.alphapo.net/payment-requests/backlinks
The AlphaPo payment request webpage may include a **Return to merchant** link with a URL that you provide. It is good practice to use these webpages to inform the customer about the successful purchase or let them retry a failed one.
This customization is only available when creating a payment request via the [API endpoint](/api-reference/endpoints/payments). You can provide different webpages for different states of the process via the [url\_store](#url-store), [url\_success](#url-success) and [url\_failed](#url-failed) parameters.
It is not guaranteed that the customer will click the link. Instead, they may immediately close the tab with the AlphaPo interface after sending the transaction. The only reliable way to get notified about the payment request status is to process [API callbacks](/api-reference/callbacks/payment-request-callbacks).
## url\_store
The `url_store` link will be shown under the payment request form while it is still processing (neither successful nor cancelled).
This URL is also used as the default value for `url_success` and `url_failed` in case you don't specify them.
## url\_success
The `url_success` link will be used for the button on the final screen of the payment request interface.
A customer only sees this button when they successfully completed the payment request. Your site will have already received the [Payment request paid](/api-reference/callbacks/payment-request-callbacks#payment-request-paid) callback.
## url\_failed
The `url_failed` link will be used for the button on the ‘Payment request expired’ screen.
A customer only sees this button when they failed to fulfill the requested amount within the [lifespan](/payment-requests#lifespan-and-rate-lock). Your site will have already received the [Payment request failed](/api-reference/callbacks/payment-request-callbacks#payment-request-failed) callback.
# Create a payment refund
Source: https://docs.alphapo.net/payment-requests/create-a-payment-refund
Available to roles: Owner
You can refund all or part of a completed payment request at any time. The refund is always sent in the same cryptocurrency and network the customer used to pay, and the amount is deducted from your balance. For an overview of how refunds work, see [Payment request refunds](/payment-requests/refunds).
You can refund the full amount or a partial amount. The maximum refundable amount is shown below the amount field. Review the fee and final amount deducted from your balance before proceeding.
Once the refund is created, the amount is deducted from your balance and your customer receives an email with a secure link to claim their refund. You can track the refund status in the refunds section of the payment request. See [Payment request statuses](/payment-requests/statuses) for details.
# Create a payment request
Source: https://docs.alphapo.net/payment-requests/create-a-payment-request
Available to roles: View Exchange Limit Owner
A payment request generates a unique payment link and QR code you can share with a customer to collect a one-time crypto payment. For an overview of how payment requests work, see [Payment requests](/payment-requests).
Select the currency and the amount you want to receive.
If the customer [selects another currency](/payment-requests#currency-selection) to pay in, AlphaPo will automatically convert the funds into the currency you selected.
Choose how long the payment link remains valid. Set this as a duration (minutes, hours, or weeks) or as a specific date and time in your local time zone.
Make sure your customer will have enough time to place the payment. We recommend setting the lifespan to at least 15 minutes. If your customers can pay in currencies on networks with higher confirmation times (such as BTC), consider setting the lifespan to at least an hour.
* **Description** — a short description of the product or service. This will be shown to the customer on the payment page.
* **Customer email** — the customer's email address, used to send them a receipt and any [refund](/payment-requests/refunds) instructions if needed.
Once the request is created, a unique link and QR code are generated. Share either with your customer to complete the payment.
# Payment request fees
Source: https://docs.alphapo.net/payment-requests/fees
When your customer fulfills a payment request and you receive the funds, a fee will be subtracted from your account. The fee is the same as a [deposit fee](/deposits/fees) for the same amount.
Just like for a deposit, the fee may depend on the currency and on whether the payment involved a conversion between different currencies. Some fees may have a minimum amount that you will pay even for small transactions.
The fees are listed on the **Fees** tab in your merchant dashboard, under the **Deposit operations** section. The applicable fees are:
* **Deposit crypto**
* **Deposit crypto exchange to crypto**
* **Deposit crypto exchange to fiat**
If an [automatic or manual refund](/payment-requests/refunds) is initiated, a fixed fee will be subtracted from its amount. The customer will be shown both the fee amount and the result amount they receive when they fill in the refund form. The fee may depend on the currency in which the refund will be sent, which is the same currency the customer paid.
If the refund itself is smaller than the fee, the customer will not be able to receive it.
# Payment requests
Source: https://docs.alphapo.net/payment-requests/index
With payment requests, you can let your customers make one-time payments in the cryptocurrency of their choice.
* **Your customer** sees a convenient webpage that guides them through the payment process.
* **You** receive funds in the currency you requested, regardless of the customer's payment currency.
* **AlphaPo** takes care of conversion and edge cases, such as underpayments and overpayments.
When creating a payment request, you control its behavior by choosing the [currency](#currency-selection) and the [lifespan](#lifespan-and-rate-lock).
The funds received via a payment request may be sent back via a [refund](/payment-requests/refunds), initiated either automatically or manually by you.
## Currency selection
When creating a payment request, you specify the **expected currency** — the cryptocurrency you want to receive. However, your customer may find it convenient to choose another **payment currency** – the cryptocurrency in which the actual transaction will be made.
If the payment currency is different from the expected currency, AlphaPo takes care of converting the funds automatically. This means that you receive the exact amount of the exact currency you requested. When doing so, AlphaPo applies a [rate lock of 1 hour](#lifespan-and-rate-lock).
Alternatively, you can choose a set currency (and/or network) your customer will be able to pay in. We recommend only doing this if your customer has already chosen their preferred currency somewhere on your site. The parameter is only available via API, see [/payments/v1/requests](/api-reference/endpoints/payments).
The payment currency is also used in [refunds](/payment-requests/refunds).
## Lifespan and rate lock
There are two time constraints applicable to a payment request.
* The **lifespan** is configured when you create a payment request. The customer's transaction must be both created and confirmed within this lifespan, or the payment request expires.
* The **rate lock** happens if the customer chooses the payment currency different from the currency you requested. AlphaPo locks the currency rates for **1 hour**. The customer's transaction must be both created and confirmed within this period, or the payment request expires.
Note that if you forced selection of a payment currency, the rate lock will start immediately. This behavior is only available via API, see [/payments/v1/requests](/api-reference/endpoints/payments).
When the payment request has less than 1 hour left before expiration, whatever its cause is, the customer will see a countdown timer on the webpage.
## Further reading
Learn how to integrate the payment requests flow into your site
Walk through all scenarios to make sure your integration works correctly
API endpoint
API callback
# Payment requests integration guide
Source: https://docs.alphapo.net/payment-requests/integration-guide
Let your customers pay crypto via a convenient interface with rate lock, currency conversion, and easy refunds.
## Set up payment requests
Complete your onboarding in your merchant dashboard and generate an API key. For more details on how to create an API key, see [Get your API key](/merchant-administration/generate-and-activate-api-keys).
When the customer wants to make a new purchase, send a request to [/payments/v1/requests](/api-reference/endpoints/payments). Specify the required amount, [currency](/payment-requests#currency-selection) and [lifespan](/payment-requests#lifespan-and-rate-lock) for the payment request.
```json title="Request example" theme={null}
{
"amount": "100",
"currency": {
"iso": "EUR"
},
"life_time_duration": 360000,
"end_user_email": "customer@example.com",
"description": "Order 0512",
"url_store": "https://example.com/store"
}
```
```json title="Response example" theme={null}
{
"data": {
"id": "019d511c-9fd2-7e71-b534-74e8abd855f1",
"amount": "100",
"currency": {
"iso": "EUR"
},
"status": "created",
"life_time": 1775542323,
"end_user_email": "customer@example.com",
"description": "Order 0512",
"payment_link": "https://payments.alphapo.net/payment/lLXLZ6Q8lCwFFRbyW0C1ET",
"url_store": "https://example.com/store"
}
}
```
The URL of the interface is provided in the `data.payment_link` field of the API response. Depending on your payment flow, you can:
* navigate the customer to the payment request link in a new tab,
* generate a QR code based on the payment request link and display it to your customer,
* embed the payment link as an iFrame for quick on-page checkout.
For the customer's convenience, we recommend providing a link to the pending payment request somewhere on your site, too. This way, if the customer accidentally closes the payment request tab before finishing the payment, they will use the link to continue the process.
When you get the [payment\_request](/api-reference/callbacks/payment-request-callbacks) callback, update the purchase status on your site.
Make sure to cover all possible statuses of the callback. For a failed payment request, consider showing a 'Retry' button that initiates a purchase of the same product again.
# Payment request refunds
Source: https://docs.alphapo.net/payment-requests/refunds
AlphaPo provides a mechanism to send funds back to the customer. This involves emailing the customer a link to a special form, where the customer enters a crypto address for receiving the refund. The mechanism can be initiated [automatically](#automatic-refunds) or [manually](#manual-refunds).
## Automatic refunds
The mechanism is initiated automatically in the following scenarios:
**Late payment or underpayment**
The customer sent some funds but failed to fulfill the request conditions. All funds (minus a fee) must be sent back to the customer via a **full refund**.
**Overpayment**
The customer sent more funds than needed for this request. The extra funds (minus a fee) must be sent back to the customer via a **partial refund**.
## Manual refunds
Additionally, you can always initiate a **manual refund** to sent back any part of the payment (up to the whole payment amount) back to the customer for arbitrary reasons.
The refund is always sent in the same cryptocurrency and on the same network as the payment done by the customer, regardless of the originally expected cryptocurrency.
You decided that some or all funds should be sent back to the customer. The reasons here are completely up to you. For example, if the customer canceled a subscription on your website in the middle of a month, you may want to return half of the payment to them.
To initiate a manual refund, click **Actions → Create refund** on the payment request's details page. In a form that appears, you can specify the amount of funds to send back (not higher than the amount received).
## How it works
The customer receives a link to the refund form via the email address they provided before the payment.
In the refund form, the customer enters a crypto address for receiving the refund.
AlphaPo sends funds to the address.
The refund process uses the same cryptocurrency and network as the actual payment. For example, if the original payment was in BTC with conversion to USDC, AlphaPo will convert USDC back to BTC for the refund.
# Payment request and refund statuses
Source: https://docs.alphapo.net/payment-requests/statuses
This section describes the statuses displayed in the merchant dashboard for payment requests and refunds.
## Payment request statuses
| Status |
Description |
|
Created
|
The payment request was created, but the crypto address is not yet generated for it. Depending on the payment request's parameters, at this point the customer can [select the currency](/payment-requests#currency-selection) in which they are going to pay.
When the customer agrees to the terms and clicks **Proceed to payment**, the address will be generated, and the status will change to Processing. If they fail to do so during the [lifespan or rate lock period](/payment-requests#lifespan-and-rate-lock), the status will change to Expired.
|
|
Processing
|
The crypto address was generated, but incoming transactions aren't created, aren't confirmed or don't cover the requested amount yet.
As soon as incoming transactions for the requested total amount will get the required [number of confirmations](/confirmations-and-limits), the status will change to Paid.
If transactions are created but aren't confirmed during the [lifespan or rate lock period](/payment-requests#lifespan-and-rate-lock), or if the total confirmed amount is less than requested, the status will change to Failed.
If no transactions are created during the [lifespan or rate lock period](/payment-requests#lifespan-and-rate-lock), the status will change to Expired.
|
|
Paid
|
Incoming transactions for the requested total amount were confirmed. The funds are credited to the merchant's balance.
In case of a late payment or an overpayment, AlphaPo will initiate an [automatic refund](/payment-requests/refunds#automatic-refunds), unless the overpaid amount is smaller than the [minimum withdrawal limit](/confirmations-and-limits) + [refund fee](/payment-requests/fees).
|
|
Failed
|
The customer created one or more transactions to the address, but they did not get the required [number of confirmations](/confirmations-and-limits) or their total amount did not reach the requested amount during the [lifespan or rate lock period](/payment-requests#lifespan-and-rate-lock).
AlphaPo will initiate an [automatic refund](/payment-requests/refunds#automatic-refunds), unless the total received amount is smaller than the [minimum withdrawal limit](/confirmations-and-limits) + [refund fee](/payment-requests/fees).
|
|
Expired
|
The customer hasn't created any transactions during the [lifespan or rate lock period](/payment-requests#lifespan-and-rate-lock).
|
## Refund statuses
| Status |
Description |
|
Creating
|
The refund request was created.
|
|
Waiting for customer
|
AlphaPo sent the customer an email with a link to claim their refund.
|
|
In progress
|
The customer opened the email, clicked the link and entered their details. The refund is being processed.
|
|
Completed
|
The refund has been successfully completed.
|
|
Not created
|
The refund request couldn't be created. Double-check the details and make sure you have enough funds on your balance to issue the refund.
|
|
Failed
|
The refund couldn't be completed.
|
# Payment requests integration test cases
Source: https://docs.alphapo.net/payment-requests/test-cases
These are the test cases to help you test your site's integration with AlphaPo [payment requests](/payment-requests/integration-guide).
For each test case, create a new payment request via the [/payments/v1/requests](/api-reference/endpoints/payments) endpoint and then process the [payment\_request](/api-reference/callbacks/payment-request-callbacks) callback.
For some test cases, you will need to check that your customer receives an email from AlphaPo and can click a link in it. Make sure to enter a specify email address when creating payment requests for such test cases.
| Procedure |
Expected results |
|
**Successfully completed payment**
|
|
1. Create a payment request.
2. Open the payment request link on your device.
3. Place a payment for the exact amount requested.
|
* The site gets a `payment_request` callback.
* The callback status is `paid`.
* The customer is redirected to `url_success`.
* The customer receives an email about the successful payment.
|
|
**Overpayment**
|
|
1. Create a payment request.
2. Open the payment request link on your device.
3. Place a payment for an amount larger tha requested (add at least the [minimum deposit amount](/confirmations-and-limits)).
|
* The site gets a `payment_request` callback.
* The callback status is `paid`.
* The customer is redirected to `url_success`.
* The customer receives an email with a link to a **partial refund**.
|
|
**Underpayment**
|
|
1. Create a payment request.
2. Open the payment request link on your device.
3. Place a payment for an amount less than requested.
|
* The site gets a `payment_request` callback.
* The callback status is `failed`.
* The customer is redirected to `url_failed`.
* The customer receives an email with a link to a **full refund**.
|
|
**Payment requests with a late payment**
|
|
1. Create a payment request with a short lifespan (for example, 5 minutes).
2. Open the payment request link on your device.
3. Choose a payment currency and click **Proceed to payment**.
4. Copy the address or scan the QR code with your device. Do not place the payment yet.
5. Wait till the payment request expires.
6. Place a payment for the requested amount.
|
* The site gets a `payment_request` callback.
* The callback status is `failed`.
* The customer is redirected to `url_failed`.
* The customer receives an email with a link to a **full refund**.
|
|
**Payment request expired before the currency selection**
|
|
1. Create a payment request with a short lifespan (for example, 5 minutes).
2. Wait till the payment request expires.
|
* The site gets a `payment_request` callback.
* The callback status is `failed`.
* The customer is redirected to `url_failed`.
* The customer does not receive any email.
|
|
**Payment request expired after the currency selection**
|
|
1. Create a payment request with a short lifespan (for example, 5 minutes).
2. Open the payment request link on your device.
3. Choose a payment currency and click **Proceed to payment**. Do not place the payment.
4. Wait till the payment request expires.
|
* The site gets a `payment_request` callback.
* The callback status is `failed`.
* The callback contains the information about the selected currency in the `currency_sent` field.
* The customer is redirected to `url_failed`.
* The customer does not receive any email.
|
# Supported currencies
Source: https://docs.alphapo.net/supported-currencies
## Supported crypto
| Cryptocurrency | Name | Network |
| --------------- | ------------------------- | ---------------------- |
| ADA | Cardano | Cardano |
| BCH | Bitcoin Cash | Bitcoin Cash |
| BNB-BSC | BNB | BNB Smart Chain |
| BSV | Bitcoin Satoshi Vision | Bitcoin Satoshi Vision |
| BTC | Bitcoin | Bitcoin |
| BTC (Lightning) | Bitcoin | Lightning |
| BXBT (ERC-20) | Boxbet | Ethereum |
| DAI | DAI Stablecoin | Ethereum |
| DOGE | Dogecoin | Dogecoin |
| ETH | Ethereum | Ethereum |
| ETH (Arbitrum) | Ethereum | Arbitrum |
| ETH (Base) | Ethereum | Base |
| EURC (ERC-20) | EUR Stablecoin | Ethereum |
| EURC (BASE) | EUR Stablecoin | Base |
| EURC (SOL) | EUR Stablecoin | Solana |
| EURS (ERC-20) | STASIS EURS | Ethereum |
| LTC | Litecoin | Litecoin |
| MNEE (ERC-20) | MNEE | Ethereum |
| POL | Polygon | Polygon |
| SOL | Solana | Solana |
| GRAM | Gram (previously Toncoin) | Ton |
| TRX | Tron | Tron |
| USDC (Arbitrum) | USD Coin | Arbitrum |
| USDC (Base) | USD Coin | Base |
| USDC (BEP-20) | USD Coin | BNB Smart Chain |
| USDC (ERC-20) | USD Coin | Ethereum |
| USDC (POL) | USD Coin | Polygon |
| USDC (SOL) | USD Coin | Solana |
| USDG (ERC-20) | Global Dollar | Ethereum |
| USDG (SOL) | Global Dollar | Solana |
| USDT (Arbitrum) | Tether USD | Arbitrum |
| USDT (ERC-20) | Tether USD | Ethereum |
| USDT (BEP-20) | Tether USD | Binance Smart Chain |
| USDT (SOL) | Tether USD | Solana |
| USDT (POL) | Tether USD | Polygon |
| USDT (TON) | Tether USD | Ton |
| USDT (TRC-20) | Tether USD | Tron |
| XED (ERC-20) | Exeedme | Ethereum |
| XRP | Ripple | XRP Ledger |
* **ERC-20** means that a token is based on the Ethereum network.
* **BEP-20** means that a token is based on the BNB Smart Chain network.
* **TRC-20** means that a token is based on the Tron network.
Some currencies are available on multiple blockchains. In API requests, use the currency's API code to specify the correct blockchain version. For the list of API currency codes, see [API currency codes](/api-reference/currency-codes).
Additional tokens on supported networks can be added by request.
## Supported fiat
| Currency code | Currency name |
| ------------- | --------------------------------------- |
| EUR | Euro |
| USD | US dollar |
| AED | United Arab Emirates dirham |
| ARS | Argentine peso |
| AUD | Australian dollar |
| AZN | Azerbaijan manat |
| BAM | Bosnia and Herzegovina convertible mark |
| BDT | Bangladesh taka |
| BRL | Brazilian real |
| CAD | Canadian dollar |
| CHF | Swiss franc |
| CLP | Chilean peso |
| CNY | Renminbi |
| COP | Colombian peso |
| CZK | Czech koruna |
| DKK | Danish krone |
| EGP | Egyptian pound |
| GBP | Pound sterling |
| GEL | Georgian lari |
| HUF | Hungarian forint |
| IDR | Indonesian rupiah |
| ILS | New Israeli sheqel |
| INR | Indian rupee |
| JPY | Japanese yen |
| KES | Kenyan shilling |
| KGS | Som |
| KRW | South Korean won |
| LKR | Sri Lankan rupee |
| MDL | Moldovan leu |
| MXN | Mexican peso |
| MYR | Malaysian ringgit |
| NGN | Naira |
| NOK | Norwegian krone |
| NPR | Nepalese rupee |
| NZD | New Zealand dollar |
| PEN | Peruvian sol |
| PHP | Philippine peso |
| PKR | Pakistan rupee |
| PLN | Polish złoty |
| PYG | Paraguayan guaraní |
| SEK | Swedish krona |
| THB | Thai baht |
| TJS | Somoni |
| TMT | Turkmenistani manat |
| TRY | Turkish lira |
| UZS | Uzbekistani som |
| VND | Vietnamese dong |
| XOF | West African CFA franc |
| ZAR | South African rand |
# Supported trading pairs
Source: https://docs.alphapo.net/supported-trading-pairs
To retrieve the complete and up-to-date list of supported exchange pairs, use the [/currencies/rates](/api-reference/endpoints/currencies-rates) API endpoint.
| Convert from | Convert to crypto | Convert to fiat |
| :-------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| ADA | BTC, BTCLN, GRAM, SOL, USDT (ERC-20 / TON / BEP-20 / TRC-20) | ARS, AUD, AZN, BAM, BDT, BRL, CAD, CHF, CLP, CNY, CZK, EGP, EUR, GBP, GEL, HUF, IDR, ILS, INR, JPY, KGS, KRW, LKR, MDL, MXN, MYR, NGN, NOK, NPR, NZD, PEN, PLN, PKR, SEK, THB, TJS, TRY, USD, VND, XOF, ZAR |
| BCH | BNB-BSC, BTC, BTCLN, ETH (Ethereum / Arbitrum / Base), GRAM, LTC, SOL, USDC (BEP-20 / ERC-20 / Arbitrum / SOL / POL / Base), USDT (ERC-20 / BEP-20 / Arbitrum / SOL / TON / TRC-20 / POL) | AED, ARS, AUD, AZN, BAM, BDT, BRL, CAD, CHF, CLP, CNY, COP, DKK, CZK, EGP, EUR, GBP, GEL, HUF, IDR, ILS, INR, JPY, KES, KGS, KRW, LKR, MDL, MXN, MYR, NGN, NOK, NPR, NZD, PEN, PHP, PKR, PLN, PYG, SEK, THB, TJS, TMT, TRY, USD, UZS, VND, XOF, ZAR |
| BNB-BSC | BCH, BTC, BTCLN, GRAM, LTC, SOL, USDC (BEP-20 / ERC-20 / Arbitrum / SOL / POL / Base), USDT (ERC-20 / BEP-20 / Arbitrum / SOL / TON / TRC-20 / POL), POL | AED, AUD, BAM, CAD, CHF, EUR, GBP, HUF, INR, NOK, NZD, PLN, TRY, USD, XOF |
| BTC | ADA, BCH, BNB-BSC, BTCLN, DAI, DOGE, ETH (Ethereum / Arbitrum / Base), GRAM, LTC, SOL, TRX, XRP, USDC (BEP-20 / ERC-20 / Arbitrum / SOL / POL / Base), USDT (BEP-20 / ERC-20 / Arbitrum / SOL / TON / TRC-20 / POL), POL | AED, ARS, AUD, AZN, BAM, BDT, BRL, CAD, CHF, CLP, CNY, COP, CZK, DKK, EGP, EUR, GBP, GEL, HUF, IDR, ILS, INR, JPY, KES, KGS, KRW, LKR, MDL, MXN, MYR, NGN, NOK, NPR, NZD, PEN, PHP, PKR, PLN, PYG, SEK, THB, TJS, TMT, TRY, USD, UZS, XOF, ZAR |
| BTC (Lightning) | BTC, ADA, BCH, BNB-BSC, DAI, DOGE, ETH (Ethereum / Arbitrum / Base), GRAM, LTC, SOL, TRX, XRP, USDC (BEP-20 / ERC-20 / Arbitrum / SOL / POL / Base), USDT (BEP-20 / ERC-20 / Arbitrum / SOL / TON / TRC-20 / POL), POL | AED, ARS, AUD, AZN, BAM, BDT, BRL, CAD, CHF, CLP, CNY, COP, CZK, DKK, EGP, EUR, GBP, GEL, HUF, IDR, ILS, INR, JPY, KES, KGS, KRW, LKR, MDL, MXN, MYR, NGN, NOK, NPR, NZD, PEN, PHP, PKR, PLN, PYG, SEK, THB, TJS, TMT, TRY, USD, UZS, XOF, ZAR |
| DAI | BTC, BTCLN, ETH (Ethereum / Arbitrum / Base), LTC, USDC (BEP-20 / ERC-20 / Arbitrum / SOL / POL / Base), USDT (BEP-20 / ERC-20 / Arbitrum / SOL / TRC-20 / POL), POL | EUR, USD, TRY, XOF |
| DOGE | BTC, BTCLN, GRAM, SOL, USDT (ERC-20 / Arbitrum / SOL / TON / TRC-20 / POL) | AED, ARS, AUD, AZN, BAM, BDT, BRL, CAD, CHF, CLP, CNY, COP, CZK, DKK, EGP, EUR, GBP, GEL, HUF, ILS, INR, JPY, KES, KGS, KRW, LKR, MDL, MXN, MYR, NGN, NOK, NPR, NZD, PEN, PHP, PLN, PYG, SEK, THB, TJS, TMT, TRY, USD, UZS, XOF, ZAR |
| ETH (Arbitrum) | BTC, BTCLN, USDC (BEP-20 / ERC-20 / SOL), USDT (ERC-20 / TRC-20 / BEP-20 / SOL / TON), XRP, BCH, LTC, SOL, DAI, TON | EUR, USD, AUD, BAM, GBP, CAD, SEK, NOK, CHF, CNY, JPY, NZD, MXN, ARS, BRL, INR, KRW, MYR, THB, IDR, VND, PEN, CLP, CZK, PLN, ZAR, TJS, AZN, KGS, NGN, MDL, TRY, ILS, GEL, PKR, BDT, NPR, LKR, TMT, UZS, COP, PYG, EGP, XOF, DKK, AED |
| ETH (Base) | BTC, BTCLN, USDC (BEP-20 / ERC-20 / SOL), USDT (ERC-20 / TRC-20 / BEP-20 / SOL / TON), XRP, BCH, LTC, SOL, DAI, TON | AED, ARS, AUD, AZN, BAM, BDT, BRL, CAD, CHF, CLP, CNY, COP, CZK, DKK, EGP, EUR, GBP, GEL, IDR, ILS, INR, JPY, KGS, KRW, LKR, MDL, MXN, MYR, NGN, NOK, NPR, NZD, PEN, PKR, PLN, PYG, SEK, THB, TJS, TMT, TRY, USD, UZS, VND, XOF, ZAR |
| ETH | BCH, BTC, BTCLN, DAI, GRAM, LTC, SOL, XRP, USDC (BEP-20 / ERC-20 / Arbitrum / SOL / POL / Base), USDT (ERC-20 / BEP-20 / Arbitrum / POL / SOL / TON / TRC-20), POL | AED, ARS, AUD, AZN, BAM, BDT, BRL, CAD, CHF, CLP, CNY, COP, CZK, DKK, EGP, EUR, GBP, GEL, HUF, IDR, ILS, INR, JPY, KGS, KES, KRW, LKR, MDL, MXN, MYR, NGN, NOK, NPR, NZD, PEN, PHP, PKR, PLN, PYG, SEK, THB, TJS, TMT, TRY, USD, UZS, VND, XOF, ZAR |
| EURC (ERC-20) | USDT (BEP-20 / ERC-20 / Arbitrum / SOL / TRC-20 / TON / POL), | |
| GRAM | ADA, BCH, BNB-BSC, BTC, BTCLN, DOGE, ETH (Ethereum / Arbitrum / Base), LTC, SOL, TRX, XRP, USDC (BEP-20 / ERC-20 / Arbitrum / SOL / POL / Base), USDT (BEP-20 / ERC-20 / Arbitrum / SOL / TON / TRC-20 / POL), POL | AED, ARS, AUD, AZN, BAM, BDT, BRL, CAD, CHF, CLP, CNY, COP, CZK, DKK, EGP, EUR, GBP, GEL, HUF, IDR, ILS, INR, JPY, KES, KGS, KRW, LKR, MDL, MXN, MYR, NGN, NOK, NPR, NZD, PEN, PLN, PHP, PYG, SEK, SOL, THB, TJS, TMT, TRY, USD, UZS, VND, XOF, ZAR |
| LTC | BCH, BNB-BSC, BTC, BTCLN, DAI, ETH (Ethereum / Arbitrum / Base), GRAM, SOL, USDC (BEP-20 / ERC-20 / Arbitrum / SOL / POL / Base), USDT (ERC-20 / BEP-20 / Arbitrum / SOL / TON / TRC-20 / POL), POL | AED, ARS, AUD, AZN, BAM, BDT, BRL, CAD, CHF, CLP, CNY, COP, CZK, DKK, EGP, EUR, GBP, GEL, HUF, IDR, ILS, INR, JPY, KES, KGS, KRW, LKR, MDL, MXN, MYR, NGN, NOK, NPR, NZD, PEN, PHP, PHR, PLN, PYG, SEK, THB, TJS, TMT, TRY, USD, UZS, VND, XOF, ZAR |
| POL | BTC, BTCLN, ETH (Ethereum), USDT (ERC-20 / Ton / TRC-20 / BEP-20 / SOL / POL), USDC (BEP-20 / ERC-20 / SOL / POL), BNB-BSC, XRP, LTC, DAI, TON | USD, EUR, AUD, BAM, GBP, CAD, SEK, NOK, CHF, CNY, JPY, NZD, MXN, ARS, BRL, INR, KRW, MYR, THB, IDR, VND, PEN, CLP, CZK, PLN, ZAR, TJS, AZN, KGS, NGN, MDL, TRY, ILS, GEL, PKR, BDT, NPR, LKR, TMT, UZS, COP, PYG, EGP, XOF, DKK, AED, PHP, KES, HUF |
| SOL | ADA, BCH, BNB-BSC, BTC, BTCLN, DOGE, ETH (Ethereum / Arbitrum / Base), GRAM, LTC, TRX, XRP, USDC (BEP-20 / ERC-20 / Arbitrum / SOL / POL / Base), USDT (BEP-20 / ERC-20 / Arbitrum / SOL / TON / TRC-20 / POL) | AED, ARS, AUD, AZN, BAM, BDT, BRL, CAD, CHF, CLP, CNY, COP, CZK, DKK, EGP, EUR, GBP, GEL, HUF, IDR, ILS, INR, JPY, KES, KGS, KRW, LKR, MDL, MXN, MYR, NGN, NOK, NPR, NZD, PEN, PLN, PHP, PYG, SEK, THB, TJS, TMT, TRY, USD, UZS, VND, XOF, ZAR |
| TRX | BTC, BTCLN, GRAM, SOL, USDT (ERC-20 / BEP-20 / Arbitrum / SOL / TON / TRC-20 / POL) | AED, ARS, AUD, AZN, BAM, BDT, BRL, CAD, CHF, CLP, CNY, COP, CZK, EGP, EUR, GBP, GEL, HUF, IDR, ILS, INR, JPY, KES, KGS, KRW, LKR, MDL, MXN, MYR, NGN, NOK, NPR, NZD, PEN, PLN, PHP, PKR, PYG, SEK, THB, TJS, TRY, USD, UZS, VND, XOF, ZAR |
| USDC (Arbitrum) | BTC, BTCLN, ETH (Ethereum), LTC, BCH, BNB-BSC, USDT (ERC-20 / BEP-20 / TRC-20 / SOL / TON), USDC (BEP-20 / ERC-20), SOL, DAI, TON | USD, ARS, EUR, GBP, IDR, AUD, BAM, ILS, NZD, AZN, INR, PEN, JPY, BRL, KGS, PLN, CAD, KRW, SEK, CHF, THB, CLP, TJS, CNY, MDL, TRY, CZK, MXN, GEL, MYR, VND, NGN, ZAR, NOK, XOF, DKK, AED |
| USDC (Base) | BTC, BTCLN, ETH (Ethereum), LTC, USDT (ERC-20 / BEP-20 / TRC-20 / SOL / TON), USDC (BEP-20 / ERC-20), BCH, BNB-BSC, SOL, DAI, TON | USD, ARS, EUR, GBP, IDR, AUD, BAM, ILS, NZD, AZN, INR, PEN, JPY, BRL, KGS, PLN, CAD, KRW, SEK, CHF, THB, CLP, TJS, CNY, MDL, TRY, CZK, MXN, GEL, MYR, VND, NGN, ZAR, NOK, XOF, DKK, AED |
| USDC (BEP-20) | BCH, BNB-BSC, BTC, BTCLN, DAI, ETH (Ethereum / Arbitrum / Base), GRAM, LTC, POL, SOL, USDC (Arbitrum, Base, ERC-20, POL, SOL), USDT (Arbitrum / BEP-20 / ERC-20 / POL / SOL / TRC-20 / TON) | USD, EUR, AED, ARS, AUD, BAM, BRL, CAD, CHF, CLP, CNY, CZK, DKK, EGP, GBP, GEL, IDR, ILS, INR, JPY, KES, KGS, KRW, MDL, MXN, MYR, NGN, NOK, NZD, PEN, PHP, PLN, SEK, THB, TJS, TRY, VND, XOF, ZAR |
| USDC (ERC-20) | BCH, BNB-BSC, BTC, BTCLN, DAI, ETH (Ethereum / Arbitrum / Base), GRAM, LTC, SOL, USDC (BEP-20 / SOL / Arbitrum / POL / Base), USDT (BEP-20 / ERC-20 / Arbitrum / SOL / TRC-20 / TON / POL), POL | AED, AUD, ARS, BAM, BRL, CAD, CHF, CLP, CNY, CZK, DKK, EGP, EUR, GBP, GEL, HUF, IDR, ILS, INR, JPY, KES, KGS, KRW, MDL, MXN, MYR, NGN, NOK, NZD, PEN, PHP, PLN, SEK, THB, TJS, TRY, USD, VND, XOF, ZAR |
| USDC (POL) | LTC, USDT (BEP-20 / ERC-20 / TRC-20 / TON / TRC-20 / SOL / POL), BCH, BNB-BSC, BTC, BTCLN, DAI, ETH (Ethereum), USDC (BEP-20 / ERC-20 / SOL), GRAM, POL, SOL | USD, ARS, EUR, GBP, IDR, AUD, BAM, ILS, NZD, AZN, INR, PEN, JPY, BRL, KGS, PLN, CAD, KRW, SEK, CHF, THB, CLP, TJS, CNY, MDL, TRY, CZK, MXN, GEL, MYR, VND, NGN, ZAR, NOK, XOF, DKK, AED, PHP, KES |
| USDC (SOL) | BCH, BNB-BSC, BTC, BTCLN, DAI, ETH (Ethereum / Arbitrum / Base), GRAM, LTC, SOL, USDC (BEP-20 / ERC-20 / POL), USDT (BEP-20 / ERC-20 / Arbitrum / SOL / TON / TRC-20 / POL), POL | AED, ARS, AUD, AZN, BAM, BRL, CAD, CHF, CLP, CNY, CZK, DKK, EUR, GBP, GEL, IDR, ILS, INR, JPY, KES, KGS, KRW, MDL, MXN, MYR, NGN, NOK, NZD, PEN, PLN, PHP, SEK, THB, TJS, TRY, USD, VND, XOF, ZAR |
| USDT (Arbitrum) | BTC, BTCLN, BCH, LTC, ETH (Ethereum), EURC (ERC-20), DOGE, BNB-BSC, TRX, USDT (TRC-20 / BEP-20 / SOL / TON), SOL, USDC (BEP-20 / ERC-20 / SOL), DAI, XRP, TON | EUR, MYR, THB, IDR, VND, USD, PKR, CNY, INR, CAD, SEK, AUD, BAM, NOK, CHF, JPY, NZD, MXN, ARS, BRL, GBP, KRW, PEN, CLP, CZK, PLN, ZAR, TJS, AZN, KGS, NGN, MDL, TRY, ILS, GEL, TMT, UZS, COP, PYG, EGP, XOF, DKK, AED |
| USDT (BEP-20) | ADA, BCH, BNB-BSC, BTC, BTCLN, DAI, ETH (Ethereum / Arbitrum / Base), EURC (ERC-20), GRAM, LTC, SOL, TRX, XRP, USDC (BEP-20 / ERC-20 / Arbitrum / SOL / POL / Base), USDT (ERC-20 / Arbitrum / SOL / TON / TRC-20 / POL), POL | AED, ARS, AUD, AZN, BAM, BRL, CAD, CHF, CLP, CNY, CZK, DKK, EGP, EUR, GBP, GEL, HUF, IDR, ILS, INR, JPY, KES, KGS, KRW, MDL, MXN, MYR, NGN, NOK, NZD, PEN, PLN, PHP, SEK, THB, TJS, TRY, USD, VND, XOF, ZAR |
| USDT (ERC-20) | ADA, BCH, BNB-BSC, BTC, BTCLN, DAI, DOGE, ETH (Ethereum / Arbitrum / Base), EURC (ERC-20), GRAM, LTC, SOL, TRX, XRP, USDC (BEP-20 / ERC-20 / Arbitrum / SOL / POL / Base), USDT (BEP-20 / SOL / TON / TRC-20 / POL), POL | AED, ARS, AUD, AZN, BAM, BRL, CAD, CHF, CLP, CNY, COP, CZK, DKK, EGP, EUR, GBP, GEL, HUF, IDR, ILS, INR, JPY, KES, KGS, KRW, MDL, MXN, MYR, NGN, NOK, NZD, PEN, PLN, PHP, PKR, PYG, SEK, THB, TJS, TMT, TRY, USD, UZS, VND, XOF, ZAR |
| USDT (POL) | LTC, DOGE, EURC (ERC-20), TRX, USDT (ERC-20 / TRC-20 / BEP-20 / TON / SOL), USDC (BEP-20 / ERC-20 / SOL / POL), BTC, BTCLN, BCH, BNB-BSC, DAI, ETH (Ethereum), GRAM, POL, SOL | VND, USD, CNY, CAD, AUD, BAM, NOK, NZD, GBP, KRW, PEN, PLN, KGS, ILS, TMT, UZS, PYG, EUR, MYR, IDR, CHF, JPY, BRL, CZK, TRY, GEL, COP, THB, PKR, INR, SEK, MXN, ARS, CLP, ZAR, TJS, AZN, NGN, MDL, XOF, DKK, AED, PHP, KES, HUF |
| USDT (SOL) | ADA, BCH, BNB-BSC, BTC, BTCLN, DAI, DOGE, ETH (Ethereum / Arbitrum / Base), EURC (ERC-20), GRAM, LTC, SOL, TRX, USDC (BEP-20 / ERC-20 / Arbitrum / POL / SOL / Base), USDT (BEP-20 / ERC-20 / Arbitrum / TON / TRC-20 / POL), POL | AED, ARS, AUD, AZN, BAM, BRL, CAD, CHF, CLP, CNY, COP, CZK, DKK, EUR, GBP, GEL, HUF, IDR, ILS, INR, JPY, KES, KGS, KRW, MDL, MXN, MYR, NGN, NOK, NZD, PEN, PLN, PHP, PKR, PYG, SEK, THB, TJS, TMT, TRY, USD, UZS, VND, XOF, ZAR |
| USDT (TON) | ADA, BCH, BNB-BSC, BTC, BTCLN, DOGE, ETH (Ethereum / Arbitrum / Base), EURC (ERC-20), GRAM, LTC, SOL, TRX, XRP, USDC (BEP-20 / ERC-20 / Arbitrum / SOL / POL / Base), USDT (BEP-20 / ERC-20 / Arbitrum / SOL / TRC-20 / POL), POL | AED, ARS, AUD, AZN, BAM, BDT, BRL, CAD, CHF, CLP, CNY, COP, CZK, DKK, EGP, EUR, GBP, GEL, HUF, IDR, ILS, INR, JPY, KES, KGS, KRW, LKR, MDL, MXN, MYR, NGN, NOK, NPR, NZD, PEN, PLN, PHP, PYG, SEK, THB, TJS, TMT, TRY, USD, UZS, VND, XOF, ZAR |
| USDT (TRC-20) | ADA, BCH, BNB-BSC, BTC, BTCLN, DAI, DOGE, ETH (Ethereum / Arbitrum / Base), EURC (ERC-20), GRAM, LTC, SOL, TRX, XRP, USDC (BEP-20 / ERC-20 / Arbitrum / SOL / POL / Base), USDT (BEP-20 / ERC-20 / Arbitrum / SOL / TON / POL), POL | AED, ARS, AUD, AZN, BAM, BRL, CAD, CHF, CLP, CNY, COP, CZK, DKK, EGP, EUR, GBP, GEL, HUF, IDR, ILS, INR, JPY, KES, KGS, KRW, MDL, MXN, MYR, NGN, NOK, NZD, PEN, PLN, PHP, PKR, PYG, SEK, THB, TJS, TMT, TRY, USD, UZS, VND, XOF, ZAR |
| XRP | BTC, BTCLN, ETH (Ethereum / Arbitrum / Base), GRAM, POL, SOL, USDT (BEP-20 / ERC-20 / TON / TRC-20 / Arbitrum) | AED, ARS, AUD, AZN, BAM, BDT, BRL, CAD, CHF, CLP, CNY, COP, CZK, DKK, EGP, EUR, GBP, GEL, HUF, IDR, ILS, INR, JPY, KES, KGS, KRW, LKR, MDL, MXN, MYR, NGN, NOK, NPR, NZD, PEN, PLN, PHP, PKR, PYG, SEK, THB, TJS, TRY, USD, UZS, VND, XOF, ZAR |
# Approve a withdrawal
Source: https://docs.alphapo.net/withdrawals/approve-a-withdrawal
Available to roles: Owner
When a withdrawal exceeds a configured limit, it is held for manual review and assigned a **Pending** status. A user with the Owner role must then approve or decline the transaction before it can be processed.
For withdrawals created in the merchant dashboard, the approving user must be a different user than the one who created the withdrawal. For API withdrawals, any user with the Owner role can approve or decline.
There are two ways to approve or decline pending withdrawals. We recommend using the **Moderation queue**, which shows only the pending withdrawals awaiting your decision and lets you act on one or several at once. You can also approve withdrawals from the **Transactions** tab, which lists all transactions regardless of status. Both approaches are described below:
* [Approve transactions in the Moderation queue](#approve-transactions-in-the-moderation-queue) — review pending withdrawals and apply a single decision to one or several transactions at once.
* [Approve a transaction in the Transactions tab](#approve-a-transaction-in-the-transactions-tab) — open a single transaction and approve or decline it.
The **Moderation queue (N)** tab shows the number of transactions you are authorized to approve right in its name, so you can tell at a glance whether anything is awaiting your decision without opening the queue. A number means that multiple transactions are pending; no number (or `0`) means there is nothing waiting for your approval.
## Approve transactions in the Moderation queue
Use the **Moderation queue** to review and process several withdrawals at the same time. The queue shows only the transactions you are authorized to act on, and lets you apply a single approve or decline decision to multiple transactions in one step.
The **Moderation queue** lists only the transactions available to you for **Approve** / **Decline** actions, and shows the number of transactions you are currently authorized to approve.
By default, the **Date Range** filter is applied, showing transactions created within the last 3 months. To narrow the list further, click **Filters** and configure filters such as **Contact** (contacts from the address book), **Initiated by** (transaction initiator), and other transaction filters.
Click any transaction to open a pane with additional information. You can process the transaction directly from this pane by clicking **Approve** or **Decline**.
To approve or decline a single transaction without opening the pane, click the corresponding icon (the checkmark or the **x**) in that transaction's row.
To process multiple transactions at once, either:
* Select individual transactions by ticking the checkboxes next to them, or
* Select all transactions currently visible in the queue by clicking the checkbox in the first column of the table header.
Click **Approve** or **Decline** to apply the same moderation decision to all selected transactions.
A **Comment** field appears when you confirm your decision — required when you decline, optional when you approve — and applies to all selected transactions. A single 2FA confirmation covers the whole action.
In the Moderation queue, you cannot see transactions that you created yourself. As with individual approvals, these must be approved by a different Owner and will appear in the Moderation queue for other Owners.
## Approve a transaction in the Transactions tab
Approve or decline a single pending withdrawal directly from the Transactions tab.
Optionally, click **Filters** and set the status filter to **Pending**.
Find the withdrawal in the list and click it to open the transaction details.
Click **Approve** to process the withdrawal or **Decline** to reject it.
A **Comment** field appears when you confirm your decision — required when you decline, optional when you approve. The decision requires 2FA confirmation.
## FAQ
#### Why is the Approve button greyed out?
The **Approve** button is greyed out when you are the same user who created the withdrawal in the merchant dashboard. Interface withdrawals must be approved by a different Owner account. Log in as a different user with Owner permissions to approve the transaction.
# Contacts for crypto withdrawals
Source: https://docs.alphapo.net/withdrawals/contacts
When making a [crypto withdrawal](/withdrawals) using the merchant dashboard, you can use previously saved recipient addresses instead of pasting them again. The saved addresses are available from the withdrawal form or from the dedicated tab **Addresses → Contacts**.
For cryptocurrencies with a [tag field](/deposits/tags), the tag is stored in the contact, too.
Each contact must have a unique name.
To save a new address, go to **Addresses → Contacts** and click **Add contact**. Alternatively, after you made a withdrawal to a new address, click **Save address** on the withdrawal screen.
To send cryptocurrency to a saved address, select it in **Addresses → Contacts** and click **Send**. Alternatively, select a cryptocurrency on the **Balances** tab, click **Send**, then click the book icon and select the contact.
# Create a withdrawal
Source: https://docs.alphapo.net/withdrawals/create-a-withdrawal
Available to roles: Owner
You can send funds from your balance to your own crypto address or to a customer's address. This guide covers creating a withdrawal via the merchant dashboard; for the API method, see [/withdrawal/crypto](/api-reference/endpoints/withdrawal-crypto).
Alternatively, click the address-book icon next to the address field to select a saved contact instead of entering the address manually. See [Contacts](/withdrawals/contacts) for more details.
# Design a crypto withdrawal form
Source: https://docs.alphapo.net/withdrawals/design-withdrawal-form
To let your customers withdraw in crypto from their balance on your site, add a custom withdrawal form.
We recommend that you:
1. Let your customers choose their preferred network and currency.
2. Warn your customers that if they make a withdrawal to an address on the wrong network, they might lose their funds.
## Currency selection
Your customers should be able to choose their withdrawal currency and network. For withdrawals with conversion, the funds on your balance will be automatically converted to the customer's chosen currency.
## Recipient address
Add an input field prompting the customer for their crypto address. We highly recommend warning the customer that they should make sure they're entering the address for their chosen currency and network.
## Withdrawal amount
Add an input field prompting the customer for the withdrawal amount.
# Crypto withdrawal fees
Source: https://docs.alphapo.net/withdrawals/fees
Crypto withdrawals are subject to both [processing fees](#processing-fee) and [mining fees](#mining-fee).
## Processing fee
The processing fees are the paid to AlphaPo. They are listed on the **Fees** tab in your merchant dashboard, under the **Withdrawal operations** section. The exact fee may depend on the currency and on whether the payment involved a conversion between different currencies. Some fees may have a minimum amount that you will pay even for small transactions.
The applicable fees are:
* **Withdrawal crypto**
* **Withdrawal crypto exchange from crypto**
* **Withdrawal crypto exchange from fiat**
When the withdrawal is being processed [off-chain](/withdrawals#off-chain-withdrawals), the system uses the fees with "internal" in the name:
* **Withdrawal crypto internal**
* **Withdrawal crypto exchange from crypto internal**
* **Withdrawal crypto exchange from fiat internal**
## Mining fee
The mining fees are paid to the miners in the cryptocurrency's network.
Depending on your fee package and the currency of the transaction, these fees may or may not be deducted from the merchant's balance after each transaction. If they do, their size depends on how busy the network is at the moment.
For standard withdrawals in BTC, mining fees are never deducted from the merchant's balance. This protects merchants from the volatility of the BTC network. Instead, AlphaPo only charges fees for depositing BTC, with a dynamic [minimum deposit fee](/deposits/fees#minimum-deposit-fee-for-bitcoin).
This does not apply to [instant withdrawals](/withdrawals#instant-withdrawals) in BTC.
# Crypto withdrawals
Source: https://docs.alphapo.net/withdrawals/index
You can send funds from your balance to your own or your customers' crypto addresses. This can be done via the API or from the merchant dashboard. Optionally, you can [convert funds](#withdrawals-with-conversion) from one currency to another when making a withdrawal. For some cryptocurrencies, [instant withdrawals](#instant-withdrawals) are available that are processed with higher priority.
Depending on the target address, withdrawals can happen on-chain or [off-chain](#off-chain-withdrawals).
When withdrawing via the merchant dashboard, you can save addresses as [contacts](/withdrawals/contacts) for future use.
[Fees](/withdrawals/fees), [minimal withdrawal amounts](/confirmations-and-limits) and [withdrawal limits](/merchant-administration/configure-withdrawal-limits) may apply.
## Withdrawals with conversion
When making a withdrawal using API, you can enable conversion to another currency.
For a standard withdrawal, specify either the *sender amount* that will be deducted from your balance or the *received amount* that will be received by the other person. AlphaPo will automatically calculate the other value using the current currency rate. Both values do not include the [fees](/withdrawals/fees).
For an [instant withdrawal](#instant-withdrawals), specify the *sender amount*.
## Instant withdrawals
To provide the best experience for your customers, consider using *instant withdrawals* when the processing speed is critical. They work just like standard withdrawals, but faster: AlphaPo processes them with a higher priority and sends them to the network within **30 seconds to 2 minutes**.
When using instant withdrawals, the [mining fee](/withdrawals/fees#mining-fee) is always charged, regardless of your fee package.
Instant withdrawals are only supported for **Bitcoin, Bitcoin Cash, Litecoin, and DOGE**.
If you are already using standard withdrawals, follow [these instructions](/withdrawals/instant-withdrawals) to start using instant withdrawals.
## Off-chain withdrawals
If the withdrawal address happens to be controlled by AlphaPo, too, the transaction is being processed *off-chain*. This means that AlphaPo registers it internally but does not send the transaction to the blockchain.
Just like a standard withdrawal, an off-chain withdrawal can be found on the **Transactions** tab. However, an off-chain withdrawal has an internal **TXID** instead of a public one. You can use this **TXID** to find the transaction in the merchant dashboard, but not in a blockchain explorer.
In the [API callback](/api-reference/callbacks/withdrawal-callbacks), an off-chain withdrawal has the `transaction.transaction_type` property set to `"internal"` instead of `"blockchain"`.
The [fee](/withdrawals/fees) for an off-chain withdrawal may differ from the standard one. The network fee is not paid for an off-chain withdrawal, as there is no network involved.
## Further reading
Learn how to integrate the withdrawals flow into your site
Walk through all scenarios to make sure your integration works correctly
API endpoint
API endpoint
API endpoint
API callbacks
# Send crypto instantly
Source: https://docs.alphapo.net/withdrawals/instant-withdrawals
To switch from standard withdrawals to [instant withdrawals](/withdrawals#instant-withdrawals):
Ask AlphaPo support team to enable the feature for the currencies you need.
Replace [/api/v2/withdrawal/crypto](/api-reference/endpoints/withdrawal-crypto) with one of these special API endpoints wherever you need to prioritize the processing speed:
* [/api/v2/crypto/withdrawal\_instant](/api-reference/endpoints/crypto-withdrawal-instant)
* [/api/v2/crypto/withdrawal\_instant\_exchange](/api-reference/endpoints/crypto-withdrawal-instant-exchange)
The requests for both API endpoints are similar to [/api/v2/withdrawal/crypto](/api-reference/endpoints/withdrawal-crypto), but some parameter names are different.
Update the callback handler to support two additional AlphaPo [callbacks](/api-reference/callbacks/withdrawal-callbacks):
* **withdrawal\_instant**
* **withdrawal\_instant\_exchange**
To make sure you support all possible scenarios, use our [integration test cases](/withdrawals/test-cases#instant-withdrawals).
# Crypto withdrawals integration guide
Source: https://docs.alphapo.net/withdrawals/integration-guide
If your customers have a balance on your site, you can provide withdrawals in crypto.
## Set up withdrawals
Complete your onboarding in your merchant dashboard and generate an API key. For more details on how to create an API key, see [Get your API key](/merchant-administration/generate-and-activate-api-keys).
Add a withdrawal form to your site. For our recommendations on how to design the form, see [Design a withdrawal form](/withdrawals/design-withdrawal-form).
Send a request to [/api/v2/withdrawal/crypto](/api-reference/endpoints/withdrawal-crypto). To request a withdrawal with exchange, include the `convert_to` parameter.
You will also need to include `foreign_id` — the unique ID of the withdrawal request. You can use any format you prefer.
```json title="Request example" theme={null}
{
"amount": "100",
"currency": "EUR",
"convert_to": "BTC",
"address": "tb1qfdxh6gkfr0qgyatnlkd8khcnxph9tw06n6qwjc",
"foreign_id": "withdrawal_123"
}
```
```json title="Response example" theme={null}
{
"data": {
"id": 134702831,
"foreign_id": "withdrawal_123",
"type": "withdrawal_exchange",
"status": "processing",
"amount": "100.00000000",
"sender_amount": "100.00000000",
"sender_currency": "EUR",
"receiver_currency": "BTC"
}
}
```
Once the withdrawal is processed, AlphaPo will send you a [callback](/api-reference/callbacks/withdrawal-callbacks).
# Withdrawal statuses
Source: https://docs.alphapo.net/withdrawals/statuses
This section describes the statuses displayed in the merchant dashboard for withdrawals.
| Status |
Description |
|
Pending
|
The transaction is waiting to be reviewed by another team member, according to the merchant's [withdrawal limits](/merchant-administration/configure-withdrawal-limits).
Based on the team member's decision, the status will then change to .
|
|
Processing
|
The transaction is being generated and sent to the blockchain.
After sending, AlphaPo will change the status to Confirmed.
|
|
Confirmed
|
The transaction is successfully sent to the blockchain.
|
|
Declined
|
The transaction is declined by another team member who reviewed it.
|
|
Failed
|
The transaction cannot be completed because the merchant's balance does not meet the requirements. The specific error is shown in the transaction's details panel on the **Transactions** tab.
Possible errors are:
* *"Not enough money on balance"*
* *"Total of negative balances exceeds the allowed value"*
|
|
Cancelled
|
The transaction was cancelled by AlphaPo due to some other error. The specific error is shown in the transaction's details panel on the **Transactions** tab.
|
# Crypto withdrawals integration test cases
Source: https://docs.alphapo.net/withdrawals/test-cases
These are the test cases to help you test your site's integration with AlphaPo [crypto withdrawals](/withdrawals/integration-guide).
For each test case, initiate a withdrawal via the [/api/v2/withdrawal/crypto](/api-reference/endpoints/withdrawal-crypto) endpoint and then process the relevant [callback](/api-reference/callbacks/withdrawal-callbacks).
Depending on whether you work with standard withdrawals or instant withdrawals, you will need to use different callback types and field names. If your site supports both, make sure to go through both lists of test cases.
Make sure to check these test cases if your site uses the [/api/v2/withdrawal/crypto](/api-reference/endpoints/withdrawal-crypto) endpoint.
| Procedure |
Expected results |
|
**Successful withdrawal**
|
|
1. Initiate a crypto withdrawal.
|
* The site gets a `withdrawal` callback.
* The callback status is `confirmed`.
|
|
**Successful withdrawal with conversion**
|
|
1. Initiate a withdrawal with the `convert_to` field.
|
* The site gets a `withdrawal` callback.
* The callback status is `confirmed`.
* `currency_sent` describes the amount you sent (minus the network fee). Its currency is the same as you specified in `currency`.
* `currency_received` describes the amount you received on your balance. Its currency is the same as you specified in `convert_to`.
|
|
**Withdrawal declined by the owner**
|
|
1. Go to **Settings → Withdrawal limits → API withdrawals → Custom API withdrawal limits** and set up a limit for a specific currency.
2. Initiate a withdrawal in that currency with an amount above the limit.
3. As an *Owner*, go to **Transactions** and select the pending transaction.
4. Click **Decline**.
5. Remove the withdrawal limit if you won't need it after testing.
|
* The site gets two `withdrawal` callbacks.
* The callback status is first `pending`, then `declined`.
|
|
**Withdrawal approved by the owner**
|
|
1. Go to **Settings → Withdrawal limits → API withdrawals → Custom API withdrawal limits** and set up a limit for a specific currency.
2. Initiate a withdrawal in that currency with an amount above the limit.
3. As an *Owner*, go to **Transactions** and select the pending transaction.
4. Click **Approve**.
5. Remove the withdrawal limit if you won't need it after testing.
|
* The site gets two `withdrawal` callbacks.
* The callback status is first `pending`, then `confirmed`.
|
Make sure to check these test cases if your site uses the [/api/v2/crypto/withdrawal\_instant](/api-reference/endpoints/crypto-withdrawal-instant) or [/api/v2/crypto/withdrawal\_instant\_exchange](/api-reference/endpoints/crypto-withdrawal-instant-exchange) endpoints.
| Procedure |
Expected results |
|
**Successful withdrawal**
|
|
1. Initiate an instant crypto withdrawal.
|
* The site gets a `withdrawal_instant` callback.
* The callback status is `confirmed`.
|
|
**Successful withdrawal with conversion**
|
|
1. Initiate an instant withdrawal with conversion.
|
* The site gets a `withdrawal_instant_exchange` callback.
* The callback status is `confirmed`.
* `currency_sent` describes the amount you sent (minus the network fee). Its currency is the same as you specified in `sender_currency`.
* `currency_received` describes the amount you received on your balance. Its currency is the same as you specified in `received_currency`.
|
|
**Withdrawal declined by the owner**
|
|
1. Go to **Settings → Withdrawal limits → API withdrawals → Custom API withdrawal limits** and set up a limit for a specific currency.
2. Initiate an instant withdrawal in that currency with an amount above the limit.
3. As an *Owner*, go to **Transactions** and select the pending transaction.
4. Click **Decline**.
5. Remove the withdrawal limit if you won't need it after testing.
|
* The site gets two `withdrawal_instant` or `withdrawal_instant_exchange` callbacks.
* The callback status is first `pending`, then `declined`.
|
|
**Withdrawal approved by the owner**
|
|
1. Go to **Settings → Withdrawal limits → API withdrawals → Custom API withdrawal limits** and set up a limit for a specific currency.
2. Initiate an instant withdrawal in that currency with an amount above the limit.
3. As an *Owner*, go to **Transactions** and select the pending transaction.
4. Click **Approve**.
5. Remove the withdrawal limit if you won't need it after testing.
|
* The site gets two `withdrawal_instant` or `withdrawal_instant_exchange` callbacks.
* The callback status is first `pending`, then `confirmed`.
|