Skip to content
wirebookby BufferSol

Docs

Bills resource

Endpoints, filters and the create and update fields for bills in the Wirebook API, with curl, TypeScript and Python examples.

What it is

Bills you owe to vendors (QuickBooks Bill transaction), with expense lines and item lines.

Bills live in the connected QuickBooks Desktop company file. Every call names the file with the X-End-User-Id header, and every field name below is the JSON key you send and receive. Behaviour on this page is validated against the QuickBooks Web Connector simulator and not yet against a real QuickBooks Desktop install. The acceptance run on a Windows rig is a launch step.

Endpoints

GET https://wirebook.buffersoltech.com/v1/qbd/bills lists bills. Filters: vendor, refNumber, modifiedSince, includeLines, plus limit (1 to 100, default 25) and cursor. The response has data, hasMore, nextCursor and cursorExpiresAt.

GET https://wirebook.buffersoltech.com/v1/qbd/bills/{id} returns one record by its txnId.

POST https://wirebook.buffersoltech.com/v1/qbd/bills creates a record and returns 201 with the created object. Send an Idempotency-Key header on every write.

POST https://wirebook.buffersoltech.com/v1/qbd/bills/{id} updates a record. Send the revisionNumber you read, and a stale one returns 409.

Create fields

Fields for POST https://wirebook.buffersoltech.com/v1/qbd/bills. Unknown fields are rejected with 400 invalid_request and the JSON path of the first problem. Lengths are the QuickBooks limits.

text
field                                type               required  max length
vendorRef                            object             yes
vendorRef.listId                     string             no        36
vendorRef.fullName                   string             no        209
aPAccountRef                         object             no
aPAccountRef.listId                  string             no        36
aPAccountRef.fullName                string             no        209
txnDate                              date (YYYY-MM-DD)  no
dueDate                              date (YYYY-MM-DD)  no
refNumber                            string             no        20
termsRef                             object             no
termsRef.listId                      string             no        36
termsRef.fullName                    string             no        209
memo                                 string             no        4095
expenseLines[]                       array              no
expenseLines[].accountRef            object             yes
expenseLines[].accountRef.listId     string             no        36
expenseLines[].accountRef.fullName   string             no        209
expenseLines[].amount                number             yes
expenseLines[].memo                  string             no        4095
expenseLines[].customerRef           object             no
expenseLines[].customerRef.listId    string             no        36
expenseLines[].customerRef.fullName  string             no        209
expenseLines[].classRef              object             no
expenseLines[].classRef.listId       string             no        36
expenseLines[].classRef.fullName     string             no        209
itemLines[]                          array              no
itemLines[].itemRef                  object             yes
itemLines[].itemRef.listId           string             no        36
itemLines[].itemRef.fullName         string             no        209
itemLines[].desc                     string             no        4095
itemLines[].quantity                 number             no
itemLines[].unitOfMeasure            string             no        31
itemLines[].cost                     number             no
itemLines[].amount                   number             no
itemLines[].customerRef              object             no
itemLines[].customerRef.listId       string             no        36
itemLines[].customerRef.fullName     string             no        209
itemLines[].classRef                 object             no
itemLines[].classRef.listId          string             no        36
itemLines[].classRef.fullName        string             no        209

Update fields

Fields for POST https://wirebook.buffersoltech.com/v1/qbd/bills/{id}. The txnId goes in the URL, not in the body. revisionNumber is required: it is the value you read last, and it protects against overwriting a change made in QuickBooks. Every other field is optional and only the fields you send change.

Every line you send carries txnLineId. Send the txnLineId of an existing line to change it, or "-1" to add a new line.

