<!-- Generated by `just docs` from catalog/toolkits/quickbooks.yaml, catalog/expansions/quickbooks.yaml, catalog/evals/scorecard.json. Edit the source, not this file. -->

# QuickBooks

Accounting. Manage customers, vendors, items, and accounts, send invoices and bills, record payments, and pull financial reports.

| Property | Value |
| --- | --- |
| Slug | `quickbooks` |
| Definition version | `0.1.0` |
| Base URL | `https://quickbooks.api.intuit.com` |
| Auth schemes | `oauth2` |
| Action tools | 39 |
| By class | 19 read, 14 write, 6 destructive |
| Triggers | 0 |
| Provider rate limit | 500 requests per 1m, per account |

## Measured routing accuracy

53 golden cases replayed through the router over the whole index: measured over corpus `ea4f12ad2948` (65 toolkits, 2283 tools indexed and 13 declared uncallable), 39 cases written by hand and 14 cases from the paraphrase pass. A case counts as top-1 when its gold tool ranked first and top-8 when it reached the slate at all.

| Measure | Cases | Share |
| --- | --- | --- |
| top-1 | 40/53 | 75.5% |
| top-8 | 46/53 | 86.8% |

The sweep is offline: the reranker is a deterministic identity fake that returns candidates in the order retrieval produced them, so top-1 measures retrieval order rather than a reranked slate. `just eval-live` measures the same cases through the live reranker.

## Authentication

Connect an entity with `ConnectionsService.InitiateConnection`, naming this toolkit's slug. Credentials stay in the connections vault; callers hold connected-account ids only.

### `oauth2`

| Property | Value |
| --- | --- |
| Authorization URL | `https://appcenter.intuit.com/connect/oauth2` |
| Token URL | `https://oauth.platform.intuit.com/oauth2/v1/tokens/bearer` |
| Default scopes | `com.intuit.quickbooks.accounting` |
| Refresh tokens | yes, the refresh daemon renews ahead of expiry |

## Tools

39 action tools. The catalog-wide slug is `quickbooks.<tool>`, which is what `search_tools` returns and `call_tool` takes.

### `quickbooks.create_customer`

Create a new QuickBooks customer: someone you invoice or collect payment from. Use when the user wants to add, register, or set up a new customer or client before billing them. Requires a display name; email, phone, company name, and billing address are optional.

Class `write` (writes, no confirmation needed). No scopes beyond the connection's defaults. Calls `POST /v3/company/{{params.realm_id}}/customer`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `billing_address` | object | no | Billing address, e.g. {"line1": "500 Elm St", "city": "Austin", "region": "TX", "postal_code": "78701"}. |
| `company_name` | string | no | Company name, for a business customer. |
| `display_name` | string | **yes** | Name shown on invoices and lists, e.g. "Jane Doe" or "Acme Co". |
| `email` | string | no | Customer's email address, e.g. "jane@example.com". |
| `family_name` | string | no | Customer's last name, for an individual. |
| `given_name` | string | no | Customer's first name, for an individual. |
| `phone` | string | no | Customer's phone number. |
| `realm_id` | string | **yes** | QuickBooks company id (realm id) the request is scoped to. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `Active` | boolean |  |
| `Balance` | number |  |
| `DisplayName` | string |  |
| `Id` | string |  |
| `PrimaryEmailAddr` | object |  |
| `PrimaryEmailAddr.Address` | string |  |
| `SyncToken` | string |  |

Also retrieved by: "add jane doe as a new client we can bill", "set up this buyer's contact card", "I need a record for someone before I invoice them", "onboard a new account into the books", "start a file for a new client".

### `quickbooks.get_customer`

Get one QuickBooks customer's record by id: name, contact details, billing address, and open balance. Use when the user names a specific customer or client. For finding one by name or browsing all of them, use list_customers.

Class `read` (reads only). No scopes beyond the connection's defaults. Calls `GET /v3/company/{{params.realm_id}}/customer/{{params.customer_id}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `customer_id` | string | **yes** | QuickBooks customer id, e.g. "24". |
| `realm_id` | string | **yes** | QuickBooks company id (realm id) the request is scoped to. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `Active` | boolean |  |
| `Balance` | number |  |
| `BillAddr` | object |  |
| `BillAddr.City` | string |  |
| `BillAddr.Line1` | string |  |
| `CompanyName` | string |  |
| `DisplayName` | string |  |
| `Id` | string |  |
| `PrimaryEmailAddr` | object |  |
| `PrimaryEmailAddr.Address` | string |  |
| `PrimaryPhone` | object |  |
| `PrimaryPhone.FreeFormNumber` | string |  |
| `SyncToken` | string |  |

Also retrieved by: "pull up what we have on file for this client", "what does this buyer still owe us", "check their contact details in the books", "look up one specific client's record".

### `quickbooks.list_customers`

Search or list QuickBooks customers using QuickBooks' own query language, e.g. "SELECT * FROM Customer WHERE Active = true MAXRESULTS 20". Use when the user asks who our customers are, wants to find one by name, or browses the customer list. For one known customer, use get_customer.

Class `read` (reads only). No scopes beyond the connection's defaults. Calls `GET /v3/company/{{params.realm_id}}/query`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `query` | string | **yes** | Full QuickBooks query statement against the Customer table, e.g. "SELECT * FROM Customer WHERE Balance > '0' MAXRESULTS 20". |
| `realm_id` | string | **yes** | QuickBooks company id (realm id) the request is scoped to. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `QueryResponse` | object |  |
| `QueryResponse.Customer` | array of object |  |
| `QueryResponse.Customer[].Active` | boolean |  |
| `QueryResponse.Customer[].Balance` | number |  |
| `QueryResponse.Customer[].CompanyName` | string |  |
| `QueryResponse.Customer[].DisplayName` | string |  |
| `QueryResponse.Customer[].Id` | string |  |

Also retrieved by: "who are our clients right now", "find the buyer with this name", "show everyone we bill", "search the client list", "which of our clients still have money owed to us".

