invoice-ninja
Manage Invoice Ninja clients, invoices, quotes, expenses, tasks and projects.
Should I use this
Quality & Safety
Findings (2)
- LOWin invoiceninja_list_recurring_invoices
- LOWin invoiceninja_convert_quote_to_invoice
Based on automated analysis of tool definitions and protocol compliance.
Context Cost
This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.
Install
One-Click Install
Add this to your `claude_desktop_config.json` file:
{
"mcpServers": {
"invoice-ninja": {
"url": "https://invoice-ninja.usefulapi.io/mcp"
}
}
}Remote endpoints
https://invoice-ninja.usefulapi.io/mcpstreamable-httpWhat it can do
Tool inventory
Tools (24)
🟢invoiceninja_list_clients(filter, name, email, number, balance, ...)
List clients with balances and contacts, optionally searched by name, email or number. Invoice Ninja: GET /api/v1/clients.
Input Schema
{
"type": "object",
"properties": {
"filter": {
"description": "Free-text search across name, id number, contact names/emails/phones and custom fields.",
"type": "string"
},
"name": {
"description": "Only clients whose name matches.",
"type": "string"
},
"email": {
"description": "Only the client with a contact at this email.",
"type": "string"
},
"number": {
"description": "Only the client with this client number.",
"type": "string"
},
"balance": {
"description": "Balance comparison \"op:value\", op one of lt, lte, gt, gte, eq, e.g. \"gt:0\".",
"type": "string"
},
"per_page": {
"description": "Records per page, 1-100 (API default 20).",
"type": "integer",
"minimum": 1,
"maximum": 100
},
"page": {
"description": "Page number, starting at 1.",
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
},
"sort": {
"description": "Sort as \"column|asc\" or \"column|desc\", e.g. \"number|desc\" or \"balance|desc\".",
"type": "string"
},
"status": {
"description": "Comma-separated record state: active, archived, deleted (e.g. \"active\"). Omit for all.",
"type": "string"
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢invoiceninja_get_client(client_id)
Fetch one client by id, with contacts, address, balance and paid-to-date. Invoice Ninja: GET /api/v1/clients/{id}.
Input Schema
{
"type": "object",
"properties": {
"client_id": {
"type": "string",
"minLength": 1,
"description": "The client's hashed id, e.g. \"Wpmbk5ezJn\"."
}
},
"required": [
"client_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢invoiceninja_list_invoices(client_id, client_status, number, filter, date_range, ...)
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.
Input Schema
{
"type": "object",
"properties": {
"client_id": {
"description": "Only records for this client (hashed id).",
"type": "string"
},
"client_status": {
"description": "Comma-separated payment status: all, paid, unpaid, overdue.",
"type": "string"
},
"number": {
"description": "Only the invoice with this number.",
"type": "string"
},
"filter": {
"description": "Free-text search across number, PO number, date, amount, balance, client name/contacts and line items.",
"type": "string"
},
"date_range": {
"description": "Invoice-date range \"YYYY-MM-DD,YYYY-MM-DD\".",
"type": "string"
},
"per_page": {
"description": "Records per page, 1-100 (API default 20).",
"type": "integer",
"minimum": 1,
"maximum": 100
},
"page": {
"description": "Page number, starting at 1.",
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
},
"sort": {
"description": "Sort as \"column|asc\" or \"column|desc\", e.g. \"number|desc\" or \"balance|desc\".",
"type": "string"
},
"status": {
"description": "Comma-separated record state: active, archived, deleted (e.g. \"active\"). Omit for all.",
"type": "string"
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢invoiceninja_get_invoice(invoice_id)
Fetch one invoice by id — line items, totals, balance, dates, status and invitations. Invoice Ninja: GET /api/v1/invoices/{id}.
Input Schema
{
"type": "object",
"properties": {
"invoice_id": {
"type": "string",
"minLength": 1,
"description": "The invoice's hashed id, e.g. \"Wpmbk5ezJn\"."
}
},
"required": [
"invoice_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢invoiceninja_list_quotes(client_id, client_status, number, filter, per_page, ...)
List quotes (estimates), filterable by client and quote status. Invoice Ninja: GET /api/v1/quotes.
Input Schema
{
"type": "object",
"properties": {
"client_id": {
"description": "Only records for this client (hashed id).",
"type": "string"
},
"client_status": {
"description": "Comma-separated quote status: all, draft, sent, approved, expired, upcoming.",
"type": "string"
},
"number": {
"description": "Only the quote with this number.",
"type": "string"
},
"filter": {
"description": "Free-text search across number and custom fields.",
"type": "string"
},
"per_page": {
"description": "Records per page, 1-100 (API default 20).",
"type": "integer",
"minimum": 1,
"maximum": 100
},
"page": {
"description": "Page number, starting at 1.",
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
},
"sort": {
"description": "Sort as \"column|asc\" or \"column|desc\", e.g. \"number|desc\" or \"balance|desc\".",
"type": "string"
},
"status": {
"description": "Comma-separated record state: active, archived, deleted (e.g. \"active\"). Omit for all.",
"type": "string"
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢invoiceninja_get_quote(quote_id)
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}.
Input Schema
{
"type": "object",
"properties": {
"quote_id": {
"type": "string",
"minLength": 1,
"description": "The quote's hashed id, e.g. \"Wpmbk5ezJn\"."
}
},
"required": [
"quote_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢invoiceninja_list_products(filter, product_key, per_page, page, sort, ...)
List products / services in the catalog with price, cost and default taxes. Invoice Ninja: GET /api/v1/products.
Input Schema
{
"type": "object",
"properties": {
"filter": {
"description": "Free-text search across product name.",
"type": "string"
},
"product_key": {
"description": "Only the product with this product key.",
"type": "string"
},
"per_page": {
"description": "Records per page, 1-100 (API default 20).",
"type": "integer",
"minimum": 1,
"maximum": 100
},
"page": {
"description": "Page number, starting at 1.",
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
},
"sort": {
"description": "Sort as \"column|asc\" or \"column|desc\", e.g. \"number|desc\" or \"balance|desc\".",
"type": "string"
},
"status": {
"description": "Comma-separated record state: active, archived, deleted (e.g. \"active\"). Omit for all.",
"type": "string"
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢invoiceninja_list_payments(client_id, number, filter, per_page, page, ...)
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.
Input Schema
{
"type": "object",
"properties": {
"client_id": {
"description": "Only records for this client (hashed id).",
"type": "string"
},
"number": {
"description": "Only the payment with this number.",
"type": "string"
},
"filter": {
"description": "Free-text search across amount, date and custom fields.",
"type": "string"
},
"per_page": {
"description": "Records per page, 1-100 (API default 20).",
"type": "integer",
"minimum": 1,
"maximum": 100
},
"page": {
"description": "Page number, starting at 1.",
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
},
"sort": {
"description": "Sort as \"column|asc\" or \"column|desc\", e.g. \"number|desc\" or \"balance|desc\".",
"type": "string"
},
"status": {
"description": "Comma-separated record state: active, archived, deleted (e.g. \"active\"). Omit for all.",
"type": "string"
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢invoiceninja_list_expenses(client_id, client_status, number, filter, per_page, ...)
List expenses, filterable by client and invoicing/payment state. Invoice Ninja: GET /api/v1/expenses.
Input Schema
{
"type": "object",
"properties": {
"client_id": {
"description": "Only records for this client (hashed id).",
"type": "string"
},
"client_status": {
"description": "Comma-separated: all, logged, pending, invoiced, uninvoiced, paid, unpaid.",
"type": "string"
},
"number": {
"description": "Only the expense with this number.",
"type": "string"
},
"filter": {
"description": "Free-text search across expense fields.",
"type": "string"
},
"per_page": {
"description": "Records per page, 1-100 (API default 20).",
"type": "integer",
"minimum": 1,
"maximum": 100
},
"page": {
"description": "Page number, starting at 1.",
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
},
"sort": {
"description": "Sort as \"column|asc\" or \"column|desc\", e.g. \"number|desc\" or \"balance|desc\".",
"type": "string"
},
"status": {
"description": "Comma-separated record state: active, archived, deleted (e.g. \"active\"). Omit for all.",
"type": "string"
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢invoiceninja_list_vendors(filter, number, per_page, page, sort, ...)
List vendors (suppliers) with contacts and address. Invoice Ninja: GET /api/v1/vendors.
Input Schema
{
"type": "object",
"properties": {
"filter": {
"description": "Free-text search across vendor name and contacts.",
"type": "string"
},
"number": {
"description": "Only the vendor with this number.",
"type": "string"
},
"per_page": {
"description": "Records per page, 1-100 (API default 20).",
"type": "integer",
"minimum": 1,
"maximum": 100
},
"page": {
"description": "Page number, starting at 1.",
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
},
"sort": {
"description": "Sort as \"column|asc\" or \"column|desc\", e.g. \"number|desc\" or \"balance|desc\".",
"type": "string"
},
"status": {
"description": "Comma-separated record state: active, archived, deleted (e.g. \"active\"). Omit for all.",
"type": "string"
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢invoiceninja_list_tasks(client_id, client_status, number, filter, per_page, ...)
List tasks / time entries with their time_log, duration, rate and linked client, project and invoice. Invoice Ninja: GET /api/v1/tasks.
Input Schema
{
"type": "object",
"properties": {
"client_id": {
"description": "Only records for this client (hashed id).",
"type": "string"
},
"client_status": {
"description": "Comma-separated: all, invoiced, uninvoiced, is_running, overdue.",
"type": "string"
},
"number": {
"description": "Only the task with this number.",
"type": "string"
},
"filter": {
"description": "Free-text search across task description and custom fields.",
"type": "string"
},
"per_page": {
"description": "Records per page, 1-100 (API default 20).",
"type": "integer",
"minimum": 1,
"maximum": 100
},
"page": {
"description": "Page number, starting at 1.",
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
},
"sort": {
"description": "Sort as \"column|asc\" or \"column|desc\", e.g. \"number|desc\" or \"balance|desc\".",
"type": "string"
},
"status": {
"description": "Comma-separated record state: active, archived, deleted (e.g. \"active\"). Omit for all.",
"type": "string"
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢invoiceninja_list_projects(client_id, filter, number, per_page, page, ...)
List projects with client, budgeted hours, task rate, current hours and due date. Invoice Ninja: GET /api/v1/projects.
Input Schema
{
"type": "object",
"properties": {
"client_id": {
"description": "Only records for this client (hashed id).",
"type": "string"
},
"filter": {
"description": "Free-text search across project name and notes.",
"type": "string"
},
"number": {
"description": "Only the project with this number.",
"type": "string"
},
"per_page": {
"description": "Records per page, 1-100 (API default 20).",
"type": "integer",
"minimum": 1,
"maximum": 100
},
"page": {
"description": "Page number, starting at 1.",
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
},
"sort": {
"description": "Sort as \"column|asc\" or \"column|desc\", e.g. \"number|desc\" or \"balance|desc\".",
"type": "string"
},
"status": {
"description": "Comma-separated record state: active, archived, deleted (e.g. \"active\"). Omit for all.",
"type": "string"
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢invoiceninja_list_recurring_invoices(client_id, client_status, number, per_page, page, ...)
List recurring invoice schedules with frequency, next send date and remaining cycles. Read-only. Invoice Ninja: GET /api/v1/recurring_invoices.
Input Schema
{
"type": "object",
"properties": {
"client_id": {
"description": "Only records for this client (hashed id).",
"type": "string"
},
"client_status": {
"description": "Comma-separated: all, active, paused, completed.",
"type": "string"
},
"number": {
"description": "Only the recurring invoice with this number.",
"type": "string"
},
"per_page": {
"description": "Records per page, 1-100 (API default 20).",
"type": "integer",
"minimum": 1,
"maximum": 100
},
"page": {
"description": "Page number, starting at 1.",
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
},
"sort": {
"description": "Sort as \"column|asc\" or \"column|desc\", e.g. \"number|desc\" or \"balance|desc\".",
"type": "string"
},
"status": {
"description": "Comma-separated record state: active, archived, deleted (e.g. \"active\"). Omit for all.",
"type": "string"
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴invoiceninja_create_client(name, website, phone, address1, address2, ...)
Create a client, optionally with contacts. Give at least a name or one contact. Invoice Ninja: POST /api/v1/clients.
Input Schema
{
"type": "object",
"properties": {
"name": {
"description": "Client company / display name.",
"type": "string"
},
"website": {
"type": "string"
},
"phone": {
"type": "string"
},
"address1": {
"type": "string"
},
"address2": {
"type": "string"
},
"city": {
"type": "string"
},
"state": {
"type": "string"
},
"postal_code": {
"type": "string"
},
"country_id": {
"description": "Country as its ISO 3166-1 NUMERIC code, as a string, e.g. \"840\" (US), \"826\" (UK), \"276\" (DE).",
"type": "string"
},
"vat_number": {
"type": "string"
},
"id_number": {
"description": "Your own id / registration number for this client.",
"type": "string"
},
"public_notes": {
"type": "string"
},
"private_notes": {
"type": "string"
},
"contacts": {
"description": "People at the client; the first is the primary contact.",
"type": "array",
"items": {
"type": "object",
"properties": {
"first_name": {
"type": "string"
},
"last_name": {
"type": "string"
},
"email": {
"description": "Contact email (unique per client).",
"type": "string"
},
"phone": {
"type": "string"
},
"send_email": {
"description": "Whether this contact receives invoice emails.",
"type": "boolean"
}
}
}
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴invoiceninja_update_client(client_id, name, website, phone, address1, ...)
Update a client's details; only the fields you pass change. Passing contacts replaces the contact list. Invoice Ninja: PUT /api/v1/clients/{id}.
Input Schema
{
"type": "object",
"properties": {
"client_id": {
"type": "string",
"minLength": 1,
"description": "The client's hashed id, e.g. \"Wpmbk5ezJn\"."
},
"name": {
"description": "Client company / display name.",
"type": "string"
},
"website": {
"type": "string"
},
"phone": {
"type": "string"
},
"address1": {
"type": "string"
},
"address2": {
"type": "string"
},
"city": {
"type": "string"
},
"state": {
"type": "string"
},
"postal_code": {
"type": "string"
},
"country_id": {
"description": "Country as its ISO 3166-1 NUMERIC code, as a string, e.g. \"840\" (US), \"826\" (UK), \"276\" (DE).",
"type": "string"
},
"vat_number": {
"type": "string"
},
"id_number": {
"description": "Your own id / registration number for this client.",
"type": "string"
},
"public_notes": {
"type": "string"
},
"private_notes": {
"type": "string"
},
"contacts": {
"description": "Full replacement contact list.",
"type": "array",
"items": {
"type": "object",
"properties": {
"first_name": {
"type": "string"
},
"last_name": {
"type": "string"
},
"email": {
"description": "Contact email (unique per client).",
"type": "string"
},
"phone": {
"type": "string"
},
"send_email": {
"description": "Whether this contact receives invoice emails.",
"type": "boolean"
}
}
}
}
},
"required": [
"client_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴invoiceninja_create_invoice(client_id, date, due_date, number, po_number, ...)
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.
Input Schema
{
"type": "object",
"properties": {
"client_id": {
"type": "string",
"minLength": 1,
"description": "The client's hashed id, e.g. \"Wpmbk5ezJn\"."
},
"date": {
"description": "Document date, YYYY-MM-DD.",
"type": "string"
},
"due_date": {
"description": "Due date (valid-until for quotes), YYYY-MM-DD.",
"type": "string"
},
"number": {
"description": "Document number. Omit to let Invoice Ninja assign the next one.",
"type": "string"
},
"po_number": {
"description": "Purchase order number.",
"type": "string"
},
"line_items": {
"description": "Line items. On update this REPLACES all existing lines.",
"type": "array",
"items": {
"type": "object",
"properties": {
"product_key": {
"description": "Product / item name (the product key).",
"type": "string"
},
"notes": {
"description": "Line description.",
"type": "string"
},
"cost": {
"description": "Unit price.",
"type": "number"
},
"quantity": {
"description": "Quantity.",
"type": "number"
},
"discount": {
"description": "Line discount (amount or percent, see is_amount_discount).",
"type": "number"
},
"is_amount_discount": {
"description": "true = discount is an amount; false = a percentage.",
"type": "boolean"
},
"tax_name1": {
"description": "First tax name, e.g. VAT.",
"type": "string"
},
"tax_rate1": {
"description": "First tax rate in percent.",
"type": "number"
},
"tax_name2": {
"description": "Second tax name.",
"type": "string"
},
"tax_rate2": {
"description": "Second tax rate in percent.",
"type": "number"
}
}
}
},
"public_notes": {
"description": "Notes shown to the client.",
"type": "string"
},
"private_notes": {
"description": "Internal notes, not shown to the client.",
"type": "string"
},
"terms": {
"description": "Terms text.",
"type": "string"
},
"footer": {
"description": "Footer text.",
"type": "string"
},
"discount": {
"description": "Document-level discount (amount or percent).",
"type": "number"
},
"is_amount_discount": {
"description": "true = discount is an amount; false = a percentage.",
"type": "boolean"
},
"partial": {
"description": "Deposit / partial amount due first.",
"type": "number"
},
"partial_due_date": {
"description": "Due date of the partial amount, YYYY-MM-DD.",
"type": "string"
},
"project_id": {
"description": "Link to a project (hashed id).",
"type": "string"
},
"tax_name1": {
"description": "Document-level tax name.",
"type": "string"
},
"tax_rate1": {
"description": "Document-level tax rate in percent.",
"type": "number"
}
},
"required": [
"client_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴invoiceninja_update_invoice(invoice_id, date, due_date, number, po_number, ...)
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}.
Input Schema
{
"type": "object",
"properties": {
"invoice_id": {
"type": "string",
"minLength": 1,
"description": "The invoice's hashed id, e.g. \"Wpmbk5ezJn\"."
},
"date": {
"description": "Document date, YYYY-MM-DD.",
"type": "string"
},
"due_date": {
"description": "Due date (valid-until for quotes), YYYY-MM-DD.",
"type": "string"
},
"number": {
"description": "Document number. Omit to let Invoice Ninja assign the next one.",
"type": "string"
},
"po_number": {
"description": "Purchase order number.",
"type": "string"
},
"line_items": {
"description": "Line items. On update this REPLACES all existing lines.",
"type": "array",
"items": {
"type": "object",
"properties": {
"product_key": {
"description": "Product / item name (the product key).",
"type": "string"
},
"notes": {
"description": "Line description.",
"type": "string"
},
"cost": {
"description": "Unit price.",
"type": "number"
},
"quantity": {
"description": "Quantity.",
"type": "number"
},
"discount": {
"description": "Line discount (amount or percent, see is_amount_discount).",
"type": "number"
},
"is_amount_discount": {
"description": "true = discount is an amount; false = a percentage.",
"type": "boolean"
},
"tax_name1": {
"description": "First tax name, e.g. VAT.",
"type": "string"
},
"tax_rate1": {
"description": "First tax rate in percent.",
"type": "number"
},
"tax_name2": {
"description": "Second tax name.",
"type": "string"
},
"tax_rate2": {
"description": "Second tax rate in percent.",
"type": "number"
}
}
}
},
"public_notes": {
"description": "Notes shown to the client.",
"type": "string"
},
"private_notes": {
"description": "Internal notes, not shown to the client.",
"type": "string"
},
"terms": {
"description": "Terms text.",
"type": "string"
},
"footer": {
"description": "Footer text.",
"type": "string"
},
"discount": {
"description": "Document-level discount (amount or percent).",
"type": "number"
},
"is_amount_discount": {
"description": "true = discount is an amount; false = a percentage.",
"type": "boolean"
},
"partial": {
"description": "Deposit / partial amount due first.",
"type": "number"
},
"partial_due_date": {
"description": "Due date of the partial amount, YYYY-MM-DD.",
"type": "string"
},
"project_id": {
"description": "Link to a project (hashed id).",
"type": "string"
},
"tax_name1": {
"description": "Document-level tax name.",
"type": "string"
},
"tax_rate1": {
"description": "Document-level tax rate in percent.",
"type": "number"
}
},
"required": [
"invoice_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴invoiceninja_mark_invoice_sent(invoice_id)
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.
Input Schema
{
"type": "object",
"properties": {
"invoice_id": {
"type": "string",
"minLength": 1,
"description": "The invoice's hashed id, e.g. \"Wpmbk5ezJn\"."
}
},
"required": [
"invoice_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴invoiceninja_email_invoice(invoice_id, email_type)
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.
Input Schema
{
"type": "object",
"properties": {
"invoice_id": {
"type": "string",
"minLength": 1,
"description": "The invoice's hashed id, e.g. \"Wpmbk5ezJn\"."
},
"email_type": {
"description": "Which email template to send (default: the invoice template).",
"type": "string",
"enum": [
"invoice",
"reminder1",
"reminder2",
"reminder3",
"reminder_endless",
"custom1",
"custom2",
"custom3"
]
}
},
"required": [
"invoice_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴invoiceninja_create_quote(client_id, date, due_date, number, po_number, ...)
Create a DRAFT quote (estimate) for a client. Nothing is emailed. Invoice Ninja: POST /api/v1/quotes.
Input Schema
{
"type": "object",
"properties": {
"client_id": {
"type": "string",
"minLength": 1,
"description": "The client's hashed id, e.g. \"Wpmbk5ezJn\"."
},
"date": {
"description": "Document date, YYYY-MM-DD.",
"type": "string"
},
"due_date": {
"description": "Due date (valid-until for quotes), YYYY-MM-DD.",
"type": "string"
},
"number": {
"description": "Document number. Omit to let Invoice Ninja assign the next one.",
"type": "string"
},
"po_number": {
"description": "Purchase order number.",
"type": "string"
},
"line_items": {
"description": "Line items. On update this REPLACES all existing lines.",
"type": "array",
"items": {
"type": "object",
"properties": {
"product_key": {
"description": "Product / item name (the product key).",
"type": "string"
},
"notes": {
"description": "Line description.",
"type": "string"
},
"cost": {
"description": "Unit price.",
"type": "number"
},
"quantity": {
"description": "Quantity.",
"type": "number"
},
"discount": {
"description": "Line discount (amount or percent, see is_amount_discount).",
"type": "number"
},
"is_amount_discount": {
"description": "true = discount is an amount; false = a percentage.",
"type": "boolean"
},
"tax_name1": {
"description": "First tax name, e.g. VAT.",
"type": "string"
},
"tax_rate1": {
"description": "First tax rate in percent.",
"type": "number"
},
"tax_name2": {
"description": "Second tax name.",
"type": "string"
},
"tax_rate2": {
"description": "Second tax rate in percent.",
"type": "number"
}
}
}
},
"public_notes": {
"description": "Notes shown to the client.",
"type": "string"
},
"private_notes": {
"description": "Internal notes, not shown to the client.",
"type": "string"
},
"terms": {
"description": "Terms text.",
"type": "string"
},
"footer": {
"description": "Footer text.",
"type": "string"
},
"discount": {
"description": "Document-level discount (amount or percent).",
"type": "number"
},
"is_amount_discount": {
"description": "true = discount is an amount; false = a percentage.",
"type": "boolean"
},
"partial": {
"description": "Deposit / partial amount due first.",
"type": "number"
},
"partial_due_date": {
"description": "Due date of the partial amount, YYYY-MM-DD.",
"type": "string"
},
"project_id": {
"description": "Link to a project (hashed id).",
"type": "string"
},
"tax_name1": {
"description": "Document-level tax name.",
"type": "string"
},
"tax_rate1": {
"description": "Document-level tax rate in percent.",
"type": "number"
}
},
"required": [
"client_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴invoiceninja_convert_quote_to_invoice(quote_id)
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.
Input Schema
{
"type": "object",
"properties": {
"quote_id": {
"type": "string",
"minLength": 1,
"description": "The quote's hashed id, e.g. \"Wpmbk5ezJn\"."
}
},
"required": [
"quote_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴invoiceninja_create_expense(amount, date, vendor_id, client_id, project_id, ...)
Log an expense, optionally tied to a vendor, client or project and flagged to be re-invoiced. Invoice Ninja: POST /api/v1/expenses.
Input Schema
{
"type": "object",
"properties": {
"amount": {
"type": "number",
"description": "Expense amount."
},
"date": {
"description": "Expense date, YYYY-MM-DD.",
"type": "string"
},
"vendor_id": {
"description": "Vendor (hashed id).",
"type": "string"
},
"client_id": {
"description": "Client to re-bill (hashed id).",
"type": "string"
},
"project_id": {
"description": "Project (hashed id).",
"type": "string"
},
"category_id": {
"description": "Expense category (hashed id).",
"type": "string"
},
"currency_id": {
"description": "Currency id as a string, e.g. \"1\" (USD). Omit for the company default.",
"type": "string"
},
"public_notes": {
"description": "Description.",
"type": "string"
},
"private_notes": {
"type": "string"
},
"transaction_reference": {
"description": "Receipt / transaction reference.",
"type": "string"
},
"payment_date": {
"description": "Date it was paid, YYYY-MM-DD.",
"type": "string"
},
"should_be_invoiced": {
"description": "Flag the expense to be billed to the client.",
"type": "boolean"
},
"tax_name1": {
"type": "string"
},
"tax_rate1": {
"type": "number"
}
},
"required": [
"amount"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴invoiceninja_create_task(description, client_id, project_id, rate, due_date, ...)
Create a task, optionally with logged time entries, for a client or project. Invoice Ninja: POST /api/v1/tasks.
Input Schema
{
"type": "object",
"properties": {
"description": {
"type": "string",
"minLength": 1,
"description": "What the work was."
},
"client_id": {
"description": "Client (hashed id).",
"type": "string"
},
"project_id": {
"description": "Project (hashed id).",
"type": "string"
},
"rate": {
"description": "Hourly rate; omit to use the project/client default.",
"type": "number"
},
"due_date": {
"description": "Due date, YYYY-MM-DD.",
"type": "string"
},
"time_log": {
"description": "Time entries. Entries must not overlap.",
"type": "array",
"items": {
"type": "object",
"properties": {
"start": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "Start, Unix timestamp in seconds."
},
"end": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "End, Unix timestamp in seconds (0 = still running)."
},
"description": {
"description": "Note for this time entry.",
"type": "string"
},
"billable": {
"description": "Whether this entry is billable.",
"type": "boolean"
}
},
"required": [
"start",
"end"
]
}
}
},
"required": [
"description"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴invoiceninja_create_project(name, client_id, task_rate, budgeted_hours, due_date, ...)
Create a project for a client, with an optional hourly task rate, budget and due date. Invoice Ninja: POST /api/v1/projects.
Input Schema
{
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1,
"description": "Project name."
},
"client_id": {
"type": "string",
"minLength": 1,
"description": "The client's hashed id, e.g. \"Wpmbk5ezJn\"."
},
"task_rate": {
"description": "Hourly rate for tasks in this project (default 0 = inherit).",
"type": "number"
},
"budgeted_hours": {
"type": "number"
},
"due_date": {
"description": "Due date, YYYY-MM-DD.",
"type": "string"
},
"public_notes": {
"type": "string"
},
"private_notes": {
"type": "string"
},
"color": {
"description": "Hex color, e.g. \"#1f77b4\".",
"type": "string"
}
},
"required": [
"name",
"client_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}Community
Evidence