QuickBooks Online
Your own QuickBooks Online company: create and update customers and invoices, read settings, run QuickBooks queries (also payments). Writes are idempotent per request_id; updates are always sparse. Connect with your own Intuit app (client id and secret in the vault), then the OAuth connect flow. Testing: sandbox company, Development keys, vault key quickbooks_environment = "sandbox".
setup_integration or the Dashboard Vault — they're encrypted
with AES-256-GCM and never exposed.
Required Credentials
Get your API key at quickbooks.intuit.com →
Endpoints (11)
The connected company: CompanyName, Country, addresses. Also a cheap connection check.
No input parameters required.
Company preferences: CurrencyPrefs (HomeCurrency, MultiCurrencyEnabled), SalesFormsPrefs.CustomTxnNumbers (must be true to keep your own invoice number as DocNumber), TaxPrefs.
No input parameters required.
Run a read-only QuickBooks query, e.g. "select * from Invoice where DocNumber = '1001'", "select * from Customer where DisplayName = 'Acme Ltd'", "select * from TaxCode", "select * from Payment where MetaData.LastUpdatedTime > '2026-10-01T00:00:00Z'". Page with STARTPOSITION and MAXRESULTS (100 or less).
| Field | Type | Required | Description |
|---|---|---|---|
query |
string | ✓ Yes | select ... from Entity where ... |
One customer by QuickBooks Id, including the SyncToken that update-customer needs.
| Field | Type | Required | Description |
|---|---|---|---|
customer_id |
string | ✓ Yes |
Create a customer. DisplayName must be unique (customers, vendors and employees): look it up first with query. The same request_id returns the original result instead of a second customer, so a retry is safe. Other QuickBooks Customer fields pass through as given.
| Field | Type | Required | Description |
|---|---|---|---|
request_id |
string | ✓ Yes | Idempotency key, unique per company, e.g. "cust-<your id>-v1". |
DisplayName |
string | ✓ Yes | |
GivenName |
string | No | |
FamilyName |
string | No | |
CompanyName |
string | No | |
PrimaryEmailAddr |
array | No | {"Address": "jane@example.com"} |
PrimaryPhone |
array | No | {"FreeFormNumber": "+44 20 7946 0000"} |
BillAddr |
array | No | {"Line1", "City", "PostalCode", "Country"} |
ShipAddr |
array | No | |
Notes |
string | No | |
CurrencyRef |
array | No | {"value": "GBP"}, only with multi-currency on. |
Update a customer; sparse, so only the fields you send change. Needs Id and the current SyncToken (get-customer); on a stale SyncToken read again and retry. Active false = inactive (no customer delete in QuickBooks).
| Field | Type | Required | Description |
|---|---|---|---|
request_id |
string | ✓ Yes | |
Id |
string | ✓ Yes | |
SyncToken |
string | ✓ Yes | |
DisplayName |
string | No | |
GivenName |
string | No | |
FamilyName |
string | No | |
CompanyName |
string | No | |
PrimaryEmailAddr |
array | No | |
PrimaryPhone |
array | No | |
BillAddr |
array | No | |
ShipAddr |
array | No | |
Notes |
string | No | |
Active |
boolean | No |
One invoice by QuickBooks Id (not DocNumber): lines, TotalAmt, Balance (0 = paid), LinkedTxn (payments), SyncToken. Find one by your own number with query on DocNumber.
| Field | Type | Required | Description |
|---|---|---|---|
invoice_id |
string | ✓ Yes |
Create an invoice. Minimal: CustomerRef {"value": "<customer Id>"} and Line [{"DetailType": "SalesItemLineDetail", "Amount": 120.00, "Description": "...", "SalesItemLineDetail": {"ItemRef": {"value": "<item Id>"}, "Qty": 1, "UnitPrice": 120.00, "TaxCodeRef": {"value": "<tax code>"}}}]. Amounts are decimals, not cents; Amount = Qty x UnitPrice. DocNumber (your invoice number, max 21) is only kept when SalesFormsPrefs.CustomTxnNumbers is on; check with query that it is not used yet. The same request_id returns the original invoice instead of a second one. Other Invoice fields pass through as given.
| Field | Type | Required | Description |
|---|---|---|---|
request_id |
string | ✓ Yes | Idempotency key, unique per company, e.g. "inv-<your id>-v1". |
CustomerRef |
array | ✓ Yes | |
Line |
array | ✓ Yes | |
DocNumber |
string | No | |
TxnDate |
string | No | YYYY-MM-DD |
DueDate |
string | No | YYYY-MM-DD |
CurrencyRef |
array | No | Must be the customer currency. |
BillEmail |
array | No | {"Address": "..."} |
CustomerMemo |
array | No | {"value": "shown on the invoice"} |
PrivateNote |
string | No | |
SalesTermRef |
array | No | |
TxnTaxDetail |
array | No | |
GlobalTaxCalculation |
string | No | TaxExcluded, TaxInclusive or NotApplicable (non-US). |
Update an invoice; sparse, so only the fields you send change (a Line array replaces all lines). Needs Id and the current SyncToken (get-invoice); on a stale SyncToken read again and retry.
| Field | Type | Required | Description |
|---|---|---|---|
request_id |
string | ✓ Yes | |
Id |
string | ✓ Yes | |
SyncToken |
string | ✓ Yes | |
CustomerRef |
array | No | |
Line |
array | No | |
DocNumber |
string | No | |
TxnDate |
string | No | |
DueDate |
string | No | |
BillEmail |
array | No | |
CustomerMemo |
array | No | |
PrivateNote |
string | No | |
SalesTermRef |
array | No | |
TxnTaxDetail |
array | No | |
GlobalTaxCalculation |
string | No |
One payment by QuickBooks Id: TotalAmt, TxnDate, CustomerRef, PaymentMethodRef and Line[].LinkedTxn (the invoices it pays, TxnType Invoice).
| Field | Type | Required | Description |
|---|---|---|---|
payment_id |
string | ✓ Yes |
Objects changed since a moment, e.g. entities "Invoice,Payment" and changed_since "2026-10-01T00:00:00Z". At most 30 days back and at most 1000 objects per entity; deleted objects come back with status "Deleted". Answer: CDCResponse[0].QueryResponse[] per entity.
| Field | Type | Required | Description |
|---|---|---|---|
entities |
string | ✓ Yes | Comma list of entity names, e.g. "Invoice,Payment". |
changed_since |
string | ✓ Yes | ISO 8601 time, at most 30 days ago. |
MCP Tool Names
When using this integration through an AI assistant (Claude, ChatGPT, Cursor, etc.), the endpoints are available as MCP tools:
| Endpoint | MCP Tool Name |
|---|---|
| get-company-info | quickbooks_get_company_info |
| get-preferences | quickbooks_get_preferences |
| query | quickbooks_query |
| get-customer | quickbooks_get_customer |
| create-customer | quickbooks_create_customer |
| update-customer | quickbooks_update_customer |
| get-invoice | quickbooks_get_invoice |
| create-invoice | quickbooks_create_invoice |
| update-invoice | quickbooks_update_invoice |
| get-payment | quickbooks_get_payment |
| change-data-capture | quickbooks_change_data_capture |
Website