Skip to content

Create a purchase invoice

POST
/v1/invoices
curl --request POST \
--url https://api.trueproxies.com/v1/invoices \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{ "auto_pay": { "disclosure_text": "example", "disclosure_version": "example" }, "offer_key": "example", "options": { "city": "example", "gb": 1, "quantity": 1 }, "promo_code": "example", "request_id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "service_id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0" }'

Requires billing:write; reseller:purchase also permits this operation. Add customer_id to buy for an owned managed customer, which additionally requires reseller:purchase. Prices and discount are snapshotted; a discount never goes below an offer’s minimum price. API keys must send an Idempotency-Key header.

customer_id
string format: uuid

Owned sub-customer UUID. Resellers only; reads require reseller:read and writes reseller:purchase in addition to the operation scope. X-Customer-Id header is an alternative. Not allowed for me, wallet, trial, API keys, or reseller-management routes.

Idempotency-Key
string
<= 200 characters

Required for API-key requests; optional for dashboard sessions. Makes a retry safe. The first request carrying a given key is executed and its response recorded; repeating the same request with the same key replays that response, with Idempotency-Replayed: true, rather than buying or paying a second time. Reusing a key for a different request is refused with 409, as is a repeat that arrives while the first is still running. Keys are scoped to your account and to the endpoint. Successful and uncertain invoice commands are retained so that an old retry cannot create another invoice. Completed definite rejections are kept for at least 24 hours; after that, the same key may be evaluated again.

Media typeapplication/json
object
auto_pay

Send when the customer ticked the automatic renewal box at checkout. The card they pay with is kept and the service renews on it. Ignored for plans automatic renewal does not cover.

object
disclosure_text
required

Refused when blank or longer than 1000 characters, so the stored sentence is exactly what was shown.

string
>= 1 characters <= 1000 characters
disclosure_version
required
string
>= 1 characters <= 64 characters
offer_key
required
string
options
object
city
string
gb

GB for top-ups; taken from the offer otherwise

integer
quantity

IPs for isp_dedicated

integer
>= 1 <= 1000
promo_code

Works on a purchase, top-up, renewal or plan upgrade. On a renewal or upgrade it replaces the service’s unpaid invoice of that kind, unless a payment for it is in progress.

string
>= 3 characters <= 40 characters /^[A-Za-z0-9][A-Za-z0-9-]{2,39}$/
request_id

Required when promo_code is present; keep stable only while retrying identical invoice content.

string format: uuid
service_id

Required for renewal, topup and plan upgrade

string format: uuid
Examplegenerated
{
"auto_pay": {
"disclosure_text": "example",
"disclosure_version": "example"
},
"offer_key": "example",
"options": {
"city": "example",
"gb": 1,
"quantity": 1
},
"promo_code": "example",
"request_id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0",
"service_id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0"
}

Created

Media typeapplication/json
object
activated_at

When this invoice’s service activation, top-up, renewal, or charge-only processing committed. Payment receipt and an already-active service do not establish this outcome.

string format: date-time
activation_failed_at

Automatic fulfillment stopped and needs operator attention. Payment remains received; this does not mean a refund completed or previously purchased service was revoked.

string format: date-time
amount_cents
required
integer
bill_to

Who the invoice is issued to, copied from the account’s billing details when the invoice was created. Absent when the account had no billing details then; saving details later does not change it.

object
address
string
company
string
country
string
name
string
vat_id
string
created_at
required
string format: date-time
currency
required
string
discount_bp
integer
display_name
required
string
due_at
required
string format: date-time
expired

True when a cancelled invoice closed because it was not paid by due_at. Invoices cancelled before this field existed report false.

boolean
id
required

Internal API identifier. Use reference for customer-facing display.

string format: uuid
kind
required
string
Allowed values: wallet_topup purchase renewal topup upgrade custom white_label
list_amount_cents
integer
offer_key
required
string
options
object
city
string
gb

