Invoice routes: bill, collect, refund, void
The Invoice Verbs bill, collect, refund, void as api.sb routes, with inputs, result, refusals and an example.
Reference for Invoice, one group of Invoice routes.
Invoice.bill
Bill finalizes an Invoice and presents it to the Customer for payment. Verb page.
POST /{namespace}/ invoices/ {invoice}/ billPath: invoice. Emits Invoice.billed.
Inputs
| Input | Type | Required | Description |
|---|---|---|---|
invoice | Invoice | required | The draft Invoice. |
Returns
| Output | Type | Required | Description |
|---|---|---|---|
invoice | Invoice | required | The open Invoice. |
Refuses when
| Check | Error | Fix | Then call |
|---|---|---|---|
| The key is valid, but its scopes do not allow this operation. | forbidden | Use a key whose scopes cover the operation, or ask an owner of the namespace to grant them. | None. |
| The record is not in a state that allows this Verb, so the call is refused. | refused | Read the record, run the Verb that moves it to an allowed state, then retry. | None. |
Example
curl -X POST https: //api.sb/ leaseline.app/ invoices/ inv_KjgRxmhMzZ/ bill \
-H "Authorization: Bearer $STARTUP_BUILDER_API_KEY"{
"api": "https: //api.sb/ leaseline.app",
"invoice": {
"$id": "https: //api.sb/ leaseline.app/ invoices/ inv_KjgRxmhMzZ",
"$type": "Invoice",
"total": {
"amount": 99,
"currency": "USD"
},
"due": "2026-11-01"
},
"action": {
"$id": "https: //api.sb/ leaseline.app/ actions/ act_br07HsG8MG",
"operation": "Invoice.bill",
"status": "done"
},
"links": {
"self": "https: //api.sb/ leaseline.app/ actions/ act_br07HsG8MG"
}
}Invoice.collect
Collect charges a Customer’s saved payment method for an open Invoice and retries on failure. Verb page.
POST /{namespace}/ invoices/ {invoice}/ collectPath: invoice. Emits Invoice.collected.
Inputs
| Input | Type | Required | Description |
|---|---|---|---|
invoice | Invoice | required | The open Invoice. |
Returns
| Output | Type | Required | Description |
|---|---|---|---|
invoice | Invoice | required | The paid Invoice. |
Refuses when
| Check | Error | Fix | Then call |
|---|---|---|---|
| The operation is part of an Offer the caller has not accepted or paid for. | payment-required | Accept the Offer named in the response, then retry the call. | Offer.accept |
| The key is valid, but its scopes do not allow this operation. | forbidden | Use a key whose scopes cover the operation, or ask an owner of the namespace to grant them. | None. |
| The record is not in a state that allows this Verb, so the call is refused. | refused | Read the record, run the Verb that moves it to an allowed state, then retry. | None. |
Example
curl -X POST https: //api.sb/ leaseline.app/ invoices/ inv_FXANyzQojc/ collect \
-H "Authorization: Bearer $STARTUP_BUILDER_API_KEY"{
"api": "https: //api.sb/ leaseline.app",
"invoice": {
"$id": "https: //api.sb/ leaseline.app/ invoices/ inv_FXANyzQojc",
"$type": "Invoice",
"total": {
"amount": 29,
"currency": "USD"
},
"due": "2026-10-13"
},
"action": {
"$id": "https: //api.sb/ leaseline.app/ actions/ act_br07HsG8MG",
"operation": "Invoice.collect",
"status": "done"
},
"links": {
"self": "https: //api.sb/ leaseline.app/ actions/ act_br07HsG8MG"
}
}Invoice.refund
Refund returns all or part of a paid Invoice to the Customer’s original payment method and posts the reversing Entries. Verb page.
POST /{namespace}/ invoices/ {invoice}/ refundPath: invoice. Body, as JSON: the other inputs. Emits Invoice.refunded.
Inputs
| Input | Type | Required | Description |
|---|---|---|---|
invoice | Invoice | required | The paid Invoice. |
amount | money | The amount. Defaults to the full payment; pro rata takes the unused part of the Period. | |
reason | text | required | Why the money goes back, kept on the Invoice. |
Returns
| Output | Type | Required | Description |
|---|---|---|---|
invoice | Invoice | required | The Invoice, with its refunded amount. |
Refuses when
| Check | Error | Fix | Then call |
|---|---|---|---|
| The key is valid, but its scopes do not allow this operation. | forbidden | Use a key whose scopes cover the operation, or ask an owner of the namespace to grant them. | None. |
| A Dispute on the Invoice is open | refused | Clear what the check names, then call it again. | None. |
Example
curl -X POST https: //api.sb/ leaseline.app/ invoices/ inv_9sfvgeRT7L/ refund \
-H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
-H "Content-Type: application/ json" \
-d '{"reason": "Example reason"}'{
"api": "https: //api.sb/ leaseline.app",
"invoice": {
"$id": "https: //api.sb/ leaseline.app/ invoices/ inv_9sfvgeRT7L",
"$type": "Invoice",
"total": {
"amount": 99,
"currency": "USD"
},
"due": "2026-10-01"
},
"action": {
"$id": "https: //api.sb/ leaseline.app/ actions/ act_br07HsG8MG",
"operation": "Invoice.refund",
"status": "done"
},
"links": {
"self": "https: //api.sb/ leaseline.app/ actions/ act_br07HsG8MG"
}
}Invoice.void
Void cancels an unpaid Invoice, keeps it on record, and posts the reversing Entries. Verb page.
POST /{namespace}/ invoices/ {invoice}/ voidPath: invoice. Body, as JSON: the other inputs. Emits Invoice.voided.
Inputs
| Input | Type | Required | Description |
|---|---|---|---|
invoice | Invoice | required | The unpaid Invoice. |
reason | text | required | Why the amount is no longer due. |
Returns
| Output | Type | Required | Description |
|---|---|---|---|
invoice | Invoice | required | The voided Invoice, kept forever. |
Refuses when
| Check | Error | Fix | Then call |
|---|---|---|---|
| The key is valid, but its scopes do not allow this operation. | forbidden | Use a key whose scopes cover the operation, or ask an owner of the namespace to grant them. | None. |
| The record changed since it was read, so the write would overwrite a newer version. | conflict | Read the record again, then retry the write against its current state. | None. |
| The record is not in a state that allows this Verb, so the call is refused. | refused | Read the record, run the Verb that moves it to an allowed state, then retry. | None. |
Example
curl -X POST https: //api.sb/ leaseline.app/ invoices/ inv_KjgRxmhMzZ/ void \
-H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
-H "Content-Type: application/ json" \
-d '{"reason": "Example reason"}'{
"api": "https: //api.sb/ leaseline.app",
"invoice": {
"$id": "https: //api.sb/ leaseline.app/ invoices/ inv_KjgRxmhMzZ",
"$type": "Invoice",
"total": {
"amount": 99,
"currency": "USD"
},
"due": "2026-11-01"
},
"action": {
"$id": "https: //api.sb/ leaseline.app/ actions/ act_br07HsG8MG",
"operation": "Invoice.void",
"status": "done"
},
"links": {
"self": "https: //api.sb/ leaseline.app/ actions/ act_br07HsG8MG"
}
}