Quickstart
From zero to a paid test order in a few minutes — agent skill, SDK, or raw curl.
This walks you from an empty project to a paid test order. All three integration paths work here — pick Node, Python, Go, or curl below and the choice sticks across every guide.
Building with an AI coding agent?
Install the official skill first — npx skills add AbsolutePay/absolutepay-skill — and your
agent learns this entire flow (SDK calls, request signing, webhook verification). You can then
say "add AbsolutePay checkout to this app" and skim this page as the reference for what it does.
1. Create an app
In the dashboard, go to Developers → Apps and create an app.
You'll get three secrets once: the ap_test_… token, an apisign_… signing secret, and
(if you set a webhook URL) a whsec_… webhook signing secret. Use the test token while you build.
New apps need approval
A new app starts pending review — an admin must approve it before it can authenticate. To skip
the wait, build in the dedicated sandbox (sandbox.absolutepay.io,
API at https://sandbox-api.absolutepay.io), where apps are auto-approved.
2. Install the SDK
The SDKs sign every request for you, raise typed errors, and paginate lists. Going raw REST instead? Nothing to install — you'll sign each request yourself.
npm install absolutepaypip install absolutepaygo get github.com/AbsolutePay/absolutepay-go# No SDK — export your secrets and grab the sign() shell helper
# from the Authentication guide; every curl sample below uses it.
export APP_TOKEN="ap_test_…"
export SIGNING_SECRET="apisign_…"Export your secrets as ABSOLUTEPAY_API_KEY and ABSOLUTEPAY_SIGNING_SECRET (the samples below
read them from the environment). See SDK setup for full configuration options.
3. Confirm your credentials
Read your balances. With the SDK, signing is automatic; with curl you sign each request (see
Authentication for the sign() helper).
import { AbsolutePay } from "absolutepay";
const ap = new AbsolutePay({
apiKey: process.env.ABSOLUTEPAY_API_KEY!, // ap_test_…
signingSecret: process.env.ABSOLUTEPAY_SIGNING_SECRET!,
// sandbox: true, // if you're on the dedicated sandbox
});
console.log(await ap.balances.list());import os
from absolutepay import AbsolutePay
ap = AbsolutePay(
api_key=os.environ["ABSOLUTEPAY_API_KEY"], # ap_test_…
signing_secret=os.environ["ABSOLUTEPAY_SIGNING_SECRET"],
# sandbox=True, # if you're on the dedicated sandbox
)
print(ap.balances.list())ap, err := absolutepay.New(
os.Getenv("ABSOLUTEPAY_API_KEY"), // ap_test_…
absolutepay.WithSigningSecret(os.Getenv("ABSOLUTEPAY_SIGNING_SECRET")),
// absolutepay.WithSandbox(true),
)
if err != nil {
log.Fatal(err)
}
ctx := context.Background()
balances, err := ap.Balances.List(ctx)
if err != nil {
log.Fatal(err)
}
fmt.Println(balances)curl https://api.absolutepay.io/v1/balances \
-H "Authorization: Bearer $APP_TOKEN" $(sign GET /v1/balances ""){ "items": [{ "currency": "USDT", "available": "1000.000000", "locked": "0.000000" }] }A test workspace starts with sandbox funds, so you'll see a balance immediately. Every list endpoint
returns this { items, nextCursor } shape — see Pagination.
4. Create a payment
Create a checkout and send your customer to the returned checkoutUrl (they pick the asset on the
page). reference is your order id — keep it unique per order; it's also how you poll status
later. Amounts are decimal strings ("10.00"), never floats.
const checkout = await ap.checkouts.create({
reference: "order-1024", // your order id
amount: { amount: "10.00", currency: "USDT" },
});
console.log(checkout.token, checkout.checkoutUrl);checkout = ap.checkouts.create(
reference="order-1024", # your order id
amount={"amount": "10.00", "currency": "USDT"},
)
print(checkout["token"], checkout["checkoutUrl"])checkout, err := ap.Checkouts.Create(ctx, absolutepay.CheckoutParams{
Reference: "order-1024", // your order id
Amount: absolutepay.Money{Amount: "10.00", Currency: "USDT"},
})
if err != nil {
log.Fatal(err)
}
fmt.Println(checkout.Token, checkout.CheckoutURL)BODY='{"reference":"order-1024","amount":{"amount":"10.00","currency":"USDT"}}'
curl https://api.absolutepay.io/v1/checkouts \
-H "Authorization: Bearer $APP_TOKEN" -H "Content-Type: application/json" \
$(sign POST /v1/checkouts "$BODY") -d "$BODY"{ "token": "chk_…", "kind": "checkout", "status": "OPEN", "checkoutUrl": "https://pay.absolutepay.io/pay/chk_…" }5. Watch it get paid
In test mode the order is auto-paid a few moments after creation and a payment.succeeded
webhook fires — exactly the flow you'll see in production. On the dedicated
sandbox you drive settlement yourself: open the link in the dashboard and hit
Simulate payment.
Don't fulfill until the order reaches a terminal paid state. Use the webhook as the primary signal and read the checkout back by its token as a fallback:
const checkout = await ap.checkouts.get("chk_…");
if (checkout.status === "PAID") { /* fulfill */ }checkout = ap.checkouts.get("chk_…")
if checkout["status"] == "PAID":
... # fulfillcheckout, err := ap.Checkouts.Get(ctx, "chk_…")
if err != nil {
log.Fatal(err)
}
if checkout.Status == "PAID" {
// fulfill
}curl "https://api.absolutepay.io/v1/checkouts/chk_…" \
-H "Authorization: Bearer $APP_TOKEN" $(sign GET "/v1/checkouts/chk_…" "")Before you build further
Crypto payments are irreversible — there are no chargebacks, so never fulfill on a redirect,
only on PAID. Money-moving POSTs (payouts, refunds, conversions) accept an
Idempotency-Key; reuse the same key on retries so a request applies at most once.
6. Go live
Swap the ap_test_ app for an ap_live_ one (re-approved + re-signed) — same base URL, same request
shapes. Walk the Go-live checklist first.