GB for top-ups; taken from the offer otherwise

integer
quantity

IPs for isp_dedicated

integer
>= 1 <= 1000
paid_at
string format: date-time
payments
required
Array<object>
object
amount_received_cents
integer
attempt
required
integer
checkout_url

Present only while the invoice is payable and the pending checkout has not reached its known expiry

string
created_at
required
string format: date-time
expires_at
string format: date-time
failure_reason

Staff views only. Why the checkout ended unpaid, as the provider reports it: not_attempted (no payment submitted), not_completed (started, never confirmed), or the card issuer’s code such as card_declined/insufficient_funds.

string
id
required
string format: uuid
provider
required
One of:

Payment provider identifier (stripe, cryptomus or passimpay).

string
refund_amount_cents
integer
>= 1
refund_amount_unknown

A provider refund was reported without a trustworthy amount. Reconciliation is required before any additional refund.

boolean
refund_completed_at
string format: date-time
refund_reason
string
refund_reference
string
refund_retryable

The recorded request can be retried unchanged within the provider idempotency window.

boolean
refund_status
string
Allowed values: processing uncertain manual_required submitted failed refunded
refunded_at

Refund request recorded at; not proof of completion

string format: date-time
status
required
string
Allowed values: pending paid expired failed paid_unapplied paid_duplicate
wallet_credit_cents

What this applied payment added to the wallet: the rest of a minimum payment ($10 by card, $3 by crypto) above the invoice amount, or crypto sent above it. Absent when nothing was added.

integer
>= 1
promo_code
string
promo_discount_cents
integer format: int64
reference
required

Stable, unique customer-facing reference.

string
/^INV-[0-9]{6,}$/
service_id
string format: uuid
status
required
string
Allowed values: open paid cancelled
upgrade_credit_cents

Plan upgrades only. Credit for unused time on the previous plan.

integer format: int64
upgrade_price_cents

Plan upgrades only. The new plan’s price; amount_cents is this minus upgrade_credit_cents.

integer format: int64
Example
{
"kind": "wallet_topup",
"payments": [
{
"provider": "manual",
"refund_status": "processing",
"status": "pending"
}
],
"reference": "INV-001001",
"status": "open"
}

Error

Media typeapplication/json
object
code
required
string
Allowed values: BAD_REQUEST UNAUTHENTICATED FORBIDDEN NOT_FOUND CONFLICT RATE_LIMITED SERVICE_UNAVAILABLE OFFER_UNAVAILABLE CITY_UNAVAILABLE CAPACITY_UNAVAILABLE INVOICE_NOT_PAYABLE PROVIDER_ERROR PIPE_UNAVAILABLE TRIAL_NOT_ELIGIBLE EMAIL_UNVERIFIED INTERNAL
details

What a client needs to act on the error (ids, flags), never display text.

object
key
additional properties
any
message
required
string
Example
{
"code": "BAD_REQUEST"
}

Error

Media typeapplication/json
object
code
required
string
Allowed values: BAD_REQUEST UNAUTHENTICATED FORBIDDEN NOT_FOUND CONFLICT RATE_LIMITED SERVICE_UNAVAILABLE OFFER_UNAVAILABLE CITY_UNAVAILABLE CAPACITY_UNAVAILABLE INVOICE_NOT_PAYABLE PROVIDER_ERROR PIPE_UNAVAILABLE TRIAL_NOT_ELIGIBLE EMAIL_UNVERIFIED INTERNAL
details

What a client needs to act on the error (ids, flags), never display text.

object
key
additional properties
any
message
required
string
Example
{
"code": "BAD_REQUEST"
}

Error

Media typeapplication/json
object
code
required
string
Allowed values: BAD_REQUEST UNAUTHENTICATED FORBIDDEN NOT_FOUND CONFLICT RATE_LIMITED SERVICE_UNAVAILABLE OFFER_UNAVAILABLE CITY_UNAVAILABLE CAPACITY_UNAVAILABLE INVOICE_NOT_PAYABLE PROVIDER_ERROR PIPE_UNAVAILABLE TRIAL_NOT_ELIGIBLE EMAIL_UNVERIFIED INTERNAL
details

