Manage Invoice Ninja clients, invoices, quotes, expenses, tasks and projects.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Convert a quote into a new invoice (the quote is marked converted and links to it). Returns the new invoice. Invoice Ninja: GET /api/v1/quotes/{id}/convert_to_invoice.
The quote's hashed id, e.g. "Wpmbk5ezJn".
The server marks this tool as destructive. Running it may delete or overwrite data on the server or in any account you connected with your headers.
Convert a quote into a new invoice (the quote is marked converted and links to it). Returns the new invoice. Invoice Ninja: GET /api/v1/quotes/{id}/convert_to_invoice.
| Argument | Type | Description |
|---|---|---|
| quote_id* | string | The quote's hashed id, e.g. "Wpmbk5ezJn". |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"quote_id"
],
"properties": {
"quote_id": {
"type": "string",
"minLength": 1,
"description": "The quote's hashed id, e.g. \"Wpmbk5ezJn\"."
}
}
}Create a client, optionally with contacts. Give at least a name or one contact. Invoice Ninja: POST /api/v1/clients.
| Argument | Type | Description |
|---|---|---|
| city | string | |
| name | string | Client company / display name. |
| phone | string | |
| state | string | |
| website | string | |
| address1 | string | |
| address2 | string | |
| contacts | array | People at the client; the first is the primary contact. |
| id_number | string | Your own id / registration number for this client. |
| country_id | string | Country as its ISO 3166-1 NUMERIC code, as a string, e.g. "840" (US), "826" (UK), "276" (DE). |
| vat_number | string | |
| postal_code | string | |
| public_notes | string | |
| private_notes | string |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"city": {
"type": "string"
},
"name": {
"type": "string",
"description": "Client company / display name."
},
"phone": {
"type": "string"
},
"state": {
"type": "string"
},
"website": {
"type": "string"
},
"address1": {
"type": "string"
},
"address2": {
"type": "string"
},
"contacts": {
"type": "array",
"items": {
"type": "object",
"properties": {
"email": {
"type": "string",
"description": "Contact email (unique per client)."
},
"phone": {
"type": "string"
},
"last_name": {
"type": "string"
},
"first_name": {
"type": "string"
},
"send_email": {
"type": "boolean",
"description": "Whether this contact receives invoice emails."
}
}
},
"description": "People at the client; the first is the primary contact."
},
"id_number": {
"type": "string",
"description": "Your own id / registration number for this client."
},
"country_id": {
"type": "string",
"description": "Country as its ISO 3166-1 NUMERIC code, as a string, e.g. \"840\" (US), \"826\" (UK), \"276\" (DE)."
},
"vat_number": {
"type": "string"
},
"postal_code": {
"type": "string"
},
"public_notes": {
"type": "string"
},
"private_notes": {
"type": "string"
}
}
}Log an expense, optionally tied to a vendor, client or project and flagged to be re-invoiced. Invoice Ninja: POST /api/v1/expenses.
| Argument | Type | Description |
|---|---|---|
| date | string | Expense date, YYYY-MM-DD. |
| amount* | number | Expense amount. |
| client_id | string | Client to re-bill (hashed id). |
| tax_name1 | string | |
| tax_rate1 | number | |
| vendor_id | string | Vendor (hashed id). |
| project_id | string | Project (hashed id). |
| category_id | string | Expense category (hashed id). |
| currency_id | string | Currency id as a string, e.g. "1" (USD). Omit for the company default. |
| payment_date | string |
Create a DRAFT invoice for a client. It is not sent or emailed — use invoiceninja_mark_invoice_sent or invoiceninja_email_invoice afterwards. Invoice Ninja: POST /api/v1/invoices.
| Argument | Type | Description |
|---|---|---|
| date | string | Document date, YYYY-MM-DD. |
| terms | string | Terms text. |
| footer | string | Footer text. |
| number | string | Document number. Omit to let Invoice Ninja assign the next one. |
| partial | number | Deposit / partial amount due first. |
| discount | number | Document-level discount (amount or percent). |
| due_date | string | Due date (valid-until for quotes), YYYY-MM-DD. |
| client_id* | string | The client's hashed id, e.g. "Wpmbk5ezJn". |
| po_number | string | Purchase order number. |
Create a project for a client, with an optional hourly task rate, budget and due date. Invoice Ninja: POST /api/v1/projects.
| Argument | Type | Description |
|---|---|---|
| name* | string | Project name. |
| color | string | Hex color, e.g. "#1f77b4". |
| due_date | string | Due date, YYYY-MM-DD. |
| client_id* | string | The client's hashed id, e.g. "Wpmbk5ezJn". |
| task_rate | number | Hourly rate for tasks in this project (default 0 = inherit). |
| public_notes | string | |
| private_notes | string | |
| budgeted_hours | number |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"name",
"client_id"
],
"properties": {
"name": {
"type": "string",
"minLength": 1,
"description": "Project name."
},
"color": {
"type": "string",
"description": "Hex color, e.g. \"#1f77b4\"."
},
"due_date": {
"type": "string",
"description": "Due date, YYYY-MM-DD."
},
"client_id": {
"type": "string",
"minLength": 1,
"description": "The client's hashed id, e.g. \"Wpmbk5ezJn\"."
},
"task_rate": {
"type": "number",
"description": "Hourly rate for tasks in this project (default 0 = inherit)."
},
"public_notes": {
"type": "string"
},
"private_notes": {
"type": "string"
},
"budgeted_hours": {
"type": "number"
}
}
}Create a DRAFT quote (estimate) for a client. Nothing is emailed. Invoice Ninja: POST /api/v1/quotes.
| Argument | Type | Description |
|---|---|---|
| date | string | Document date, YYYY-MM-DD. |
| terms | string | Terms text. |
| footer | string | Footer text. |
| number | string | Document number. Omit to let Invoice Ninja assign the next one. |
| partial | number | Deposit / partial amount due first. |
| discount | number | Document-level discount (amount or percent). |
| due_date | string | Due date (valid-until for quotes), YYYY-MM-DD. |
| client_id* | string | The client's hashed id, e.g. "Wpmbk5ezJn". |
| po_number | string | Purchase order number. |
| tax_name1 |
Create a task, optionally with logged time entries, for a client or project. Invoice Ninja: POST /api/v1/tasks.
| Argument | Type | Description |
|---|---|---|
| rate | number | Hourly rate; omit to use the project/client default. |
| due_date | string | Due date, YYYY-MM-DD. |
| time_log | array | Time entries. Entries must not overlap. |
| client_id | string | Client (hashed id). |
| project_id | string | Project (hashed id). |
| description* | string | What the work was. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"description"
],
"properties": {
"rate": {
"type": "number",
"description": "Hourly rate; omit to use the project/client default."
},
"due_date": {
"type": "string",
"description": "Due date, YYYY-MM-DD."
},
"time_log": {
"type": "array",
"items": {
"type": "object",
"required": [
"start",
"end"
],
"properties": {
"end": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "End, Unix timestamp in seconds (0 = still running)."
},
"start": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Start, Unix timestamp in seconds."
},
"billable": {
"type": "boolean",
"description": "Whether this entry is billable."
},
"description": {
"type": "string",
"description": "Note for this time entry."
}
}
},
"description": "Time entries. Entries must not overlap."
},
"client_id": {
"type": "string",
"description": "Client (hashed id)."
},
"project_id": {
"type": "string",
"description": "Project (hashed id)."
},
"description": {
"type": "string",
"minLength": 1,
"description": "What the work was."
}
}
}OUTWARD-FACING: sends a real email with the invoice to the client's invited contacts, and marks the invoice sent. Cannot be unsent — confirm with the user first. Invoice Ninja: POST /api/v1/invoices/bulk with action=email.
| Argument | Type | Description |
|---|---|---|
| email_type | string | Which email template to send (default: the invoice template). |
| invoice_id* | string | The invoice's hashed id, e.g. "Wpmbk5ezJn". |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"invoice_id"
],
"properties": {
"email_type": {
"enum": [
"invoice",
"reminder1",
"reminder2",
"reminder3",
"reminder_endless",
"custom1",
"custom2",
"custom3"
],
"type": "string",
"description": "Which email template to send (default: the invoice template)."
},
"invoice_id": {
"type": "string",
"minLength": 1,
"description": "The invoice's hashed id, e.g. \"Wpmbk5ezJn\"."
}
}
}Fetch one client by id, with contacts, address, balance and paid-to-date. Invoice Ninja: GET /api/v1/clients/{id}.
| Argument | Type | Description |
|---|---|---|
| client_id* | string | The client's hashed id, e.g. "Wpmbk5ezJn". |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"client_id"
],
"properties": {
"client_id": {
"type": "string",
"minLength": 1,
"description": "The client's hashed id, e.g. \"Wpmbk5ezJn\"."
}
}
}Fetch one invoice by id — line items, totals, balance, dates, status and invitations. Invoice Ninja: GET /api/v1/invoices/{id}.
| Argument | Type | Description |
|---|---|---|
| invoice_id* | string | The invoice's hashed id, e.g. "Wpmbk5ezJn". |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"invoice_id"
],
"properties": {
"invoice_id": {
"type": "string",
"minLength": 1,
"description": "The invoice's hashed id, e.g. \"Wpmbk5ezJn\"."
}
}
}Fetch one quote by id — line items, totals, status and the invoice it was converted to (invoice_id), if any. Invoice Ninja: GET /api/v1/quotes/{id}.
| Argument | Type | Description |
|---|---|---|
| quote_id* | string | The quote's hashed id, e.g. "Wpmbk5ezJn". |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"quote_id"
],
"properties": {
"quote_id": {
"type": "string",
"minLength": 1,
"description": "The quote's hashed id, e.g. \"Wpmbk5ezJn\"."
}
}
}List clients with balances and contacts, optionally searched by name, email or number. Invoice Ninja: GET /api/v1/clients.
| Argument | Type | Description |
|---|---|---|
| name | string | Only clients whose name matches. |
| page | integer | Page number, starting at 1. |
| sort | string | Sort as "column|asc" or "column|desc", e.g. "number|desc" or "balance|desc". |
| string | Only the client with a contact at this email. | |
| filter | string | Free-text search across name, id number, contact names/emails/phones and custom fields. |
| number | string | Only the client with this client number. |
| status | string | Comma-separated record state: active, archived, deleted (e.g. "active"). Omit for all. |
| balance | string | Balance comparison "op:value", op one of lt, lte, gt, gte, eq, e.g. "gt:0". |
| per_page | integer |
List expenses, filterable by client and invoicing/payment state. Invoice Ninja: GET /api/v1/expenses.
| Argument | Type | Description |
|---|---|---|
| page | integer | Page number, starting at 1. |
| sort | string | Sort as "column|asc" or "column|desc", e.g. "number|desc" or "balance|desc". |
| filter | string | Free-text search across expense fields. |
| number | string | Only the expense with this number. |
| status | string | Comma-separated record state: active, archived, deleted (e.g. "active"). Omit for all. |
| per_page | integer | Records per page, 1-100 (API default 20). |
| client_id | string | Only records for this client (hashed id). |
| client_status | string | Comma-separated: all, logged, pending, invoiced, uninvoiced, paid, unpaid. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"page": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "Page number, starting at 1."
},
"sort": {
"type": "string",
"description": "Sort as \"column|asc\" or \"column|desc\", e.g. \"number|desc\" or \"balance|desc\"."
},
"filter": {
"type": "string",
"description": "Free-text search across expense fields."
},
"number": {
"type": "string",
"description": "Only the expense with this number."
},
"status": {
"type": "string",
"description": "Comma-separated record state: active, archived, deleted (e.g. \"active\"). Omit for all."
},
"per_page": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "Records per page, 1-100 (API default 20)."
},
"client_id": {
"type": "string",
"description": "Only records for this client (hashed id)."
},
"client_status": {
"type": "string",
"description": "Comma-separated: all, logged, pending, invoiced, uninvoiced, paid, unpaid."
}
}
}List invoices, filterable by client and payment status (paid / unpaid / overdue). status_id on each invoice: 1 draft, 2 sent, 3 partial, 4 paid, 5 cancelled, 6 reversed. Invoice Ninja: GET /api/v1/invoices.
| Argument | Type | Description |
|---|---|---|
| page | integer | Page number, starting at 1. |
| sort | string | Sort as "column|asc" or "column|desc", e.g. "number|desc" or "balance|desc". |
| filter | string | Free-text search across number, PO number, date, amount, balance, client name/contacts and line items. |
| number | string | Only the invoice with this number. |
| status | string | Comma-separated record state: active, archived, deleted (e.g. "active"). Omit for all. |
| per_page | integer | Records per page, 1-100 (API default 20). |
| client_id | string | Only records for this client (hashed id). |
| date_range | string | Invoice-date range "YYYY-MM-DD,YYYY-MM-DD". |
| client_status |
List payments received, with amount, date, refunded/applied totals and the invoices each was applied to (paymentables). Read-only: this server never records or refunds payments. Invoice Ninja: GET /api/v1/payments.
| Argument | Type | Description |
|---|---|---|
| page | integer | Page number, starting at 1. |
| sort | string | Sort as "column|asc" or "column|desc", e.g. "number|desc" or "balance|desc". |
| filter | string | Free-text search across amount, date and custom fields. |
| number | string | Only the payment with this number. |
| status | string | Comma-separated record state: active, archived, deleted (e.g. "active"). Omit for all. |
| per_page | integer | Records per page, 1-100 (API default 20). |
| client_id | string | Only records for this client (hashed id). |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"page": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "Page number, starting at 1."
},
"sort": {
"type": "string",
"description": "Sort as \"column|asc\" or \"column|desc\", e.g. \"number|desc\" or \"balance|desc\"."
},
"filter": {
"type": "string",
"description": "Free-text search across amount, date and custom fields."
},
"number": {
"type": "string",
"description": "Only the payment with this number."
},
"status": {
"type": "string",
"description": "Comma-separated record state: active, archived, deleted (e.g. \"active\"). Omit for all."
},
"per_page": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "Records per page, 1-100 (API default 20)."
},
"client_id": {
"type": "string",
"description": "Only records for this client (hashed id)."
}
}
}List products / services in the catalog with price, cost and default taxes. Invoice Ninja: GET /api/v1/products.
| Argument | Type | Description |
|---|---|---|
| page | integer | Page number, starting at 1. |
| sort | string | Sort as "column|asc" or "column|desc", e.g. "number|desc" or "balance|desc". |
| filter | string | Free-text search across product name. |
| status | string | Comma-separated record state: active, archived, deleted (e.g. "active"). Omit for all. |
| per_page | integer | Records per page, 1-100 (API default 20). |
| product_key | string | Only the product with this product key. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"page": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "Page number, starting at 1."
},
"sort": {
"type": "string",
"description": "Sort as \"column|asc\" or \"column|desc\", e.g. \"number|desc\" or \"balance|desc\"."
},
"filter": {
"type": "string",
"description": "Free-text search across product name."
},
"status": {
"type": "string",
"description": "Comma-separated record state: active, archived, deleted (e.g. \"active\"). Omit for all."
},
"per_page": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "Records per page, 1-100 (API default 20)."
},
"product_key": {
"type": "string",
"description": "Only the product with this product key."
}
}
}List projects with client, budgeted hours, task rate, current hours and due date. Invoice Ninja: GET /api/v1/projects.
| Argument | Type | Description |
|---|---|---|
| page | integer | Page number, starting at 1. |
| sort | string | Sort as "column|asc" or "column|desc", e.g. "number|desc" or "balance|desc". |
| filter | string | Free-text search across project name and notes. |
| number | string | Only the project with this number. |
| status | string | Comma-separated record state: active, archived, deleted (e.g. "active"). Omit for all. |
| per_page | integer | Records per page, 1-100 (API default 20). |
| client_id | string | Only records for this client (hashed id). |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"page": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "Page number, starting at 1."
},
"sort": {
"type": "string",
"description": "Sort as \"column|asc\" or \"column|desc\", e.g. \"number|desc\" or \"balance|desc\"."
},
"filter": {
"type": "string",
"description": "Free-text search across project name and notes."
},
"number": {
"type": "string",
"description": "Only the project with this number."
},
"status": {
"type": "string",
"description": "Comma-separated record state: active, archived, deleted (e.g. \"active\"). Omit for all."
},
"per_page": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "Records per page, 1-100 (API default 20)."
},
"client_id": {
"type": "string",
"description": "Only records for this client (hashed id)."
}
}
}List quotes (estimates), filterable by client and quote status. Invoice Ninja: GET /api/v1/quotes.
| Argument | Type | Description |
|---|---|---|
| page | integer | Page number, starting at 1. |
| sort | string | Sort as "column|asc" or "column|desc", e.g. "number|desc" or "balance|desc". |
| filter | string | Free-text search across number and custom fields. |
| number | string | Only the quote with this number. |
| status | string | Comma-separated record state: active, archived, deleted (e.g. "active"). Omit for all. |
| per_page | integer | Records per page, 1-100 (API default 20). |
| client_id | string | Only records for this client (hashed id). |
| client_status | string | Comma-separated quote status: all, draft, sent, approved, expired, upcoming. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"page": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "Page number, starting at 1."
},
"sort": {
"type": "string",
"description": "Sort as \"column|asc\" or \"column|desc\", e.g. \"number|desc\" or \"balance|desc\"."
},
"filter": {
"type": "string",
"description": "Free-text search across number and custom fields."
},
"number": {
"type": "string",
"description": "Only the quote with this number."
},
"status": {
"type": "string",
"description": "Comma-separated record state: active, archived, deleted (e.g. \"active\"). Omit for all."
},
"per_page": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "Records per page, 1-100 (API default 20)."
},
"client_id": {
"type": "string",
"description": "Only records for this client (hashed id)."
},
"client_status": {
"type": "string",
"description": "Comma-separated quote status: all, draft, sent, approved, expired, upcoming."
}
}
}List recurring invoice schedules with frequency, next send date and remaining cycles. Read-only. Invoice Ninja: GET /api/v1/recurring_invoices.
| Argument | Type | Description |
|---|---|---|
| page | integer | Page number, starting at 1. |
| sort | string | Sort as "column|asc" or "column|desc", e.g. "number|desc" or "balance|desc". |
| number | string | Only the recurring invoice with this number. |
| status | string | Comma-separated record state: active, archived, deleted (e.g. "active"). Omit for all. |
| per_page | integer | Records per page, 1-100 (API default 20). |
| client_id | string | Only records for this client (hashed id). |
| client_status | string | Comma-separated: all, active, paused, completed. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"page": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "Page number, starting at 1."
},
"sort": {
"type": "string",
"description": "Sort as \"column|asc\" or \"column|desc\", e.g. \"number|desc\" or \"balance|desc\"."
},
"number": {
"type": "string",
"description": "Only the recurring invoice with this number."
},
"status": {
"type": "string",
"description": "Comma-separated record state: active, archived, deleted (e.g. \"active\"). Omit for all."
},
"per_page": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "Records per page, 1-100 (API default 20)."
},
"client_id": {
"type": "string",
"description": "Only records for this client (hashed id)."
},
"client_status": {
"type": "string",
"description": "Comma-separated: all, active, paused, completed."
}
}
}List tasks / time entries with their time_log, duration, rate and linked client, project and invoice. Invoice Ninja: GET /api/v1/tasks.
| Argument | Type | Description |
|---|---|---|
| page | integer | Page number, starting at 1. |
| sort | string | Sort as "column|asc" or "column|desc", e.g. "number|desc" or "balance|desc". |
| filter | string | Free-text search across task description and custom fields. |
| number | string | Only the task with this number. |
| status | string | Comma-separated record state: active, archived, deleted (e.g. "active"). Omit for all. |
| per_page | integer | Records per page, 1-100 (API default 20). |
| client_id | string | Only records for this client (hashed id). |
| client_status | string | Comma-separated: all, invoiced, uninvoiced, is_running, overdue. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"page": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "Page number, starting at 1."
},
"sort": {
"type": "string",
"description": "Sort as \"column|asc\" or \"column|desc\", e.g. \"number|desc\" or \"balance|desc\"."
},
"filter": {
"type": "string",
"description": "Free-text search across task description and custom fields."
},
"number": {
"type": "string",
"description": "Only the task with this number."
},
"status": {
"type": "string",
"description": "Comma-separated record state: active, archived, deleted (e.g. \"active\"). Omit for all."
},
"per_page": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "Records per page, 1-100 (API default 20)."
},
"client_id": {
"type": "string",
"description": "Only records for this client (hashed id)."
},
"client_status": {
"type": "string",
"description": "Comma-separated: all, invoiced, uninvoiced, is_running, overdue."
}
}
}List vendors (suppliers) with contacts and address. Invoice Ninja: GET /api/v1/vendors.
| Argument | Type | Description |
|---|---|---|
| page | integer | Page number, starting at 1. |
| sort | string | Sort as "column|asc" or "column|desc", e.g. "number|desc" or "balance|desc". |
| filter | string | Free-text search across vendor name and contacts. |
| number | string | Only the vendor with this number. |
| status | string | Comma-separated record state: active, archived, deleted (e.g. "active"). Omit for all. |
| per_page | integer | Records per page, 1-100 (API default 20). |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"page": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "Page number, starting at 1."
},
"sort": {
"type": "string",
"description": "Sort as \"column|asc\" or \"column|desc\", e.g. \"number|desc\" or \"balance|desc\"."
},
"filter": {
"type": "string",
"description": "Free-text search across vendor name and contacts."
},
"number": {
"type": "string",
"description": "Only the vendor with this number."
},
"status": {
"type": "string",
"description": "Comma-separated record state: active, archived, deleted (e.g. \"active\"). Omit for all."
},
"per_page": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "Records per page, 1-100 (API default 20)."
}
}
}Mark a draft invoice as sent WITHOUT emailing it. This moves it out of draft and adds its amount to the client's balance. Invoice Ninja: GET /api/v1/invoices/{id}/mark_sent.
| Argument | Type | Description |
|---|---|---|
| invoice_id* | string | The invoice's hashed id, e.g. "Wpmbk5ezJn". |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"invoice_id"
],
"properties": {
"invoice_id": {
"type": "string",
"minLength": 1,
"description": "The invoice's hashed id, e.g. \"Wpmbk5ezJn\"."
}
}
}Update a client's details; only the fields you pass change. Passing contacts replaces the contact list. Invoice Ninja: PUT /api/v1/clients/{id}.
| Argument | Type | Description |
|---|---|---|
| city | string | |
| name | string | Client company / display name. |
| phone | string | |
| state | string | |
| website | string | |
| address1 | string | |
| address2 | string | |
| contacts | array | Full replacement contact list. |
| client_id* | string | The client's hashed id, e.g. "Wpmbk5ezJn". |
| id_number | string | Your own id / registration number for this client. |
Edit an invoice; only the fields you pass change, but line_items (if passed) replace every existing line. Does not send anything. Invoice Ninja: PUT /api/v1/invoices/{id}.
| Argument | Type | Description |
|---|---|---|
| date | string | Document date, YYYY-MM-DD. |
| terms | string | Terms text. |
| footer | string | Footer text. |
| number | string | Document number. Omit to let Invoice Ninja assign the next one. |
| partial | number | Deposit / partial amount due first. |
| discount | number | Document-level discount (amount or percent). |
| due_date | string | Due date (valid-until for quotes), YYYY-MM-DD. |
| po_number | string | Purchase order number. |
| tax_name1 | string | Document-level tax name. |
| tax_rate1 |
| Date it was paid, YYYY-MM-DD. |
| public_notes | string | Description. |
| private_notes | string |
| should_be_invoiced | boolean | Flag the expense to be billed to the client. |
| transaction_reference | string | Receipt / transaction reference. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"amount"
],
"properties": {
"date": {
"type": "string",
"description": "Expense date, YYYY-MM-DD."
},
"amount": {
"type": "number",
"description": "Expense amount."
},
"client_id": {
"type": "string",
"description": "Client to re-bill (hashed id)."
},
"tax_name1": {
"type": "string"
},
"tax_rate1": {
"type": "number"
},
"vendor_id": {
"type": "string",
"description": "Vendor (hashed id)."
},
"project_id": {
"type": "string",
"description": "Project (hashed id)."
},
"category_id": {
"type": "string",
"description": "Expense category (hashed id)."
},
"currency_id": {
"type": "string",
"description": "Currency id as a string, e.g. \"1\" (USD). Omit for the company default."
},
"payment_date": {
"type": "string",
"description": "Date it was paid, YYYY-MM-DD."
},
"public_notes": {
"type": "string",
"description": "Description."
},
"private_notes": {
"type": "string"
},
"should_be_invoiced": {
"type": "boolean",
"description": "Flag the expense to be billed to the client."
},
"transaction_reference": {
"type": "string",
"description": "Receipt / transaction reference."
}
}
}| tax_name1 |
| string |
| Document-level tax name. |
| tax_rate1 | number | Document-level tax rate in percent. |
| line_items | array | Line items. On update this REPLACES all existing lines. |
| project_id | string | Link to a project (hashed id). |
| public_notes | string | Notes shown to the client. |
| private_notes | string | Internal notes, not shown to the client. |
| partial_due_date | string | Due date of the partial amount, YYYY-MM-DD. |
| is_amount_discount | boolean | true = discount is an amount; false = a percentage. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"client_id"
],
"properties": {
"date": {
"type": "string",
"description": "Document date, YYYY-MM-DD."
},
"terms": {
"type": "string",
"description": "Terms text."
},
"footer": {
"type": "string",
"description": "Footer text."
},
"number": {
"type": "string",
"description": "Document number. Omit to let Invoice Ninja assign the next one."
},
"partial": {
"type": "number",
"description": "Deposit / partial amount due first."
},
"discount": {
"type": "number",
"description": "Document-level discount (amount or percent)."
},
"due_date": {
"type": "string",
"description": "Due date (valid-until for quotes), YYYY-MM-DD."
},
"client_id": {
"type": "string",
"minLength": 1,
"description": "The client's hashed id, e.g. \"Wpmbk5ezJn\"."
},
"po_number": {
"type": "string",
"description": "Purchase order number."
},
"tax_name1": {
"type": "string",
"description": "Document-level tax name."
},
"tax_rate1": {
"type": "number",
"description": "Document-level tax rate in percent."
},
"line_items": {
"type": "array",
"items": {
"type": "object",
"properties": {
"cost": {
"type": "number",
"description": "Unit price."
},
"notes": {
"type": "string",
"description": "Line description."
},
"discount": {
"type": "number",
"description": "Line discount (amount or percent, see is_amount_discount)."
},
"quantity": {
"type": "number",
"description": "Quantity."
},
"tax_name1": {
"type": "string",
"description": "First tax name, e.g. VAT."
},
"tax_name2": {
"type": "string",
"description": "Second tax name."
},
"tax_rate1": {
"type": "number",
"description": "First tax rate in percent."
},
"tax_rate2": {
"type": "number",
"description": "Second tax rate in percent."
},
"product_key": {
"type": "string",
"description": "Product / item name (the product key)."
},
"is_amount_discount": {
"type": "boolean",
"description": "true = discount is an amount; false = a percentage."
}
}
},
"description": "Line items. On update this REPLACES all existing lines."
},
"project_id": {
"type": "string",
"description": "Link to a project (hashed id)."
},
"public_notes": {
"type": "string",
"description": "Notes shown to the client."
},
"private_notes": {
"type": "string",
"description": "Internal notes, not shown to the client."
},
"partial_due_date": {
"type": "string",
"description": "Due date of the partial amount, YYYY-MM-DD."
},
"is_amount_discount": {
"type": "boolean",
"description": "true = discount is an amount; false = a percentage."
}
}
}| string |
| Document-level tax name. |
| tax_rate1 | number | Document-level tax rate in percent. |
| line_items | array | Line items. On update this REPLACES all existing lines. |
| project_id | string | Link to a project (hashed id). |
| public_notes | string | Notes shown to the client. |
| private_notes | string | Internal notes, not shown to the client. |
| partial_due_date | string | Due date of the partial amount, YYYY-MM-DD. |
| is_amount_discount | boolean | true = discount is an amount; false = a percentage. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"client_id"
],
"properties": {
"date": {
"type": "string",
"description": "Document date, YYYY-MM-DD."
},
"terms": {
"type": "string",
"description": "Terms text."
},
"footer": {
"type": "string",
"description": "Footer text."
},
"number": {
"type": "string",
"description": "Document number. Omit to let Invoice Ninja assign the next one."
},
"partial": {
"type": "number",
"description": "Deposit / partial amount due first."
},
"discount": {
"type": "number",
"description": "Document-level discount (amount or percent)."
},
"due_date": {
"type": "string",
"description": "Due date (valid-until for quotes), YYYY-MM-DD."
},
"client_id": {
"type": "string",
"minLength": 1,
"description": "The client's hashed id, e.g. \"Wpmbk5ezJn\"."
},
"po_number": {
"type": "string",
"description": "Purchase order number."
},
"tax_name1": {
"type": "string",
"description": "Document-level tax name."
},
"tax_rate1": {
"type": "number",
"description": "Document-level tax rate in percent."
},
"line_items": {
"type": "array",
"items": {
"type": "object",
"properties": {
"cost": {
"type": "number",
"description": "Unit price."
},
"notes": {
"type": "string",
"description": "Line description."
},
"discount": {
"type": "number",
"description": "Line discount (amount or percent, see is_amount_discount)."
},
"quantity": {
"type": "number",
"description": "Quantity."
},
"tax_name1": {
"type": "string",
"description": "First tax name, e.g. VAT."
},
"tax_name2": {
"type": "string",
"description": "Second tax name."
},
"tax_rate1": {
"type": "number",
"description": "First tax rate in percent."
},
"tax_rate2": {
"type": "number",
"description": "Second tax rate in percent."
},
"product_key": {
"type": "string",
"description": "Product / item name (the product key)."
},
"is_amount_discount": {
"type": "boolean",
"description": "true = discount is an amount; false = a percentage."
}
}
},
"description": "Line items. On update this REPLACES all existing lines."
},
"project_id": {
"type": "string",
"description": "Link to a project (hashed id)."
},
"public_notes": {
"type": "string",
"description": "Notes shown to the client."
},
"private_notes": {
"type": "string",
"description": "Internal notes, not shown to the client."
},
"partial_due_date": {
"type": "string",
"description": "Due date of the partial amount, YYYY-MM-DD."
},
"is_amount_discount": {
"type": "boolean",
"description": "true = discount is an amount; false = a percentage."
}
}
}| Records per page, 1-100 (API default 20). |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"name": {
"type": "string",
"description": "Only clients whose name matches."
},
"page": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "Page number, starting at 1."
},
"sort": {
"type": "string",
"description": "Sort as \"column|asc\" or \"column|desc\", e.g. \"number|desc\" or \"balance|desc\"."
},
"email": {
"type": "string",
"description": "Only the client with a contact at this email."
},
"filter": {
"type": "string",
"description": "Free-text search across name, id number, contact names/emails/phones and custom fields."
},
"number": {
"type": "string",
"description": "Only the client with this client number."
},
"status": {
"type": "string",
"description": "Comma-separated record state: active, archived, deleted (e.g. \"active\"). Omit for all."
},
"balance": {
"type": "string",
"description": "Balance comparison \"op:value\", op one of lt, lte, gt, gte, eq, e.g. \"gt:0\"."
},
"per_page": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "Records per page, 1-100 (API default 20)."
}
}
}| string |
| Comma-separated payment status: all, paid, unpaid, overdue. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"page": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "Page number, starting at 1."
},
"sort": {
"type": "string",
"description": "Sort as \"column|asc\" or \"column|desc\", e.g. \"number|desc\" or \"balance|desc\"."
},
"filter": {
"type": "string",
"description": "Free-text search across number, PO number, date, amount, balance, client name/contacts and line items."
},
"number": {
"type": "string",
"description": "Only the invoice with this number."
},
"status": {
"type": "string",
"description": "Comma-separated record state: active, archived, deleted (e.g. \"active\"). Omit for all."
},
"per_page": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "Records per page, 1-100 (API default 20)."
},
"client_id": {
"type": "string",
"description": "Only records for this client (hashed id)."
},
"date_range": {
"type": "string",
"description": "Invoice-date range \"YYYY-MM-DD,YYYY-MM-DD\"."
},
"client_status": {
"type": "string",
"description": "Comma-separated payment status: all, paid, unpaid, overdue."
}
}
}| country_id |
| string |
| Country as its ISO 3166-1 NUMERIC code, as a string, e.g. "840" (US), "826" (UK), "276" (DE). |
| vat_number | string |
| postal_code | string |
| public_notes | string |
| private_notes | string |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"client_id"
],
"properties": {
"city": {
"type": "string"
},
"name": {
"type": "string",
"description": "Client company / display name."
},
"phone": {
"type": "string"
},
"state": {
"type": "string"
},
"website": {
"type": "string"
},
"address1": {
"type": "string"
},
"address2": {
"type": "string"
},
"contacts": {
"type": "array",
"items": {
"type": "object",
"properties": {
"email": {
"type": "string",
"description": "Contact email (unique per client)."
},
"phone": {
"type": "string"
},
"last_name": {
"type": "string"
},
"first_name": {
"type": "string"
},
"send_email": {
"type": "boolean",
"description": "Whether this contact receives invoice emails."
}
}
},
"description": "Full replacement contact list."
},
"client_id": {
"type": "string",
"minLength": 1,
"description": "The client's hashed id, e.g. \"Wpmbk5ezJn\"."
},
"id_number": {
"type": "string",
"description": "Your own id / registration number for this client."
},
"country_id": {
"type": "string",
"description": "Country as its ISO 3166-1 NUMERIC code, as a string, e.g. \"840\" (US), \"826\" (UK), \"276\" (DE)."
},
"vat_number": {
"type": "string"
},
"postal_code": {
"type": "string"
},
"public_notes": {
"type": "string"
},
"private_notes": {
"type": "string"
}
}
}| number |
| Document-level tax rate in percent. |
| invoice_id* | string | The invoice's hashed id, e.g. "Wpmbk5ezJn". |
| line_items | array | Line items. On update this REPLACES all existing lines. |
| project_id | string | Link to a project (hashed id). |
| public_notes | string | Notes shown to the client. |
| private_notes | string | Internal notes, not shown to the client. |
| partial_due_date | string | Due date of the partial amount, YYYY-MM-DD. |
| is_amount_discount | boolean | true = discount is an amount; false = a percentage. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"invoice_id"
],
"properties": {
"date": {
"type": "string",
"description": "Document date, YYYY-MM-DD."
},
"terms": {
"type": "string",
"description": "Terms text."
},
"footer": {
"type": "string",
"description": "Footer text."
},
"number": {
"type": "string",
"description": "Document number. Omit to let Invoice Ninja assign the next one."
},
"partial": {
"type": "number",
"description": "Deposit / partial amount due first."
},
"discount": {
"type": "number",
"description": "Document-level discount (amount or percent)."
},
"due_date": {
"type": "string",
"description": "Due date (valid-until for quotes), YYYY-MM-DD."
},
"po_number": {
"type": "string",
"description": "Purchase order number."
},
"tax_name1": {
"type": "string",
"description": "Document-level tax name."
},
"tax_rate1": {
"type": "number",
"description": "Document-level tax rate in percent."
},
"invoice_id": {
"type": "string",
"minLength": 1,
"description": "The invoice's hashed id, e.g. \"Wpmbk5ezJn\"."
},
"line_items": {
"type": "array",
"items": {
"type": "object",
"properties": {
"cost": {
"type": "number",
"description": "Unit price."
},
"notes": {
"type": "string",
"description": "Line description."
},
"discount": {
"type": "number",
"description": "Line discount (amount or percent, see is_amount_discount)."
},
"quantity": {
"type": "number",
"description": "Quantity."
},
"tax_name1": {
"type": "string",
"description": "First tax name, e.g. VAT."
},
"tax_name2": {
"type": "string",
"description": "Second tax name."
},
"tax_rate1": {
"type": "number",
"description": "First tax rate in percent."
},
"tax_rate2": {
"type": "number",
"description": "Second tax rate in percent."
},
"product_key": {
"type": "string",
"description": "Product / item name (the product key)."
},
"is_amount_discount": {
"type": "boolean",
"description": "true = discount is an amount; false = a percentage."
}
}
},
"description": "Line items. On update this REPLACES all existing lines."
},
"project_id": {
"type": "string",
"description": "Link to a project (hashed id)."
},
"public_notes": {
"type": "string",
"description": "Notes shown to the client."
},
"private_notes": {
"type": "string",
"description": "Internal notes, not shown to the client."
},
"partial_due_date": {
"type": "string",
"description": "Due date of the partial amount, YYYY-MM-DD."
},
"is_amount_discount": {
"type": "boolean",
"description": "true = discount is an amount; false = a percentage."
}
}
}