Billing
Calls are metered in credits. Buy credits in packages and top up when you run low.
List packages
/v1/billing/packages Public {
"status": "success",
"packages": [
{ "id": "trial", "credits": 50, "amountLak": 20000 },
{ "id": "starter", "credits": 150, "amountLak": 50000 },
{ "id": "standard", "credits": 700, "amountLak": 200000 },
{ "id": "bulk", "credits": 2800, "amountLak": 700000 }
]
}Start a top-up
/v1/billing/topup API key Returns the payment gateway QR code / deeplink to present to the payer.
JSON body
packageId * string | The package to purchase, e.g. "standard". |
provider string | Payment provider. Default: laosway. |
curl -X POST https://ai-api.vanguardinitiative.com/v1/billing/topup \
-H "authorization: Bearer $TOKEN" \
-H 'content-type: application/json' \
-d '{"packageId":"standard"}'Credits are granted idempotently once the gateway confirms the payment.
VAT
Package prices are before VAT. The amount charged — and package.amountLak in the
top-up response — includes VAT at the current rate (10%, the Lao standard rate), and
the response carries the breakdown as order: { subtotalLak, vatLak, totalLak }. GET /v1/billing/packages returns the rule in force as tax: { mode, ratePct }. The
Pro threshold is measured on package prices before VAT.
Quotations, invoices and receipts
Every purchase is an order. A paid one has a numbered receipt (RC-…); companies that
need paperwork before paying can request a quotation (QT-…) and an invoice (INV-…)
from the Billing page of the portal, download each as a PDF, and send the payer a link
that needs no account. The payments list (GET /v1/billing/payments) now includes each
payment’s orderId and receiptNumber.
Enterprise (postpaid) invoicing
Enterprise contracts are billed after use, like a cloud account. Usage builds up
through the month at your contract rate (₭ per credit, before VAT); on the 1st of
each month (Vientiane time) the month before becomes an invoice (INV-…) with VAT
on top, a PDF, a pay link and a receipt once paid. Each line is a service with its
number of calls and credits — the same rows GET /v1/account/usage lists, so the
invoice and your own records always total the same.
- One invoice, or one per API key. An owner chooses on the Billing page. Per key, each key with its own bill-to profile gets its own invoice addressed to that client; everything else is on the main invoice.
- Terms. Due 30 days after it is issued unless your contract says otherwise. If an
invoice is still unpaid 15 days after its due date, new billable calls return
402 BILLING_OVERDUEuntil it is paid — only that key’s calls for a key’s own invoice, the whole organization’s for the main one. Reading data, reports, the billing pages and paying always work. - Credit limit. If your contract has one, unbilled usage plus unpaid invoices count against it; paying an invoice frees that room at once.
GET /v1/account/balance carries billingHold: { held, overdue, holdFrom, heldKeys } so an integration can warn before calls start failing.
Plan allowances expire; purchased credits do not
Your balance holds two kinds of credit. The monthly plan allowance is replaced at
each renewal — use it or lose it — while credits you paid for never expire and are
always spent last. GET /v1/account/balance returns the split as grant and purchased, with grantExpiresAt for the allowance.
Usage limits
Separately from your balance, each plan caps how many credits may be spent per day
and per month, across every service at once. Exceeding a cap returns 429 USAGE_LIMIT_REACHED with window, limit, used and resetsAt — distinct
from 402 QUOTA_EXCEEDED, which means the balance itself is empty. Check your
headroom with GET /v1/account/quota.