Skip to main content
Skip to Content

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

FieldTypeDescription
idstringUnique identifier (prefix: inv_)
invoice_numberstringAuto-generated invoice number
client_idstringRequired. Associated client
contact_idstringBilling contact
agreement_idstringRetainer agreement (if applicable)
statusenumInvoice status (see below)
datesobjectImportant dates
amountsobjectFinancial totals
subjectstringInvoice subject/title
notesstringNotes visible to client
internal_notesstringInternal notes (not on PDF)
po_numberstringClient’s purchase order number
paymentobjectPayment details
pdf_urlstringURL to download PDF
remindersobjectReminder tracking
approvalobjectApproval workflow (if enabled)
created_atdatetimeWhen invoice was created
updated_atdatetimeWhen invoice was last updated

Invoice Status

StatusDescription
draftNot yet finalized
pending_approvalAwaiting internal approval
approvedApproved, ready to send
sentSent to client
viewedClient has viewed
partialPartially paid
paidFully paid
overduePast due date, unpaid
voidCancelled/voided
uncollectibleWritten off as bad debt

List Invoices

GET/v1/invoicesList all invoices

Returns a paginated list of invoices.

Query Parameters

ParameterTypeDefaultDescription
pageinteger1Page number
per_pageinteger20Results per page (max: 100)
client_idstringFilter by client
statusstringFilter by status (comma-separated)
fromdateInvoice date from
todateInvoice date to
due_fromdateDue date from
due_todateDue date to
overduebooleanOnly overdue invoices
searchstringSearch by number or subject
sortstringinvoice_dateSort by: invoice_date, due_date, total, status
orderstringdescSort 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

POST/v1/invoicesCreate a new invoice

Request Body

FieldTypeRequiredDescription
client_idstringYesClient ID
contact_idstringNoBilling contact ID
agreement_idstringNoRetainer agreement ID
invoice_datedateNoInvoice date (default: today)
due_datedateNoDue date (default: invoice_date + payment_terms)
subjectstringNoInvoice subject
notesstringNoNotes for client
internal_notesstringNoInternal notes
po_numberstringNoPO number
tax_ratedecimalNoTax rate (e.g., 0.0825 for 8.25%)
line_itemsarrayNoInvoice line items

Line Item Object

FieldTypeRequiredDescription
descriptionstringYesLine item description
quantitydecimalNoQuantity (default: 1)
ratedecimalYesUnit rate
amountdecimalNoTotal (auto-calculated if not provided)
time_entry_idsarrayNoTime entries to include
expense_idsarrayNoExpenses 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

POST/v1/invoices/from-timeCreate invoice from unbilled time entries

Creates an invoice with line items automatically generated from unbilled time entries.

Request Body

FieldTypeRequiredDescription
client_idstringYesClient ID
fromdateYesTime entries from date
todateYesTime entries to date
project_idstringNoFilter to specific project
group_bystringNonone, project, ticket, user, date
include_expensesbooleanNoInclude 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

GET/v1/invoices/:idRetrieve an invoice by ID

Path Parameters

ParameterDescription
idThe invoice ID

Query Parameters

ParameterTypeDescription
includestringComma-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

PUT/v1/invoices/:idUpdate an invoice

Only 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

POST/v1/invoices/:id/sendSend an invoice to the client

Sends the invoice via email and changes status to sent.

Request Body

FieldTypeRequiredDescription
toarrayNoEmail addresses (defaults to billing contact)
ccarrayNoCC email addresses
bccarrayNoBCC email addresses
messagestringNoCustom email message
attach_pdfbooleanNoAttach 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

POST/v1/invoices/:id/paymentsRecord a payment

Request Body

FieldTypeRequiredDescription
amountdecimalYesPayment amount
datedateNoPayment date (default: today)
methodstringNocredit_card, ach, check, wire, other
referencestringNoPayment reference/check number
notesstringNoPayment 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

GET/v1/invoices/:id/pdfDownload invoice PDF

Returns 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.pdf

Send Reminder

POST/v1/invoices/:id/remindSend payment reminder

Sends 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

POST/v1/invoices/:id/voidVoid an invoice

Voids 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

POST/v1/invoices/:id/duplicateCreate a copy of an invoice

Creates 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

POST/v1/invoices/:id/line-itemsAdd a line item
curl -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

PUT/v1/invoices/:id/line-items/:line_idUpdate a line item

Delete Line Item

DELETE/v1/invoices/:id/line-items/:line_idRemove a line item

Aging Report

GET/v1/invoices/agingGet accounts receivable aging
curl "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:

EventDescription
invoice.createdNew invoice created
invoice.sentInvoice sent to client
invoice.viewedClient viewed invoice
invoice.paidInvoice fully paid
invoice.partial_paymentPartial payment received
invoice.overdueInvoice became overdue
invoice.voidedInvoice voided

Next Steps