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/balance
  • POST https://aoywallet.com/api/v1/getbalance

Parameters

api_key requiredYour faucet's API key — Faucet Owner → Manage → Faucet Information
currency optionalDefaults to "BTC". Any supported ticker — see Supported currencies below

Return values

currencyThe currency you set while making the request
balanceThe faucet wallet balance in 10^8 units ("satoshis")
balance_bitcoinThe 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 requiredYour faucet's API key — Faucet Owner → Manage → Faucet Information

Return values

currenciesA JSON array with currency acronyms
currencies_namesA 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 requiredYour faucet's API key — Faucet Owner → Manage → Faucet Information
address requiredA username, an account email, or a payment address (1234567890@aoywallet.com)

Return values

payout_user_hashA 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 requiredYour faucet's API key — Faucet Owner → Manage → Faucet Information
amount requiredAmount in 10^8 units ("satoshis"). For example: 50
to requiredWho 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 optionalDefaults to "BTC". Any supported ticker — see Supported currencies below
referral optionalSet to "true" to mark this as a referral payment
unique_id optionalOptional 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 optionalThe 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

currencyThe currency you paid in
balanceThe remaining faucet wallet balance in 10^8 units
balance_bitcoinThe remaining faucet wallet balance in coin value
payout_idA unique identifier for this transaction
payout_user_hashHash 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 requiredYour faucet's API key — Faucet Owner → Manage → Faucet Information
currency optionalDefaults to "BTC". Any supported ticker — see Supported currencies below
count optionalNumber 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 requiredYour faucet's API key — Faucet Owner → Manage → Faucet Information

Return values

list_dataA 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.

BTCBitcoin
ETHEthereum
USDTTether
BNBBinance Coin
SOLSolana
NEARNEAR Protocol
XRPRipple
USDCUSD Coin
DOGEDogecoin
ADACardano
TRXTRON
ZERZero
LTCLitecoin
BCHBitcoin Cash
XLMStellar
SHIBShiba Inu
XMRMonero
POLPolygon
PEPEPepe
TRUMPOfficial Trump
BONKBonk
FLOKIFloki
DASHDash
DGBDigiByte
GRAMGram
XAUTTether Gold
ALTAoyWallet Lottery Token

Read this list from GET https://aoywallet.com/api/v1/currencies rather than copying it — coins are added without a deploy.

Error codes

CodeMessage
200Success.
402You don't have sufficient funds for this transaction.
403Invalid API Key used. Please login to your account and use a valid API Key.
405You are sending an invalid amount of payment to the user.
410Invalid currency provided.
450Rate limit reached — the payout breaks a limit you set under Manage → Rate-Limits or Anti-Fraud.
456The address does not belong to any user.
457Your IP address is not whitelisted for this faucet (Manage → IP Whitelisting).
458The recipient is blacklisted on this faucet (Manage → IP Whitelisting → Recipient Blacklist).
459The 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.

FieldRequiredWhat it doesExample
merchant_usernameRequiredThe AoyWallet account that gets paid — must hold an approved merchant statusaoyshop
item_descriptionRequiredWhat the buyer sees on the checkout pagePremium VPN — 1 month
amount1RequiredThe price, in plain coin units of currency125
currency1RequiredTicker the price is quoted inUSDT
currency2OptionalLock the payment to one specific coin. Leave blank and the buyer picks any coin you acceptLTC
customOptionalFree-form reference echoed back to your server — an order number, a user id, anythinginv-88031
callback_urlOptionalYour server endpoint for the payment notification (IPN). Must be a public https/http URLhttps://yourstore.example/ipn
success_urlOptionalWhere the buyer’s browser goes after a completed paymenthttps://yourstore.example/thanks
cancel_urlOptionalWhere the buyer’s browser goes if they back outhttps://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 USDT99.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_idUnique id of this payment — store it to deduplicate callbacks
merchant_usernameMust be YOUR username, or the callback is not about your shop
amount1 / currency1The original asking price — compare against what the order actually costs
amount2 / currency2What the buyer really paid, in the coin they picked — GROSS, before any settlement fee
fee2Settlement fee deducted, in currency2. "0" on a balance payment, which is free
net2What actually reached your balance: amount2 minus fee2. Book THIS as revenue
customYour 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 1the moment the buyer pays
Attempt 25 minutes later
Attempt 315 minutes later
Attempt 430 minutes later
Attempt 51 hour later
Attempt 62 hours later
Attempt 74 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.