What a client needs to act on the error (ids, flags), never display text.

object
key
additional properties
any
message
required
string
Example
{
"code": "BAD_REQUEST"
}

Error

Media typeapplication/json
object
code
required
string
Allowed values: BAD_REQUEST UNAUTHENTICATED FORBIDDEN NOT_FOUND CONFLICT RATE_LIMITED SERVICE_UNAVAILABLE OFFER_UNAVAILABLE CITY_UNAVAILABLE CAPACITY_UNAVAILABLE INVOICE_NOT_PAYABLE PROVIDER_ERROR PIPE_UNAVAILABLE TRIAL_NOT_ELIGIBLE EMAIL_UNVERIFIED INTERNAL
details

What a client needs to act on the error (ids, flags), never display text.

object
key
additional properties
any
message
required
string
Example
{
"code": "BAD_REQUEST"
}

Error

Media typeapplication/json
object
code
required
string
Allowed values: BAD_REQUEST UNAUTHENTICATED FORBIDDEN NOT_FOUND CONFLICT RATE_LIMITED SERVICE_UNAVAILABLE OFFER_UNAVAILABLE CITY_UNAVAILABLE CAPACITY_UNAVAILABLE INVOICE_NOT_PAYABLE PROVIDER_ERROR PIPE_UNAVAILABLE TRIAL_NOT_ELIGIBLE EMAIL_UNVERIFIED INTERNAL
details

What a client needs to act on the error (ids, flags), never display text.

object
key
additional properties
any
message
required
string
Example
{
"code": "BAD_REQUEST"
}

Error

Media typeapplication/json
object
code
required
string
Allowed values: BAD_REQUEST UNAUTHENTICATED FORBIDDEN NOT_FOUND CONFLICT RATE_LIMITED SERVICE_UNAVAILABLE OFFER_UNAVAILABLE CITY_UNAVAILABLE CAPACITY_UNAVAILABLE INVOICE_NOT_PAYABLE PROVIDER_ERROR PIPE_UNAVAILABLE TRIAL_NOT_ELIGIBLE EMAIL_UNVERIFIED INTERNAL
details

What a client needs to act on the error (ids, flags), never display text.

object
key
additional properties
any
message
required
string
Example
{
"code": "BAD_REQUEST"
}

Error

Media typeapplication/json
object
code
required
string
Allowed values: BAD_REQUEST UNAUTHENTICATED FORBIDDEN NOT_FOUND CONFLICT RATE_LIMITED SERVICE_UNAVAILABLE OFFER_UNAVAILABLE CITY_UNAVAILABLE CAPACITY_UNAVAILABLE INVOICE_NOT_PAYABLE PROVIDER_ERROR PIPE_UNAVAILABLE TRIAL_NOT_ELIGIBLE EMAIL_UNVERIFIED INTERNAL
details

What a client needs to act on the error (ids, flags), never display text.

object
key
additional properties
any
message
required
string
Example
{
"code": "BAD_REQUEST"
}

Error

Media typeapplication/json
object
code
required
string
Allowed values: BAD_REQUEST UNAUTHENTICATED FORBIDDEN NOT_FOUND CONFLICT RATE_LIMITED SERVICE_UNAVAILABLE OFFER_UNAVAILABLE CITY_UNAVAILABLE CAPACITY_UNAVAILABLE INVOICE_NOT_PAYABLE PROVIDER_ERROR PIPE_UNAVAILABLE TRIAL_NOT_ELIGIBLE EMAIL_UNVERIFIED INTERNAL
details

What a client needs to act on the error (ids, flags), never display text.

object
key
additional properties
any
message
required
string
Example
{
"code": "BAD_REQUEST"
}