List payments
Returns the caller org's tax year as a PAYER: every payment it made to another org in that calendar year, on any rail, as the event plane records it, each classified — reportable or not, in which 1099 box, and the rule that decided it, with its source — and each payee's totals tested against the year's threshold.
GET /v1/tax/payments
| Address | https://api.hanzo.ai/v1/tax/payments |
| Method | GET |
| Operation | get_tax_payments |
| Auth | Authorization: Bearer $HANZO_API_KEY |
Returns the caller org's tax year as a PAYER: every payment it made to another org in that calendar year, on any rail, as the event plane records it, each classified — reportable or not, in which 1099 box, and the rule that decided it, with its source — and each payee's totals tested against the year's threshold.
The rules applied: a payment settled by a card or a third-party settlement network is reported on Form 1099-K by the settlement entity, not here; a payment for merchandise is not reported; a payment to a corporation is generally not reported, except for legal services; a payment in a digital asset is reported at its fair market value on the date paid; a box is reported only at or above the year's threshold — 2,000 for 2026 under P.L. 119-21, and not guessed for a year the IRS has not yet published. A payee's classification comes only from a W-9 it granted the caller; without one, nothing establishes an exemption.
Org admins only. It reads; it prepares nothing and files nothing.
Request
1 field.
| Field | In | Type | Required | Description |
|---|---|---|---|---|
year | query | integer | — | Year is the calendar year the payments were made in, e.g. 2026. |
Response
| Status | Body | Meaning |
|---|---|---|
200 | tax.Ledger | ok |
default | problem-details | refused |
200 body — 35 fields.
| Field | In | Type | Always | Description |
|---|---|---|---|---|
payees | body | tax.PayeeYear[] | — | Payees is every org the caller paid, by org id. |
payees[].category | body | string | — | Category is what the payer states it bought from this payee; services when it has stated nothing. |
payees[].lines | body | tax.Line[] | — | Lines are the payments, oldest first. |
payees[].lines[].amountCents | body | integer (int64) | — | AmountCents is its fair market value in U.S. dollars on the date paid, in cents — for a U.S. dollar payment, what was paid. |
payees[].lines[].id | body | string | — | ID is the economic event's id. |
payees[].lines[].memo | body | string | — | Memo is what was bought, in the rail's words. |
payees[].lines[].paid | body | integer (int64) | — | Paid is when, unix seconds. |
payees[].lines[].proof | body | string | — | Proof is the rail's own reference for the payment. |
payees[].lines[].rail | body | string | — | Rail is how it moved: x402, ledger, chain, ach, wire, card, network or other. |
payees[].lines[].verdict | body | tax.Verdict | — | |
payees[].lines[].verdict.box | body | tax.Box | — | |
payees[].lines[].verdict.box.box | body | string | — | |
payees[].lines[].verdict.box.kind | body | string | — | |
payees[].lines[].verdict.box.label | body | string | — | |
payees[].lines[].verdict.reportable | body | boolean | — | |
payees[].lines[].verdict.rules | body | tax.Rule[] | — | Rules are every rule that applied, in the order applied — the last one is the verdict's reason. |
payees[].lines[].verdict.rules[].code | body | string | — | Code is the rule's stable name, for a caller that branches on it. |
payees[].lines[].verdict.rules[].reason | body | string | — | Reason is the rule, stated. |
payees[].payee | body | string | — | Payee is the org paid. |
payees[].totals | body | tax.Total[] | — | Totals are the reportable sums by box. |
payees[].totals[].amountCents | body | integer (int64) | — | AmountCents is the reportable payments in this box, summed exactly and then rounded to cents. |
payees[].totals[].box | body | tax.Box | — | |
payees[].totals[].box.box | body | string | — | |
payees[].totals[].box.kind | body | string | — | |
payees[].totals[].box.label | body | string | — | |
payees[].totals[].payments | body | string[] | — | Payments are the ids that sum into it. |
payees[].totals[].reportable | body | boolean | — | Reportable is true when the total is at or above the threshold. |
payees[].totals[].rule | body | tax.Rule | — | |
payees[].totals[].rule.code | body | string | — | Code is the rule's stable name, for a caller that branches on it. |
payees[].totals[].rule.reason | body | string | — | Reason is the rule, stated. |
payees[].totals[].thresholdCents | body | integer (int64) | — | ThresholdCents is the year's threshold for this box. |
payees[].w9 | body | string | — | W9 is where the payer's W-9 request to this payee stands: none, requested, granted, declined or revoked. |
source | body | string | — | Source names where the year's numbers were read. |
thresholdCents | body | integer (int64) | — | ThresholdCents is the §6041(a) threshold for the year. |
year | body | integer (int64) | — | Year is the tax year. |
Failure carries the platform error shape — see Errors.
Examples
hanzo has no subcommand for this operation — the CLI serves only what cloud's live route table confirms. Use HTTP or an SDK.
import { Configuration, TaxApi } from 'hanzoai';
const api = new TaxApi(new Configuration({ accessToken: process.env.HANZO_API_KEY }));
const { data } = await api.getTaxPayments();from hanzoai.cloud import ApiClient, Configuration
from hanzoai.cloud.api import TaxApi
client = ApiClient(Configuration(access_token=os.environ["HANZO_API_KEY"]))
result = TaxApi(client).get_tax_payments()cfg := hanzoai.NewConfiguration()
cfg.AddDefaultHeader("Authorization", "Bearer "+os.Getenv("HANZO_API_KEY"))
client := hanzoai.NewAPIClient(cfg)
resp, _, err := client.TaxAPI.GetTaxPayments(context.Background()).Execute()
if err != nil {
return err
}use hanzo_client::apis::{configuration::Configuration, tax_api};
let mut cfg = Configuration::new();
cfg.bearer_access_token = std::env::var("HANZO_API_KEY").ok();
let result = tax_api::get_tax_payments(&cfg, Default::default()).await?;import ai.hanzo.cloud.ApiClient;
import ai.hanzo.cloud.api.TaxApi;
ApiClient client = new ApiClient();
client.setBearerToken(System.getenv("HANZO_API_KEY"));
var result = new TaxApi(client).getTaxPayments();The method above is the one at the current release of the document. [email protected] (npm) and [email protected] (PyPI) were generated from an earlier release, where this operation carried a different id, so it spells the method differently — regenerating the clients is what makes the two agree. SDKs →
curl https://api.hanzo.ai/v1/tax/payments \
-H "Authorization: Bearer $HANZO_API_KEY"MCP declares no tool for tax — tools/list on https://api.hanzo.ai/v1/mcp names the products it does reach. Use HTTP or an SDK.
How is this guide?