Invoices API
Invoices bill your clients for work performed. They can be created from time entries, fixed fees, retainer fees, or manual line items. Vantage handles PDF generation, email delivery, and payment tracking.
The Invoice Object
{
"id": "inv_cuid123456",
"invoice_number": "INV-2026-0042",
"client_id": "cli_xxxxx",
"contact_id": "con_xxxxx",
"agreement_id": null,
"status": "sent",
"dates": {
"invoice_date": "2026-01-25",
"due_date": "2026-02-24",
"sent_at": "2026-01-25T10:30:00Z",
"viewed_at": "2026-01-25T14:15:00Z",
"paid_date": null
},
"amounts": {
"subtotal": 5000.00,
"tax_rate": 0.0825,
"tax_amount": 412.50,
"total": 5412.50,
"amount_paid": 0.00,
"outstanding": 5412.50
},
"subject": "January 2026 Services",
"notes": "Thank you for your business!",
"internal_notes": "Rush project - expedited timeline",
"po_number": "PO-12345",
"payment": {
"method": null,
"reference": null
},
"pdf_url": "https://api.govantage.co/v1/invoices/inv_cuid123456/pdf",
"reminders": {
"last_reminder_at": null,
"reminder_count": 0
},
"approval": {
"required": false,
"approved_at": null,
"approved_by_id": null
},
"created_at": "2026-01-25T09:00:00Z",
"updated_at": "2026-01-25T10:30:00Z"
}Invoice Fields
| Field | Type | Description |
|---|---|---|
id | string | Unique identifier (prefix: inv_) |
invoice_number | string | Auto-generated invoice number |
client_id | string | Required. Associated client |
contact_id | string | Billing contact |
agreement_id | string | Retainer agreement (if applicable) |
status | enum | Invoice status (see below) |
dates | object | Important dates |
amounts | object | Financial totals |
subject | string | Invoice subject/title |
notes | string | Notes visible to client |
internal_notes | string | Internal notes (not on PDF) |
po_number | string | Client’s purchase order number |
payment | object | Payment details |
pdf_url | string | URL to download PDF |
reminders | object | Reminder tracking |
approval | object | Approval workflow (if enabled) |
created_at | datetime | When invoice was created |
updated_at | datetime | When invoice was last updated |
Invoice Status
| Status | Description |
|---|---|
draft | Not yet finalized |
pending_approval | Awaiting internal approval |
approved | Approved, ready to send |
sent | Sent to client |
viewed | Client has viewed |
partial | Partially paid |
paid | Fully paid |
overdue | Past due date, unpaid |
void | Cancelled/voided |
uncollectible | Written off as bad debt |
List Invoices
/v1/invoicesList all invoicesReturns a paginated list of invoices.
Query Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
page | integer | 1 | Page number |
per_page | integer | 20 | Results per page (max: 100) |
client_id | string | Filter by client | |
status | string | Filter by status (comma-separated) | |
from | date | Invoice date from | |
to | date | Invoice date to | |
due_from | date | Due date from | |
due_to | date | Due date to | |
overdue | boolean | Only overdue invoices | |
search | string | Search by number or subject | |
sort | string | invoice_date | Sort by: invoice_date, due_date, total, status |
order | string | desc | Sort order: asc, desc |
Request
curl "https://api.govantage.co/v1/invoices?status=sent,overdue&from=2026-01-01" \
-H "Authorization: Bearer vnt_sk_live_xxxxx"Response
{
"data": [
{
"id": "inv_cuid123456",
"invoice_number": "INV-2026-0042",
"client_id": "cli_xxxxx",
"client_name": "Acme Corporation",
"status": "sent",
"dates": {
"invoice_date": "2026-01-25",
"due_date": "2026-02-24"
},
"amounts": {
"total": 5412.50,
"outstanding": 5412.50
},
"days_outstanding": 0
}
],
"pagination": {
"page": 1,
"per_page": 20,
"total": 156,
"total_pages": 8
},
"summary": {
"total_invoiced": 125000.00,
"total_outstanding": 45000.00,
"total_overdue": 12500.00,
"count_by_status": {
"draft": 5,
"sent": 12,
"overdue": 3,
"paid": 136
}
}
}Create an Invoice
/v1/invoicesCreate a new invoiceRequest Body
| Field | Type | Required | Description |
|---|---|---|---|
client_id | string | Yes | Client ID |
contact_id | string | No | Billing contact ID |
agreement_id | string | No | Retainer agreement ID |
invoice_date | date | No | Invoice date (default: today) |
due_date | date | No | Due date (default: invoice_date + payment_terms) |
subject | string | No | Invoice subject |
notes | string | No | Notes for client |
internal_notes | string | No | Internal notes |
po_number | string | No | PO number |
tax_rate | decimal | No | Tax rate (e.g., 0.0825 for 8.25%) |
line_items | array | No | Invoice line items |
Line Item Object
| Field | Type | Required | Description |
|---|---|---|---|
description | string | Yes | Line item description |
quantity | decimal | No | Quantity (default: 1) |
rate | decimal | Yes | Unit rate |
amount | decimal | No | Total (auto-calculated if not provided) |
time_entry_ids | array | No | Time entries to include |
expense_ids | array | No | Expenses to include |
Request
curl -X POST "https://api.govantage.co/v1/invoices" \
-H "Authorization: Bearer vnt_sk_live_xxxxx" \
-H "Content-Type: application/json" \
-d '{
"client_id": "cli_xxxxx",
"subject": "January 2026 Development Services",
"invoice_date": "2026-01-31",
"tax_rate": 0.0825,
"line_items": [
{
"description": "Website Development - January 2026",
"quantity": 32.5,
"rate": 150.00
},
{
"description": "Server Hosting (Monthly)",
"quantity": 1,
"rate": 250.00
}
],
"notes": "Thank you for your business!"
}'Response
{
"data": {
"id": "inv_cuid789012",
"invoice_number": "INV-2026-0043",
"client_id": "cli_xxxxx",
"status": "draft",
"dates": {
"invoice_date": "2026-01-31",
"due_date": "2026-03-02"
},
"amounts": {
"subtotal": 5125.00,
"tax_rate": 0.0825,
"tax_amount": 422.81,
"total": 5547.81,
"amount_paid": 0.00,
"outstanding": 5547.81
},
"line_items": [
{
"id": "line_xxxxx",
"description": "Website Development - January 2026",
"quantity": 32.5,
"rate": 150.00,
"amount": 4875.00
},
{
"id": "line_yyyyy",
"description": "Server Hosting (Monthly)",
"quantity": 1,
"rate": 250.00,
"amount": 250.00
}
],
"created_at": "2026-01-25T10:30:00Z"
}
}Create from Unbilled Time
/v1/invoices/from-timeCreate invoice from unbilled time entriesCreates an invoice with line items automatically generated from unbilled time entries.
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
client_id | string | Yes | Client ID |
from | date | Yes | Time entries from date |
to | date | Yes | Time entries to date |
project_id | string | No | Filter to specific project |
group_by | string | No | none, project, ticket, user, date |
include_expenses | boolean | No | Include unbilled expenses |
Request
curl -X POST "https://api.govantage.co/v1/invoices/from-time" \
-H "Authorization: Bearer vnt_sk_live_xxxxx" \
-H "Content-Type: application/json" \
-d '{
"client_id": "cli_xxxxx",
"from": "2026-01-01",
"to": "2026-01-31",
"group_by": "project",
"include_expenses": true
}'Response
{
"data": {
"id": "inv_cuid789012",
"invoice_number": "INV-2026-0044",
"amounts": {
"subtotal": 8750.00,
"total": 8750.00
},
"line_items": [
{
"description": "Website Redesign - Development Services",
"quantity": 45.5,
"rate": 150.00,
"amount": 6825.00,
"time_entry_count": 23
},
{
"description": "Mobile App - Development Services",
"quantity": 12.5,
"rate": 150.00,
"amount": 1875.00,
"time_entry_count": 8
},
{
"description": "Hosting fees (expense)",
"quantity": 1,
"rate": 50.00,
"amount": 50.00,
"expense_count": 1
}
],
"summary": {
"time_entries_included": 31,
"expenses_included": 1,
"hours_billed": 58.0
}
}
}Get an Invoice
/v1/invoices/:idRetrieve an invoice by IDPath Parameters
| Parameter | Description |
|---|---|
id | The invoice ID |
Query Parameters
| Parameter | Type | Description |
|---|---|---|
include | string | Comma-separated: line_items, client, contact, time_entries, payments |
Request
curl "https://api.govantage.co/v1/invoices/inv_cuid123456?include=line_items,client" \
-H "Authorization: Bearer vnt_sk_live_xxxxx"Update an Invoice
/v1/invoices/:idUpdate an invoiceOnly draft invoices can have amounts modified. Sent invoices can only update internal_notes and po_number.
Request
curl -X PUT "https://api.govantage.co/v1/invoices/inv_cuid123456" \
-H "Authorization: Bearer vnt_sk_live_xxxxx" \
-H "Content-Type: application/json" \
-d '{
"subject": "January 2026 Services - Updated",
"notes": "Payment via ACH preferred"
}'Send an Invoice
/v1/invoices/:id/sendSend an invoice to the clientSends the invoice via email and changes status to sent.
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
to | array | No | Email addresses (defaults to billing contact) |
cc | array | No | CC email addresses |
bcc | array | No | BCC email addresses |
message | string | No | Custom email message |
attach_pdf | boolean | No | Attach PDF (default: true) |
Request
curl -X POST "https://api.govantage.co/v1/invoices/inv_cuid123456/send" \
-H "Authorization: Bearer vnt_sk_live_xxxxx" \
-H "Content-Type: application/json" \
-d '{
"to": ["billing@acme.com"],
"cc": ["john@acme.com"],
"message": "Please find attached your invoice for January services."
}'Response
{
"data": {
"id": "inv_cuid123456",
"status": "sent",
"dates": {
"sent_at": "2026-01-25T10:30:00Z"
},
"email_sent_to": ["billing@acme.com"]
}
}Record Payment
/v1/invoices/:id/paymentsRecord a paymentRequest Body
| Field | Type | Required | Description |
|---|---|---|---|
amount | decimal | Yes | Payment amount |
date | date | No | Payment date (default: today) |
method | string | No | credit_card, ach, check, wire, other |
reference | string | No | Payment reference/check number |
notes | string | No | Payment notes |
Request
curl -X POST "https://api.govantage.co/v1/invoices/inv_cuid123456/payments" \
-H "Authorization: Bearer vnt_sk_live_xxxxx" \
-H "Content-Type: application/json" \
-d '{
"amount": 5412.50,
"date": "2026-02-15",
"method": "ach",
"reference": "ACH-789456"
}'Response
{
"data": {
"id": "inv_cuid123456",
"status": "paid",
"amounts": {
"total": 5412.50,
"amount_paid": 5412.50,
"outstanding": 0.00
},
"payment": {
"method": "ach",
"reference": "ACH-789456"
},
"dates": {
"paid_date": "2026-02-15"
}
}
}Download PDF
/v1/invoices/:id/pdfDownload invoice PDFReturns the invoice as a PDF file.
curl "https://api.govantage.co/v1/invoices/inv_cuid123456/pdf" \
-H "Authorization: Bearer vnt_sk_live_xxxxx" \
-o invoice.pdfSend Reminder
/v1/invoices/:id/remindSend payment reminderSends a payment reminder email for overdue invoices.
curl -X POST "https://api.govantage.co/v1/invoices/inv_cuid123456/remind" \
-H "Authorization: Bearer vnt_sk_live_xxxxx" \
-H "Content-Type: application/json" \
-d '{
"message": "Friendly reminder that your invoice is now overdue."
}'Void an Invoice
/v1/invoices/:id/voidVoid an invoiceVoids the invoice and releases any associated time entries back to unbilled status.
Voiding an invoice with recorded payments is not allowed. Refund payments first.
curl -X POST "https://api.govantage.co/v1/invoices/inv_cuid123456/void" \
-H "Authorization: Bearer vnt_sk_live_xxxxx" \
-H "Content-Type: application/json" \
-d '{
"reason": "Duplicate invoice created in error"
}'Duplicate Invoice
/v1/invoices/:id/duplicateCreate a copy of an invoiceCreates a new draft invoice with the same line items.
curl -X POST "https://api.govantage.co/v1/invoices/inv_cuid123456/duplicate" \
-H "Authorization: Bearer vnt_sk_live_xxxxx"Line Items
Add Line Item
/v1/invoices/:id/line-itemsAdd a line itemcurl -X POST "https://api.govantage.co/v1/invoices/inv_cuid123456/line-items" \
-H "Authorization: Bearer vnt_sk_live_xxxxx" \
-H "Content-Type: application/json" \
-d '{
"description": "Additional development work",
"quantity": 5,
"rate": 150.00
}'Update Line Item
/v1/invoices/:id/line-items/:line_idUpdate a line itemDelete Line Item
/v1/invoices/:id/line-items/:line_idRemove a line itemAging Report
/v1/invoices/agingGet accounts receivable agingcurl "https://api.govantage.co/v1/invoices/aging" \
-H "Authorization: Bearer vnt_sk_live_xxxxx"Response
{
"data": {
"as_of": "2026-01-25",
"total_outstanding": 85000.00,
"buckets": {
"current": 25000.00,
"1_30_days": 35000.00,
"31_60_days": 15000.00,
"61_90_days": 5000.00,
"over_90_days": 5000.00
},
"by_client": [
{
"client_id": "cli_xxxxx",
"client_name": "Acme Corporation",
"total": 15000.00,
"current": 10000.00,
"1_30_days": 5000.00
}
]
}
}Webhooks
Subscribe to invoice events:
| Event | Description |
|---|---|
invoice.created | New invoice created |
invoice.sent | Invoice sent to client |
invoice.viewed | Client viewed invoice |
invoice.paid | Invoice fully paid |
invoice.partial_payment | Partial payment received |
invoice.overdue | Invoice became overdue |
invoice.voided | Invoice voided |
Next Steps
- Clients API - Manage client billing settings
- Time Entries API - Log billable time
- Agreements API - Manage retainers