본문으로 건너뛰기
비공개 베타 · 아직 일반에 공개되지 않았습니다. 초대를 받은 분만 계정을 만들 수 있습니다. 이용 신청 →
AywaPay

개발자

API 문서

AywaPay로 암호화폐 결제를 받는 데 필요한 모든 것: 인보이스 생성, 지급 전송, 콜백 검증.

시작하기

  1. 이용 신청 (현재 비공개 베타로, 초대장을 받으면 계정이 열립니다) 후 스토어를 만들고 2단계 인증을 켜세요.
  2. 스토어의 API 탭을 열고 비밀 키를 생성하세요. 필요하면 내 서버 IP만 허용할 수 있습니다.
  3. 스토어의 Status URL을 설정하세요. 모든 인보이스 변경 사항이 이 주소로 POST됩니다.
  4. 서버에서 인보이스를 만들고, 응답으로 받은 invoice_url로 고객을 보내세요.

기본 URL

https://api.aywapay.com/api/v1

인증

api_key 쿼리 파라미터를 모든 요청에 포함하세요. 브라우저나 앱에는 절대 넣지 마세요.

모든 응답은 JSON입니다: { "status": "success", "data": { … } } 또는 { "status": "error", "data": { "code": 103, "message": "…" } }.

Invoices

Create an invoice

GET/api/v1/invoices/new

Creates a payment request and returns the link of the hosted payment page. Price it in fiat (the customer picks the coin) or in one coin.