### `quickbooks.update_customer`

Edit an existing QuickBooks customer's name, contact details, or billing address. Use when the user wants to update, correct, or change a customer's record, not add a new one. Requires the customer's current sync_token, from get_customer or list_customers, to prevent overwriting a concurrent change.

Class `write` (writes, no confirmation needed). No scopes beyond the connection's defaults. Calls `POST /v3/company/{{params.realm_id}}/customer`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `billing_address` | object | no | New billing address, replacing the one on file. |
| `customer_id` | string | **yes** | QuickBooks customer id to update. |
| `display_name` | string | no | New display name. |
| `email` | string | no | New email address. |
| `phone` | string | no | New phone number. |
| `realm_id` | string | **yes** | QuickBooks company id (realm id) the request is scoped to. |
| `sync_token` | string | **yes** | Current SyncToken on the customer record, e.g. "3". |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `DisplayName` | string |  |
| `Id` | string |  |
| `SyncToken` | string |  |

Also retrieved by: "fix the email we have for this client", "their phone number changed", "correct the mailing address on file", "change what's saved for this account".

### `quickbooks.deactivate_customer`

Deactivate a QuickBooks customer, hiding it from lists and dropdowns without deleting its transaction history. QuickBooks does not support hard-deleting a customer with open transactions; this is the irreversible-in-practice way to remove one. Use when the user wants to delete, remove, or get rid of a customer record. Requires the customer's current sync_token.

