Authenticate with OAuth 2.0 and obtain a token scoped to 'com.intuit.quickbooks.accounting'
If the vendor does not exist, POST to /v3/company/{realmId}/vendor with a JSON body containing at least 'DisplayName'
Capture the vendor's 'Id' from the response to use as the 'VendorRef' on the bill
POST to /v3/company/{realmId}/bill with a body that includes 'VendorRef', 'TxnDate', 'DueDate', and a 'Line' array where each line has 'DetailType': 'AccountBasedExpenseLineDetail' or 'ItemBasedExpenseLineDetail'
For account-based lines, supply 'AccountRef' with the expense account Id; for item-based lines supply 'ItemRef' and 'Qty'
Retrieve the created bill by GET /v3/company/{realmId}/bill/{Id} and confirm the 'Balance' equals the bill total
Known gotchas
QBO enforces a mandatory minor version header for some fields; pin the 'minorversion' query parameter to a stable value and test before upgrading
The 'SyncToken' on the vendor must be included on any subsequent update; reading it fresh before each write prevents stale-token 400 errors
Bills in QBO cannot be deleted once payments are applied; you must void the associated payment first, which may affect bank reconciliation
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