We strongly recommend using our Node.js client library for interfacing with QuickBooks Desktop because its type-checking, autocomplete, and inline docs make working with QuickBooks Desktop’s complex data objects super easy. Even if you know nothing about QuickBooks, you will easily discover the APIs, request parameters, response fields you need.

If your backend is not in Node.js, you can use the REST API that powers our Node.js library to send requests to QuickBooks Desktop. Follow the steps below to set up Node.js and TypeScript locally to test Conductor, and enable verbose logging to see the REST API request format, which you can then replicate in your backend. This approach enables you to determine the APIs and fields you need by leveraging the client library’s autocomplete and inline docs.

Skip to Step 10 below to see the REST API request format.

We are actively working on a complete rewrite of our REST API for QuickBooks Desktop that is much more powerful and much simpler. Available end of March, 2024.

Use the approach documented below in the meantime, which will be easily adaptable to the new REST API when it is released.

Check out our Python example for creating an invoice in QuickBooks Desktop using this REST API.

Build your REST API requests with Node.js locally and Conductor

This guide will show you how to easily generate the REST API request format for QuickBooks Desktop using Node.js and Conductor in your local environment. You can then replicate the REST API request format in your backend.


Install Node.js locally if you do not have it already

If you are on a Mac:

brew install node

Create a new directory

mkdir conductor-test
cd conductor-test

Initialize a new Node.js project

npm init -y

Install TypeScript and Conductor's Node.js library

npm install conductor-node typescript @types/node

Create a new TypeScript file

touch index.ts

Follow our quickstart guide if you haven't yet

If you haven’t already, follow our quickstart guide to create an EndUser with an authorized connection to a QuickBooks Desktop instance.


Add the following code to your `index.ts` file

import Conductor from "conductor-node";

const conductor = new Conductor("YOUR_SECRET_KEY}}", {
  // ❗ Enable logging to see the REST API request format.
  verbose: true,

async function main() {
  // ❗ Replace `{{END_USER_ID}}` bellow with the ID of the end-user
  // you created in the Quickstart guide.
  const invoices = await conductor.qbd.invoice.query("{{END_USER_ID}}", {
    IncludeLineItems: true,
    IncludeLinkedTxns: true,
    MaxReturned: 5,


Run the code

npx ts-node index.ts

Review the output

You will see the complete REST API request format in the output. For example:

Conductor request: {
  method: 'POST',
  url: 'https://api.conductor.is/v1/end_users/{{END_USER_ID}}/request/quickbooks_desktop',
  headers: {
    'Content-Type': 'application/json',
    Authorization: 'Bearer sk_live_************',
  body: {
    InvoiceQueryRq: {
      IncludeLineItems: true,
      IncludeLinkedTxns: true,
      MaxReturned: 3

Replicate the REST API request format in your backend

For example, with curl:

curl -X POST https://api.conductor.is/v1/end_users/{{END_USER_ID}}/request/quickbooks_desktop \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer {{YOUR_SECRET_KEY}}" \
  -d '{
    "InvoiceQueryRq": {
      "IncludeLineItems": true,
      "IncludeLinkedTxns": true,
      "MaxReturned": 3