Billing API

Invoices with their lines and PDFs, the wallet's history, and balance promo codes.

Everything your accountant asks for, without opening the dashboard: every invoice (top-ups, traffic, orders) with its lines, the same PDF the dashboard downloads, and the wallet history behind the balance.

Balance codes add money to the balance once per account. Discount codes are different: they are sent as promo_code with a purchase.

List transactions

GET/api/v1/transactions

The wallet's history, newest first. amount_usd is signed: top-ups, bonuses and refunds are positive, purchases negative. Only paid rows count in the balance; a pending top-up waits for the payment, a failed one never arrived.

Query parameters

NameTypeDescription
typestringOnly one kind. One of: deposit, charge, refund, coupon, bonus, commission, adjustment.
limitintegerPage size. 1–100. Default 50.
offsetintegerHow many to skip. From 0. Default 0.

Request

curl "https://aeonproxy.com/api/v1/transactions?limit=3" \
  -H "Authorization: Bearer $AEONPROXY_API_KEY"

Response 200

{
  "count": 9,
  "limit": 3,
  "offset": 0,
  "results": [
    {
      "id": 3301,
      "type": "charge",
      "amount_usd": -29.9,
      "status": "paid",
      "method": "Wallet balance",
      "invoice_number": 101962,
      "created_at": "2026-10-24T17:03:12.000Z"
    },
    {
      "id": 3298,
      "type": "deposit",
      "amount_usd": 50,
      "status": "paid",
      "method": "Crypto",
      "invoice_number": 101960,
      "created_at": "2026-10-24T16:51:40.000Z"
    },
    {
      "id": 3297,
      "type": "coupon",
      "amount_usd": 5,
      "status": "paid",
      "method": "Coupon SPRING5",
      "invoice_number": null,
      "created_at": "2026-10-23T10:02:18.000Z"
    }
  ]
}

Errors

StatusCodeWhen
400invalid_parameteran unknown type

List invoices

GET/api/v1/invoices

Every invoice of the account, newest first: top-ups, traffic purchases and orders. type says which.

Query parameters

NameTypeDescription
limitintegerPage size. 1–100. Default 50.
offsetintegerHow many to skip. From 0. Default 0.

Request

curl "https://aeonproxy.com/api/v1/invoices?limit=1" \
  -H "Authorization: Bearer $AEONPROXY_API_KEY"

Response 200

{
  "count": 6,
  "limit": 1,
  "offset": 0,
  "results": [
    {
      "number": 101962,
      "type": "traffic",
      "description": "Residential traffic · 10 GB",
      "items": [
        {
          "label": "10 GB × $2.99",
          "amount_usd": 29.9
        }
      ],
      "total_usd": 29.9,
      "status": "paid",
      "method": "Wallet balance",
      "issued_at": "2026-10-24T17:03:12.000Z",
      "order_id": 5120
    }
  ]
}

Get an invoice

GET/api/v1/invoices/{number}

One invoice with its lines, by its number.

Path parameters

NameTypeDescription
numberrequiredintegerThe invoice number.

Request

curl "https://aeonproxy.com/api/v1/invoices/101962" \
  -H "Authorization: Bearer $AEONPROXY_API_KEY"

Response 200

{
  "number": 101962,
  "type": "traffic",
  "description": "Residential traffic · 10 GB",
  "items": [
    {
      "label": "10 GB × $2.99",
      "amount_usd": 29.9
    }
  ],
  "total_usd": 29.9,
  "status": "paid",
  "method": "Wallet balance",
  "issued_at": "2026-10-24T17:03:12.000Z",
  "order_id": 5120
}

Errors

StatusCodeWhen
404not_foundno invoice with this number on your account

Download an invoice PDF

GET/api/v1/invoices/{number}/pdf

The invoice as a PDF file, the same document the dashboard downloads.

Path parameters

NameTypeDescription
numberrequiredintegerThe invoice number.

Request

curl "https://aeonproxy.com/api/v1/invoices/101962/pdf" \
  -H "Authorization: Bearer $AEONPROXY_API_KEY" \
  -o invoice-101962.pdf --fail

Response 200text/plain

%PDF-1.3 … (the file, application/pdf)

Errors

StatusCodeWhen
404not_foundno invoice with this number on your account

Activate a balance code

POST/api/v1/promo-codes/activate

Adds a balance code's amount to the balance. Each code works once per account, and the account needs a confirmed email and a linked Telegram, as in the dashboard's Coupon page.

Body (JSON)

NameTypeDescription
coderequiredstringThe code, in any letter case.

Request

curl -X POST "https://aeonproxy.com/api/v1/promo-codes/activate" \
  -H "Authorization: Bearer $AEONPROXY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"code":"SPRING5"}'

Response 200

{
  "code": "SPRING5",
  "credited_usd": 5,
  "balance_usd": 47.5
}

Errors

StatusCodeWhen
400invalid_requestthe code does not exist, has expired or was used, or Telegram is not linked yet

Your API key is already in the dashboard.