- Proper HTTP methods:
GETfor reading,POSTfor creating or updating. No morePOSTfor everything. - Cleaner URL endpoints:
/quickbooks_desktop/invoicesinstead of/end-users/{id}/passthrough/quickbooks_desktopwithInvoiceQueryRqin the body. - An OpenAPI spec for the entire API.
- Full online documentation of all fields and their types.
- API playground in the documentation to test requests and see responses.
- Always returns all response fields. Uses
nullfor undefined fields instead of omitting them. - Consistently returns arrays for any nested fields that previously returned a single object for one item and an array for multiple items.
- Returns an empty array instead of
nullfor empty lists.
- Returns an empty array instead of
- Clean response bodies: No more unwrapping outer objects; e.g., no more
InvoiceQueryRs.InvoiceRet. - Proper object wrapper for all list responses: Previously, we returned an array of objects. Now, we return an object with a
datafield that contains the array of objects. - Pagination for all list endpoints.
- Better parameter names instead of QuickBooks Desktop’s unconventional naming. For example:
MaxReturned→limitTimeModified→updatedAtDataExtRet→customFields
- Uses
camelCasefor input and output field names instead ofPascalCase. - Simplified request structure. For example:
refNumberStartsWith: "REF"instead ofRefNumberFilter: { MatchCriterion: "StartsWith", RefNumber: "REF" }accountId: "123"instead ofAccountRef: { ListID: "123" }
- Correct types for obscure fields: Previously, we inferred types from XML. Now, we define the type of every field to ensure it is always correct.
- Better field descriptions: we are using our own descriptions instead of QuickBooks’ descriptions.
- Field-specific coercions: better handling of dates and money amounts.
- Enforced upper bound on
limitof 150 records per page to prevent unintentionally overloading QuickBooks Desktop instances. - Better defaults. For example:
includeLineItemsistrueby default because who wants an empty invoice?ownerIdis 0 by default to always include your end-users’ custom fields.