Class `destructive` (held by the mutation gate until the call's own arguments carry `"confirm": true`). No scopes beyond the connection's defaults. Calls `POST /v3/company/{{params.realm_id}}/customer`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `customer_id` | string | **yes** | QuickBooks customer id to deactivate. |
| `realm_id` | string | **yes** | QuickBooks company id (realm id) the request is scoped to. |
| `sync_token` | string | **yes** | Current SyncToken on the customer record. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `Active` | boolean |  |
| `Id` | string |  |

Also retrieved by: "hide this client, we're done working with them", "remove them from the active client list", "archive an old account we no longer bill", "take this buyer off our books for good", "we're not doing business with this account anymore, hide it from view".

### `quickbooks.create_vendor`

Create a new QuickBooks vendor: a supplier or contractor you owe bills to. Use when the user wants to add, register, or set up a new vendor or supplier before billing against them. Requires a display name; email, phone, company name, and billing address are optional.

Class `write` (writes, no confirmation needed). No scopes beyond the connection's defaults. Calls `POST /v3/company/{{params.realm_id}}/vendor`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `billing_address` | object | no | Vendor's billing address, e.g. {"line1": "12 Dock Rd", "city": "Reno", "region": "NV", "postal_code": "89501"}. |
| `company_name` | string | no | Company name, for a business vendor. |
| `display_name` | string | **yes** | Name shown on bills and lists, e.g. "Acme Supply Co". |
| `email` | string | no | Vendor's email address. |
| `phone` | string | no | Vendor's phone number. |
| `realm_id` | string | **yes** | QuickBooks company id (realm id) the request is scoped to. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `Active` | boolean |  |
| `Balance` | number |  |
| `DisplayName` | string |  |
| `Id` | string |  |
| `PrimaryEmailAddr` | object |  |
| `PrimaryEmailAddr.Address` | string |  |
| `SyncToken` | string |  |

Also retrieved by: "add a new supplier we'll owe money to", "register a contractor before we get their first bill", "set up a new supplier's contact card", "onboard a company we're going to pay".

### `quickbooks.get_vendor`

Get one QuickBooks vendor's record by id: name, contact details, billing address, and amount owed. Use when the user names a specific vendor or supplier. For finding one by name or browsing all of them, use list_vendors.

Class `read` (reads only). No scopes beyond the connection's defaults. Calls `GET /v3/company/{{params.realm_id}}/vendor/{{params.vendor_id}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `realm_id` | string | **yes** | QuickBooks company id (realm id) the request is scoped to. |
| `vendor_id` | string | **yes** | QuickBooks vendor id, e.g. "56". |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `Active` | boolean |  |
| `Balance` | number |  |
| `CompanyName` | string |  |
| `DisplayName` | string |  |
| `Id` | string |  |
| `PrimaryEmailAddr` | object |  |
| `PrimaryEmailAddr.Address` | string |  |
| `SyncToken` | string |  |

Also retrieved by: "what do we owe this supplier", "pull up a contractor's contact details", "check the record for one specific supplier".

### `quickbooks.list_vendors`

Search or list QuickBooks vendors using QuickBooks' own query language, e.g. "SELECT * FROM Vendor WHERE Active = true MAXRESULTS 20". Use when the user asks who our vendors or suppliers are, wants to find one by name, or browses the vendor list. For one known vendor, use get_vendor.

Class `read` (reads only). No scopes beyond the connection's defaults. Calls `GET /v3/company/{{params.realm_id}}/query`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `query` | string | **yes** | Full QuickBooks query statement against the Vendor table, e.g. "SELECT * FROM Vendor WHERE Active = true MAXRESULTS 20". |
| `realm_id` | string | **yes** | QuickBooks company id (realm id) the request is scoped to. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `QueryResponse` | object |  |
| `QueryResponse.Vendor` | array of object |  |
| `QueryResponse.Vendor[].Active` | boolean |  |
| `QueryResponse.Vendor[].Balance` | number |  |
| `QueryResponse.Vendor[].DisplayName` | string |  |
| `QueryResponse.Vendor[].Id` | string |  |

Also retrieved by: "who do we buy from", "find the supplier with this name", "show every contractor we pay".

### `quickbooks.update_vendor`

Edit an existing QuickBooks vendor's name, contact details, or billing address. Use when the user wants to update, correct, or change a vendor's record, not add a new one. Requires the vendor's current sync_token, from get_vendor or list_vendors.

Class `write` (writes, no confirmation needed). No scopes beyond the connection's defaults. Calls `POST /v3/company/{{params.realm_id}}/vendor`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `billing_address` | object | no | New billing address, replacing the one on file. |
| `display_name` | string | no | New display name. |
| `email` | string | no | New email address. |
| `phone` | string | no | New phone number. |
| `realm_id` | string | **yes** | QuickBooks company id (realm id) the request is scoped to. |
| `sync_token` | string | **yes** | Current SyncToken on the vendor record. |
| `vendor_id` | string | **yes** | QuickBooks vendor id to update. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `DisplayName` | string |  |
| `Id` | string |  |
| `SyncToken` | string |  |

Also retrieved by: "fix the contact info for a supplier", "this contractor's address changed", "correct what's saved for a vendor account".

### `quickbooks.deactivate_vendor`

Deactivate a QuickBooks vendor, hiding it from lists and dropdowns without deleting its bill history. QuickBooks does not support hard-deleting a vendor with existing bills; this is the irreversible-in-practice way to remove one. Use when the user wants to delete, remove, or get rid of a vendor record. Requires the vendor's current sync_token.

Class `destructive` (held by the mutation gate until the call's own arguments carry `"confirm": true`). No scopes beyond the connection's defaults. Calls `POST /v3/company/{{params.realm_id}}/vendor`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `realm_id` | string | **yes** | QuickBooks company id (realm id) the request is scoped to. |
| `sync_token` | string | **yes** | Current SyncToken on the vendor record. |
| `vendor_id` | string | **yes** | QuickBooks vendor id to deactivate. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `Active` | boolean |  |
| `Id` | string |  |

Also retrieved by: "hide this supplier, we stopped using them", "archive a contractor we no longer pay", "remove this vendor from the active list", "we're not placing orders with this account anymore, hide it from view".

### `quickbooks.create_item`

Create a new QuickBooks item: a product or service line you sell, shown on invoices and bills. Use when the user wants to add a new product, service, or SKU to the price list. Requires a name, item type, and the income account it posts sales to.

Class `write` (writes, no confirmation needed). No scopes beyond the connection's defaults. Calls `POST /v3/company/{{params.realm_id}}/item`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `description` | string | no | Text shown on invoices and bills for this item. |
| `expense_account_id` | string | no | QuickBooks expense account id purchases of this item post to. |
| `income_account_id` | string | **yes** | QuickBooks income account id sales of this item post to. |
| `name` | string | **yes** | Item name, e.g. "Consulting - Hourly". |
| `realm_id` | string | **yes** | QuickBooks company id (realm id) the request is scoped to. |
| `type` | string, one of Service, Inventory, NonInventory | **yes** | What kind of item this is. |
| `unit_price` | number | no | Default sales price per unit. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `Active` | boolean |  |
| `Id` | string |  |
| `Name` | string |  |
| `SyncToken` | string |  |
| `Type` | string |  |
| `UnitPrice` | number |  |

Also retrieved by: "add a new service to the price list", "set up a product we sell with its price", "register a new SKU customers can be billed for", "add a line we can put on invoices".

### `quickbooks.get_item`

Get one QuickBooks item by id: its type, sales price, and linked income account. Use when the user names a specific product, service, or SKU. For finding one by name or browsing the price list, use list_items.

Class `read` (reads only). No scopes beyond the connection's defaults. Calls `GET /v3/company/{{params.realm_id}}/item/{{params.item_id}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `item_id` | string | **yes** | QuickBooks item id, e.g. "19". |
| `realm_id` | string | **yes** | QuickBooks company id (realm id) the request is scoped to. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `Active` | boolean |  |
| `Description` | string |  |
| `Id` | string |  |
| `Name` | string |  |
| `SyncToken` | string |  |
| `Type` | string |  |
| `UnitPrice` | number |  |

Also retrieved by: "what's the price on this service", "pull up one product's details", "check a specific SKU's info".

### `quickbooks.list_items`

Search or list QuickBooks items using QuickBooks' own query language, e.g. "SELECT * FROM Item WHERE Type = 'Service'". Use when the user asks what products or services are on the price list, or wants to find one by name. For one known item, use get_item.

Class `read` (reads only). No scopes beyond the connection's defaults. Calls `GET /v3/company/{{params.realm_id}}/query`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `query` | string | **yes** | Full QuickBooks query statement against the Item table, e.g. "SELECT * FROM Item WHERE Active = true MAXRESULTS 20". |
| `realm_id` | string | **yes** | QuickBooks company id (realm id) the request is scoped to. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `QueryResponse` | object |  |
| `QueryResponse.Item` | array of object |  |
| `QueryResponse.Item[].Active` | boolean |  |
| `QueryResponse.Item[].Id` | string |  |
| `QueryResponse.Item[].Name` | string |  |
| `QueryResponse.Item[].Type` | string |  |
| `QueryResponse.Item[].UnitPrice` | number |  |

Also retrieved by: "what's on our price list", "show every service we offer", "find a product by its name".

### `quickbooks.update_item`

Edit an existing QuickBooks item's name, price, or description. Use when the user wants to reprice, rename, or update a product or service, not add a new one. Requires the item's current sync_token, from get_item or list_items.

Class `write` (writes, no confirmation needed). No scopes beyond the connection's defaults. Calls `POST /v3/company/{{params.realm_id}}/item`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `description` | string | no | New text shown on invoices and bills for this item. |
| `item_id` | string | **yes** | QuickBooks item id to update. |
| `name` | string | no | New item name. |
| `realm_id` | string | **yes** | QuickBooks company id (realm id) the request is scoped to. |
| `sync_token` | string | **yes** | Current SyncToken on the item record. |
| `unit_price` | number | no | New default sales price per unit. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `Id` | string |  |
| `Name` | string |  |
| `SyncToken` | string |  |
| `UnitPrice` | number |  |

Also retrieved by: "change the price on this service", "rename a product on the price list", "fix the description for a SKU".

### `quickbooks.create_account`

Create a new account on the QuickBooks chart of accounts. Use when the user wants to add a new bank, income, expense, or other ledger account to book transactions against. Requires a name and account type.

Class `write` (writes, no confirmation needed). No scopes beyond the connection's defaults. Calls `POST /v3/company/{{params.realm_id}}/account`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `account_sub_type` | string | no | More specific QuickBooks sub-type, e.g. "SuppliesMaterials". |
| `account_type` | string | **yes** | QuickBooks account type, e.g. "Bank", "Accounts Receivable", "Expense", "Income", "Cost of Goods Sold", "Other Current Asset", "Credit Card", "Equity". |
| `description` | string | no | Internal note describing what this account is for. |
| `name` | string | **yes** | Account name, e.g. "Office Supplies". |
| `realm_id` | string | **yes** | QuickBooks company id (realm id) the request is scoped to. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `AccountType` | string |  |
| `Active` | boolean |  |
| `CurrentBalance` | number |  |
| `Id` | string |  |
| `Name` | string |  |
| `SyncToken` | string |  |

Also retrieved by: "add a new ledger line for tracking spend", "open a new bank account in the books", "set up a fresh expense category".

### `quickbooks.get_account`

Get one QuickBooks chart-of-accounts entry by id: its type, sub-type, and current balance. Use when the user names a specific account. For browsing the whole chart of accounts, use list_accounts.

Class `read` (reads only). No scopes beyond the connection's defaults. Calls `GET /v3/company/{{params.realm_id}}/account/{{params.account_id}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `account_id` | string | **yes** | QuickBooks account id, e.g. "35". |
| `realm_id` | string | **yes** | QuickBooks company id (realm id) the request is scoped to. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `AccountSubType` | string |  |
| `AccountType` | string |  |
| `Active` | boolean |  |
| `CurrentBalance` | number |  |
| `Id` | string |  |
| `Name` | string |  |
| `SyncToken` | string |  |

Also retrieved by: "what's the balance on this ledger entry", "pull up one specific account's details", "check the current balance on a bank account".

### `quickbooks.list_accounts`

Search or list the QuickBooks chart of accounts using QuickBooks' own query language, e.g. "SELECT * FROM Account WHERE AccountType = 'Expense'". Use when the user asks what accounts exist, wants the chart of accounts, or needs an account's balance. For one known account, use get_account.

Class `read` (reads only). No scopes beyond the connection's defaults. Calls `GET /v3/company/{{params.realm_id}}/query`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `query` | string | **yes** | Full QuickBooks query statement against the Account table, e.g. "SELECT * FROM Account WHERE Active = true MAXRESULTS 50". |
| `realm_id` | string | **yes** | QuickBooks company id (realm id) the request is scoped to. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `QueryResponse` | object |  |
| `QueryResponse.Account` | array of object |  |
| `QueryResponse.Account[].AccountType` | string |  |
| `QueryResponse.Account[].Active` | boolean |  |
| `QueryResponse.Account[].CurrentBalance` | number |  |
| `QueryResponse.Account[].Id` | string |  |
| `QueryResponse.Account[].Name` | string |  |

Also retrieved by: "show the chart of accounts", "what accounts exist in the books", "find a ledger entry by its type".

### `quickbooks.create_invoice`

Create a new QuickBooks invoice billing a customer for one or more line items. Use when the user wants to invoice, bill, or charge a customer for goods or services sold. Requires a customer and at least one line item with an amount.

Class `write` (writes, no confirmation needed). No scopes beyond the connection's defaults. Calls `POST /v3/company/{{params.realm_id}}/invoice`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `billing_email` | string | no | Email address the invoice will be sent to, if sent later. |
| `customer_id` | string | **yes** | QuickBooks customer id being billed. |
| `doc_number` | string | no | Custom invoice number, if not left to auto-numbering. |
| `due_date` | string | no | Payment due date, "YYYY-MM-DD". |
| `line_items` | array of object | **yes** | Invoice lines. Each needs an amount, e.g. [{"item_id": "5", "quantity": 2, "unit_price": 75, "amount": 150, "description": "Consulting hours"}]. |
| `line_items[].amount` | number | **yes** | Line total. |
| `line_items[].description` | string | no |  |
| `line_items[].item_id` | string | no | QuickBooks item id billed on this line. |
| `line_items[].quantity` | number | no |  |
| `line_items[].unit_price` | number | no |  |
| `memo` | string | no | Private memo, not shown to the customer. |
| `realm_id` | string | **yes** | QuickBooks company id (realm id) the request is scoped to. |
| `txn_date` | string | no | Invoice date, "YYYY-MM-DD". Defaults to today. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `Balance` | number |  |
| `CustomerRef` | object |  |
| `CustomerRef.value` | string |  |
| `DocNumber` | string |  |
| `DueDate` | string |  |
| `Id` | string |  |
| `SyncToken` | string |  |
| `TotalAmt` | number |  |

Also retrieved by: "bill this client for the hours worked", "charge a customer for goods delivered", "draft a bill for services rendered", "start a new bill for a client with line items".

### `quickbooks.get_invoice`

Get one QuickBooks invoice by id: its line items, total, balance due, and due date. Use when the user names a specific invoice or asks whether it has been paid. For a customer's open invoices generally, use list_invoices.

Class `read` (reads only). No scopes beyond the connection's defaults. Calls `GET /v3/company/{{params.realm_id}}/invoice/{{params.invoice_id}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `invoice_id` | string | **yes** | QuickBooks invoice id, e.g. "142". |
| `realm_id` | string | **yes** | QuickBooks company id (realm id) the request is scoped to. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `Balance` | number |  |
| `CustomerRef` | object |  |
| `CustomerRef.name` | string |  |
| `CustomerRef.value` | string |  |
| `DocNumber` | string |  |
| `DueDate` | string |  |
| `Id` | string |  |
| `Line` | array of object |  |
| `Line[].Amount` | number |  |
| `Line[].Description` | string |  |
| `SyncToken` | string |  |
| `TotalAmt` | number |  |

Also retrieved by: "has this bill been paid yet", "pull up one specific bill sent to a client", "what's still owed on this bill".

### `quickbooks.list_invoices`

Search or list QuickBooks invoices using QuickBooks' own query language, e.g. "SELECT * FROM Invoice WHERE Balance > '0' ORDER BY DueDate". Use when the user asks about a customer's invoices, unpaid bills owed to us, or overall invoice history. For one known invoice, use get_invoice.

Class `read` (reads only). No scopes beyond the connection's defaults. Calls `GET /v3/company/{{params.realm_id}}/query`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `query` | string | **yes** | Full QuickBooks query statement against the Invoice table, e.g. "SELECT * FROM Invoice WHERE CustomerRef = '24' MAXRESULTS 20". |
| `realm_id` | string | **yes** | QuickBooks company id (realm id) the request is scoped to. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `QueryResponse` | object |  |
| `QueryResponse.Invoice` | array of object |  |
| `QueryResponse.Invoice[].Balance` | number |  |
| `QueryResponse.Invoice[].DocNumber` | string |  |
| `QueryResponse.Invoice[].DueDate` | string |  |
| `QueryResponse.Invoice[].Id` | string |  |
| `QueryResponse.Invoice[].TotalAmt` | number |  |

Also retrieved by: "what's outstanding from our clients", "show every unpaid bill we've sent", "pull up a client's billing history".

### `quickbooks.update_invoice`

Edit an existing QuickBooks invoice's line items, due date, or memo. Use when the user wants to correct or change an invoice that has not been paid. Requires the invoice's current sync_token, from get_invoice or list_invoices. To email it, use send_invoice; to kill it entirely, use void_invoice or delete_invoice.

Class `write` (writes, no confirmation needed). No scopes beyond the connection's defaults. Calls `POST /v3/company/{{params.realm_id}}/invoice`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `due_date` | string | no | New payment due date, "YYYY-MM-DD". |
| `invoice_id` | string | **yes** | QuickBooks invoice id to update. |
| `line_items` | array of object | no | Replacement line items for the whole invoice. |
| `line_items[].amount` | number | **yes** |  |
| `line_items[].description` | string | no |  |
| `line_items[].item_id` | string | no |  |
| `line_items[].quantity` | number | no |  |
| `line_items[].unit_price` | number | no |  |
| `memo` | string | no | New private memo, not shown to the customer. |
| `realm_id` | string | **yes** | QuickBooks company id (realm id) the request is scoped to. |
| `sync_token` | string | **yes** | Current SyncToken on the invoice record. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `Balance` | number |  |
| `Id` | string |  |
| `SyncToken` | string |  |
| `TotalAmt` | number |  |

Also retrieved by: "fix the line items on a bill we sent", "change the due date on an open bill", "correct a mistake on a client's bill".

### `quickbooks.send_invoice`

Email a QuickBooks invoice to the customer for payment. Use when the user wants to send, deliver, mail, or email an invoice to whoever owes it. Defaults to the email on the customer's record; give send_to to override it for this send only.

Class `write` (writes, no confirmation needed). No scopes beyond the connection's defaults. Calls `POST /v3/company/{{params.realm_id}}/invoice/{{params.invoice_id}}/send`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `invoice_id` | string | **yes** | QuickBooks invoice id to email. |
| `realm_id` | string | **yes** | QuickBooks company id (realm id) the request is scoped to. |
| `send_to` | string | no | Email address to send to instead of the invoice's billing email. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `EmailStatus` | string |  |
| `Id` | string |  |

Also retrieved by: "email this bill to the client", "get the invoice out to whoever owes it", "deliver the bill so they can pay".

### `quickbooks.void_invoice`

Void a QuickBooks invoice, zeroing its amount while keeping it on record for the audit trail. Irreversible; the invoice number is not reused. Use when the user wants to void, cancel, or invalidate an invoice that was sent by mistake but should stay on the books at zero. To remove it from the books entirely, use delete_invoice instead. Requires the invoice's current sync_token.

Class `destructive` (held by the mutation gate until the call's own arguments carry `"confirm": true`). No scopes beyond the connection's defaults. Calls `POST /v3/company/{{params.realm_id}}/invoice`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `invoice_id` | string | **yes** | QuickBooks invoice id to void. |
| `realm_id` | string | **yes** | QuickBooks company id (realm id) the request is scoped to. |
| `sync_token` | string | **yes** | Current SyncToken on the invoice record. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `Id` | string |  |
| `SyncToken` | string |  |
| `TotalAmt` | number |  |

Also retrieved by: "zero out a bill we sent by mistake but keep it on record", "kill a bill's amount without erasing the paper trail", "invalidate this invoice, keep it for the audit".

### `quickbooks.delete_invoice`

Permanently delete a QuickBooks invoice from the books. Irreversible. Use when the user wants to delete or completely remove an invoice that should never have existed, not just cancel one that stays on record. For that, use void_invoice instead. Requires the invoice's current sync_token.

Class `destructive` (held by the mutation gate until the call's own arguments carry `"confirm": true`). No scopes beyond the connection's defaults. Calls `POST /v3/company/{{params.realm_id}}/invoice`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `invoice_id` | string | **yes** | QuickBooks invoice id to delete. |
| `realm_id` | string | **yes** | QuickBooks company id (realm id) the request is scoped to. |
| `sync_token` | string | **yes** | Current SyncToken on the invoice record. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `Id` | string |  |
| `deleted` | boolean |  |

Also retrieved by: "scrap a bill that never should have existed", "get rid of this invoice completely", "erase a bill entered by accident".

### `quickbooks.create_bill`

Record a new QuickBooks bill: money owed to a vendor for goods or services received. Use when the user wants to enter, log, or record a bill from a supplier or contractor, before paying it. Requires a vendor and at least one line item with an amount.

Class `write` (writes, no confirmation needed). No scopes beyond the connection's defaults. Calls `POST /v3/company/{{params.realm_id}}/bill`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `doc_number` | string | no | Vendor's own bill or reference number. |
| `due_date` | string | no | Payment due date, "YYYY-MM-DD". |
| `line_items` | array of object | **yes** | Bill lines. Each needs an amount, e.g. [{"account_id": "64", "amount": 250, "description": "Office supplies"}]. |
| `line_items[].account_id` | string | no | QuickBooks expense account id this line posts to. |
| `line_items[].amount` | number | **yes** |  |
| `line_items[].description` | string | no |  |
| `line_items[].item_id` | string | no | QuickBooks item id this line is for, instead of an account. |
| `memo` | string | no | Private memo about this bill. |
| `realm_id` | string | **yes** | QuickBooks company id (realm id) the request is scoped to. |
| `txn_date` | string | no | Bill date, "YYYY-MM-DD". Defaults to today. |
| `vendor_id` | string | **yes** | QuickBooks vendor id the bill is owed to. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `Balance` | number |  |
| `DocNumber` | string |  |
| `DueDate` | string |  |
| `Id` | string |  |
| `SyncToken` | string |  |
| `TotalAmt` | number |  |
| `VendorRef` | object |  |
| `VendorRef.value` | string |  |

Also retrieved by: "log what we owe this supplier", "enter a charge from a contractor before we pay it", "record money owed for materials received", "jot down a dollar amount we owe a supplier for office supplies".

### `quickbooks.get_bill`

Get one QuickBooks bill by id: its line items, total, balance due, and due date. Use when the user names a specific bill or asks whether it has been paid. For what we owe in general, use list_bills.

Class `read` (reads only). No scopes beyond the connection's defaults. Calls `GET /v3/company/{{params.realm_id}}/bill/{{params.bill_id}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `bill_id` | string | **yes** | QuickBooks bill id, e.g. "88". |
| `realm_id` | string | **yes** | QuickBooks company id (realm id) the request is scoped to. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `Balance` | number |  |
| `DocNumber` | string |  |
| `DueDate` | string |  |
| `Id` | string |  |
| `Line` | array of object |  |
| `Line[].Amount` | number |  |
| `Line[].Description` | string |  |
| `SyncToken` | string |  |
| `TotalAmt` | number |  |
| `VendorRef` | object |  |
| `VendorRef.name` | string |  |
| `VendorRef.value` | string |  |

Also retrieved by: "has this supplier's charge been paid", "pull up what we owe on one specific bill", "check the due date on a charge from a contractor".

### `quickbooks.list_bills`

Search or list QuickBooks bills using QuickBooks' own query language, e.g. "SELECT * FROM Bill WHERE Balance > '0' ORDER BY DueDate". Use when the user asks what we owe, which vendor bills are unpaid, or wants a bill history. For one known bill, use get_bill.

Class `read` (reads only). No scopes beyond the connection's defaults. Calls `GET /v3/company/{{params.realm_id}}/query`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `query` | string | **yes** | Full QuickBooks query statement against the Bill table, e.g. "SELECT * FROM Bill WHERE VendorRef = '56' MAXRESULTS 20". |
| `realm_id` | string | **yes** | QuickBooks company id (realm id) the request is scoped to. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `QueryResponse` | object |  |
| `QueryResponse.Bill` | array of object |  |
| `QueryResponse.Bill[].Balance` | number |  |
| `QueryResponse.Bill[].DocNumber` | string |  |
| `QueryResponse.Bill[].DueDate` | string |  |
| `QueryResponse.Bill[].Id` | string |  |
| `QueryResponse.Bill[].TotalAmt` | number |  |

Also retrieved by: "what do we currently owe our suppliers", "show every unpaid charge from vendors", "pull up our accounts payable".

### `quickbooks.update_bill`

Edit an existing QuickBooks bill's line items, due date, or memo. Use when the user wants to correct or change a bill that has not been paid. Requires the bill's current sync_token, from get_bill or list_bills.

Class `write` (writes, no confirmation needed). No scopes beyond the connection's defaults. Calls `POST /v3/company/{{params.realm_id}}/bill`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `bill_id` | string | **yes** | QuickBooks bill id to update. |
| `due_date` | string | no | New payment due date, "YYYY-MM-DD". |
| `line_items` | array of object | no | Replacement line items for the whole bill. |
| `line_items[].account_id` | string | no |  |
| `line_items[].amount` | number | **yes** |  |
| `line_items[].description` | string | no |  |
| `line_items[].item_id` | string | no |  |
| `memo` | string | no | New private memo about this bill. |
| `realm_id` | string | **yes** | QuickBooks company id (realm id) the request is scoped to. |
| `sync_token` | string | **yes** | Current SyncToken on the bill record. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `Balance` | number |  |
| `Id` | string |  |
| `SyncToken` | string |  |
| `TotalAmt` | number |  |

Also retrieved by: "fix the due date on a charge from a supplier", "correct the amount owed on this bill", "change the line items on a charge from a contractor".

### `quickbooks.delete_bill`

Permanently delete a QuickBooks bill from the books. Irreversible. Use when the user wants to delete, remove, or scrap a bill entered by mistake, whether or not it has been paid. Requires the bill's current sync_token.

Class `destructive` (held by the mutation gate until the call's own arguments carry `"confirm": true`). No scopes beyond the connection's defaults. Calls `POST /v3/company/{{params.realm_id}}/bill`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `bill_id` | string | **yes** | QuickBooks bill id to delete. |
| `realm_id` | string | **yes** | QuickBooks company id (realm id) the request is scoped to. |
| `sync_token` | string | **yes** | Current SyncToken on the bill record. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `Id` | string |  |
| `deleted` | boolean |  |

Also retrieved by: "scrap a charge that was entered by mistake", "get rid of this vendor bill completely", "erase a supplier's charge that shouldn't exist".

### `quickbooks.create_payment`

Record a QuickBooks payment received from a customer, optionally applied against one or more open invoices. Use when the user wants to record, log, or apply a payment, deposit, or check received from a customer. For paying a vendor's bill instead, use create_bill_payment.

Class `write` (writes, no confirmation needed). No scopes beyond the connection's defaults. Calls `POST /v3/company/{{params.realm_id}}/payment`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `applied_invoices` | array of object | no | Invoices this payment pays down, e.g. [{"invoice_id": "142", "amount": 150}]. Omit to leave the payment unapplied. |
| `applied_invoices[].amount` | number | **yes** | Amount of this payment applied to that invoice. |
| `applied_invoices[].invoice_id` | string | **yes** | QuickBooks invoice id being paid. |
| `customer_id` | string | **yes** | QuickBooks customer id the payment came from. |
| `deposit_to_account_id` | string | no | QuickBooks account id the money is deposited to, e.g. a bank account or Undeposited Funds. Defaults to Undeposited Funds. |
| `payment_date` | string | no | Date the payment was received, "YYYY-MM-DD". Defaults to today. |
| `payment_method` | string | no | Free-text payment method, e.g. "Check", "Credit Card". |
| `realm_id` | string | **yes** | QuickBooks company id (realm id) the request is scoped to. |
| `total_amount` | number | **yes** | Total amount received. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `Id` | string |  |
| `SyncToken` | string |  |
| `TotalAmt` | number |  |
| `TxnDate` | string |  |
| `UnappliedAmt` | number |  |

Also retrieved by: "log a check we got from a client", "record money a customer sent us", "apply what a client paid against their open bill", "mark a deposit as received from a buyer".

### `quickbooks.get_payment`

Get one QuickBooks customer payment by id: amount, date, and which invoices it was applied to. Use when the user asks whether a specific payment was recorded or how it was applied. For a customer's payment history generally, use list_payments.

Class `read` (reads only). No scopes beyond the connection's defaults. Calls `GET /v3/company/{{params.realm_id}}/payment/{{params.payment_id}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `payment_id` | string | **yes** | QuickBooks payment id, e.g. "201". |
| `realm_id` | string | **yes** | QuickBooks company id (realm id) the request is scoped to. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `CustomerRef` | object |  |
| `CustomerRef.value` | string |  |
| `Id` | string |  |
| `SyncToken` | string |  |
| `TotalAmt` | number |  |
| `TxnDate` | string |  |
| `UnappliedAmt` | number |  |

Also retrieved by: "did this client's payment actually go through", "pull up details on money we received", "check whether a deposit cleared".

### `quickbooks.list_payments`

Search or list QuickBooks customer payments using QuickBooks' own query language, e.g. "SELECT * FROM Payment WHERE CustomerRef = '24'". Use when the user asks what a customer has paid, or wants recent payment history. For one known payment, use get_payment.

Class `read` (reads only). No scopes beyond the connection's defaults. Calls `GET /v3/company/{{params.realm_id}}/query`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `query` | string | **yes** | Full QuickBooks query statement against the Payment table, e.g. "SELECT * FROM Payment WHERE TotalAmt > '100'". |
| `realm_id` | string | **yes** | QuickBooks company id (realm id) the request is scoped to. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `QueryResponse` | object |  |
| `QueryResponse.Payment` | array of object |  |
| `QueryResponse.Payment[].Id` | string |  |
| `QueryResponse.Payment[].TotalAmt` | number |  |
| `QueryResponse.Payment[].TxnDate` | string |  |
| `QueryResponse.Payment[].UnappliedAmt` | number |  |

Also retrieved by: "what has this client paid us so far", "show recent money coming in from customers", "pull a buyer's deposit history".

### `quickbooks.delete_payment`

Permanently delete a QuickBooks customer payment, un-applying it from any invoices it was linked to. Irreversible; those invoices become unpaid again. Use when the user wants to delete, remove, or undo a payment entered by mistake or duplicated. Requires the payment's current sync_token.

Class `destructive` (held by the mutation gate until the call's own arguments carry `"confirm": true`). No scopes beyond the connection's defaults. Calls `POST /v3/company/{{params.realm_id}}/payment`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `payment_id` | string | **yes** | QuickBooks payment id to delete. |
| `realm_id` | string | **yes** | QuickBooks company id (realm id) the request is scoped to. |
| `sync_token` | string | **yes** | Current SyncToken on the payment record. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `Id` | string |  |
| `deleted` | boolean |  |

Also retrieved by: "undo a payment that was entered twice", "remove a deposit logged by mistake, the bill goes back to unpaid", "reverse money we recorded from a client in error".

### `quickbooks.create_bill_payment`

Pay a QuickBooks vendor bill, in full or in part, from a bank account. Use when the user wants to pay a vendor, settle a bill, or cut a check against money owed to a supplier. For recording a payment a customer sent us instead, use create_payment.

Class `write` (writes, no confirmation needed). No scopes beyond the connection's defaults. Calls `POST /v3/company/{{params.realm_id}}/billpayment`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `applied_bills` | array of object | no | Bills this payment pays down, e.g. [{"bill_id": "88", "amount": 250}]. Omit to leave the payment unapplied. |
| `applied_bills[].amount` | number | **yes** | Amount of this payment applied to that bill. |
| `applied_bills[].bill_id` | string | **yes** | QuickBooks bill id being paid. |
| `bank_account_id` | string | **yes** | QuickBooks account id the payment is drawn from. |
| `pay_type` | string, one of Check, CreditCard | no | How the vendor was paid. Defaults to Check. |
| `payment_date` | string | no | Payment date, "YYYY-MM-DD". Defaults to today. |
| `realm_id` | string | **yes** | QuickBooks company id (realm id) the request is scoped to. |
| `total_amount` | number | **yes** | Total amount paid. |
| `vendor_id` | string | **yes** | QuickBooks vendor id being paid. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `Id` | string |  |
| `PayType` | string |  |
| `SyncToken` | string |  |
| `TotalAmt` | number |  |
| `TxnDate` | string |  |

Also retrieved by: "pay this supplier from the checking account", "cut a check to settle what we owe a contractor", "send money to a vendor for their charge".

### `quickbooks.get_bill_payment`

Get one QuickBooks vendor bill payment by id: amount, date, and which bills it was applied to. Use when the user asks whether a specific vendor payment went out or how it was applied. For a vendor's payment history generally, use list_bill_payments.

Class `read` (reads only). No scopes beyond the connection's defaults. Calls `GET /v3/company/{{params.realm_id}}/billpayment/{{params.bill_payment_id}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `bill_payment_id` | string | **yes** | QuickBooks bill payment id, e.g. "310". |
| `realm_id` | string | **yes** | QuickBooks company id (realm id) the request is scoped to. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `Id` | string |  |
| `PayType` | string |  |
| `SyncToken` | string |  |
| `TotalAmt` | number |  |
| `TxnDate` | string |  |
| `VendorRef` | object |  |
| `VendorRef.value` | string |  |

Also retrieved by: "did the money to this supplier actually go out", "pull up details on a payment we sent a vendor", "check whether a check to a contractor cleared".

### `quickbooks.list_bill_payments`

Search or list QuickBooks vendor bill payments using QuickBooks' own query language, e.g. "SELECT * FROM BillPayment WHERE VendorRef = '56'". Use when the user asks what we have paid a vendor, or wants recent outgoing payment history. For one known bill payment, use get_bill_payment.

Class `read` (reads only). No scopes beyond the connection's defaults. Calls `GET /v3/company/{{params.realm_id}}/query`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `query` | string | **yes** | Full QuickBooks query statement against the BillPayment table, e.g. "SELECT * FROM BillPayment WHERE TotalAmt > '100'". |
| `realm_id` | string | **yes** | QuickBooks company id (realm id) the request is scoped to. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `QueryResponse` | object |  |
| `QueryResponse.BillPayment` | array of object |  |
| `QueryResponse.BillPayment[].Id` | string |  |
| `QueryResponse.BillPayment[].PayType` | string |  |
| `QueryResponse.BillPayment[].TotalAmt` | number |  |
| `QueryResponse.BillPayment[].TxnDate` | string |  |

Also retrieved by: "what have we sent this supplier lately", "show recent money going out to vendors", "pull a contractor's outgoing payment history".

### `quickbooks.get_profit_and_loss_report`

Run a QuickBooks profit and loss (income statement) report for a date range: income, expenses, and net income. Use when the user asks how the business is doing, what our profit or margin looks like, or for a P&L. For assets and liabilities instead, use get_balance_sheet_report.

Class `read` (reads only). No scopes beyond the connection's defaults. Calls `GET /v3/company/{{params.realm_id}}/reports/ProfitAndLoss`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `end_date` | string | no | Report period end, "YYYY-MM-DD". Defaults to today. |
| `realm_id` | string | **yes** | QuickBooks company id (realm id) the request is scoped to. |
| `start_date` | string | no | Report period start, "YYYY-MM-DD". Defaults to the start of the current fiscal year. |
| `summarize_column_by` | string, one of Total, Month, Week, Quarter, Year, Customers, Vendors, Classes | no | How to break the columns down. Defaults to Total. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `Header` | object |  |
| `Header.Currency` | string |  |
| `Header.EndPeriod` | string |  |
| `Header.ReportName` | string |  |
| `Header.StartPeriod` | string |  |
| `Rows` | object |  |
| `Rows.Row` | array of object |  |
| `Rows.Row[].ColData` | array of object |  |
| `Rows.Row[].Summary` | object |  |

Also retrieved by: "how much did we make last quarter", "pull a P&L for the business", "what's our margin looking like this year".

### `quickbooks.get_balance_sheet_report`

Run a QuickBooks balance sheet report as of a date: assets, liabilities, and equity. Use when the user asks what the business owns and owes, wants a snapshot of net worth, or asks for a balance sheet. For income and expenses over a period instead, use get_profit_and_loss_report.

Class `read` (reads only). No scopes beyond the connection's defaults. Calls `GET /v3/company/{{params.realm_id}}/reports/BalanceSheet`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `end_date` | string | no | As-of date for the balance sheet, "YYYY-MM-DD". Defaults to today. |
| `realm_id` | string | **yes** | QuickBooks company id (realm id) the request is scoped to. |
| `start_date` | string | no | Comparison period start, "YYYY-MM-DD". Defaults to the start of the current fiscal year. |
| `summarize_column_by` | string, one of Total, Month, Week, Quarter, Year | no | How to break the columns down. Defaults to Total. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `Header` | object |  |
| `Header.Currency` | string |  |
| `Header.EndPeriod` | string |  |
| `Header.ReportName` | string |  |
| `Header.StartPeriod` | string |  |
| `Rows` | object |  |
| `Rows.Row` | array of object |  |
| `Rows.Row[].ColData` | array of object |  |
| `Rows.Row[].Summary` | object |  |

Also retrieved by: "what do we own versus owe right now", "give me a snapshot of our net worth", "pull the assets and liabilities summary".

### `quickbooks.get_aged_receivables_report`

Run a QuickBooks aged receivables report: unpaid customer invoices grouped by how overdue they are (current, 1-30, 31-60, 61-90, 90+ days). Use when the user asks who owes us money, what is overdue, or wants an accounts receivable aging summary.

Class `read` (reads only). No scopes beyond the connection's defaults. Calls `GET /v3/company/{{params.realm_id}}/reports/AgedReceivables`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `realm_id` | string | **yes** | QuickBooks company id (realm id) the request is scoped to. |
| `report_date` | string | no | As-of date for aging, "YYYY-MM-DD". Defaults to today. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `Header` | object |  |
| `Header.Currency` | string |  |
| `Header.EndPeriod` | string |  |
| `Header.ReportName` | string |  |
| `Rows` | object |  |
| `Rows.Row` | array of object |  |
| `Rows.Row[].ColData` | array of object |  |
| `Rows.Row[].Summary` | object |  |

Also retrieved by: "who's behind on paying us", "show what's overdue from our clients", "give me an AR aging summary".