ParameterDescription
api_key*Your store's secret key (Stores & API → API). Keep it on your server.
order_number*Your order id. Unique per store; repeating it is refused unless return_existing=1.
order_name*What the customer pays for, shown on the payment page.
source_currency + source_amountFiat price, e.g. USD and 49.99. Converted at the current rate.
currency + amountOr a crypto price in one coin, e.g. BTC and 0.001. currency alone fixes the coin of a fiat invoice.
allowed_psys_cidsComma list of coins the customer may choose, e.g. BTC,USDT_TRX. Coins whose minimum the order does not reach are left out.
callback_urlWhere status changes are POSTed (default: the store's Status URL). Add ?json=true for a JSON body.
success_callback_url / fail_callback_urlExtra callbacks for paid and failed invoices.
success_invoice_url / fail_invoice_urlWhere the payment page's "Back to store" button goes.
emailCustomer email: the payment link and receipt are sent there.
descriptionShown under the order name.
expire_minMinutes before the invoice expires (default: the store's setting, else 60).
return_existing1 = an existing order_number returns that invoice instead of an error.
Request
curl -G "https://api.aywapay.com/api/v1/invoices/new" \
  -d source_currency=USD -d source_amount=49.99 \
  -d order_number=1042 --data-urlencode "order_name=Pro plan" \
  --data-urlencode "callback_url=https://yourshop.com/callback?json=true" \
  -d api_key=$AYWAPAY_SECRET_KEY
Response data
{
  "txn_id": "65f1c0ffee00000000000001",
  "invoice_url": "https://pay.aywapay.com/invoice/65f1c0ffee00000000000001",
  "invoice_total_sum": "0.5512"
}

Get an invoice

GET/api/v1/invoices/:id

Full invoice: status, coin, address, amounts, confirmations and transactions.

ParameterDescription
api_key*Your store's secret key (Stores & API → API). Keep it on your server.
Request
curl -G "https://api.aywapay.com/api/v1/invoices/:id" -d api_key=$AYWAPAY_SECRET_KEY
Response data
{
  "invoice": { "txn_id": "…", "status": "completed", "psys_cid": "LTC",
    "amount": "0.5512", "received_amount": "0.5512",
    "remaining_amount": "0", "wallet_hash": "ltc1q…",
    "expected_confirmations": 6, "tx_url": ["…"], "tx_id": ["…"] },
  "active_invoice_id": "…"
}

Withdrawals & payouts

Send a withdrawal or a mass payout

GET/api/v1/operations/withdraw

Sends crypto from your balance. The network (gas) fee is taken in the same coin. Can be turned off per store (Stores & API → API).

ParameterDescription
api_key*Your store's secret key (Stores & API → API). Keep it on your server.
psys_cid*Coin, e.g. USDT_TRX.
type*cash_out (one address) or mass_cash_out (many).
to*Address, or comma list for mass_cash_out.
amount*Amount, or comma list in the same order as to.
feePlannormal (default) or priority.
Request
curl -G "https://api.aywapay.com/api/v1/operations/withdraw" -d api_key=$AYWAPAY_SECRET_KEY
Response data
{ "id": "65f1c0ffee00000000000002", "type": "cash_out", "status": "pending",
  "psys_cid": "USDT_TRX", "currency": "USDT", "amount": "25.00", "fee": "1.25",
  "wallet_hash": "T…", "tx_url": "", "tx_id": [] }

Estimate the network fee

GET/api/v1/operations/fee/:psys_cid

Fee of a withdrawal before you send it.

ParameterDescription
api_key*Your store's secret key (Stores & API → API). Keep it on your server.
addresses*Comma list of recipients.
amounts*Comma list of amounts.
feePlannormal or priority.
Request
curl -G "https://api.aywapay.com/api/v1/operations/fee/:psys_cid" -d api_key=$AYWAPAY_SECRET_KEY
Response data
{ "fee": "0.0000021", "psys_cid": "LTC", "currency": "LTC", "plan": "normal" }

Fee and commission of a withdrawal

GET/api/v1/operations/commission/:psys_cid

What the withdrawal costs in total: network fee plus any commission.

ParameterDescription
api_key*Your store's secret key (Stores & API → API). Keep it on your server.
addressesComma list of recipients.
amountsComma list of amounts.
typecash_out or mass_cash_out.
Request
curl -G "https://api.aywapay.com/api/v1/operations/commission/:psys_cid" -d api_key=$AYWAPAY_SECRET_KEY
Response data
{ "commission": "0", "fee": "0.0000021", "feeUnit": "LTC", "plan": "normal",
  "plans": { "normal": { "value": "0.0000021" }, "priority": { "value": "0.0000042" } } }

Fee plans of a coin

GET/api/v1/operations/fee-plan/:psys_cid

Details of the normal and priority plans.

ParameterDescription
api_key*Your store's secret key (Stores & API → API). Keep it on your server.
Request
curl -G "https://api.aywapay.com/api/v1/operations/fee-plan/:psys_cid" -d api_key=$AYWAPAY_SECRET_KEY
Response data
{ "normal": { … }, "priority": { … } }

Balances, operations & coins

Balance of one coin

GET/api/v1/balances/:psys_cid

Available balance of your account in that coin.

ParameterDescription
api_key*Your store's secret key (Stores & API → API). Keep it on your server.
Request
curl -G "https://api.aywapay.com/api/v1/balances/:psys_cid" -d api_key=$AYWAPAY_SECRET_KEY
Response data
{ "psys_cid": "LTC", "currency": "LTC", "balance": "0.0510" }

List operations

GET/api/v1/operations

Invoices, deposits and withdrawals, newest first.

ParameterDescription
api_key*Your store's secret key (Stores & API → API). Keep it on your server.
pagePage number (default 1).
limitItems per page (default 10).
Request
curl -G "https://api.aywapay.com/api/v1/operations" -d api_key=$AYWAPAY_SECRET_KEY
Response data
{ "operations": [ … ], "_meta": { "totalCount": 3, "pageCount": 1, "currentPage": 1, "perPage": 10 } }

Get one operation

GET/api/v1/operations/:id

One invoice, deposit or withdrawal by id.

ParameterDescription
api_key*Your store's secret key (Stores & API → API). Keep it on your server.
Request
curl -G "https://api.aywapay.com/api/v1/operations/:id" -d api_key=$AYWAPAY_SECRET_KEY
Response data
{ "id": "…", "type": "invoice", "status": "completed", … }

Coins and rates

GET/api/v1/currencies/:fiat

Every coin you can accept, with its rate in a fiat currency (default USD) and minimum invoice.

ParameterDescription
api_key*Your store's secret key (Stores & API → API). Keep it on your server.
Request
curl -G "https://api.aywapay.com/api/v1/currencies/:fiat" -d api_key=$AYWAPAY_SECRET_KEY
Response data
[ { "cid": "BTC", "name": "Bitcoin", "rate_usd": "0.0000125", "min_sum_in": "0.0001", "min_withdraw": "0.0002", … } ]

Your store

GET/api/v1/shops

The store the key belongs to.

ParameterDescription
api_key*Your store's secret key (Stores & API → API). Keep it on your server.
Request
curl -G "https://api.aywapay.com/api/v1/shops" -d api_key=$AYWAPAY_SECRET_KEY
Response data
{ "id": "…", "name": "My Shop", "plan": "api", … }

Deposit addresses (White Label)

Permanent address for one of your users

GET/api/v1/shops/deposit/new

A fixed address per user and coin. Every payment to it is credited to you and reported with a pay_in callback. White Label plan.

ParameterDescription
api_key*Your store's secret key (Stores & API → API). Keep it on your server.
psys_cid*Coin, or a comma list for several.
uid*Your id of the user.
Request
curl -G "https://api.aywapay.com/api/v1/shops/deposit/new" -d api_key=$AYWAPAY_SECRET_KEY
Response data
{ "psys_cid": "USDT_TRX", "uid": "user-17", "hash": "T…" }

List deposit addresses

GET/api/v1/shops/deposit

Addresses already given out.

ParameterDescription
api_key*Your store's secret key (Stores & API → API). Keep it on your server.
uidOnly this user.
psys_cidOnly this coin.
Request
curl -G "https://api.aywapay.com/api/v1/shops/deposit" -d api_key=$AYWAPAY_SECRET_KEY
Response data
[ { "psys_cid": "BTC", "uid": "user-17", "hash": "bc1q…" } ]

콜백 (웹훅)

On every invoice status change we POST the invoice to its callback_url (or the store's Status URL). Withdrawals made with your API key are reported to the Status URL too, when they are sent, completed, fail or are cancelled. Add ?json=true to the URL to get JSON instead of a form post.

  • Answer with HTTP 200. Anything else is retried 8 more times over about two days, then shown as Failed in your dashboard.
  • Always check verify_hash before trusting a callback.
  • Stores & API → Webhooks shows every attempt, lets you resend one, and sends a signed test.
Invoice callback
{
  "txn_id": "65f1c0ffee00000000000001",
  "ipn_type": "invoice",
  "merchant": "My Shop",
  "merchant_id": "3f2a9c1e-…",
  "status": "completed",
  "amount": "0.5512",
  "currency": "LTC",
  "order_number": "1042",
  "order_name": "Pro plan",
  "confirmations": "6",
  "source_currency": "USD",
  "source_amount": "49.99",
  "invoice_total_sum": "0.5512",
  "verify_hash": "…"
}
Withdrawal callback
{
  "txn_id": "65f1c0ffee00000000000002",
  "ipn_type": "cash_out",
  "merchant": "My Shop",
  "merchant_id": "3f2a9c1e-…",
  "status": "completed",          // pending | completed | error | cancelled
  "psys_cid": "USDT_TRX",
  "currency": "USDT",
  "amount": "25.00",
  "fee": "1.25",
  "to": "T…",
  "tx_id": "a1b2…",
  "comment": "",
  "verify_hash": "…"
}

서명 확인

verify_hash is an HMAC-SHA1 with your store's secret key: of PHP's serialize() of the key-sorted fields for form posts, or of JSON.stringify of the body without verify_hash for JSON.

PHP (form post)
<?php
// Your store's secret key (Stores & API → API)
$secretKey = getenv('AYWAPAY_SECRET_KEY');

$post = $_POST;                       // form-encoded callback
$received = $post['verify_hash'] ?? '';
unset($post['verify_hash']);
ksort($post);
$expected = hash_hmac('sha1', serialize($post), $secretKey);

if (!hash_equals($expected, $received)) {
    http_response_code(400);
    exit('bad signature');
}
if ($post['status'] === 'completed' || $post['status'] === 'mismatch') {
    // mark order $post['order_number'] as paid
}
http_response_code(200);
Node.js (JSON)
import crypto from "node:crypto";

// callback_url ends with ?json=true, so the body is JSON
app.post("/callback", express.json(), (req, res) => {
  const { verify_hash, ...body } = req.body;
  const expected = crypto
    .createHmac("sha1", process.env.AYWAPAY_SECRET_KEY)
    .update(JSON.stringify(body))
    .digest("hex");
  const given = Buffer.from(String(verify_hash ?? ""));
  const wanted = Buffer.from(expected);
  if (given.length !== wanted.length || !crypto.timingSafeEqual(given, wanted)) {
    return res.status(400).send("bad signature");
  }

  if (body.status === "completed" || body.status === "mismatch") {
    // mark order body.order_number as paid
  }
  res.sendStatus(200);
});

테스트 모드 (샌드박스)

Every store can have a test key next to its live key (Stores & API → API → Test key). It works with the same endpoints, with no real money:

  • Invoices made with the test key are test invoices: no deposit address, nothing on a blockchain.
  • Their payment page has Simulate buttons: paid, overpaid, underpaid, expire. Each fires your normal callback, with test=true and signed with the test key.
  • Test invoices never touch your balance. Withdrawals and deposit addresses need the live key (error 229); balances read 0.
  • Order numbers are separate: a test order never blocks a live one with the same number.
Create a test invoice
curl -G "https://api.aywapay.com/api/v1/invoices/new" \
  -d source_currency=USD -d source_amount=10 \
  -d order_number=test-1 -d order_name=Test \
  -d api_key=$AYWAPAY_TEST_KEY

자체 결제 도메인 (화이트 라벨)

화이트 라벨 요금제에서는 인보이스, 결제 링크, 후원 페이지, 결제 버튼을 당사 주소 대신 pay.yourshop.com 같은 내 주소에서 열 수 있습니다. 고객에게는 내 도메인과 브랜드만 보입니다. DNS 레코드 하나와 10분 정도면 충분하며, 개발자는 필요 없습니다.

설정 방법

  1. 스토어를 화이트 라벨 요금제로 바꿉니다 (스토어 → 일반).
  2. 스토어의 결제 페이지 탭을 엽니다. “결제 링크가 열리는 곳”에서 내 도메인을 선택합니다.
  3. 소유한 서브도메인(예: pay.yourshop.com)을 입력합니다. yourshop.com 자체는 쓸 수 없습니다. 수수료가 표시되면 확인한 뒤 저장합니다.
  4. 화면에 표시된 레코드를 복사해 도메인의 DNS를 관리하는 곳(Cloudflare, GoDaddy, Namecheap, Hostinger 등)에 추가합니다. 대시보드에 업체별 간단한 가이드가 있습니다.
  5. 기다리면 됩니다. 1분마다 확인합니다: DNS → HTTPS 인증서 → 활성. 보통 5~30분 걸리며, 새 DNS 레코드는 몇 시간이 걸릴 수도 있습니다. 활성화되면 이메일로 알려 드립니다.

DNS 레코드

유형이름값
CNAMEpay<your-code>.domains.aywapay.com

정확한 대상 값은 대시보드에서 복사하세요. 스토어마다 다릅니다. 대부분의 업체는 이름에 첫 부분(pay)만 입력하면 됩니다.

Cloudflare를 쓰시나요?

레코드를 “DNS only”(회색 구름)로 설정하세요. 주황색 구름이 켜져 있으면 인증서를 발급할 수 없고, 확인 결과에 레코드가 프록시를 거친다고 표시됩니다.

확인이 통과되지 않으면

  • 레코드 없음: CNAME이 아직 없거나 DNS가 아직 퍼지지 않았습니다. 이름을 확인하고 몇 분 기다리세요.
  • 다른 곳을 가리킴: 다른 레코드(A, AAAA 또는 예전 CNAME)가 같은 이름을 쓰고 있습니다. 그 레코드를 삭제하고 CNAME만 남기세요.
  • 프록시 사용 중: Cloudflare의 주황색 구름이 켜져 있습니다. 레코드를 “DNS only”로 바꾸세요.
  • 인증서 대기 중: DNS는 올바르며, HTTPS 인증서는 보통 몇 분 안에 발급됩니다.

활성화된 후

  • 새 링크와 기존 링크 모두 내 도메인에서 열립니다. 당사 주소로 이미 보낸 링크도 계속 작동합니다.
  • 언제든 클릭 한 번으로 AywaPay 링크로 되돌릴 수 있으며, 도메인은 저장된 채로 남습니다.
  • DNS가 24시간 동안 당사를 가리키지 않으면 링크가 자동으로 당사 주소로 돌아가고 이메일로 알려 드리므로, 결제가 누락되지 않습니다.
  • 계정에 자체 도메인 수수료가 있으면 저장하기 전에 표시되며, 잔액에서 차감됩니다.

이 옵션이 보이지 않나요? 화이트 라벨 요금제가 필요합니다. 스토어가 이미 화이트 라벨이라면 다음 주소로 문의하세요 [email protected].

인보이스 상태

newCreated, nothing received yet.
pendingPayment seen on the blockchain, waiting for confirmations.
completedPaid in full and confirmed. Ship the order.
mismatchOverpaid and confirmed: paid, the extra is in your balance too.
expiredTime ran out. With some money received it stays open for the rest of the payment.
cancelledCancelled before payment.
cancelled duplicateThe customer switched to another coin; the new copy carries on.
errorSomething went wrong; contact support.

오류

CodeHTTPMeaning
101401Wrong or missing api_key.
103400A parameter is missing or invalid (the message names it).
105422Coin not available for this store.
111404No such invoice or operation.
116422Balance too low for amount plus fee.
202429Too many requests; slow down.
210422Below the coin's minimum.
211422order_number already used.
213422Invalid address for this coin's network.
218422Saved addresses only is on and the address is not saved.
224422The address is blocked for compliance reasons (sanctions list).
225422Over a withdrawal limit. Check your own limits in Settings → Security, or contact support.
229422Not possible with the test key (withdrawals, deposit addresses): use the live key.
303403Request from an IP not in the store's allowed IPs.

궁금한 점은 이메일로 문의해 주세요: [email protected].