Vanguard AI

Billing

Calls are metered in credits. Buy credits in packages and top up when you run low.

List packages

GET /v1/billing/packages Public
200 Packages
{
  "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

POST /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.

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_OVERDUE until 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.