text
field                                type               required  max length
revisionNumber                       string             yes
vendorRef                            object             no
vendorRef.listId                     string             no        36
vendorRef.fullName                   string             no        209
aPAccountRef                         object             no
aPAccountRef.listId                  string             no        36
aPAccountRef.fullName                string             no        209
txnDate                              date (YYYY-MM-DD)  no
dueDate                              date (YYYY-MM-DD)  no
refNumber                            string             no        20
termsRef                             object             no
termsRef.listId                      string             no        36
termsRef.fullName                    string             no        209
memo                                 string             no        4095
expenseLines[]                       array              no
expenseLines[].txnLineId             string             yes
expenseLines[].accountRef            object             no
expenseLines[].accountRef.listId     string             no        36
expenseLines[].accountRef.fullName   string             no        209
expenseLines[].amount                number             no
expenseLines[].memo                  string             no        4095
expenseLines[].customerRef           object             no
expenseLines[].customerRef.listId    string             no        36
expenseLines[].customerRef.fullName  string             no        209
expenseLines[].classRef              object             no
expenseLines[].classRef.listId       string             no        36
expenseLines[].classRef.fullName     string             no        209
itemLines[]                          array              no
itemLines[].txnLineId                string             yes
itemLines[].itemRef                  object             no
itemLines[].itemRef.listId           string             no        36
itemLines[].itemRef.fullName         string             no        209
itemLines[].desc                     string             no        4095
itemLines[].quantity                 number             no
itemLines[].unitOfMeasure            string             no        31
itemLines[].cost                     number             no
itemLines[].amount                   number             no
itemLines[].customerRef              object             no
itemLines[].customerRef.listId       string             no        36
itemLines[].customerRef.fullName     string             no        209
itemLines[].classRef                 object             no
itemLines[].classRef.listId          string             no        36
itemLines[].classRef.fullName        string             no        209

Example with curl

Create a record with the required fields. Replace the key and the end user id with your own.

bash
curl -X POST https://wirebook.buffersoltech.com/v1/qbd/bills \
  -H "Authorization: Bearer sk_test_..." \
  -H "X-End-User-Id: acme-42" \
  -H "Idempotency-Key: bills-create-1" \
  -H "Content-Type: application/json" \
  -d '{"vendorRef":{"listId":"80000001-1"}}'

Example with TypeScript

Typed with the models generated from the same field specs. create returns the record, or a Queued marker if QuickBooks has not answered yet.

ts
import { Wirebook } from "@wirebook/sdk";

const qb = new Wirebook({ apiKey: process.env.WIREBOOK_API_KEY! }).forUser("acme-42");

const created = await qb.qbd.bills.create({
  "vendorRef": {
    "listId": "80000001-1"
  }
});

for await (const row of qb.qbd.bills.iterate({ limit: 100 })) {
  console.log(row);
}

await qb.qbd.bills.update("<txnId>", {
  "revisionNumber": "1700000000",
  "refNumber": "Updated",
  "expenseLines": [
    {
      "txnLineId": "-1",
      "amount": 100
    }
  ]
});

Example with Python

The Python SDK takes the same JSON keys, as typed dictionaries.

python
import os
from wirebook import Wirebook

qb = Wirebook(os.environ["WIREBOOK_API_KEY"]).for_user("acme-42")

created = qb.qbd.bills.create({
    "vendorRef": {
        "listId": "80000001-1",
    },
})

for row in qb.qbd.bills.iterate(limit=100):
    print(row)

qb.qbd.bills.update("<txnId>", {
    "revisionNumber": "1700000000",
    "refNumber": "Updated",
    "expenseLines": [
        {
            "txnLineId": "-1",
            "amount": 100,
        },
    ],
})

Waiting for QuickBooks

A request waits for QuickBooks to answer for 55 seconds. If QuickBooks has not answered by then, the API returns 202 with a request id and a Location header, and you poll GET /v1/requests/{id}. Send Prefer: respond-async to get the 202 straight away without waiting. The company file must be open and polling, see Troubleshooting.

If a write times out after it was sent, its state becomes outcome_unknown. Query by RefNumber before you retry, and do not retry blindly.