Create collect

Collects an issued invoice: credit grants first, then prepaid balance, then the card on file — the same waterfall the dunning workflow runs.

POST /v1/billing/invoices/{id}/collect

Addresshttps://api.hanzo.ai/v1/billing/invoices/{id}/collect
MethodPOST
OperationcollectInvoice
AuthAuthorization: Bearer $HANZO_API_KEY

Collects an issued invoice: credit grants first, then prepaid balance, then the card on file — the same waterfall the dunning workflow runs. It spends the named customer's money, so it is the org admin's act; a member is refused 403.

A DECLINE IS NOT AN ERROR. It answers with paid=false, a reason, and the invoice still open, because a declined collection is a normal business outcome that must remain retryable — and because sealing it as a failure would wedge dunning behind a replayed decline. Only a successful collection is sealed, so a retry of a paid invoice replays the receipt instead of charging again.

A named handler, not a closure, so zipdoc can lift this prose into the registry.

Request

1 field.

FieldInTypeRequiredDescription
idpathstringyesID is the invoice id.

Response

StatusBodyMeaning
200billing.Collectedok
defaultproblem-detailsrefused

200 body — 23 fields.

FieldInTypeAlwaysDescription
balanceUsedCentsbodyinteger (int64)—BalanceUsedCents is how much was covered by prepaid balance.
cardChargedCentsbodyinteger (int64)—CardChargedCents is how much was charged to the card on file.
creditUsedCentsbodyinteger (int64)—CreditUsedCents is how much was covered by credit grants.
invoicebodybilling.Invoice—
invoice.amountDueCentsbodyinteger (int64)—AmountDueCents is what remains collectible.
invoice.amountPaidCentsbodyinteger (int64)—AmountPaidCents is what has been collected so far.
invoice.createdAtbodystring—CreatedAt is when the draft was raised, RFC3339.
invoice.currencybodystring—Currency is the ISO 4217 code.
invoice.customerEmailbodystring—CustomerEmail is where it is sent.
invoice.idbodystring—ID is the invoice id — what the issue, collect and void ops address.
invoice.linesbodybilling.InvoiceLine[]—Lines are the charges on the invoice.
invoice.lines[].amountbodyinteger (int64)—Amount is the line total in whole cents (250000 is $2,500.00).
invoice.lines[].descriptionbodystring—Description is the human-readable line, e.g. "Advisory retainer — August".
invoice.lines[].quantitybodyinteger (int64)—Quantity is the number of units, when the line is metered.
invoice.lines[].unitPricebodyinteger (int64)—UnitPrice is the per-unit price in cents, when the line is metered.
invoice.numberbodystring—Number is the human-facing invoice number, e.g. "INV-0042".
invoice.paymentRefbodystring—PaymentRef is the processor reference for the collection, once paid.
invoice.statusbodystring—Status is draft, open, paid, void or uncollectible.
invoice.subtotalCentsbodyinteger (int64)—SubtotalCents is the sum of the lines.
invoice.userIdbodystring—UserID is the customer billed.
paidbodyboolean—Paid reports whether the invoice is now settled in full.
processorRefbodystring—ProcessorRef is the processor's reference for any card charge — the field that proves money moved at the gateway rather than only in our ledger.
reasonbodystring—Reason explains a decline or partial collection.

Failure carries the platform error shape — see Errors.

Examples

hanzo billing invoices collect <id>
import { Configuration, BillingApi } from 'hanzoai';

const api = new BillingApi(new Configuration({ accessToken: process.env.HANZO_API_KEY }));
const { data } = await api.collectInvoice({ id: 'id' });
from hanzoai.cloud import ApiClient, Configuration
from hanzoai.cloud.api import BillingApi

client = ApiClient(Configuration(access_token=os.environ["HANZO_API_KEY"]))
result = BillingApi(client).collect_invoice(id='id')
cfg := hanzoai.NewConfiguration()
cfg.AddDefaultHeader("Authorization", "Bearer "+os.Getenv("HANZO_API_KEY"))
client := hanzoai.NewAPIClient(cfg)

resp, _, err := client.BillingAPI.CollectInvoice(context.Background()).Execute()
if err != nil {
	return err
}
use hanzo_client::apis::{configuration::Configuration, billing_api};

let mut cfg = Configuration::new();
cfg.bearer_access_token = std::env::var("HANZO_API_KEY").ok();

let result = billing_api::collect_invoice(&cfg, Default::default()).await?;
import ai.hanzo.cloud.ApiClient;
import ai.hanzo.cloud.api.BillingApi;

ApiClient client = new ApiClient();
client.setBearerToken(System.getenv("HANZO_API_KEY"));

var result = new BillingApi(client).collectInvoice();
curl -X POST https://api.hanzo.ai/v1/billing/invoices/<id>/collect \
  -H "Authorization: Bearer $HANZO_API_KEY"

Tool billing, op collectInvoice — POST the JSON-RPC envelope to https://api.hanzo.ai/v1/mcp.

curl -X POST https://api.hanzo.ai/v1/mcp \
  -H "Authorization: Bearer $HANZO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
       "jsonrpc": "2.0",
       "id": 1,
       "method": "tools/call",
       "params": {
         "name": "billing",
         "arguments": {
           "op": "collectInvoice",
           "input": {
             "id": "<id>"
           }
         }
       }
     }'

Billing API · All Hanzo APIs · Interactive reference

Was this page useful?