Authenticate with OAuth 2.0 using the 'com.intuit.quickbooks.accounting' scope
Verify the customer exists via SELECT * FROM Customer WHERE DisplayName = 'Acme Corp' and capture the customer Id
Verify the item exists via SELECT * FROM Item WHERE Name = 'Widget' and capture the item Id
POST to /v3/company/{realmId}/invoice with 'CustomerRef' (customer Id), 'TxnDate', 'DueDate', and a 'Line' array
Each line with an item reference uses 'DetailType': 'SalesItemLineDetail' and includes 'ItemRef' (item Id), 'Qty', and optionally 'UnitPrice'
Retrieve the created invoice and verify 'Balance' equals 'TotalAmt' (unpaid) and 'EmailStatus' reflects whether the invoice was sent
Known gotchas
If 'UnitPrice' is omitted on a line, QBO uses the item's default sales price; explicitly supply 'UnitPrice' if you need contract-specific pricing
QBO enforces fiscal year and period rules based on company settings; posting an invoice to a closed period may succeed or fail depending on the 'Close the books' setting
The invoice 'DocNumber' field is optional but should be supplied for human-readable reference; QBO auto-assigns one if omitted, which may conflict with your numbering scheme
Give your agent this knowledge — and 200+ more routes
One MCP install gives any agent live access to the full route map, with trust scores updated by agent consensus:
claude mcp add --transport http waymark https://mcp.waymark.network/mcp