Quotes and invoices numbered without gaps, sent as PDFs, paid online. Pay per action.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Your Conecto key, sent as Bearer conecto_sk_... One POST to https://api.conecto.chat/v1/signup returns a key with $1 of free credit. Chat apps that sign in with OAuth add https://api.conecto.chat/v1/mcp instead: one connection for every area.
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.
Make a tool wait for a person: every call of it, those whose argument is over a number (like invoices_create_credit_note when amount is over 500), or those whose argument is one of some values (like connect_call when method is POST, PUT, PATCH or DELETE). A held call answers approval_required with an approval_id and asks the approver; when they approve, call again with the same arguments, once (a call no person answers for adds the approval: header X-Conecto-Approval, or _meta.approvalId over MCP). The approver is an email, a saved channel, or a team (its managers, or everyone in it); each approver gets a link of their own, and the person whose call it is never approves it. With two_people_over, calls whose argument is over it need two people. Bills like Xero's bill approval: purchasing_create_bill with argument total holds bills over an amount, tax included; a rule on purchasing_pay_bill also holds batches with such a payment. Removing a rule is the owner's, on their account page, when the account has an owner email. $0.001. Costs $0.001 per call; nothing if it fails.
Calls with argument over this are held.
Calls with argument equal to one of these (any case) are held.
An argument of the tool (or total, for purchasing_create_bill).
Who in approver_team approves.
A team (account_list_teams).
Calls whose argument is over this need two people; higher than over.
A saved notify channel.
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
claude mcp add --transport http invoices https://api.conecto.chat/mcp/invoices \ --header 'Authorization: Bearer YOUR_TOKEN'
Headers
Authorization (required): Your Conecto key, sent as Bearer conecto_sk_... One POST to https://api.conecto.chat/v1/signup returns a key with $1 of free credit. Chat apps that sign in with OAuth add https://api.conecto.chat/v1/mcp instead: one connection for every area.Make a tool wait for a person: every call of it, those whose argument is over a number (like invoices_create_credit_note when amount is over 500), or those whose argument is one of some values (like connect_call when method is POST, PUT, PATCH or DELETE). A held call answers approval_required with an approval_id and asks the approver; when they approve, call again with the same arguments, once (a call no person answers for adds the approval: header X-Conecto-Approval, or _meta.approvalId over MCP). The approver is an email, a saved channel, or a team (its managers, or everyone in it); each approver gets a link of their own, and the person whose call it is never approves it. With two_people_over, calls whose argument is over it need two people. Bills like Xero's bill approval: purchasing_create_bill with argument total holds bills over an amount, tax included; a rule on purchasing_pay_bill also holds batches with such a payment. Removing a rule is the owner's, on their account page, when the account has an owner email. $0.001. Costs $0.001 per call; nothing if it fails.
| Argument | Type | Description |
|---|---|---|
| over | number | Calls with argument over this are held. |
| tool* | string | |
| values | array | Calls with argument equal to one of these (any case) are held. |
| argument | string | An argument of the tool (or total, for purchasing_create_bill). |
| approvers | string | Who in approver_team approves. |
| approver_team | string | A team (account_list_teams). |
| approver_email | string | |
| two_people_over | number | Calls whose argument is over this need two people; higher than over. |
| approver_channel | string | A saved notify channel. |
{
"type": "object",
"required": [
"tool"
],
"properties": {
"over": {
"type": "number",
"description": "Calls with argument over this are held."
},
"tool": {
"type": "string",
"maxLength": 80,
"minLength": 1
},
"values": {
"type": "array",
"items": {
"type": "string",
"maxLength": 60,
"minLength": 1
},
"maxItems": 20,
"minItems": 1,
"description": "Calls with argument equal to one of these (any case) are held."
},
"argument": {
"type": "string",
"maxLength": 60,
"description": "An argument of the tool (or total, for purchasing_create_bill)."
},
"approvers": {
"enum": [
"managers",
"everyone"
],
"type": "string",
"default": "managers",
"description": "Who in approver_team approves."
},
"approver_team": {
"type": "string",
"maxLength": 80,
"description": "A team (account_list_teams)."
},
"approver_email": {
"type": "string",
"maxLength": 254
},
"two_people_over": {
"type": "number",
"description": "Calls whose argument is over this need two people; higher than over."
},
"approver_channel": {
"type": "string",
"maxLength": 80,
"description": "A saved notify channel."
}
},
"additionalProperties": false
}Move a form, a meeting type, a job, an inbox, a phone number, a newsletter, the website chat, a rental, a pipeline, a table or a website to a team. What happens through it is charged to that team from now on (a form's responses, a number's calls, an inbox's tickets), and its rental moves with it. Something a bot makes already belongs to the bot's team. Only a key of the company-wide team without limits moves things between teams. $0.001. Costs $0.001 per call; nothing if it fails.
| Argument | Type | Description |
|---|---|---|
| id | string | Its id, slug, name, address or number; not needed for the chat. |
| kind* | string | |
| team* | string |
{
"type": "object",
"required": [
"kind",
"team"
],
"properties": {
"id": {
"type": "string",
"maxLength": 254,
"description": "Its id, slug, name, address or number; not needed for the chat."
},
"kind": {
"enum": [
"form",
"meeting_type",
"job",
"inbox",
"phone_number",
"newsletter",
"chat",
"rental",
"pipeline",
"table",
"website"
],
"type": "string"
},
"team": {
"type": "string",
"maxLength": 80,
"minLength": 1
}
},
"additionalProperties": false
}The account's admin and security actions, newest first: keys made and revoked, limits and auto-reload, the owner's sign-ins, connectors, exports, vault reads and writes, credentials set and everything deleted. Ordinary work is in the call log (account_list_calls). verify: true also checks the hash chain, which breaks where an entry was changed or removed. Free.
| Argument | Type | Description |
|---|---|---|
| limit | integer | |
| since | string | |
| action | string | Only actions starting with this, like "key." or "tool.vault_". |
| verify | boolean |
{
"type": "object",
"required": [],
"properties": {
"limit": {
"type": "integer",
"default": 50,
"maximum": 500,
"minimum": 1
},
"since": {
"type": "string",
"format": "date-time",
"maxLength": 40
},
"action": {
"type": "string",
"maxLength": 60,
"description": "Only actions starting with this, like \"key.\" or \"tool.vault_\"."
},
"verify": {
"type": "boolean",
"default": false
}
},
"additionalProperties": false
}The account balance, how much of it is credit bought (AI visibility and the phone run only on that) and how much free and bonus credit, what running calls are holding, this key's daily budget, the auto-reload state, and how much of this month's free reads and downloads is used. Free.
No arguments.
{
"type": "object",
"required": [],
"properties": {},
"additionalProperties": false
}A one-time link to a page showing one area as it is when the page opens, for when the person you work for asks to see it themselves: a recruiter looks at the applicants, a bookkeeper at what is due. Do the work and answer with the area's own tools first; a link never replaces that. When an answer would be a long list they would rather look through, offer a link and make it once they say yes. The page is made from the area's own reads as this key, so it shows only what this key may see. It opens once and keeps for an hour; an unopened link ends after 7 days. Free.
| Argument | Type | Description |
|---|---|---|
| area* | string |
{
"type": "object",
"required": [
"area"
],
"properties": {
"area": {
"enum": [
"analytics",
"code",
"crm",
"calendar",
"chat",
"account",
"admin",
"email",
"helpdesk",
"documents",
"esign",
"hiring",
"outreach",
"prospects",
"lookups",
"companies",
"longlists",
"mergers",
"valuation",
"newsletters",
"notify",
"projects",
"schedules",
"speech",
"uptime",
"vault",
"web",
"tables",
"links",
"images",
"files",
"forms",
"helpcenter",
"imports",
"invoices",
"books",
"inventory",
"whistleblowing",
"connect",
"microsoft365",
"googleworkspace",
"hubspot",
"salesforce",
"directory",
"hr",
"social",
"purchasing",
"phone",
"websites",
"views",
"visibility",
"markets"
],
"type": "string"
}
},
"additionalProperties": false
}Where each area's data is stored and processed: the company that runs each place, the country or region, and what it holds. Every area keeps its records in the database and runs on Conecto's servers; some also use a service named here (email, phone, PDFs, search). For the business's records of processing and its transfer assessments (GDPR Art. 30 and 44). Free.
| Argument | Type | Description |
|---|---|---|
| areas | array | Areas to show, like ["email", "phone"]; all when left out. |
{
"type": "object",
"required": [],
"properties": {
"areas": {
"type": "array",
"items": {
"type": "string",
"maxLength": 40
},
"maxItems": 50,
"description": "Areas to show, like [\"email\", \"phone\"]; all when left out."
}
},
"additionalProperties": false
}Send an event you name, custom.<name> (custom.lead_qualified, custom.order_shipped), to every channel subscribed to it (notify_subscribe with "custom.*" or its name: Slack, Teams, a webhook to Zapier, Make, n8n or the business's own systems) and to account_events, where another team's bot can pick it up. data is any JSON object (up to 10 KB); sent_by is added with this bot's name and team. $0.005 for each channel it goes to; free when no channel is subscribed. Costs $0.005 per channel it goes to; nothing if none are found.
| Argument | Type | Description |
|---|---|---|
| data | object | |
| kind* | string | custom. and a name of lowercase letters, digits, dots, dashes and _. |
| link | string | |
| text | string | |
| title* | string |
{
"type": "object",
"required": [
"kind",
"title"
],
"properties": {
"data": {
"type": "object"
},
"kind": {
"type": "string",
"pattern": "^custom\\.[a-z0-9][a-z0-9_.-]*$",
"maxLength": 66,
"minLength": 8,
"description": "custom. and a name of lowercase letters, digits, dots, dashes and _."
},
"link": {
"type": "string",
"pattern": "^https://",
"maxLength": 1000
},
"text": {
"type": "string",
"maxLength": 4000
},
"title": {
"type": "string",
"maxLength": 200,
"minLength": 1
}
},
"additionalProperties": false
}Erases one person across every area when they ask (GDPR Art. 17), once you know it is them (they wrote from that address, or confirmed it). Their CRM contact, chat visitor, past meetings and calls are anonymised, so deals stay without them, and a meeting they were only a guest at drops them; their chats, CRM history, form and routing form answers, job applications with the CV, newsletter subscriptions and events are deleted, and the call log's contents that name them are cleared. Kept, each with its reason in the result: accounting records, employment records, signed documents, the audit log, the account's own settings, upcoming meetings, and emails and tickets (outreach emails and replies too) unless correspondence is true. Their address goes on the suppression lists, so it is never mailed again: outreach campaigns stop for them at once. Can't be undone; the owner is emailed. A key of a team other than the company-wide one gets owner_required: pass the request to the owner. Free. Free.
| Argument | Type | Description |
|---|---|---|
| string | The person's email address. | |
| phone | string | Their phone number in international format, like +1 503 555 0145. |
| correspondence | boolean | Also delete their emails and tickets, when no law requires keeping them. |
{
"type": "object",
"required": [],
"properties": {
"email": {
"type": "string",
"maxLength": 254,
"description": "The person's email address."
},
"phone": {
"type": "string",
"maxLength": 40,
"description": "Their phone number in international format, like +1 503 555 0145."
},
"correspondence": {
"type": "boolean",
"default": false,
"description": "Also delete their emails and tickets, when no law requires keeping them."
}
},
"additionalProperties": false
}What happened in this account that someone outside the bot did, oldest first: applications, bookings, form responses, signatures, replies, emails received, goals reached on the website; and the custom events bots sent with account_emit_event. Kept 30 days. Poll with after = the last event_id you saw. Free.
| Argument | Type | Description |
|---|---|---|
| after | integer | Only events after this event_id. |
| kinds | array | Event names or areas ("hiring.*"); all when left out. |
| limit | integer |
{
"type": "object",
"required": [],
"properties": {
"after": {
"type": "integer",
"minimum": 0,
"description": "Only events after this event_id."
},
"kinds": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 30,
"description": "Event names or areas (\"hiring.*\"); all when left out."
},
"limit": {
"type": "integer",
"default": 50,
"maximum": 200,
"minimum": 1
}
},
"additionalProperties": false
}Everything this account holds, in ZIP files of up to 24 MB saved to its file store: every record of every area as JSON Lines, and the stored files themselves, with a README saying what is where. Credentials are left out. Runs in the background: poll the call with account_get_call; the result has a download link for each part. The parts open only for this key and for the owner's and admins' own keys that neither only read nor only draft. A key of a team other than the company-wide one gets owner_required. Free (EU Data Act). One at a time, three a day; the owner is emailed when an export is made. Free. Runs in the background: the reply has a call_id; poll it with the account_get_call tool or GET /v1/calls/<id>.
No arguments.
{
"type": "object",
"required": [],
"properties": {},
"additionalProperties": false
}Everything account_find_person finds about one person in one ZIP in the file store: their records as JSON Lines (credentials left out) and the files those records point to, like a CV. Give the person the download link when they ask for a copy of their data (GDPR Art. 15 and 20), once you know it is them. The ZIP opens only for this key and for the owner's and admins' own keys that neither only read nor only draft. A key of a team other than the company-wide one gets owner_required: pass the request to the owner. Free; 20 a day. Free.
| Argument | Type | Description |
|---|---|---|
| string | The person's email address. | |
| phone | string | Their phone number in international format, like +1 503 555 0145. |
{
"type": "object",
"required": [],
"properties": {
"email": {
"type": "string",
"maxLength": 254,
"description": "The person's email address."
},
"phone": {
"type": "string",
"maxLength": 40,
"description": "Their phone number in international format, like +1 503 555 0145."
}
},
"additionalProperties": false
}Every record this account holds about one person, by their email address or phone number, across every area: CRM, chats, emails, tickets, forms, bookings, calls, applications, invoices, orders, newsletters, HR and the call log, with their chats and CRM history. For a person who asks what the business keeps about them (GDPR Art. 15). Shows each kind with its count and ids; account_export_person gives them a copy, account_erase_person erases what may go. Free.
| Argument | Type | Description |
|---|---|---|
| string | The person's email address. | |
| phone | string | Their phone number in international format, like +1 503 555 0145. |
{
"type": "object",
"required": [],
"properties": {
"email": {
"type": "string",
"maxLength": 254,
"description": "The person's email address."
},
"phone": {
"type": "string",
"maxLength": 40,
"description": "Their phone number in international format, like +1 503 555 0145."
}
},
"additionalProperties": false
}The name, logo, colour and footer line the business's emails and published pages carry. Free.
No arguments.
{
"type": "object",
"required": [],
"properties": {},
"additionalProperties": false
}One call by id: its status (queued, running, succeeded, failed), cost and result. Use it to poll a background call until it finishes. Free.
| Argument | Type | Description |
|---|---|---|
| call_id* | string |
{
"type": "object",
"required": [
"call_id"
],
"properties": {
"call_id": {
"type": "string",
"maxLength": 36,
"minLength": 36
}
},
"additionalProperties": false
}The limits a business can ask Conecto to raise (calls a minute, new email addresses a day, phone numbers and more): each one's standard and current value and the most that can be asked for, and the business's requests with their answers. Free.
No arguments.
{
"type": "object",
"required": [],
"properties": {},
"additionalProperties": false
}The tools that wait for a person's approval, with their thresholds and approvers. Free.
No arguments.
{
"type": "object",
"required": [],
"properties": {},
"additionalProperties": false
}Recent calls on this account, newest first, optionally only failed or succeeded ones, or one area's. Free.
| Argument | Type | Description |
|---|---|---|
| area | string | |
| limit | integer | |
| status | string |
{
"type": "object",
"required": [],
"properties": {
"area": {
"enum": [
"analytics",
"code",
"crm",
"calendar",
"chat",
"account",
"admin",
"email",
"helpdesk",
"documents",
"esign",
"hiring",
"outreach",
"prospects",
"lookups",
"companies",
"longlists",
"mergers",
"valuation",
"newsletters",
"notify",
"projects",
"schedules",
"speech",
"uptime",
"vault",
"web",
"tables",
"links",
"images",
"files",
"forms",
"helpcenter",
"imports",
"invoices",
"books",
"inventory",
"whistleblowing",
"connect",
"microsoft365",
"googleworkspace",
"hubspot",
"salesforce",
"directory",
"hr",
"social",
"purchasing",
"phone",
"websites",
"views",
"visibility",
"markets"
],
"type": "string"
},
"limit": {
"type": "integer",
"default": 20,
"maximum": 100,
"minimum": 1
},
"status": {
"enum": [
"reserved",
"running",
"succeeded",
"failed"
],
"type": "string"
}
},
"additionalProperties": false
}Every email Conecto sends to the business's customers (bookings, applications, interviews, tests, signatures, invoices and quotes, newsletter sign-ups), with when it goes out and its subject, headline and opening words as they are now, and the {variables} each can use. Free.
No arguments.
{
"type": "object",
"required": [],
"properties": {},
"additionalProperties": false
}The account's teams, the company-wide one first: each with its areas, whether it only reads, its budget (hard or soft, and its period) and alert line, this period's spend, its ERP code, whether it is paused, its keys, and its people with who manages it. A person's own assistant works within their teams. Free.
No arguments.
{
"type": "object",
"required": [],
"properties": {},
"additionalProperties": false
}A link that signs the business owner into their Conecto page, with no password: the balance, adding credit, auto-reload, limits, what the bots did, people, rentals and keys. page opens it where the owner is needed, like people for a role only the owner gives, or settings for joining by email domain. It works once, within 30 minutes; hand it to the owner. Free.
| Argument | Type | Description |
|---|---|---|
| page | string |
{
"type": "object",
"required": [],
"properties": {
"page": {
"enum": [
"home",
"tools",
"activity",
"apps",
"billing",
"add_credit",
"limits",
"people",
"settings"
],
"type": "string",
"default": "home"
}
},
"additionalProperties": false
}Stops every key of a team at once, this one too if it is the team's: their calls are refused until the owner starts the team again on their account page. For a bot that misbehaves or a team that spends too fast. Free. Free.
| Argument | Type | Description |
|---|---|---|
| team* | string |
{
"type": "object",
"required": [
"team"
],
"properties": {
"team": {
"type": "string",
"maxLength": 80,
"minLength": 1
}
},
"additionalProperties": false
}Refund a top-up paid in the last 24 hours that none of has been used yet: its credit, with the first top-up's bonus, leaves the balance, and the card gets the credit back with its tax. The service fee is kept. Without topup_id, the newest top-up (GET /v1/topups lists them with their ids). Free. Free.
| Argument | Type | Description |
|---|---|---|
| topup_id | integer |
{
"type": "object",
"required": [],
"properties": {
"topup_id": {
"type": "integer",
"minimum": 1
}
},
"additionalProperties": false
}Ask Conecto to raise one of the business's limits: which one (or other, saying which), the number it needs, and why, in 40 to 2,000 characters. Conecto reviews it and approves (maybe with less) or declines; the answer comes as the account.limit_request_answered event and by email to the owner, who is also told now. For an account that has topped up; one request per limit at a time, five in 30 days. Free. Free.
| Argument | Type | Description |
|---|---|---|
| limit* | string | The limit, as account_get_limits names it, or other. |
| other | string | With limit other: which limit, like "rows in one table". |
| amount* | integer | The number the business needs, in the limit's unit (5000 calls a minute). |
| reason* | string | What the business does that needs it, and why the current limit is too low. |
{
"type": "object",
"required": [
"limit",
"amount",
"reason"
],
"properties": {
"limit": {
"enum": [
"calls_per_minute",
"key_calls_per_minute",
"downloads_per_hour",
"new_email_recipients_per_day",
"documents_emailed_per_day",
"orders_emailed_per_day",
"phone_numbers",
"confirmation_calls_per_day",
"connections",
"storage_blocks",
"prospects_per_month",
"outreach_mailboxes",
"other"
],
"type": "string",
"description": "The limit, as account_get_limits names it, or other."
},
"other": {
"type": "string",
"maxLength": 200,
"description": "With limit other: which limit, like \"rows in one table\"."
},
"amount": {
"type": "integer",
"maximum": 1000000000,
"minimum": 1,
"description": "The number the business needs, in the limit's unit (5000 calls a minute)."
},
"reason": {
"type": "string",
"maxLength": 2000,
"minLength": 40,
"description": "What the business does that needs it, and why the current limit is too low."
}
},
"additionalProperties": false
}A department, location or project group of the account, like Support, Finance or the Hamburg shop. Its keys (POST /v1/keys with "team") can only work in its areas, only read when read_only is on, and spend against its budget (monthly_budget_usd per budget_period: a month, a fiscal quarter or year, or a project total): a hard budget refuses the call that would pass it, a soft one only warns. At alert_percent you get the event account.budget_alert and the owner an email, once a period. erp_code is the team's cost center in the company's ERP, for statements. drafts_only makes every write of its keys wait for one of its managers (or the owner), for a new bot that should only draft. mailboxes are the Microsoft 365 or Google mailboxes its keys may act as. You may make a team and narrow one; widening its areas, letting it write, ending drafts only, switching a hard budget to soft, and raising or removing a budget are the owner's, on their account page, when the account has an owner email. The company-wide team holds every key no other team does and is never limited to areas. $0.001. Costs $0.001 per call; nothing if it fails.
| Argument | Type | Description |
|---|---|---|
| name* | string | |
| areas | array | null | The areas its keys may work in (account tools always); null for every area. |
| budget | string | hard refuses calls past the budget; soft only warns. |
| erp_code | string | null | |
| new_name | string | Renames the team; its keys, spend and budget stay with it. |
| mailboxes |
One search over what this account holds: what its files say (PDFs, Word, Excel, PowerPoint, text), table rows, help center articles, CRM contacts, companies and deals, emails, tickets, quotes and invoices, book entries, stock items and project tasks. Every word must appear (any case); titles rank first, then the newest. Each result says which tool opens it. Narrow it with areas. Free.
| Argument | Type | Description |
|---|---|---|
| areas | array | |
| limit | integer | |
| query* | string |
{
"type": "object",
"required": [
"query"
],
"properties": {
"areas": {
"type": "array",
"items": {
"enum": [
"files",
"tables",
"helpcenter",
"crm",
"email",
"helpdesk",
"invoices",
"books",
"inventory",
"projects"
],
"type": "string"
},
"minItems": 1
},
"limit": {
"type": "integer",
"default": 20,
"maximum": 50,
"minimum": 1
},
"query": {
"type": "string",
"maxLength": 200,
"minLength": 2
}
},
"additionalProperties": false
}The business's name as the sender, its logo (a PNG, JPEG, WebP or GIF from the file store), its colour and a footer line (an address, a legal line), on every email to its customers (bookings, applications, tests, signatures, invoices, newsletters, replies) and on its published pages (forms, booking, careers, newsletters, status, views). Only what you pass changes; an empty string clears it. Mail from Conecto to you keeps Conecto's look. Costs $0.001 per call; nothing if it fails.
| Argument | Type | Description |
|---|---|---|
| colour | string | Hex, like #1a73e8; empty for none. |
| footer | string | |
| remove_logo | boolean | |
| sender_name | string | |
| logo_file_id | string |
{
"type": "object",
"required": [],
"properties": {
"colour": {
"type": "string",
"maxLength": 7,
"description": "Hex, like #1a73e8; empty for none."
},
"footer": {
"type": "string",
"maxLength": 200
},
"remove_logo": {
"type": "boolean",
"default": false
},
"sender_name": {
"type": "string",
"maxLength": 120
},
"logo_file_id": {
"type": "string",
"maxLength": 36,
"minLength": 36
}
},
"additionalProperties": false
}Change an email's subject, headline or opening words in the business's own voice, with {variables} from account_list_email_templates (like {name} or {when}). The facts under them (times, places, amounts, links and buttons) stay as they are. Only what you pass changes; an empty string brings back the original words. Plain text; a blank line starts a new paragraph. Costs $0.001 per call; nothing if it fails.
| Argument | Type | Description |
|---|---|---|
| email* | string | Like booking_booked or invoice_sent. |
| opening | string | |
| subject | string | |
| headline | string |
{
"type": "object",
"required": [
"email"
],
"properties": {
"email": {
"type": "string",
"maxLength": 40,
"description": "Like booking_booked or invoice_sent."
},
"opening": {
"type": "string",
"maxLength": 4000
},
"subject": {
"type": "string",
"maxLength": 200
},
"headline": {
"type": "string",
"maxLength": 120
}
},
"additionalProperties": false
}When the account was made without the owner's email: send that person a link to confirm they own it. Once they confirm, the owner gets the account's warnings and approval requests, and only the owner raises limits. Nothing changes until they open the link. Free. Free.
| Argument | Type | Description |
|---|---|---|
| email* | string |
{
"type": "object",
"required": [
"email"
],
"properties": {
"email": {
"type": "string",
"maxLength": 254,
"minLength": 3
}
},
"additionalProperties": false
}Connect the business's own Stripe account with a restricted key (a person makes it in Stripe: Developers, API keys, Create restricted key), so invoices can carry a Pay button (invoices_set_profile pay_online). A restricted key with write access to Checkout Sessions and Webhook Endpoints. Conecto registers a webhook on that account to learn when an invoice is paid. The money goes straight to the business; Conecto never holds it. Called without stripe_key, it answers with a link for the owner, who types the key on a Conecto page, so it never passes through the chat (from_a_terminal does the same from a terminal); account.credential_added says when it is connected, and the link costs nothing. The key is kept encrypted and never shown again. Costs $0.001 per call; nothing if it fails.
| Argument | Type | Description |
|---|---|---|
| stripe_key | string | A restricted key, rk_live_... Leave it out to get the link instead. |
{
"type": "object",
"required": [],
"properties": {
"stripe_key": {
"type": "string",
"maxLength": 300,
"minLength": 20,
"writeOnly": true,
"description": "A restricted key, rk_live_... Leave it out to get the link instead."
}
},
"additionalProperties": false
}Turn an accepted quote into a draft invoice with the same customer and lines, ready for invoices_send. If the customer accepted some other way (email, phone), pass mark_accepted: true to record it. Costs $0.01 per call; nothing if it fails.
| Argument | Type | Description |
|---|---|---|
| quote_id* | string | The quote's invoice_id. |
| mark_accepted | boolean | Record a sent quote as accepted first (the customer said yes). |
{
"type": "object",
"required": [
"quote_id"
],
"properties": {
"quote_id": {
"type": "string",
"maxLength": 36,
"minLength": 36,
"description": "The quote's invoice_id."
},
"mark_accepted": {
"type": "boolean",
"default": false,
"description": "Record a sent quote as accepted first (the customer said yes)."
}
},
"additionalProperties": false
}Create a quote or an invoice as a draft: the customer (a CRM contact or company, or a name and email), line items, currency and dates. Nothing is numbered or sent yet; change drafts with invoices_update and send them with invoices_send. Amounts are the business's money in the document's currency, rounded half-up line by line. Costs $0.01 per call; nothing if it fails.
| Argument | Type | Description |
|---|---|---|
| kind* | string | |
| items* | array | |
| notes | string | Printed above the lines, e.g. "Thank you for your order" or a project reference. |
| currency | string | ISO 4217, e.g. "USD", "EUR" or "JPY". |
| customer* | object | Who the document is for. Link a CRM record with contact_id or company_id, or give name and email (an email that matches a CRM contact links it). What is given here is printed as it is. |
| due_date | string | Invoices. Default: issue date + the payment terms. |
| e_invoice | string | Invoices and their credit notes as EN 16931 e-invoices (German B2B invoices must be from 2027): factur-x (Factur-X/ZUGFeRD, the XML inside the PDF/A-3) or xrechnung (XRechnung 3.0, its own XML beside the PDF), checked against the EN 16931 schema before sending. "" is the default: none, except that from 2027 an invoice from a German business to a German business above EUR 250 is a factur-x; "none" opts out (a business under the EUR 800,000 turnover allowance until 2028). Needs the customer's country. Default: the profile's. |
Issue a credit note against a sent invoice: all of it, some of its lines, or an amount. It takes the next credit note number (gapless, CN-0001...), gets a PDF and a page like an invoice, and is emailed to the customer unless email is false. It lowers what the customer still owes; refunded: true says the money went back to them instead, and the invoice records the refund. In much of the EU a sent invoice is corrected this way, not voided. When the account keeps books, the sale and its tax are reversed there. Costs $0.10 per call; nothing if it fails.
| Argument | Type | Description |
|---|---|---|
| to | string | Email it to this address instead of the customer's. |
| boolean | false: issue it without emailing anyone. | |
| lines | array | Lines of the invoice to credit, at its prices. Leave out lines and amount to credit the whole invoice (or what is left of it). |
| amount | number | string | A sum to credit, tax included, e.g. "50.00" off for a late delivery. Its tax follows the invoice's rates (or those of `lines`, when given too). |
| method | string | With refunded: how the money went back. |
| reason | string | Printed on the credit note, e.g. "Returned: 1 bike rack". |
| message | string | A short note in the email. |
Stop a repeating invoice for good. The invoices it made stay as they are. Free.
| Argument | Type | Description |
|---|---|---|
| repeating_id* | integer | From invoices_list_repeating. |
{
"type": "object",
"required": [
"repeating_id"
],
"properties": {
"repeating_id": {
"type": "integer",
"minimum": 1,
"description": "From invoices_list_repeating."
}
},
"additionalProperties": false
}One quote, invoice or credit note in full: lines with their amounts, totals and taxes, payments, credit notes, history, its public page and a fresh PDF link. Find it by invoice_id, or by number (with kind if documents of two kinds share it). Free.
| Argument | Type | Description |
|---|---|---|
| kind | string | |
| number | string | e.g. "INV-0042". |
| invoice_id | string | The invoice_id invoices_create returned (quotes and credit notes have one too). |
| link_hours | integer | How long the PDF download link works, in hours (up to 168). |
{
"type": "object",
"required": [],
"properties": {
"kind": {
"enum": [
"quote",
"invoice",
"credit_note"
],
"type": "string"
},
"number": {
"type": "string",
"maxLength": 40,
"description": "e.g. \"INV-0042\"."
},
"invoice_id": {
"type": "string",
"maxLength": 36,
"minLength": 36,
"description": "The invoice_id invoices_create returned (quotes and credit notes have one too)."
},
"link_hours": {
"type": "integer",
"default": 24,
"maximum": 168,
"minimum": 1,
"description": "How long the PDF download link works, in hours (up to 168)."
}
},
"additionalProperties": false
}The business details used on quotes and invoices, the next numbers, and what is still missing before documents can be sent. Free.
No arguments.
{
"type": "object",
"required": [],
"properties": {},
"additionalProperties": false
}Quotes, invoices and credit notes, newest first, filtered by kind, status (also overdue, unpaid and expired), customer and issue date. Totals and balances come with each one. Free.
| Argument | Type | Description |
|---|---|---|
| kind | string | |
| limit | integer | |
| offset | integer | |
| status | string | overdue: past due with a balance. unpaid: sent invoices with a balance. expired: sent quotes past valid_until. |
| date_to | string | Issued on or before. |
| customer | string | Part of the customer's name or email, or of the number. |
| date_from | string | Issued on or after (YYYY-MM-DD). Drafts have no issue date yet. |
| company_id | integer | |
| contact_id | integer |
Customers' credits, prepayments and overpayments, newest first: what each was, what is left, its VAT and how it was used or paid back. Filter by customer, or status (open, used, refunded, void, all; default open). Free.
| Argument | Type | Description |
|---|---|---|
| limit | integer | |
| offset | integer | |
| status | string | |
| customer | object | The customer: a CRM contact or company, or the email or name on their invoices. |
{
"type": "object",
"required": [],
"properties": {
"limit": {
"type": "integer",
"default": 50,
"maximum": 200,
"minimum": 1
},
"offset": {
"type": "integer",
"default": 0,
"minimum": 0
},
"status": {
"enum": [
"open",
"used",
"refunded",
"void",
"all"
],
"type": "string",
"default": "open"
},
"customer": {
"type": "object",
"properties": {
"name": {
"type": "string",
"maxLength": 200,
"description": "Who is billed, as printed."
},
"email": {
"type": "string",
"maxLength": 254,
"description": "Where the document is emailed."
},
"company_id": {
"type": "integer",
"minimum": 1,
"description": "A CRM company; fills the name."
},
"contact_id": {
"type": "integer",
"minimum": 1,
"description": "A CRM contact; fills the name and email."
}
},
"description": "The customer: a CRM contact or company, or the email or name on their invoices.",
"additionalProperties": false
}
},
"additionalProperties": false
}The repeating invoices: who each is for, its lines, how often, the next dates, whether it is drafted or sent, how many were made and the last one, and why one is paused. Free.
| Argument | Type | Description |
|---|---|---|
| status | string |
{
"type": "object",
"required": [],
"properties": {
"status": {
"enum": [
"active",
"paused",
"ended"
],
"type": "string"
}
},
"additionalProperties": false
}Record money received against a sent invoice: amount, date, method and reference. It becomes partially_paid, or paid when nothing is left. A payment can't be more than the balance, unless keep_excess keeps the rest as the customer's credit (an overpayment, like Xero's, for invoices_use_credit); a negative amount records a refund. When the account keeps books, it is posted to them. Costs $0.01 per call; nothing if it fails.
| Argument | Type | Description |
|---|---|---|
| date | string | When it was paid. Default today. |
| note | string | |
| amount* | number | string | In the invoice's currency, e.g. "250.00". Negative for a refund. |
| method | string | |
| reference | string | e.g. the bank transfer reference or the payment id. |
| invoice_id* | string | The invoice_id invoices_create returned (quotes and credit notes have one too). |
| keep_excess | boolean | Paid more than the balance: keep the rest as the customer's credit. |
{
"type": "object",
"required": [
"invoice_id",
"amount"
],
"properties": {
"date": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "When it was paid. Default today."
},
"note": {
"type": "string",
"maxLength": 500
},
"amount": {
"type": [
"number",
"string"
],
"maxLength": 24,
"description": "In the invoice's currency, e.g. \"250.00\". Negative for a refund."
},
"method": {
"enum": [
"bank_transfer",
"card",
"cash",
"check",
"online",
"other"
],
"type": "string",
"default": "other"
},
"reference": {
"type": "string",
"maxLength": 120,
"description": "e.g. the bank transfer reference or the payment id."
},
"invoice_id": {
"type": "string",
"maxLength": 36,
"minLength": 36,
"description": "The invoice_id invoices_create returned (quotes and credit notes have one too)."
},
"keep_excess": {
"type": "boolean",
"default": false,
"description": "Paid more than the balance: keep the rest as the customer's credit."
}
},
"additionalProperties": false
}Record money a customer paid before there is an invoice, like a deposit, as Xero's prepayments: it waits as their credit (CR-0001 on) until invoices_use_credit puts it on their invoice or pays it back. With tax_rate it carries its VAT, owed when the money came in (as the EU has it for advance payments); using it on the invoice takes that VAT back off, so the sale's VAT counts once. With books kept it is posted at once: the bank against Customer prepayments (2400, made when missing) and the tax owed. Costs $0.01 per call; nothing if it fails.
| Argument | Type | Description |
|---|---|---|
| date | string | When it came in. Default today. |
| note | string | |
| amount* | number | string | What they paid, tax included, e.g. "3570.00". |
| method | string | |
| currency | string | ISO 4217, e.g. "USD", "EUR" or "JPY". |
| customer* | object | Who paid: a CRM contact or company, or a name and email. |
| tax_rate | number | The VAT in it, in percent, e.g. 19. Default none. |
| reference | string |
Email the customer a reminder about a sent invoice that still has a balance: the amount due, the due date and the links to pay. At most once a day per invoice. Costs $0.02 per call; nothing if it fails.
| Argument | Type | Description |
|---|---|---|
| to | string | Send to this address instead of the customer's email. |
| message | string | A short note in the email, e.g. "Just a friendly reminder." |
| invoice_id* | string | The invoice_id invoices_create returned (quotes and credit notes have one too). |
| link_hours | integer | How long the PDF download link works, in hours (up to 168). |
{
"type": "object",
"required": [
"invoice_id"
],
"properties": {
"to": {
"type": "string",
"maxLength": 254,
"description": "Send to this address instead of the customer's email."
},
"message": {
"type": "string",
"maxLength": 2000,
"description": "A short note in the email, e.g. \"Just a friendly reminder.\""
},
"invoice_id": {
"type": "string",
"maxLength": 36,
"minLength": 36,
"description": "The invoice_id invoices_create returned (quotes and credit notes have one too)."
},
"link_hours": {
"type": "integer",
"default": 24,
"maximum": 168,
"minimum": 1,
"description": "How long the PDF download link works, in hours (up to 168)."
}
},
"additionalProperties": false
}Email a reminder about every sent invoice at least days_overdue days past its due date that still has a balance, the longest overdue first, up to limit invoices: one call, or one weekly schedule (schedules_create), chases them all. Each invoice is reminded at most once a day; the ones that can't be (no customer email, emailed in the last 24 hours, the address bounced) are listed with why. $0.02 per reminder sent. Costs $0.02 per reminder sent; nothing if none are found.
| Argument | Type | Description |
|---|---|---|
| limit | integer | |
| message | string | A short note in each email, e.g. "Just a friendly reminder." |
| link_hours | integer | How long the PDF download link works, in hours (up to 168). |
| days_overdue | integer |
{
"type": "object",
"required": [],
"properties": {
"limit": {
"type": "integer",
"default": 20,
"maximum": 50,
"minimum": 1
},
"message": {
"type": "string",
"maxLength": 2000,
"description": "A short note in each email, e.g. \"Just a friendly reminder.\""
},
"link_hours": {
"type": "integer",
"default": 24,
"maximum": 168,
"minimum": 1,
"description": "How long the PDF download link works, in hours (up to 168)."
},
"days_overdue": {
"type": "integer",
"default": 1,
"maximum": 365,
"minimum": 1
}
},
"additionalProperties": false
}aged_receivables: what each customer owes on as_of (default today), by how long past due: current (not due yet), 1-30, 31-60, 61-90 and over 90 days, per currency. sales: what was invoiced from-to (by issue date; default this month) per customer, less the credit notes issued in it: net, tax and total, and what was paid in it. To show a person, put it in a view (view_show). Free. Free.
| Argument | Type | Description |
|---|---|---|
| to | string | YYYY-MM-DD |
| from | string | YYYY-MM-DD |
| as_of | string | YYYY-MM-DD |
| report* | string |
{
"type": "object",
"required": [
"report"
],
"properties": {
"to": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "YYYY-MM-DD"
},
"from": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "YYYY-MM-DD"
},
"as_of": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "YYYY-MM-DD"
},
"report": {
"enum": [
"aged_receivables",
"sales"
],
"type": "string"
}
},
"additionalProperties": false
}An invoice made again every so many weeks, months or years, like Xero's repeating invoices: the customer and lines as for invoices_create, every and unit, the start date, and an end_date or a number of times. action draft leaves each one for you to check and send; send emails it to the customer on its day. Descriptions and notes may hold [Month], [Year], [Quarter] or [Week], with an offset like [Month+1], filled in from each invoice's date. Each invoice is made by Conecto's worker as this key and costs what invoices_create and invoices_send cost. Change one by repeating_id: only what you pass changes; status paused stops it, active resumes it (dates it missed are skipped). Costs $0.001 per call; nothing if it fails.
| Argument | Type | Description |
|---|---|---|
| name | string | Your own label, e.g. "Hotel service contract". |
| unit | string | |
| every | integer | Default 1. |
| items | array | |
| notes | string | Printed above the lines, e.g. "Thank you for your order" or a project reference. |
| start | string | The first invoice's date, today or later. Monthly and yearly invoices keep to its day of the month. |
| times | integer | How many invoices in all. |
| action |
Send a draft: it takes the next number (gapless), its PDF is made and kept in the file store, and the customer is emailed a link to its page (to view, pay or accept it) and to the PDF. On a document already sent it emails it again (to `to`, if given). email: false sends it without emailing anyone, to hand the link over yourself. When the account keeps books (books_setup), a sent invoice is posted to them. Before an invoice or credit note takes its number it is checked against the law of the business's country (in the EU, the UK and Switzerland: the business's address and VAT ID, the customer's VAT ID and address where needed, why a line has no tax, the VAT in the national currency); what is missing is refused for free, warnings come back. With e_invoice set it also goes out as an EN 16931 e-invoice (Factur-X inside the PDF, or an XRechnung XML beside it), validated against the official schema first. Costs $0.10 per call; nothing if it fails.
| Argument | Type | Description |
|---|---|---|
| to | string | Send to this address instead of the customer's email. |
| boolean | false: number it and make the PDF and the page, but email no one. | |
| message | string | A short note in the email, e.g. "Thanks for your order!" |
| invoice_id* | string | The invoice_id invoices_create returned (quotes and credit notes have one too). |
| link_hours | integer | How long the PDF download link works, in hours (up to 168). |
The day a customer said they would pay an invoice that is sent and not paid yet, like Xero's expected date: the cash flow forecast (books_report cash_forecast) counts the invoice on that day, even one already overdue, which it otherwise leaves out. null clears it. Free.
| Argument | Type | Description |
|---|---|---|
| date* | string | null | YYYY-MM-DD, or null to go back to the default. |
| invoice_id* | string | The invoice_id invoices_create returned (quotes and credit notes have one too). |
{
"type": "object",
"required": [
"invoice_id",
"date"
],
"properties": {
"date": {
"type": [
"string",
"null"
],
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "YYYY-MM-DD, or null to go back to the default."
},
"invoice_id": {
"type": "string",
"maxLength": 36,
"minLength": 36,
"description": "The invoice_id invoices_create returned (quotes and credit notes have one too)."
}
},
"additionalProperties": false
}Set the business details printed on quotes and invoices: legal name, country, address, tax ID, email, phone, logo, default currency, payment terms, tax rate, number prefixes and next numbers, payment instructions, an optional payment link and legal notes. Only the fields given change. Sending needs legal_name and country; in the EU, the UK and Switzerland an invoice also needs the address and tax ID, checked when it is sent. Costs $0.001 per call; nothing if it fails.
| Argument | Type | Description |
|---|---|---|
| string | Where customers write about invoices: printed, and the Reply-To of emails. | |
| paper | string | Default: Letter for USD and CAD businesses, else A4. |
| phone | string | |
| footer | string | Payment instructions printed at the bottom of invoices, e.g. bank name, IBAN and BIC. |
| tax_id | string | VAT, GST or tax number, printed with the address. |
| address | string | Postal address, one line per row. |
| country | string | ISO 3166-1 code of the country the business is established in, e.g. "DE". Needed to send: it decides what invoices must show (in the EU the VAT ID, addresses, the date of supply, why a line has no tax, VAT in the national currency) and is checked before each one goes out. |
A customer statement, like Xero's. outstanding (the default) lists every invoice the customer still owed on as_of (default today) with what was paid or credited, how late each is and the money owed by how late; activity starts from what they owed before from, lists each invoice, payment and credit note up to to (default this month so far) with the running balance, and ends with what they owed. One currency (default the one they are billed in most). It is a PDF in the file store in the business's look and document language; email: true also emails the customer a link to it in the business's name, under the rules every bot email follows and at most once a day per customer. $0.05. Costs $0.05 per call; nothing if it fails.
| Argument | Type | Description |
|---|---|---|
| to | string | YYYY-MM-DD |
| from | string | YYYY-MM-DD |
| kind | string | |
| as_of | string | YYYY-MM-DD |
| boolean | ||
| message | string | Your own words above the amount due. |
| send_to | string | Another address to email it to. |
| currency | string | ISO 4217, e.g. "USD", "EUR" or "JPY". |
What customers owe, per currency: outstanding, overdue and paid this month, plus quotes still open. Free.
No arguments.
{
"type": "object",
"required": [],
"properties": {},
"additionalProperties": false
}Change a draft quote or invoice: give only what changes; customer and items replace the old ones. A sent document can't change: void it with invoices_void and create a new one. Costs $0.01 per call; nothing if it fails.
| Argument | Type | Description |
|---|---|---|
| items | array | |
| notes | string | Printed above the lines, e.g. "Thank you for your order" or a project reference. |
| currency | string | ISO 4217, e.g. "USD", "EUR" or "JPY". |
| customer | object | Who the document is for. Link a CRM record with contact_id or company_id, or give name and email (an email that matches a CRM contact links it). What is given here is printed as it is. |
| due_date | string | null | YYYY-MM-DD, or null to go back to the default. |
| e_invoice | string | Invoices and their credit notes as EN 16931 e-invoices (German B2B invoices must be from 2027): factur-x (Factur-X/ZUGFeRD, the XML inside the PDF/A-3) or xrechnung (XRechnung 3.0, its own XML beside the PDF), checked against the EN 16931 schema before sending. "" is the default: none, except that from 2027 an invoice from a German business to a German business above EUR 250 is a factur-x; "none" opts out (a business under the EUR 800,000 turnover allowance until 2028). Needs the customer's country. Default: the profile's. |
| invoice_id* | string |
Put a customer's credit (a prepayment or an overpayment) on one of their sent invoices, like Xero's allocate credit: invoice_id, and amount (default all it can: what is left on the credit or the invoice, the smaller); the invoice records it as a payment with method credit, and its share of the credit's VAT comes back off. Or refund: true pays what is left (or amount) back to the customer, with date and method; or void: true takes back a prepayment recorded by mistake while none of it is used. Same customer and currency only. Costs $0.01 per call; nothing if it fails.
| Argument | Type | Description |
|---|---|---|
| date | string | YYYY-MM-DD |
| void | boolean | |
| amount | number | string | |
| credit* | string | The credit's number, like "CR-0001" (invoices_list_credits). |
| method | string | |
| refund | boolean | |
| reference | string | |
| invoice_id | string | The invoice_id invoices_create returned (quotes and credit notes have one too). |
Void a document. A sent one keeps its number (numbers stay gapless) but can no longer be paid, accepted or viewed; a draft is simply discarded. Refused while payments are recorded on it, on an invoice with credit notes and on a credit note (correct those with another credit note or a new invoice), and on an invoice that may be in the customer's hands (emailed, opened, or its PDF downloaded through a link): that one is cancelled with a credit note for all of it, as the law asks. An invoice posted to the books is reversed there. Costs $0.01 per call; nothing if it fails.
| Argument | Type | Description |
|---|---|---|
| reason | string | |
| invoice_id* | string | The invoice_id invoices_create returned (quotes and credit notes have one too). |
{
"type": "object",
"required": [
"invoice_id"
],
"properties": {
"reason": {
"type": "string",
"maxLength": 500
},
"invoice_id": {
"type": "string",
"maxLength": 36,
"minLength": 36,
"description": "The invoice_id invoices_create returned (quotes and credit notes have one too)."
}
},
"additionalProperties": false
}We read every tool's name, description and inputs the way the model will, looking for instructions hidden from you. A clean result means no warning signs, not a guarantee. Scanned Nov 2, 2026.
| array | null |
| The Microsoft 365 or Google mailboxes its keys may act as; null for every mailbox the connection lists. |
| read_only | boolean | Its keys only read, and get links that act for whoever opens them as "[redacted]". |
| drafts_only | boolean | Every write of its keys waits for a person, and they get links that act for whoever opens them as "[redacted]". |
| alert_percent | integer |
| budget_period | string | What the budget is for: a month, a quarter or a year of the account's fiscal calendar, or a project total until budget_ends_on. |
| budget_ends_on | string | null | The last day of a project budget, like 2026-12-31. |
| sees_sensitive | boolean | false hides suppliers' bank details and HR notes and contracts from its keys; only the owner turns it on. |
| monthly_budget_usd | number | null | null counts the spend without a cap. |
{
"type": "object",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"maxLength": 80,
"minLength": 1
},
"areas": {
"type": [
"array",
"null"
],
"items": {
"type": "string"
},
"maxItems": 50,
"description": "The areas its keys may work in (account tools always); null for every area."
},
"budget": {
"enum": [
"hard",
"soft"
],
"type": "string",
"description": "hard refuses calls past the budget; soft only warns."
},
"erp_code": {
"type": [
"string",
"null"
],
"maxLength": 40
},
"new_name": {
"type": "string",
"maxLength": 80,
"minLength": 1,
"description": "Renames the team; its keys, spend and budget stay with it."
},
"mailboxes": {
"type": [
"array",
"null"
],
"items": {
"type": "string",
"maxLength": 254
},
"maxItems": 20,
"description": "The Microsoft 365 or Google mailboxes its keys may act as; null for every mailbox the connection lists."
},
"read_only": {
"type": "boolean",
"description": "Its keys only read, and get links that act for whoever opens them as \"[redacted]\"."
},
"drafts_only": {
"type": "boolean",
"description": "Every write of its keys waits for a person, and they get links that act for whoever opens them as \"[redacted]\"."
},
"alert_percent": {
"type": "integer",
"maximum": 100,
"minimum": 1
},
"budget_period": {
"enum": [
"month",
"quarter",
"year",
"project"
],
"type": "string",
"description": "What the budget is for: a month, a quarter or a year of the account's fiscal calendar, or a project total until budget_ends_on."
},
"budget_ends_on": {
"type": [
"string",
"null"
],
"format": "date",
"description": "The last day of a project budget, like 2026-12-31."
},
"sees_sensitive": {
"type": "boolean",
"description": "false hides suppliers' bank details and HR notes and contracts from its keys; only the owner turns it on."
},
"monthly_budget_usd": {
"type": [
"number",
"null"
],
"maximum": 1000000,
"minimum": 0,
"description": "null counts the spend without a cap."
}
},
"additionalProperties": false
}| issue_date | string | Default: the day it is sent. |
| supply_date | string | Invoices: the day the goods or services were supplied, or the first day of a period. Default: the issue date, which the invoice then states. |
| valid_until | string | Quotes. Default: issue date + the profile's quote_valid_days. |
| payment_link | string | An https link to pay this document. Default: the profile's payment_link. |
| supply_until | string | Invoices: the last day of the supply period, e.g. a month of service. |
| tax_exemption | string | Why lines with tax_rate 0 carry no tax, printed on the invoice as the law asks: exempt, zero_rated, reverse_charge (the customer accounts for the VAT), intra_eu (goods to a business in another EU country), export (goods leaving the EU), outside_scope, small_business (a business under its country's small-business VAT exemption, such as UStG §19 or art. 293 B CGI: no line may carry tax). Needed in the EU for any line without tax. Default: the profile's. |
| vat_exchange_rate | number | string | null | For an invoice in another currency than the national one of the business's country: one unit of it in the national currency, for the VAT shown in both. Default in the EU: the European Central Bank's rate for the day of supply; UK businesses give it. |
| payment_terms_days | integer | Invoices: days to pay, instead of the profile's terms. |
| tax_exemption_note | string | The wording printed for the exemption instead of the standard one, e.g. "Steuerbefreit als Kleinunternehmer nach § 19 UStG". |
{
"type": "object",
"required": [
"kind",
"customer",
"items"
],
"properties": {
"kind": {
"enum": [
"invoice",
"quote"
],
"type": "string"
},
"items": {
"type": "array",
"items": {
"type": "object",
"required": [
"description",
"unit_price"
],
"properties": {
"account": {
"type": "string",
"maxLength": 20,
"description": "With books: the income account this line books to, e.g. \"4100\" for services. Default: the sales account."
},
"discount": {
"type": [
"number",
"string"
],
"maxLength": 24,
"description": "Discount percent on this line, e.g. 10."
},
"quantity": {
"type": [
"number",
"string"
],
"maxLength": 24,
"description": "Default 1. Up to 6 decimals, e.g. 1.5 (hours)."
},
"tax_rate": {
"type": [
"number",
"string"
],
"maxLength": 24,
"description": "Tax percent, e.g. 19. Default: the profile's tax_rate."
},
"tracking": {
"type": "object",
"description": "With books: tracking options, e.g. {\"Department\": \"Service\"}.",
"maxProperties": 2,
"additionalProperties": {
"type": "string",
"maxLength": 60
}
},
"unit_price": {
"type": [
"number",
"string"
],
"maxLength": 24,
"description": "The price of one, before tax, e.g. \"19.99\". Negative for a credit line."
},
"description": {
"type": "string",
"maxLength": 2000,
"minLength": 1,
"description": "What was sold. Lines after the first print smaller, underneath."
}
},
"additionalProperties": false
},
"maxItems": 200,
"minItems": 1
},
"notes": {
"type": "string",
"maxLength": 5000,
"description": "Printed above the lines, e.g. \"Thank you for your order\" or a project reference."
},
"currency": {
"type": "string",
"pattern": "^[A-Za-z]{3}$",
"description": "ISO 4217, e.g. \"USD\", \"EUR\" or \"JPY\"."
},
"customer": {
"type": "object",
"properties": {
"name": {
"type": "string",
"maxLength": 200,
"description": "Who is billed, as printed."
},
"email": {
"type": "string",
"maxLength": 254,
"description": "Where the document is emailed."
},
"tax_id": {
"type": "string",
"maxLength": 60,
"description": "The customer's VAT or tax number, for business customers. A reverse-charge or intra-EU invoice needs their EU VAT ID, e.g. \"FR12345678901\"."
},
"address": {
"type": "string",
"maxLength": 1000,
"description": "Postal address, one line per row."
},
"country": {
"type": "string",
"maxLength": 2,
"description": "ISO 3166-1 code of the customer's country, e.g. \"FR\". Checks intra_eu and export invoices; e-invoices need it."
},
"company_id": {
"type": "integer",
"minimum": 1,
"description": "A CRM company; fills the name."
},
"contact_id": {
"type": "integer",
"minimum": 1,
"description": "A CRM contact; fills the name and email."
}
},
"description": "Who the document is for. Link a CRM record with contact_id or company_id, or give name and email (an email that matches a CRM contact links it). What is given here is printed as it is.",
"additionalProperties": false
},
"due_date": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "Invoices. Default: issue date + the payment terms."
},
"e_invoice": {
"enum": [
"",
"factur-x",
"xrechnung",
"none"
],
"type": "string",
"description": "Invoices and their credit notes as EN 16931 e-invoices (German B2B invoices must be from 2027): factur-x (Factur-X/ZUGFeRD, the XML inside the PDF/A-3) or xrechnung (XRechnung 3.0, its own XML beside the PDF), checked against the EN 16931 schema before sending. \"\" is the default: none, except that from 2027 an invoice from a German business to a German business above EUR 250 is a factur-x; \"none\" opts out (a business under the EUR 800,000 turnover allowance until 2028). Needs the customer's country. Default: the profile's."
},
"issue_date": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "Default: the day it is sent."
},
"supply_date": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "Invoices: the day the goods or services were supplied, or the first day of a period. Default: the issue date, which the invoice then states."
},
"valid_until": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "Quotes. Default: issue date + the profile's quote_valid_days."
},
"payment_link": {
"type": "string",
"maxLength": 500,
"description": "An https link to pay this document. Default: the profile's payment_link."
},
"supply_until": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "Invoices: the last day of the supply period, e.g. a month of service."
},
"tax_exemption": {
"enum": [
"",
"exempt",
"zero_rated",
"reverse_charge",
"intra_eu",
"export",
"outside_scope",
"small_business"
],
"type": "string",
"description": "Why lines with tax_rate 0 carry no tax, printed on the invoice as the law asks: exempt, zero_rated, reverse_charge (the customer accounts for the VAT), intra_eu (goods to a business in another EU country), export (goods leaving the EU), outside_scope, small_business (a business under its country's small-business VAT exemption, such as UStG §19 or art. 293 B CGI: no line may carry tax). Needed in the EU for any line without tax. Default: the profile's."
},
"vat_exchange_rate": {
"type": [
"number",
"string",
"null"
],
"maxLength": 24,
"description": "For an invoice in another currency than the national one of the business's country: one unit of it in the national currency, for the VAT shown in both. Default in the EU: the European Central Bank's rate for the day of supply; UK businesses give it."
},
"payment_terms_days": {
"type": "integer",
"maximum": 365,
"minimum": 0,
"description": "Invoices: days to pay, instead of the profile's terms."
},
"tax_exemption_note": {
"type": "string",
"maxLength": 300,
"description": "The wording printed for the exemption instead of the standard one, e.g. \"Steuerbefreit als Kleinunternehmer nach § 19 UStG\"."
}
},
"additionalProperties": false
}| refunded |
| boolean |
| true: the money went back to the customer (say how with method and reference). false: the credit lowers what they still owe. |
| reference | string | With refunded: e.g. the bank transfer or refund id. |
| invoice_id* | string | The invoice_id invoices_create returned (quotes and credit notes have one too). |
| link_hours | integer | How long the PDF download link works, in hours (up to 168). |
{
"type": "object",
"required": [
"invoice_id"
],
"properties": {
"to": {
"type": "string",
"maxLength": 254,
"description": "Email it to this address instead of the customer's."
},
"email": {
"type": "boolean",
"default": true,
"description": "false: issue it without emailing anyone."
},
"lines": {
"type": "array",
"items": {
"type": "object",
"required": [
"line"
],
"properties": {
"line": {
"type": "integer",
"minimum": 1,
"description": "The invoice's line number, from 1, in the order invoices_get lists its items."
},
"quantity": {
"type": [
"number",
"string"
],
"maxLength": 24,
"description": "How many to credit. Default: all of the line not credited yet."
}
},
"additionalProperties": false
},
"maxItems": 200,
"minItems": 1,
"description": "Lines of the invoice to credit, at its prices. Leave out lines and amount to credit the whole invoice (or what is left of it)."
},
"amount": {
"type": [
"number",
"string"
],
"maxLength": 24,
"description": "A sum to credit, tax included, e.g. \"50.00\" off for a late delivery. Its tax follows the invoice's rates (or those of `lines`, when given too)."
},
"method": {
"enum": [
"bank_transfer",
"card",
"cash",
"check",
"online",
"other"
],
"type": "string",
"default": "other",
"description": "With refunded: how the money went back."
},
"reason": {
"type": "string",
"maxLength": 500,
"description": "Printed on the credit note, e.g. \"Returned: 1 bike rack\"."
},
"message": {
"type": "string",
"maxLength": 2000,
"description": "A short note in the email."
},
"refunded": {
"type": "boolean",
"default": false,
"description": "true: the money went back to the customer (say how with method and reference). false: the credit lowers what they still owe."
},
"reference": {
"type": "string",
"maxLength": 120,
"description": "With refunded: e.g. the bank transfer or refund id."
},
"invoice_id": {
"type": "string",
"maxLength": 36,
"minLength": 36,
"description": "The invoice_id invoices_create returned (quotes and credit notes have one too)."
},
"link_hours": {
"type": "integer",
"default": 24,
"maximum": 168,
"minimum": 1,
"description": "How long the PDF download link works, in hours (up to 168)."
}
},
"additionalProperties": false
}{
"type": "object",
"required": [],
"properties": {
"kind": {
"enum": [
"quote",
"invoice",
"credit_note"
],
"type": "string"
},
"limit": {
"type": "integer",
"default": 25,
"maximum": 100,
"minimum": 1
},
"offset": {
"type": "integer",
"default": 0,
"minimum": 0
},
"status": {
"enum": [
"draft",
"sent",
"accepted",
"declined",
"paid",
"partially_paid",
"void",
"overdue",
"unpaid",
"expired"
],
"type": "string",
"description": "overdue: past due with a balance. unpaid: sent invoices with a balance. expired: sent quotes past valid_until."
},
"date_to": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "Issued on or before."
},
"customer": {
"type": "string",
"maxLength": 200,
"description": "Part of the customer's name or email, or of the number."
},
"date_from": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "Issued on or after (YYYY-MM-DD). Drafts have no issue date yet."
},
"company_id": {
"type": "integer",
"minimum": 1
},
"contact_id": {
"type": "integer",
"minimum": 1
}
},
"additionalProperties": false
}{
"type": "object",
"required": [
"customer",
"amount"
],
"properties": {
"date": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "When it came in. Default today."
},
"note": {
"type": "string",
"maxLength": 500
},
"amount": {
"type": [
"number",
"string"
],
"maxLength": 24,
"description": "What they paid, tax included, e.g. \"3570.00\"."
},
"method": {
"enum": [
"bank_transfer",
"card",
"cash",
"check",
"online",
"other"
],
"type": "string",
"default": "bank_transfer"
},
"currency": {
"type": "string",
"pattern": "^[A-Za-z]{3}$",
"description": "ISO 4217, e.g. \"USD\", \"EUR\" or \"JPY\"."
},
"customer": {
"type": "object",
"properties": {
"name": {
"type": "string",
"maxLength": 200,
"description": "Who is billed, as printed."
},
"email": {
"type": "string",
"maxLength": 254,
"description": "Where the document is emailed."
},
"tax_id": {
"type": "string",
"maxLength": 60,
"description": "The customer's VAT or tax number, for business customers. A reverse-charge or intra-EU invoice needs their EU VAT ID, e.g. \"FR12345678901\"."
},
"address": {
"type": "string",
"maxLength": 1000,
"description": "Postal address, one line per row."
},
"country": {
"type": "string",
"maxLength": 2,
"description": "ISO 3166-1 code of the customer's country, e.g. \"FR\". Checks intra_eu and export invoices; e-invoices need it."
},
"company_id": {
"type": "integer",
"minimum": 1,
"description": "A CRM company; fills the name."
},
"contact_id": {
"type": "integer",
"minimum": 1,
"description": "A CRM contact; fills the name and email."
}
},
"description": "Who paid: a CRM contact or company, or a name and email.",
"additionalProperties": false
},
"tax_rate": {
"type": "number",
"maximum": 100,
"minimum": 0,
"description": "The VAT in it, in percent, e.g. 19. Default none."
},
"reference": {
"type": "string",
"maxLength": 120
}
},
"additionalProperties": false
}| string |
| Default draft. |
| status | string |
| currency | string | ISO 4217, e.g. "USD", "EUR" or "JPY". |
| customer | object | Who the document is for. Link a CRM record with contact_id or company_id, or give name and email (an email that matches a CRM contact links it). What is given here is printed as it is. |
| end_date | string | No invoice after this date. "" for none. |
| e_invoice | string | Invoices and their credit notes as EN 16931 e-invoices (German B2B invoices must be from 2027): factur-x (Factur-X/ZUGFeRD, the XML inside the PDF/A-3) or xrechnung (XRechnung 3.0, its own XML beside the PDF), checked against the EN 16931 schema before sending. "" is the default: none, except that from 2027 an invoice from a German business to a German business above EUR 250 is a factur-x; "none" opts out (a business under the EUR 800,000 turnover allowance until 2028). Needs the customer's country. Default: the profile's. |
| payment_link | string | An https link to pay this document. Default: the profile's payment_link. |
| repeating_id | integer | From invoices_list_repeating. |
| tax_exemption | string | Why lines with tax_rate 0 carry no tax, printed on the invoice as the law asks: exempt, zero_rated, reverse_charge (the customer accounts for the VAT), intra_eu (goods to a business in another EU country), export (goods leaving the EU), outside_scope, small_business (a business under its country's small-business VAT exemption, such as UStG §19 or art. 293 B CGI: no line may carry tax). Needed in the EU for any line without tax. Default: the profile's. |
| payment_terms_days | integer | Each invoice falls due this long after its date. Default: the profile's payment terms. |
| tax_exemption_note | string | The wording printed for the exemption instead of the standard one, e.g. "Steuerbefreit als Kleinunternehmer nach § 19 UStG". |
{
"type": "object",
"required": [],
"properties": {
"name": {
"type": "string",
"maxLength": 120,
"description": "Your own label, e.g. \"Hotel service contract\"."
},
"unit": {
"enum": [
"week",
"month",
"year"
],
"type": "string"
},
"every": {
"type": "integer",
"maximum": 52,
"minimum": 1,
"description": "Default 1."
},
"items": {
"type": "array",
"items": {
"type": "object",
"required": [
"description",
"unit_price"
],
"properties": {
"account": {
"type": "string",
"maxLength": 20,
"description": "With books: the income account this line books to, e.g. \"4100\" for services. Default: the sales account."
},
"discount": {
"type": [
"number",
"string"
],
"maxLength": 24,
"description": "Discount percent on this line, e.g. 10."
},
"quantity": {
"type": [
"number",
"string"
],
"maxLength": 24,
"description": "Default 1. Up to 6 decimals, e.g. 1.5 (hours)."
},
"tax_rate": {
"type": [
"number",
"string"
],
"maxLength": 24,
"description": "Tax percent, e.g. 19. Default: the profile's tax_rate."
},
"tracking": {
"type": "object",
"description": "With books: tracking options, e.g. {\"Department\": \"Service\"}.",
"maxProperties": 2,
"additionalProperties": {
"type": "string",
"maxLength": 60
}
},
"unit_price": {
"type": [
"number",
"string"
],
"maxLength": 24,
"description": "The price of one, before tax, e.g. \"19.99\". Negative for a credit line."
},
"description": {
"type": "string",
"maxLength": 2000,
"minLength": 1,
"description": "What was sold. Lines after the first print smaller, underneath."
}
},
"additionalProperties": false
},
"maxItems": 200,
"minItems": 1
},
"notes": {
"type": "string",
"maxLength": 5000,
"description": "Printed above the lines, e.g. \"Thank you for your order\" or a project reference."
},
"start": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "The first invoice's date, today or later. Monthly and yearly invoices keep to its day of the month."
},
"times": {
"type": "integer",
"maximum": 1000,
"minimum": 1,
"description": "How many invoices in all."
},
"action": {
"enum": [
"draft",
"send"
],
"type": "string",
"description": "Default draft."
},
"status": {
"enum": [
"active",
"paused"
],
"type": "string"
},
"currency": {
"type": "string",
"pattern": "^[A-Za-z]{3}$",
"description": "ISO 4217, e.g. \"USD\", \"EUR\" or \"JPY\"."
},
"customer": {
"type": "object",
"properties": {
"name": {
"type": "string",
"maxLength": 200,
"description": "Who is billed, as printed."
},
"email": {
"type": "string",
"maxLength": 254,
"description": "Where the document is emailed."
},
"tax_id": {
"type": "string",
"maxLength": 60,
"description": "The customer's VAT or tax number, for business customers. A reverse-charge or intra-EU invoice needs their EU VAT ID, e.g. \"FR12345678901\"."
},
"address": {
"type": "string",
"maxLength": 1000,
"description": "Postal address, one line per row."
},
"country": {
"type": "string",
"maxLength": 2,
"description": "ISO 3166-1 code of the customer's country, e.g. \"FR\". Checks intra_eu and export invoices; e-invoices need it."
},
"company_id": {
"type": "integer",
"minimum": 1,
"description": "A CRM company; fills the name."
},
"contact_id": {
"type": "integer",
"minimum": 1,
"description": "A CRM contact; fills the name and email."
}
},
"description": "Who the document is for. Link a CRM record with contact_id or company_id, or give name and email (an email that matches a CRM contact links it). What is given here is printed as it is.",
"additionalProperties": false
},
"end_date": {
"type": "string",
"pattern": "^(\\d{4}-\\d{2}-\\d{2})?$",
"description": "No invoice after this date. \"\" for none."
},
"e_invoice": {
"enum": [
"",
"factur-x",
"xrechnung",
"none"
],
"type": "string",
"description": "Invoices and their credit notes as EN 16931 e-invoices (German B2B invoices must be from 2027): factur-x (Factur-X/ZUGFeRD, the XML inside the PDF/A-3) or xrechnung (XRechnung 3.0, its own XML beside the PDF), checked against the EN 16931 schema before sending. \"\" is the default: none, except that from 2027 an invoice from a German business to a German business above EUR 250 is a factur-x; \"none\" opts out (a business under the EUR 800,000 turnover allowance until 2028). Needs the customer's country. Default: the profile's."
},
"payment_link": {
"type": "string",
"maxLength": 500,
"description": "An https link to pay this document. Default: the profile's payment_link."
},
"repeating_id": {
"type": "integer",
"minimum": 1,
"description": "From invoices_list_repeating."
},
"tax_exemption": {
"enum": [
"",
"exempt",
"zero_rated",
"reverse_charge",
"intra_eu",
"export",
"outside_scope",
"small_business"
],
"type": "string",
"description": "Why lines with tax_rate 0 carry no tax, printed on the invoice as the law asks: exempt, zero_rated, reverse_charge (the customer accounts for the VAT), intra_eu (goods to a business in another EU country), export (goods leaving the EU), outside_scope, small_business (a business under its country's small-business VAT exemption, such as UStG §19 or art. 293 B CGI: no line may carry tax). Needed in the EU for any line without tax. Default: the profile's."
},
"payment_terms_days": {
"type": "integer",
"maximum": 365,
"minimum": 0,
"description": "Each invoice falls due this long after its date. Default: the profile's payment terms."
},
"tax_exemption_note": {
"type": "string",
"maxLength": 300,
"description": "The wording printed for the exemption instead of the standard one, e.g. \"Steuerbefreit als Kleinunternehmer nach § 19 UStG\"."
}
},
"additionalProperties": false
}{
"type": "object",
"required": [
"invoice_id"
],
"properties": {
"to": {
"type": "string",
"maxLength": 254,
"description": "Send to this address instead of the customer's email."
},
"email": {
"type": "boolean",
"default": true,
"description": "false: number it and make the PDF and the page, but email no one."
},
"message": {
"type": "string",
"maxLength": 2000,
"description": "A short note in the email, e.g. \"Thanks for your order!\""
},
"invoice_id": {
"type": "string",
"maxLength": 36,
"minLength": 36,
"description": "The invoice_id invoices_create returned (quotes and credit notes have one too)."
},
"link_hours": {
"type": "integer",
"default": 24,
"maximum": 168,
"minimum": 1,
"description": "How long the PDF download link works, in hours (up to 168)."
}
},
"additionalProperties": false
}| currency |
| string |
| Default currency of new documents, ISO 4217. |
| tax_rate | number | string | Default tax percent for new lines, e.g. 19. 0 for none. |
| timezone | string | IANA time zone for dates, e.g. "America/New_York". Default UTC. |
| e_invoice | string | Invoices and their credit notes as EN 16931 e-invoices (German B2B invoices must be from 2027): factur-x (Factur-X/ZUGFeRD, the XML inside the PDF/A-3) or xrechnung (XRechnung 3.0, its own XML beside the PDF), checked against the EN 16931 schema before sending. "" is the default: none, except that from 2027 an invoice from a German business to a German business above EUR 250 is a factur-x; "none" opts out (a business under the EUR 800,000 turnover allowance until 2028). Needs the customer's country. Default: the profile's. |
| tax_label | string | What the tax is called on documents: "VAT", "GST", "Sales tax". Default "Tax". |
| legal_name | string | The business name on documents; also the email sender name. |
| pay_online | boolean | A Pay button on each invoice's page: Stripe Checkout on the business's own Stripe (connect it with invoices_connect_stripe); each payment is recorded and posted to the books on its own. $0.10 per invoice paid online. |
| legal_notes | string | Printed at the foot of every quote, invoice and credit note: the company register and managing directors, a small-business VAT note, late-payment terms the law asks for (France: penalty rate and the EUR 40 indemnity). In France and Germany the country's default wording is filled in when the country is set and none is given; "" brings it back. |
| logo_file_id | string | An image in the file store (PNG, JPEG, GIF, WebP or SVG, up to 1 MB). "" removes the logo. |
| payment_link | string | An https link where customers pay, e.g. the business's own Stripe Payment Link. "" removes it. |
| quote_prefix | string | Default "Q-". |
| tax_exemption | string | Why lines with tax_rate 0 carry no tax, printed on the invoice as the law asks: exempt, zero_rated, reverse_charge (the customer accounts for the VAT), intra_eu (goods to a business in another EU country), export (goods leaving the EU), outside_scope, small_business (a business under its country's small-business VAT exemption, such as UStG §19 or art. 293 B CGI: no line may carry tax). Needed in the EU for any line without tax. Default: the profile's. |
| invoice_prefix | string | Default "INV-": invoices are INV-0001, INV-0002... |
| quote_valid_days | integer | How long quotes stay open. Default 30. |
| document_language | string | The language of the fixed words on quotes, invoices and credit notes (labels, dates, amounts); "" picks it by country: German in Germany and Austria, French in France, else English. The business's own text is printed as written. |
| next_quote_number | integer |
| credit_note_prefix | string | Default "CN-". |
| payment_terms_days | integer | Days from issue to due date. Default 14. |
| tax_exemption_note | string | The wording printed for the exemption instead of the standard one, e.g. "Steuerbefreit als Kleinunternehmer nach § 19 UStG". |
| next_invoice_number | integer | The number the next invoice gets, e.g. to carry on from another tool. Never one already used. |
| next_credit_note_number | integer |
{
"type": "object",
"required": [],
"properties": {
"email": {
"type": "string",
"maxLength": 254,
"description": "Where customers write about invoices: printed, and the Reply-To of emails."
},
"paper": {
"enum": [
"a4",
"letter"
],
"type": "string",
"description": "Default: Letter for USD and CAD businesses, else A4."
},
"phone": {
"type": "string",
"maxLength": 40
},
"footer": {
"type": "string",
"maxLength": 2000,
"description": "Payment instructions printed at the bottom of invoices, e.g. bank name, IBAN and BIC."
},
"tax_id": {
"type": "string",
"maxLength": 60,
"description": "VAT, GST or tax number, printed with the address."
},
"address": {
"type": "string",
"maxLength": 1000,
"description": "Postal address, one line per row."
},
"country": {
"type": "string",
"maxLength": 2,
"description": "ISO 3166-1 code of the country the business is established in, e.g. \"DE\". Needed to send: it decides what invoices must show (in the EU the VAT ID, addresses, the date of supply, why a line has no tax, VAT in the national currency) and is checked before each one goes out."
},
"currency": {
"type": "string",
"pattern": "^[A-Za-z]{3}$",
"description": "Default currency of new documents, ISO 4217."
},
"tax_rate": {
"type": [
"number",
"string"
],
"maxLength": 24,
"description": "Default tax percent for new lines, e.g. 19. 0 for none."
},
"timezone": {
"type": "string",
"maxLength": 64,
"description": "IANA time zone for dates, e.g. \"America/New_York\". Default UTC."
},
"e_invoice": {
"enum": [
"",
"factur-x",
"xrechnung",
"none"
],
"type": "string",
"description": "Invoices and their credit notes as EN 16931 e-invoices (German B2B invoices must be from 2027): factur-x (Factur-X/ZUGFeRD, the XML inside the PDF/A-3) or xrechnung (XRechnung 3.0, its own XML beside the PDF), checked against the EN 16931 schema before sending. \"\" is the default: none, except that from 2027 an invoice from a German business to a German business above EUR 250 is a factur-x; \"none\" opts out (a business under the EUR 800,000 turnover allowance until 2028). Needs the customer's country. Default: the profile's."
},
"tax_label": {
"type": "string",
"maxLength": 30,
"description": "What the tax is called on documents: \"VAT\", \"GST\", \"Sales tax\". Default \"Tax\"."
},
"legal_name": {
"type": "string",
"maxLength": 200,
"description": "The business name on documents; also the email sender name."
},
"pay_online": {
"type": "boolean",
"description": "A Pay button on each invoice's page: Stripe Checkout on the business's own Stripe (connect it with invoices_connect_stripe); each payment is recorded and posted to the books on its own. $0.10 per invoice paid online."
},
"legal_notes": {
"type": "string",
"maxLength": 2000,
"description": "Printed at the foot of every quote, invoice and credit note: the company register and managing directors, a small-business VAT note, late-payment terms the law asks for (France: penalty rate and the EUR 40 indemnity). In France and Germany the country's default wording is filled in when the country is set and none is given; \"\" brings it back."
},
"logo_file_id": {
"type": "string",
"maxLength": 36,
"description": "An image in the file store (PNG, JPEG, GIF, WebP or SVG, up to 1 MB). \"\" removes the logo."
},
"payment_link": {
"type": "string",
"maxLength": 500,
"description": "An https link where customers pay, e.g. the business's own Stripe Payment Link. \"\" removes it."
},
"quote_prefix": {
"type": "string",
"pattern": "^[A-Za-z0-9 ._/#-]*$",
"maxLength": 20,
"description": "Default \"Q-\"."
},
"tax_exemption": {
"enum": [
"",
"exempt",
"zero_rated",
"reverse_charge",
"intra_eu",
"export",
"outside_scope",
"small_business"
],
"type": "string",
"description": "Why lines with tax_rate 0 carry no tax, printed on the invoice as the law asks: exempt, zero_rated, reverse_charge (the customer accounts for the VAT), intra_eu (goods to a business in another EU country), export (goods leaving the EU), outside_scope, small_business (a business under its country's small-business VAT exemption, such as UStG §19 or art. 293 B CGI: no line may carry tax). Needed in the EU for any line without tax. Default: the profile's."
},
"invoice_prefix": {
"type": "string",
"pattern": "^[A-Za-z0-9 ._/#-]*$",
"maxLength": 20,
"description": "Default \"INV-\": invoices are INV-0001, INV-0002..."
},
"quote_valid_days": {
"type": "integer",
"maximum": 365,
"minimum": 1,
"description": "How long quotes stay open. Default 30."
},
"document_language": {
"enum": [
"",
"en",
"de",
"fr"
],
"type": "string",
"description": "The language of the fixed words on quotes, invoices and credit notes (labels, dates, amounts); \"\" picks it by country: German in Germany and Austria, French in France, else English. The business's own text is printed as written."
},
"next_quote_number": {
"type": "integer",
"maximum": 99999999,
"minimum": 1
},
"credit_note_prefix": {
"type": "string",
"pattern": "^[A-Za-z0-9 ._/#-]*$",
"maxLength": 20,
"description": "Default \"CN-\"."
},
"payment_terms_days": {
"type": "integer",
"maximum": 365,
"minimum": 0,
"description": "Days from issue to due date. Default 14."
},
"tax_exemption_note": {
"type": "string",
"maxLength": 300,
"description": "The wording printed for the exemption instead of the standard one, e.g. \"Steuerbefreit als Kleinunternehmer nach § 19 UStG\"."
},
"next_invoice_number": {
"type": "integer",
"maximum": 99999999,
"minimum": 1,
"description": "The number the next invoice gets, e.g. to carry on from another tool. Never one already used."
},
"next_credit_note_number": {
"type": "integer",
"maximum": 99999999,
"minimum": 1
}
},
"additionalProperties": false
}| customer* |
| object |
| Whose statement: a CRM contact_id or company_id, or the email or the name on their invoices. |
| link_hours | integer |
{
"type": "object",
"required": [
"customer"
],
"properties": {
"to": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "YYYY-MM-DD"
},
"from": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "YYYY-MM-DD"
},
"kind": {
"enum": [
"outstanding",
"activity"
],
"type": "string"
},
"as_of": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "YYYY-MM-DD"
},
"email": {
"type": "boolean",
"default": false
},
"message": {
"type": "string",
"maxLength": 2000,
"description": "Your own words above the amount due."
},
"send_to": {
"type": "string",
"maxLength": 254,
"description": "Another address to email it to."
},
"currency": {
"type": "string",
"pattern": "^[A-Za-z]{3}$",
"description": "ISO 4217, e.g. \"USD\", \"EUR\" or \"JPY\"."
},
"customer": {
"type": "object",
"properties": {
"name": {
"type": "string",
"maxLength": 200
},
"email": {
"type": "string",
"maxLength": 254
},
"company_id": {
"type": "integer",
"minimum": 1
},
"contact_id": {
"type": "integer",
"minimum": 1
}
},
"description": "Whose statement: a CRM contact_id or company_id, or the email or the name on their invoices.",
"additionalProperties": false
},
"link_hours": {
"type": "integer",
"default": 24,
"maximum": 168,
"minimum": 1
}
},
"additionalProperties": false
}| The invoice_id invoices_create returned (quotes and credit notes have one too). |
| issue_date | string | null | YYYY-MM-DD, or null to go back to the default. |
| supply_date | string | null | YYYY-MM-DD, or null to go back to the default. |
| valid_until | string | null | YYYY-MM-DD, or null to go back to the default. |
| payment_link | string | An https link to pay this document. Default: the profile's payment_link. |
| supply_until | string | null | YYYY-MM-DD, or null to go back to the default. |
| tax_exemption | string | Why lines with tax_rate 0 carry no tax, printed on the invoice as the law asks: exempt, zero_rated, reverse_charge (the customer accounts for the VAT), intra_eu (goods to a business in another EU country), export (goods leaving the EU), outside_scope, small_business (a business under its country's small-business VAT exemption, such as UStG §19 or art. 293 B CGI: no line may carry tax). Needed in the EU for any line without tax. Default: the profile's. |
| vat_exchange_rate | number | string | null | For an invoice in another currency than the national one of the business's country: one unit of it in the national currency, for the VAT shown in both. Default in the EU: the European Central Bank's rate for the day of supply; UK businesses give it. |
| payment_terms_days | integer | null |
| tax_exemption_note | string | The wording printed for the exemption instead of the standard one, e.g. "Steuerbefreit als Kleinunternehmer nach § 19 UStG". |
{
"type": "object",
"required": [
"invoice_id"
],
"properties": {
"items": {
"type": "array",
"items": {
"type": "object",
"required": [
"description",
"unit_price"
],
"properties": {
"account": {
"type": "string",
"maxLength": 20,
"description": "With books: the income account this line books to, e.g. \"4100\" for services. Default: the sales account."
},
"discount": {
"type": [
"number",
"string"
],
"maxLength": 24,
"description": "Discount percent on this line, e.g. 10."
},
"quantity": {
"type": [
"number",
"string"
],
"maxLength": 24,
"description": "Default 1. Up to 6 decimals, e.g. 1.5 (hours)."
},
"tax_rate": {
"type": [
"number",
"string"
],
"maxLength": 24,
"description": "Tax percent, e.g. 19. Default: the profile's tax_rate."
},
"tracking": {
"type": "object",
"description": "With books: tracking options, e.g. {\"Department\": \"Service\"}.",
"maxProperties": 2,
"additionalProperties": {
"type": "string",
"maxLength": 60
}
},
"unit_price": {
"type": [
"number",
"string"
],
"maxLength": 24,
"description": "The price of one, before tax, e.g. \"19.99\". Negative for a credit line."
},
"description": {
"type": "string",
"maxLength": 2000,
"minLength": 1,
"description": "What was sold. Lines after the first print smaller, underneath."
}
},
"additionalProperties": false
},
"maxItems": 200,
"minItems": 1
},
"notes": {
"type": "string",
"maxLength": 5000,
"description": "Printed above the lines, e.g. \"Thank you for your order\" or a project reference."
},
"currency": {
"type": "string",
"pattern": "^[A-Za-z]{3}$",
"description": "ISO 4217, e.g. \"USD\", \"EUR\" or \"JPY\"."
},
"customer": {
"type": "object",
"properties": {
"name": {
"type": "string",
"maxLength": 200,
"description": "Who is billed, as printed."
},
"email": {
"type": "string",
"maxLength": 254,
"description": "Where the document is emailed."
},
"tax_id": {
"type": "string",
"maxLength": 60,
"description": "The customer's VAT or tax number, for business customers. A reverse-charge or intra-EU invoice needs their EU VAT ID, e.g. \"FR12345678901\"."
},
"address": {
"type": "string",
"maxLength": 1000,
"description": "Postal address, one line per row."
},
"country": {
"type": "string",
"maxLength": 2,
"description": "ISO 3166-1 code of the customer's country, e.g. \"FR\". Checks intra_eu and export invoices; e-invoices need it."
},
"company_id": {
"type": "integer",
"minimum": 1,
"description": "A CRM company; fills the name."
},
"contact_id": {
"type": "integer",
"minimum": 1,
"description": "A CRM contact; fills the name and email."
}
},
"description": "Who the document is for. Link a CRM record with contact_id or company_id, or give name and email (an email that matches a CRM contact links it). What is given here is printed as it is.",
"additionalProperties": false
},
"due_date": {
"type": [
"string",
"null"
],
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "YYYY-MM-DD, or null to go back to the default."
},
"e_invoice": {
"enum": [
"",
"factur-x",
"xrechnung",
"none"
],
"type": "string",
"description": "Invoices and their credit notes as EN 16931 e-invoices (German B2B invoices must be from 2027): factur-x (Factur-X/ZUGFeRD, the XML inside the PDF/A-3) or xrechnung (XRechnung 3.0, its own XML beside the PDF), checked against the EN 16931 schema before sending. \"\" is the default: none, except that from 2027 an invoice from a German business to a German business above EUR 250 is a factur-x; \"none\" opts out (a business under the EUR 800,000 turnover allowance until 2028). Needs the customer's country. Default: the profile's."
},
"invoice_id": {
"type": "string",
"maxLength": 36,
"minLength": 36,
"description": "The invoice_id invoices_create returned (quotes and credit notes have one too)."
},
"issue_date": {
"type": [
"string",
"null"
],
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "YYYY-MM-DD, or null to go back to the default."
},
"supply_date": {
"type": [
"string",
"null"
],
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "YYYY-MM-DD, or null to go back to the default."
},
"valid_until": {
"type": [
"string",
"null"
],
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "YYYY-MM-DD, or null to go back to the default."
},
"payment_link": {
"type": "string",
"maxLength": 500,
"description": "An https link to pay this document. Default: the profile's payment_link."
},
"supply_until": {
"type": [
"string",
"null"
],
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "YYYY-MM-DD, or null to go back to the default."
},
"tax_exemption": {
"enum": [
"",
"exempt",
"zero_rated",
"reverse_charge",
"intra_eu",
"export",
"outside_scope",
"small_business"
],
"type": "string",
"description": "Why lines with tax_rate 0 carry no tax, printed on the invoice as the law asks: exempt, zero_rated, reverse_charge (the customer accounts for the VAT), intra_eu (goods to a business in another EU country), export (goods leaving the EU), outside_scope, small_business (a business under its country's small-business VAT exemption, such as UStG §19 or art. 293 B CGI: no line may carry tax). Needed in the EU for any line without tax. Default: the profile's."
},
"vat_exchange_rate": {
"type": [
"number",
"string",
"null"
],
"maxLength": 24,
"description": "For an invoice in another currency than the national one of the business's country: one unit of it in the national currency, for the VAT shown in both. Default in the EU: the European Central Bank's rate for the day of supply; UK businesses give it."
},
"payment_terms_days": {
"type": [
"integer",
"null"
],
"maximum": 365,
"minimum": 0
},
"tax_exemption_note": {
"type": "string",
"maxLength": 300,
"description": "The wording printed for the exemption instead of the standard one, e.g. \"Steuerbefreit als Kleinunternehmer nach § 19 UStG\"."
}
},
"additionalProperties": false
}{
"type": "object",
"required": [
"credit"
],
"properties": {
"date": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "YYYY-MM-DD"
},
"void": {
"type": "boolean",
"default": false
},
"amount": {
"type": [
"number",
"string"
],
"maxLength": 24
},
"credit": {
"type": "string",
"maxLength": 20,
"minLength": 1,
"description": "The credit's number, like \"CR-0001\" (invoices_list_credits)."
},
"method": {
"enum": [
"bank_transfer",
"card",
"cash",
"check",
"online",
"other"
],
"type": "string",
"default": "bank_transfer"
},
"refund": {
"type": "boolean",
"default": false
},
"reference": {
"type": "string",
"maxLength": 120
},
"invoice_id": {
"type": "string",
"maxLength": 36,
"minLength": 36,
"description": "The invoice_id invoices_create returned (quotes and credit notes have one too)."
}
},
"additionalProperties": false
}