Developer Documentation
Everything you need to build on AoyWallet: the payout REST API for faucets, and the hosted merchant checkout for selling with crypto. If you are a webmaster or a non-developer, this page is probably not meant for you.
Part 1 — Payout API
Pay your faucet's users straight into their AoyWallet balance.
Appropriate usage of the API
To keep the service running seamlessly for everyone, please do not hammer the servers with unintended calls. The send method already returns your balance after the transaction, so there is no reason to call balance right after it. Cache data such as your balance and user hashes, and refresh it every 5 minutes or so with a cron job — never on every public page view.
Every API key belongs to one faucet, and payouts are made from that faucet's own wallet — top it up first from Faucet Owner → Manage → Funds Management.
Send an HTTP POST request with the required parameters (such as api_key). The request body may be multipart/form-data, application/x-www-form-urlencoded or application/json. Every response is JSON containing a status and message — 200 means success.
Get balance of the faucet (balance, getbalance)
Request URLs
POST https://aoywallet.com/api/v1/balancePOST https://aoywallet.com/api/v1/getbalance
Parameters
api_key required | Your faucet's API key — Faucet Owner → Manage → Faucet Information |
currency optional | Defaults to "BTC". Any supported ticker — see Supported currencies below |
Return values
currency | The currency you set while making the request |
balance | The faucet wallet balance in 10^8 units ("satoshis") |
balance_bitcoin | The faucet wallet balance in regular coin value |
Example response
{
"status": 200,
"message": "OK",
"currency": "BTC",
"balance": "100000000",
"balance_bitcoin": "1"
}Get list of supported currencies (currencies)
Request URL
POST https://aoywallet.com/api/v1/currencies
Parameters
api_key required | Your faucet's API key — Faucet Owner → Manage → Faucet Information |
Return values
currencies | A JSON array with currency acronyms |
currencies_names | A JSON array with names and acronyms |
Example response
{
"status": 200,
"message": "OK",
"currencies": ["BTC","ETH","USDT","BNB","SOL","NEAR","XRP","USDC","DOGE","ADA","TRX","ZER","LTC","BCH","XLM","SHIB","XMR","POL","PEPE","TRUMP","BONK","FLOKI","DASH","DGB","GRAM","XAUT","ALT"],
"currencies_names": [
{ "name": "Bitcoin", "acronym": "BTC" },
{ "name": "Ethereum", "acronym": "ETH" },
{ "name": "Tether", "acronym": "USDT" },
{ "name": "Binance Coin", "acronym": "BNB" },
{ "name": "Solana", "acronym": "SOL" },
{ "name": "NEAR Protocol", "acronym": "NEAR" },
{ "name": "Ripple", "acronym": "XRP" },
{ "name": "USD Coin", "acronym": "USDC" },
{ "name": "Dogecoin", "acronym": "DOGE" },
{ "name": "Cardano", "acronym": "ADA" },
{ "name": "TRON", "acronym": "TRX" },
{ "name": "Zero", "acronym": "ZER" },
{ "name": "Litecoin", "acronym": "LTC" },
{ "name": "Bitcoin Cash", "acronym": "BCH" },
{ "name": "Stellar", "acronym": "XLM" },
{ "name": "Shiba Inu", "acronym": "SHIB" },
{ "name": "Monero", "acronym": "XMR" },
{ "name": "Polygon", "acronym": "POL" },
{ "name": "Pepe", "acronym": "PEPE" },
{ "name": "Official Trump", "acronym": "TRUMP" },
{ "name": "Bonk", "acronym": "BONK" },
{ "name": "Floki", "acronym": "FLOKI" },
{ "name": "Dash", "acronym": "DASH" },
{ "name": "DigiByte", "acronym": "DGB" },
{ "name": "Gram", "acronym": "GRAM" },
{ "name": "Tether Gold", "acronym": "XAUT" },
{ "name": "AoyWallet Lottery Token", "acronym": "ALT" }
]
}Check if an address belongs to a user (checkaddress)
Request URL
POST https://aoywallet.com/api/v1/checkaddress
Parameters
api_key required | Your faucet's API key — Faucet Owner → Manage → Faucet Information |
address required | A username, an account email, or a payment address (1234567890@aoywallet.com) |
Return values
payout_user_hash | A stable hash identifying the user. Use it to recognise the same user across requests |
Example response
{
"status": 200,
"message": "OK",
"payout_user_hash": "b8446e7a814d677f5e381f2e05206bf0cee6d063"
}
{
"status": 456,
"message": "The address does not belong to any user."
}Send a payment (send)
Request URL
POST https://aoywallet.com/api/v1/send
Parameters
api_key required | Your faucet's API key — Faucet Owner → Manage → Faucet Information |
amount required | Amount in 10^8 units ("satoshis"). For example: 50 |
to required | Who to pay: their AoyWallet username, their email, or their payment address (1234567890@aoywallet.com — a members-only address that receives money and nothing else) |
currency optional | Defaults to "BTC". Any supported ticker — see Supported currencies below |
referral optional | Set to "true" to mark this as a referral payment |
unique_id optional | Optional idempotency key (A–Z, a–z, 0–9, "-", "_", max 64). Retrying a request with the same unique_id never pays twice — strongly recommended |
ip_address optional | The claiming user’s IP address as seen by your site (IPv4 or IPv6). Enables the IP blacklist and the IP-based anti-fraud rules; those rules are skipped when omitted. The IP is stored with the payout record for your faucet’s own anti-fraud accounting |
Return values
currency | The currency you paid in |
balance | The remaining faucet wallet balance in 10^8 units |
balance_bitcoin | The remaining faucet wallet balance in coin value |
payout_id | A unique identifier for this transaction |
payout_user_hash | Hash of the user you paid |
Example response
{
"status": 200,
"message": "OK",
"rate_limit_remaining": null,
"currency": "BTC",
"balance": "8673047351",
"balance_bitcoin": "86.73047351",
"payout_id": "2af11f6f-9ca8-4c3e-b6af-0a649b011006",
"payout_user_hash": "c448e31098a8dfb48248f7e2374e77674bb90925"
}Recent payouts (payouts)
Request URL
POST https://aoywallet.com/api/v1/payouts
Parameters
api_key required | Your faucet's API key — Faucet Owner → Manage → Faucet Information |
currency optional | Defaults to "BTC". Any supported ticker — see Supported currencies below |
count optional | Number of transactions to fetch, between 0 and 100 |
Example response
{
"status": 200,
"message": "OK",
"rewards": [
{ "to": "username", "amount": 10451, "date": "14-06-26 03:11:59 GMT" },
{ "to": "username", "amount": 151, "date": "10-06-26 03:11:59 GMT" }
]
}Faucet list (faucetlist)
Request URL
POST https://aoywallet.com/api/v1/listv1/faucetlist
Parameters
api_key required | Your faucet's API key — Faucet Owner → Manage → Faucet Information |
Return values
list_data | A JSON object with the registered faucets, grouped per currency under "normal" |
Example response
{
"status": 200,
"message": "OK",
"list_data": {
"normal": {
"BTC": [
{
"id": "…",
"name": "My Faucet",
"url": "https://myfaucet.example",
"owner_name": "satoshi",
"currency": "BTC",
"timer_in_minutes": "60",
"reward": "10",
"is_enabled": "1",
"balance": "0.10000000",
"health": "100"
}
]
}
}
}Supported currencies27
Every currency value the payout API and the merchant checkout accept. Pass the ticker exactly as written. USDT is one currency here however many chains it settles on — the network is chosen when money actually moves, not when it is credited.
Read this list from GET https://aoywallet.com/api/v1/currencies rather than copying it — coins are added without a deploy.
Error codes
| Code | Message |
|---|---|
| 200 | Success. |
| 402 | You don't have sufficient funds for this transaction. |
| 403 | Invalid API Key used. Please login to your account and use a valid API Key. |
| 405 | You are sending an invalid amount of payment to the user. |
| 410 | Invalid currency provided. |
| 450 | Rate limit reached — the payout breaks a limit you set under Manage → Rate-Limits or Anti-Fraud. |
| 456 | The address does not belong to any user. |
| 457 | Your IP address is not whitelisted for this faucet (Manage → IP Whitelisting). |
| 458 | The recipient is blacklisted on this faucet (Manage → IP Whitelisting → Recipient Blacklist). |
| 459 | The payout was declined by the faucet's anti-fraud rules (Manage → Anti-Fraud). |
Part 2 — Merchant Checkout
Sell anything for crypto with nothing but an HTML form. Your buyer lands on an AoyWallet-hosted checkout, pays out of their wallet balance in one click, and your server gets notified. That route is instant, internal and free — no network fees, no confirmations to wait for. You can also switch on on-chain payments, where the buyer sends coin from any wallet instead; those carry a 0.5% settlement fee. You need an approved merchant account first: apply from the Merchant Dashboard.
1. The checkout form
Drop a form on your site that sends a POST to https://aoywallet.com/merchant/webscr. Nothing to sign and no API key involved — the buyer authenticates themselves when they approve the payment on our side. Any enabled AoyWallet ticker works for the two currency fields — all 27 of them, listed under Supported currencies.
| Field | Required | What it does | Example |
|---|---|---|---|
| merchant_username | Required | The AoyWallet account that gets paid — must hold an approved merchant status | aoyshop |
| item_description | Required | What the buyer sees on the checkout page | Premium VPN — 1 month |
| amount1 | Required | The price, in plain coin units of currency1 | 25 |
| currency1 | Required | Ticker the price is quoted in | USDT |
| currency2 | Optional | Lock the payment to one specific coin. Leave blank and the buyer picks any coin you accept | LTC |
| custom | Optional | Free-form reference echoed back to your server — an order number, a user id, anything | inv-88031 |
| callback_url | Optional | Your server endpoint for the payment notification (IPN). Must be a public https/http URL | https://yourstore.example/ipn |
| success_url | Optional | Where the buyer’s browser goes after a completed payment | https://yourstore.example/thanks |
| cancel_url | Optional | Where the buyer’s browser goes if they back out | https://yourstore.example/cart |
A complete form
<form action="https://aoywallet.com/merchant/webscr" method="post"> <input type="hidden" name="merchant_username" value="aoyshop"> <input type="hidden" name="item_description" value="Premium VPN — 1 month"> <input type="hidden" name="amount1" value="25"> <input type="hidden" name="currency1" value="USDT"> <input type="hidden" name="currency2" value=""> <input type="hidden" name="custom" value="inv-88031"> <input type="hidden" name="callback_url" value="https://yourstore.example/ipn"> <input type="hidden" name="success_url" value="https://yourstore.example/thanks"> <input type="hidden" name="cancel_url" value="https://yourstore.example/cart"> <button type="submit">Pay with AoyWallet</button> </form>
Prices in a different coin are converted at the live rate the moment the buyer confirms — if they pay in LTC for a USDT-priced item, the LTC amount is computed right then, never earlier.
1b. Taking coin on-chain (optional)
By default a buyer can only pay from their AoyWallet balance. Switch On-chain payments on in your Merchant Dashboard and the checkout offers a second tab: the buyer picks a network, gets a temporary address and an exact amount, and sends it from any wallet. Nothing in your form changes.
- The fee. 0.5% of the amount that arrives, taken out of what you are credited — the buyer sends exactly what they were quoted, never more: 100 USDT → 99.5 USDT. Balance payments stay free.
- The clock. The address and the rate are held for one hour. After that the quote is void and the address goes back into the pool — coin sent late is not credited automatically.
- One transfer. The order settles on the first transfer that covers the quote. Underpayments are never treated as payment; an overpayment settles the order and credits what arrived, less the fee.
- Confirmations. An on-chain payment settles when the network confirms it, so it is not instant. Your IPN fires at that moment, exactly as for a balance payment.
2. Getting notified (IPN)
If the form carried a callback_url, we POST a single field named token to it once the buyer has paid. The token on its own proves nothing — anyone can POST to your endpoint — so the required next step is asking us whether it is real:
GET https://aoywallet.com/merchant/get-payment/<token>
A genuine, completed payment answers with "valid": true plus the details you should cross-check on your side — that the username is yours, and that the price and currency match what you were selling:
{
"valid": true,
"transaction_id": "b7a91c04e2d85f6a3c10de99f42b7d1583aa20c6",
"merchant_username": "aoyshop",
"amount1": "25.00000000",
"currency1": "USDT",
"amount2": "0.21734500",
"currency2": "LTC",
"fee2": "0.00108672",
"net2": "0.21625828",
"custom": "inv-88031"
}| transaction_id | Unique id of this payment — store it to deduplicate callbacks |
| merchant_username | Must be YOUR username, or the callback is not about your shop |
| amount1 / currency1 | The original asking price — compare against what the order actually costs |
| amount2 / currency2 | What the buyer really paid, in the coin they picked — GROSS, before any settlement fee |
| fee2 | Settlement fee deducted, in currency2. "0" on a balance payment, which is free |
| net2 | What actually reached your balance: amount2 minus fee2. Book THIS as revenue |
| custom | Your own reference from the form, echoed back untouched |
A minimal PHP handler
<?php
// AoyWallet merchant IPN endpoint.
$token = $_POST['token'] ?? '';
// The POST alone proves nothing — anyone can hit this URL.
// Ask AoyWallet whether the token is real before trusting it.
$info = json_decode(
file_get_contents('https://aoywallet.com/merchant/get-payment/' . urlencode($token)),
true
);
if (!$info || $info['valid'] !== true) {
http_response_code(200); // acknowledge so we stop retrying
exit('not a real payment');
}
if ($info['merchant_username'] !== 'aoyshop') {
exit('payment belongs to another shop');
}
if ($info['currency1'] !== 'USDT' || $info['amount1'] !== '25.00000000') {
exit('price mismatch — do not ship');
}
// All good: mark order $info['custom'] as paid in your database here.
http_response_code(200);
echo 'OK';3. Delivery retries
Answer the IPN with HTTP 200 and we consider it delivered. Any other outcome — timeout, 4xx, 5xx, redirect — puts the notification back in the queue on this schedule:
| Attempt 1 | the moment the buyer pays |
| Attempt 2 | 5 minutes later |
| Attempt 3 | 15 minutes later |
| Attempt 4 | 30 minutes later |
| Attempt 5 | 1 hour later |
| Attempt 6 | 2 hours later |
| Attempt 7 | 4 hours later |
Seven tries and we stop — but nothing is lost: your server can query get-payment with a stored token at any time and reconcile missed orders.