cURL
curl "https://invoice.horizonpay.co/api/v1/invoice-items?invoice=in_Pb2Xk7Mv4Qs9Lr1Wd6Tn3Fh8" \
-H "Authorization: Bearer $INVOICE_AI_API_KEY"import InvoiceAI from '@horizonpay/invoice-ai'
const invoiceai = new InvoiceAI() // reads INVOICE_AI_API_KEY
for await (const item of invoiceai.invoiceItems.list({
invoice: 'in_Pb2Xk7Mv4Qs9Lr1Wd6Tn3Fh8',
})) {
console.log(item.description, item.amount)
}from invoice_ai import InvoiceAI
client = InvoiceAI() # reads INVOICE_AI_API_KEY
for item in client.invoice_items.list(invoice="in_Pb2Xk7Mv4Qs9Lr1Wd6Tn3Fh8"):
print(item.description, item.amount){
"data": [
{
"id": "ii_Da4Vq9Ns2Kx7Bm3Yt8Rc1Lp6",
"object": "invoiceitem",
"price": "price_Jc5Tn8Wq1Ze6Ra3Ym9Ub2Gs7",
"product": "prod_Hy7Rq2Lm9Xc4Vb8Nt3Kd6Pw1",
"description": "Consulting retainer",
"quantity": 1,
"unit": "NOS",
"unit_amount": 2500000,
"amount": 2500000,
"discount_percent": 0,
"tax_rate": 0,
"tax_amount": 0
},
{
"id": "ii_Ew8Hz3Jc6Tq1Ms5Nv9Kb2Xr4",
"object": "invoiceitem",
"price": null,
"product": null,
"description": "Onboarding workshop",
"quantity": 1,
"unit": "NOS",
"unit_amount": 50000,
"amount": 50000,
"discount_percent": 0,
"tax_rate": 0,
"tax_amount": 0
}
]
}{
"type": "https://invoice.horizonpay.co/problems/unauthorized",
"title": "Unauthorized",
"status": 401,
"detail": "Send your API key as `Authorization: Bearer inv_live_…`.",
"instance": "req_7f3c9a1e2b4d4e8a9c6f2d1b0a3e5f71",
"code": "unauthorized"
}{
"type": "https://invoice.horizonpay.co/problems/forbidden",
"title": "Insufficient scope",
"status": 403,
"detail": "This credential is missing the invoices:write scope.",
"instance": "req_7f3c9a1e2b4d4e8a9c6f2d1b0a3e5f71",
"code": "forbidden"
}{
"type": "https://invoice.horizonpay.co/problems/not-found",
"title": "Not found",
"status": 404,
"detail": "Invoice not found.",
"instance": "req_7f3c9a1e2b4d4e8a9c6f2d1b0a3e5f71",
"code": "not_found"
}{
"type": "https://invoice.horizonpay.co/problems/validation",
"title": "Validation failed",
"status": 422,
"detail": "Some fields need attention.",
"instance": "req_7f3c9a1e2b4d4e8a9c6f2d1b0a3e5f71",
"code": "validation",
"errors": [
{
"path": "invoice",
"message": "Pick an invoice"
}
]
}{
"type": "https://invoice.horizonpay.co/problems/rate-limited",
"title": "Too many requests",
"status": 429,
"detail": "Rate limit of 120 per 60s exceeded.",
"instance": "req_7f3c9a1e2b4d4e8a9c6f2d1b0a3e5f71",
"code": "rate_limited"
}Invoice items
List invoice items
Returns every line of one invoice, in order. invoice is required; the result is not paginated.
Scope: invoices:read
GET
/
invoice-items
cURL
curl "https://invoice.horizonpay.co/api/v1/invoice-items?invoice=in_Pb2Xk7Mv4Qs9Lr1Wd6Tn3Fh8" \
-H "Authorization: Bearer $INVOICE_AI_API_KEY"import InvoiceAI from '@horizonpay/invoice-ai'
const invoiceai = new InvoiceAI() // reads INVOICE_AI_API_KEY
for await (const item of invoiceai.invoiceItems.list({
invoice: 'in_Pb2Xk7Mv4Qs9Lr1Wd6Tn3Fh8',
})) {
console.log(item.description, item.amount)
}from invoice_ai import InvoiceAI
client = InvoiceAI() # reads INVOICE_AI_API_KEY
for item in client.invoice_items.list(invoice="in_Pb2Xk7Mv4Qs9Lr1Wd6Tn3Fh8"):
print(item.description, item.amount){
"data": [
{
"id": "ii_Da4Vq9Ns2Kx7Bm3Yt8Rc1Lp6",
"object": "invoiceitem",
"price": "price_Jc5Tn8Wq1Ze6Ra3Ym9Ub2Gs7",
"product": "prod_Hy7Rq2Lm9Xc4Vb8Nt3Kd6Pw1",
"description": "Consulting retainer",
"quantity": 1,
"unit": "NOS",
"unit_amount": 2500000,
"amount": 2500000,
"discount_percent": 0,
"tax_rate": 0,
"tax_amount": 0
},
{
"id": "ii_Ew8Hz3Jc6Tq1Ms5Nv9Kb2Xr4",
"object": "invoiceitem",
"price": null,
"product": null,
"description": "Onboarding workshop",
"quantity": 1,
"unit": "NOS",
"unit_amount": 50000,
"amount": 50000,
"discount_percent": 0,
"tax_rate": 0,
"tax_amount": 0
}
]
}{
"type": "https://invoice.horizonpay.co/problems/unauthorized",
"title": "Unauthorized",
"status": 401,
"detail": "Send your API key as `Authorization: Bearer inv_live_…`.",
"instance": "req_7f3c9a1e2b4d4e8a9c6f2d1b0a3e5f71",
"code": "unauthorized"
}{
"type": "https://invoice.horizonpay.co/problems/forbidden",
"title": "Insufficient scope",
"status": 403,
"detail": "This credential is missing the invoices:write scope.",
"instance": "req_7f3c9a1e2b4d4e8a9c6f2d1b0a3e5f71",
"code": "forbidden"
}{
"type": "https://invoice.horizonpay.co/problems/not-found",
"title": "Not found",
"status": 404,
"detail": "Invoice not found.",
"instance": "req_7f3c9a1e2b4d4e8a9c6f2d1b0a3e5f71",
"code": "not_found"
}{
"type": "https://invoice.horizonpay.co/problems/validation",
"title": "Validation failed",
"status": 422,
"detail": "Some fields need attention.",
"instance": "req_7f3c9a1e2b4d4e8a9c6f2d1b0a3e5f71",
"code": "validation",
"errors": [
{
"path": "invoice",
"message": "Pick an invoice"
}
]
}{
"type": "https://invoice.horizonpay.co/problems/rate-limited",
"title": "Too many requests",
"status": 429,
"detail": "Rate limit of 120 per 60s exceeded.",
"instance": "req_7f3c9a1e2b4d4e8a9c6f2d1b0a3e5f71",
"code": "rate_limited"
}Authorizations
An Invoice-AI API key sent as Authorization: Bearer inv_live_….
Create keys in Settings → API keys; the secret is shown once. Each key carries scopes, and every operation lists the scope it needs (x-required-scope):
business:read— Read your business profile, tax ID and bank detailsclients:read— List and read your clientsclients:write— Create, update and archive clientsproducts:read— List and read products and pricesproducts:write— Create, update and archive products and pricesinvoices:read— List and read invoices, including PDFsinvoices:write— Create, edit and delete draftsinvoices:finalize— Finalize invoices and void theminvoices:send— Email invoices to your clientspayments:write— Mark invoices as paidwebhooks:manage— Manage webhook endpoints
Keys cannot be created or revoked through the API, so a leaked key cannot mint more keys.
Query Parameters
The invoice, in_… or UUID.
Example:
"in_Pb2Xk7Mv4Qs9Lr1Wd6Tn3Fh8"
Response
The invoice lines.
The lines, in order.
Show child attributes
Show child attributes