Wave Accounting

App · Accounting & Finance · 20 actions

Read and write a Wave business's books: customers, products and services, the chart of accounts, sales taxes, and invoices from draft through approval, payment and deletion.

Actions

ActionWhat it does
Approve invoiceApprove a draft invoice, which makes it final and records it in the books.
Archive productArchive a product or service so it stops being offered on new invoices.
Create customerAdd a customer to a business.
Create invoiceCreate an invoice for a customer.
Create productAdd a product or service to a business.
Delete customerDelete a customer.
Delete invoiceDelete an invoice.
Delete invoice paymentRemove a recorded payment from an invoice, putting the amount back on what is owed.
Get businessRead one business - its currency, address, timezone, and whether Wave's email sending is enabled for it.
Get customerRead one customer, including how much they currently owe and how much of that is overdue.
Get invoiceRead one invoice with its line items, taxes, totals and every payment recorded against it.
List accountsRead a business's chart of accounts, optionally narrowed by type or subtype.
List businessesList every business in the connected Wave account.
List customersList a business's customers, optionally narrowed to one email address or to a window of when they were last changed.
List invoicesList a business's invoices, narrowed by status, customer, date range or invoice number.
List productsList a business's products and services, optionally narrowed to the ones it sells or the ones it buys.
List sales taxesList a business's sales taxes with the rate in force today and the dated history behind it.
Record invoice paymentRecord a payment against an approved invoice.
Update customerChange an existing customer.
Update productChange an existing product or service.

Approve invoice

Approve a draft invoice, which makes it final and records it in the books. An invoice has to be approved before a payment can be recorded against it. This cannot be undone.

Inputs

Invoice IDinvoice_idtextRequired
The invoice's Wave ID. 'List invoices' returns these in 'invoice_ids', and 'Create invoice' reports the one it made as 'invoice_id'.

Outputs

approvedtrue/false
Always true
invoiceobject
invoice_idtext
The invoice's Wave ID
statustext
The status after approval
Example output
{
  "approved": true,
  "invoice": {
    "amountDue": {
      "currency": {
        "code": "USD",
        "exponent": 2,
        "name": "US dollar",
        "symbol": "$"
      },
      "minorUnitValue": "12000",
      "value": "120.00"
    },
    "amountPaid": {
      "currency": {
        "code": "USD",
        "exponent": 2,
        "name": "US dollar",
        "symbol": "$"
      },
      "minorUnitValue": "0",
      "value": "0.00"
    },
    "currency": {
      "code": "USD",
      "exponent": 2,
      "name": "US dollar",
      "symbol": "$"
    },
    "customer": {
      "email": "billing@acme.example.com",
      "id": "Q3VzdG9tZXI6NTY3OA==",
      "name": "Acme Supplies"
    },
    "dueDate": "2026-10-01",
    "exchangeRate": "1",
    "id": "SW52b2ljZTo3Nzc3",
    "invoiceDate": "2026-09-01",
    "invoiceNumber": "17",
    "items": [
      {
        "account": {
          "id": "QWNjb3VudDoxMDAx",
          "name": "Sales"
        },
        "description": "Billable consulting time",
        "id": "SW52b2ljZUl0ZW06MQ==",
        "product": {
          "id": "UHJvZHVjdDo0MzIx",
          "name": "Consulting hour"
        },
        "quantity": "1",
        "subtotal": {
          "currency": {
            "code": "USD",
            "exponent": 2,
            "name": "US dollar",
            "symbol": "$"
          },
          "minorUnitValue": "12000",
          "value": "120.00"
        },
        "taxes": [],
        "total": {
          "currency": {
            "code": "USD",
            "exponent": 2,
            "name": "US dollar",
            "symbol": "$"
          },
          "minorUnitValue": "12000",
          "value": "120.00"
        },
        "unitPrice": "120.00"
      }
    ],
    "status": "SAVED",
    "subtotal": {
      "currency": {
        "code": "USD",
        "exponent": 2,
        "name": "US dollar",
        "symbol": "$"
      },
      "minorUnitValue": "12000",
      "value": "120.00"
    },
    "taxTotal": {
      "currency": {
        "code": "USD",
        "exponent": 2,
        "name": "US dollar",
        "symbol": "$"
      },
      "minorUnitValue": "0",
      "value": "0.00"
    },
    "title": "Invoice",
    "total": {
      "currency": {
        "code": "USD",
        "exponent": 2,
        "name": "US dollar",
        "symbol": "$"
      },
      "minorUnitValue": "12000",
      "value": "120.00"
    },
    "viewUrl": "https://invoice.waveapps.com/example"
  },
  "invoice_id": "SW52b2ljZTo3Nzc3",
  "status": "SAVED"
}

Archive product

Archive a product or service so it stops being offered on new invoices. Wave has no product delete: a product that has ever been invoiced is part of the books, so archiving is the only removal there is.

Inputs

Product IDproduct_idtextRequired
The product or service's Wave ID. 'List products' returns these in 'product_ids'.

Outputs

archivedtrue/false
Always true
productobject
product_idtext
The product's Wave ID
Example output
{
  "archived": true,
  "product": {
    "defaultSalesTaxes": [],
    "description": "Billable consulting time",
    "id": "UHJvZHVjdDo0MzIx",
    "incomeAccount": {
      "id": "QWNjb3VudDoxMDAx",
      "name": "Sales",
      "subtype": {
        "value": "INCOME"
      }
    },
    "isArchived": true,
    "isBought": false,
    "isSold": true,
    "name": "Consulting hour",
    "unitPrice": "120.00"
  },
  "product_id": "UHJvZHVjdDo0MzIx"
}

Create customer

Add a customer to a business. Only the name is required; everything else - contact details, billing address, currency - can be filled in later with 'Update customer'.

Inputs

Businessbusiness_idtextRequired
Which set of books to work in. Pick from the list; the value sent is the business's Wave ID. 'List businesses' returns these in 'business_ids'.
NamenametextRequired
The customer's name, or their business name. This is what appears on an invoice.
Contact first namefirst_nametext
First name of the person to contact at the customer.
Contact last namelast_nametext
Last name of the person to contact at the customer.
Emailemailtext
Where invoices are sent. Wave does not require it, and does not enforce that it is unique.
Phonephonetext
The customer's telephone number.
Mobilemobiletext
The contact's mobile number.
Websitewebsitetext
The customer's website address.
Currencycurrencytext
The currency to use. Leave empty to use the business's own currency, which is what almost every workflow wants.
Account numberdisplay_idtext
Your own reference for this customer. Wave shows it as the customer's account number.
Internal notesinternal_notestext
Notes kept on the customer record. Never shown to the customer.
Address line 1address_line1text
Street address, PO box, or company name.
Address line 2address_line2text
Apartment, suite, unit, or building.
Citycitytext
City, district, suburb, town, or village.
Countrycountry_codetext
The customer's country. Pick one first to load its states/provinces below, if it has any.
State / provinceprovince_codetext
The customer's state, province, or region. Wave only recognises the values it lists for the country picked above - most countries have none, in which case this stays empty. Pick a country first.
Postal codepostal_codetext
ZIP or postal code.

Outputs

createdtrue/false
Always true
customerobject
customer_idtext
The new customer's Wave ID
Example output
{
  "created": true,
  "customer": {
    "currency": {
      "code": "USD",
      "exponent": 2,
      "name": "US dollar",
      "symbol": "$"
    },
    "email": "billing@acme.example.com",
    "id": "Q3VzdG9tZXI6NTY3OA==",
    "isArchived": false,
    "name": "Acme Supplies",
    "outstandingAmount": {
      "currency": {
        "code": "USD",
        "exponent": 2,
        "name": "US dollar",
        "symbol": "$"
      },
      "minorUnitValue": "12000",
      "value": "120.00"
    },
    "overdueAmount": {
      "currency": {
        "code": "USD",
        "exponent": 2,
        "name": "US dollar",
        "symbol": "$"
      },
      "minorUnitValue": "0",
      "value": "0.00"
    }
  },
  "customer_id": "Q3VzdG9tZXI6NTY3OA=="
}

Create invoice

Create an invoice for a customer. A draft can still be edited in Wave and is not in the books yet; approving it makes it final. Every line item needs a product - use 'List products' or 'Create product' to get one.

Inputs

Businessbusiness_idtextRequired
Which set of books to work in. Pick from the list; the value sent is the business's Wave ID. 'List businesses' returns these in 'business_ids'.
Customer IDcustomer_idtextRequired
The customer's Wave ID. 'List customers' returns these in 'customer_ids', and every create/update step reports the one it touched as 'customer_id'.
Line itemsitemslistRequired
The lines on the invoice, as a list of objects. Each needs "product_id"; "quantity", "unit_price", "description" and "sales_tax_ids" are optional and fall back to the product's own. For example: [{"product_id": "UHJvZHVjdDo0MzIx", "quantity": 2}].
Create asstatustext
Whether the invoice starts as an editable draft or is approved straight away. Approval cannot be undone - an approved invoice is deleted rather than returned to draft.One of: DRAFT (Draft - editable, and not yet in the books), SAVED (Approved - final, and recorded in the books). Default: DRAFT.
Invoice dateinvoice_datedate
When the invoice is issued. Defaults to today.
Due datedue_datedate
When payment is due. Leave empty to apply the business's own payment terms to the invoice date.
Invoice numberinvoice_numbertext
Leave empty to let Wave take the next number after the highest one it has.
PO numberpo_numbertext
The customer's purchase or sales order number.
Titletitletext
The heading at the top of the document. Leave empty for the business's default.
Subheadingsubheadtext
The line under the title. Leave empty for none.
Memomemotext
Notes shown to the customer on the invoice.
Footerfootertext
Text along the bottom of the invoice.
Currencycurrencytext
The currency to use. Leave empty to use the business's own currency, which is what almost every workflow wants.

Outputs

createdtrue/false
Always true
invoiceobject
invoice_idtext
The new invoice's Wave ID
statustext
The status it was created in
Example output
{
  "created": true,
  "invoice": {
    "amountDue": {
      "currency": {
        "code": "USD",
        "exponent": 2,
        "name": "US dollar",
        "symbol": "$"
      },
      "minorUnitValue": "12000",
      "value": "120.00"
    },
    "amountPaid": {
      "currency": {
        "code": "USD",
        "exponent": 2,
        "name": "US dollar",
        "symbol": "$"
      },
      "minorUnitValue": "0",
      "value": "0.00"
    },
    "currency": {
      "code": "USD",
      "exponent": 2,
      "name": "US dollar",
      "symbol": "$"
    },
    "customer": {
      "email": "billing@acme.example.com",
      "id": "Q3VzdG9tZXI6NTY3OA==",
      "name": "Acme Supplies"
    },
    "dueDate": "2026-10-01",
    "exchangeRate": "1",
    "id": "SW52b2ljZTo3Nzc3",
    "invoiceDate": "2026-09-01",
    "invoiceNumber": "17",
    "items": [
      {
        "account": {
          "id": "QWNjb3VudDoxMDAx",
          "name": "Sales"
        },
        "description": "Billable consulting time",
        "id": "SW52b2ljZUl0ZW06MQ==",
        "product": {
          "id": "UHJvZHVjdDo0MzIx",
          "name": "Consulting hour"
        },
        "quantity": "1",
        "subtotal": {
          "currency": {
            "code": "USD",
            "exponent": 2,
            "name": "US dollar",
            "symbol": "$"
          },
          "minorUnitValue": "12000",
          "value": "120.00"
        },
        "taxes": [],
        "total": {
          "currency": {
            "code": "USD",
            "exponent": 2,
            "name": "US dollar",
            "symbol": "$"
          },
          "minorUnitValue": "12000",
          "value": "120.00"
        },
        "unitPrice": "120.00"
      }
    ],
    "status": "DRAFT",
    "subtotal": {
      "currency": {
        "code": "USD",
        "exponent": 2,
        "name": "US dollar",
        "symbol": "$"
      },
      "minorUnitValue": "12000",
      "value": "120.00"
    },
    "taxTotal": {
      "currency": {
        "code": "USD",
        "exponent": 2,
        "name": "US dollar",
        "symbol": "$"
      },
      "minorUnitValue": "0",
      "value": "0.00"
    },
    "title": "Invoice",
    "total": {
      "currency": {
        "code": "USD",
        "exponent": 2,
        "name": "US dollar",
        "symbol": "$"
      },
      "minorUnitValue": "12000",
      "value": "120.00"
    },
    "viewUrl": "https://invoice.waveapps.com/example"
  },
  "invoice_id": "SW52b2ljZTo3Nzc3",
  "status": "DRAFT"
}

Create product

Add a product or service to a business. Attach an income account to make it sellable - Wave will not put a product with no income account on an invoice.

Inputs

Businessbusiness_idtextRequired
Which set of books to work in. Pick from the list; the value sent is the business's Wave ID. 'List businesses' returns these in 'business_ids'.
NamenametextRequired
What the product or service is called.
Unit priceunit_pricenumberRequired
Price for one unit, in the ordinary currency amount - 12.50, not 1250.
Descriptiondescriptiontext
What appears under the name on an invoice line. Leave empty for none.
Income accountincome_account_idtext
Which income account the sales of this product post to. Attaching one is what makes a product sellable - Wave will not put a product with no income account on an invoice. Wave accepts only accounts whose subtype is INCOME, DISCOUNTS, OTHER_INCOME; each option's subtype is shown in square brackets.
Expense accountexpense_account_idtext
Which expense account purchases of this product post to, which is what lets it go on a bill. Wave accepts only accounts whose subtype is EXPENSE, COST_OF_GOODS_SOLD, PAYMENT_PROCESSING_FEES, PAYROLL_EXPENSES; each option's subtype is shown in square brackets.
Default sales taxessales_tax_idslist
Sales taxes applied to this product by default whenever it goes on an invoice. Leave empty for none.

Outputs

createdtrue/false
Always true
productobject
product_idtext
The new product's Wave ID
Example output
{
  "created": true,
  "product": {
    "defaultSalesTaxes": [],
    "description": "Billable consulting time",
    "id": "UHJvZHVjdDo0MzIx",
    "incomeAccount": {
      "id": "QWNjb3VudDoxMDAx",
      "name": "Sales",
      "subtype": {
        "value": "INCOME"
      }
    },
    "isArchived": false,
    "isBought": false,
    "isSold": true,
    "name": "Consulting hour",
    "unitPrice": "120.00"
  },
  "product_id": "UHJvZHVjdDo0MzIx"
}

Delete customer

Delete a customer. Wave refuses while any invoice or payment still points at them, so delete those first - a customer who has traded is part of the books.

Inputs

Customer IDcustomer_idtextRequired
The customer's Wave ID. 'List customers' returns these in 'customer_ids', and every create/update step reports the one it touched as 'customer_id'.

Outputs

customer_idtext
The customer that was deleted
deletedtrue/false
Always true
Example output
{
  "customer_id": "Q3VzdG9tZXI6NTY3OA==",
  "deleted": true
}

Delete invoice

Delete an invoice. Wave refuses while payments are still recorded against it, so remove those first - 'Get invoice' lists them in 'payment_ids'.

Inputs

Invoice IDinvoice_idtextRequired
The invoice's Wave ID. 'List invoices' returns these in 'invoice_ids', and 'Create invoice' reports the one it made as 'invoice_id'.

Outputs

deletedtrue/false
Always true
invoice_idtext
The invoice that was deleted
Example output
{
  "deleted": true,
  "invoice_id": "SW52b2ljZTo3Nzc3"
}

Delete invoice payment

Remove a recorded payment from an invoice, putting the amount back on what is owed. 'Get invoice' lists an invoice's payment IDs in 'payment_ids'.

Inputs

Payment IDpayment_idtextRequired
The payment's Wave ID. 'Get invoice' returns these in 'payment_ids', and 'Record invoice payment' reports the one it made as 'payment_id'.

Outputs

deletedtrue/false
Always true
payment_idtext
The payment that was deleted
Example output
{
  "deleted": true,
  "payment_id": "SW52b2ljZVBheW1lbnQ6MjI="
}

Get business

Read one business - its currency, address, timezone, and whether Wave's email sending is enabled for it.

Inputs

Businessbusiness_idtextRequired
Which set of books to work in. Pick from the list; the value sent is the business's Wave ID. 'List businesses' returns these in 'business_ids'.

Outputs

businessobject
business_idtext
The business's Wave ID
Example output
{
  "business": {
    "currency": {
      "code": "USD",
      "exponent": 2,
      "name": "US dollar",
      "symbol": "$"
    },
    "emailSendEnabled": true,
    "id": "QnVzaW5lc3M6MTIzNA==",
    "isArchived": false,
    "isPersonal": false,
    "name": "Northwind Consulting",
    "organizationalType": "SOLE_PROPRIETORSHIP",
    "timezone": "America/Toronto"
  },
  "business_id": "QnVzaW5lc3M6MTIzNA=="
}

Get customer

Read one customer, including how much they currently owe and how much of that is overdue.

Inputs

Businessbusiness_idtextRequired
Which set of books to work in. Pick from the list; the value sent is the business's Wave ID. 'List businesses' returns these in 'business_ids'.
Customer IDcustomer_idtextRequired
The customer's Wave ID. 'List customers' returns these in 'customer_ids', and every create/update step reports the one it touched as 'customer_id'.

Outputs

customerobject
customer_idtext
The customer's Wave ID
Example output
{
  "customer": {
    "currency": {
      "code": "USD",
      "exponent": 2,
      "name": "US dollar",
      "symbol": "$"
    },
    "email": "billing@acme.example.com",
    "id": "Q3VzdG9tZXI6NTY3OA==",
    "isArchived": false,
    "name": "Acme Supplies",
    "outstandingAmount": {
      "currency": {
        "code": "USD",
        "exponent": 2,
        "name": "US dollar",
        "symbol": "$"
      },
      "minorUnitValue": "12000",
      "value": "120.00"
    },
    "overdueAmount": {
      "currency": {
        "code": "USD",
        "exponent": 2,
        "name": "US dollar",
        "symbol": "$"
      },
      "minorUnitValue": "0",
      "value": "0.00"
    }
  },
  "customer_id": "Q3VzdG9tZXI6NTY3OA=="
}

Get invoice

Read one invoice with its line items, taxes, totals and every payment recorded against it. The payment IDs come back in 'payment_ids', which is what 'Delete invoice payment' takes.

Inputs

Businessbusiness_idtextRequired
Which set of books to work in. Pick from the list; the value sent is the business's Wave ID. 'List businesses' returns these in 'business_ids'.
Invoice IDinvoice_idtextRequired
The invoice's Wave ID. 'List invoices' returns these in 'invoice_ids', and 'Create invoice' reports the one it made as 'invoice_id'.

Outputs

invoiceobject
invoice_idtext
The invoice's Wave ID
payment_idslist
IDs of the payments recorded against it
statustext
The invoice's current status
Example output
{
  "invoice": {
    "amountDue": {
      "currency": {
        "code": "USD",
        "exponent": 2,
        "name": "US dollar",
        "symbol": "$"
      },
      "minorUnitValue": "12000",
      "value": "120.00"
    },
    "amountPaid": {
      "currency": {
        "code": "USD",
        "exponent": 2,
        "name": "US dollar",
        "symbol": "$"
      },
      "minorUnitValue": "0",
      "value": "0.00"
    },
    "currency": {
      "code": "USD",
      "exponent": 2,
      "name": "US dollar",
      "symbol": "$"
    },
    "customer": {
      "email": "billing@acme.example.com",
      "id": "Q3VzdG9tZXI6NTY3OA==",
      "name": "Acme Supplies"
    },
    "dueDate": "2026-10-01",
    "exchangeRate": "1",
    "id": "SW52b2ljZTo3Nzc3",
    "invoiceDate": "2026-09-01",
    "invoiceNumber": "17",
    "items": [
      {
        "account": {
          "id": "QWNjb3VudDoxMDAx",
          "name": "Sales"
        },
        "description": "Billable consulting time",
        "id": "SW52b2ljZUl0ZW06MQ==",
        "product": {
          "id": "UHJvZHVjdDo0MzIx",
          "name": "Consulting hour"
        },
        "quantity": "1",
        "subtotal": {
          "currency": {
            "code": "USD",
            "exponent": 2,
            "name": "US dollar",
            "symbol": "$"
          },
          "minorUnitValue": "12000",
          "value": "120.00"
        },
        "taxes": [],
        "total": {
          "currency": {
            "code": "USD",
            "exponent": 2,
            "name": "US dollar",
            "symbol": "$"
          },
          "minorUnitValue": "12000",
          "value": "120.00"
        },
        "unitPrice": "120.00"
      }
    ],
    "payments": [
      {
        "account": {
          "currency": {
            "code": "USD",
            "exponent": 2,
            "name": "US dollar",
            "symbol": "$"
          },
          "id": "QWNjb3VudDo5OTk5",
          "name": "Cash on Hand"
        },
        "amount": "120.00",
        "customer": {
          "id": "Q3VzdG9tZXI6NTY3OA==",
          "name": "Acme Supplies"
        },
        "exchangeRate": "1",
        "id": "SW52b2ljZVBheW1lbnQ6MjI=",
        "paymentDate": "2026-09-05",
        "paymentMethod": "CASH"
      }
    ],
    "status": "SAVED",
    "subtotal": {
      "currency": {
        "code": "USD",
        "exponent": 2,
        "name": "US dollar",
        "symbol": "$"
      },
      "minorUnitValue": "12000",
      "value": "120.00"
    },
    "taxTotal": {
      "currency": {
        "code": "USD",
        "exponent": 2,
        "name": "US dollar",
        "symbol": "$"
      },
      "minorUnitValue": "0",
      "value": "0.00"
    },
    "title": "Invoice",
    "total": {
      "currency": {
        "code": "USD",
        "exponent": 2,
        "name": "US dollar",
        "symbol": "$"
      },
      "minorUnitValue": "12000",
      "value": "120.00"
    },
    "viewUrl": "https://invoice.waveapps.com/example"
  },
  "invoice_id": "SW52b2ljZTo3Nzc3",
  "payment_ids": [
    "SW52b2ljZVBheW1lbnQ6MjI="
  ],
  "status": "SAVED"
}

List accounts

Read a business's chart of accounts, optionally narrowed by type or subtype. This is where the account IDs the other actions need come from - an income account for a product, and a cash-or-bank account to record a payment into.

Inputs

Businessbusiness_idtextRequired
Which set of books to work in. Pick from the list; the value sent is the business's Wave ID. 'List businesses' returns these in 'business_ids'.
Account typestypeslist
Only accounts of these types. Leave empty for all five.One or more of: ASSET, LIABILITY, EQUITY, INCOME, EXPENSE.
Account subtypessubtypeslist
Only accounts of these subtypes. 'Cash and bank' is what 'Record invoice payment' needs; 'Income' is what a sellable product needs. Leave empty for all.One or more of: CASH_AND_BANK (Cash and bank), CREDIT_CARD (Credit card), INCOME, OTHER_INCOME (Other income), DISCOUNTS, EXPENSE, COST_OF_GOODS_SOLD (Cost of goods sold), PAYMENT_PROCESSING_FEES (Payment processing fees), PAYROLL_EXPENSES (Payroll expenses), RECEIVABLE (Accounts receivable), and 7 more.
Archivedarchivedtext
Whether to include archived records. Wave keeps archived records for the history they carry, so 'Only active' is what a workflow normally wants.One of: false (Only active), true (Only archived), any (Both). Default: false.
Pagepagenumber
Which page of results to read, counting from 1. Feed 'next_page' from a previous run back in here to read the next one.From 1 to 100000. Default: 1.
Results per pagepage_sizenumber
How many results one page holds, 1-200. Defaults to 25.From 1 to 200. Default: 25.

Outputs

account_idslist
Just the IDs, for chaining into a later step
accountslist
The accounts on this page
business_idtext
The business these came from
countnumber
How many are on this page
has_moretrue/false
Whether a page follows
next_pagenumber
The 'page' that reads the next page, or empty at the end
pagenumber
Which page this is
total_countnumber
How many records match in total
total_pagesnumber
How many pages there are
Example output
{
  "account_ids": [
    "QWNjb3VudDo5OTk5"
  ],
  "accounts": [
    {
      "balance": "1450.00",
      "currency": {
        "code": "USD",
        "exponent": 2,
        "name": "US dollar",
        "symbol": "$"
      },
      "id": "QWNjb3VudDo5OTk5",
      "isArchived": false,
      "name": "Cash on Hand",
      "normalBalanceType": "DEBIT",
      "subtype": {
        "name": "Cash and Bank",
        "value": "CASH_AND_BANK"
      },
      "type": {
        "name": "Asset",
        "normalBalanceType": "DEBIT",
        "value": "ASSET"
      }
    }
  ],
  "business_id": "QnVzaW5lc3M6MTIzNA==",
  "count": 1,
  "has_more": false,
  "next_page": null,
  "page": 1,
  "total_count": 1,
  "total_pages": 1
}

List businesses

List every business in the connected Wave account. Returns each one's Wave ID, which is the value every other action's 'Business' field takes.

Inputs

Pagepagenumber
Which page of results to read, counting from 1. Feed 'next_page' from a previous run back in here to read the next one.From 1 to 100000. Default: 1.
Results per pagepage_sizenumber
How many results one page holds, 1-200. Defaults to 25.From 1 to 200. Default: 25.
Archivedarchivedtext
Whether to include archived records. Wave keeps archived records for the history they carry, so 'Only active' is what a workflow normally wants.One of: false (Only active), true (Only archived), any (Both). Default: false.

Outputs

business_idtext
The business these came from
business_idslist
Just the IDs, for chaining into a later step
businesseslist
The businesses on this page
countnumber
How many are on this page
has_moretrue/false
Whether a page follows
next_pagenumber
The 'page' that reads the next page, or empty at the end
pagenumber
Which page this is
total_countnumber
How many records match in total
total_pagesnumber
How many pages there are
Example output
{
  "business_ids": [
    "QnVzaW5lc3M6MTIzNA=="
  ],
  "businesses": [
    {
      "currency": {
        "code": "USD",
        "exponent": 2,
        "name": "US dollar",
        "symbol": "$"
      },
      "emailSendEnabled": true,
      "id": "QnVzaW5lc3M6MTIzNA==",
      "isArchived": false,
      "isPersonal": false,
      "name": "Northwind Consulting",
      "organizationalType": "SOLE_PROPRIETORSHIP",
      "timezone": "America/Toronto"
    }
  ],
  "count": 1,
  "has_more": false,
  "next_page": null,
  "page": 1,
  "total_count": 1,
  "total_pages": 1
}

List customers

List a business's customers, optionally narrowed to one email address or to a window of when they were last changed. Returns each one's outstanding and overdue amounts alongside their contact details.

Inputs

Businessbusiness_idtextRequired
Which set of books to work in. Pick from the list; the value sent is the business's Wave ID. 'List businesses' returns these in 'business_ids'.
Emailemailtext
Only customers with this exact email address. Leave empty for all of them.
Sort bysorttext
How to order the results.One of: NAME_ASC (Name, A to Z), NAME_DESC (Name, Z to A), CREATED_AT_DESC (Created, newest first), CREATED_AT_ASC (Created, oldest first), MODIFIED_AT_DESC (Modified, newest first), MODIFIED_AT_ASC (Modified, oldest first). Default: NAME_ASC.
Modified aftermodified_afterdate and time
Only records changed after this moment. Leave empty for all.
Modified beforemodified_beforedate and time
Only records changed before this moment. Leave empty for all.
Pagepagenumber
Which page of results to read, counting from 1. Feed 'next_page' from a previous run back in here to read the next one.From 1 to 100000. Default: 1.
Results per pagepage_sizenumber
How many results one page holds, 1-200. Defaults to 25.From 1 to 200. Default: 25.

Outputs

business_idtext
The business these came from
countnumber
How many are on this page
customer_idslist
Just the IDs, for chaining into a later step
customerslist
The customers on this page
has_moretrue/false
Whether a page follows
next_pagenumber
The 'page' that reads the next page, or empty at the end
pagenumber
Which page this is
total_countnumber
How many records match in total
total_pagesnumber
How many pages there are
Example output
{
  "business_id": "QnVzaW5lc3M6MTIzNA==",
  "count": 1,
  "customer_ids": [
    "Q3VzdG9tZXI6NTY3OA=="
  ],
  "customers": [
    {
      "currency": {
        "code": "USD",
        "exponent": 2,
        "name": "US dollar",
        "symbol": "$"
      },
      "email": "billing@acme.example.com",
      "id": "Q3VzdG9tZXI6NTY3OA==",
      "isArchived": false,
      "name": "Acme Supplies",
      "outstandingAmount": {
        "currency": {
          "code": "USD",
          "exponent": 2,
          "name": "US dollar",
          "symbol": "$"
        },
        "minorUnitValue": "12000",
        "value": "120.00"
      },
      "overdueAmount": {
        "currency": {
          "code": "USD",
          "exponent": 2,
          "name": "US dollar",
          "symbol": "$"
        },
        "minorUnitValue": "0",
        "value": "0.00"
      }
    }
  ],
  "has_more": false,
  "next_page": null,
  "page": 1,
  "total_count": 1,
  "total_pages": 1
}

List invoices

List a business's invoices, narrowed by status, customer, date range or invoice number. Recorded payments are not included - Wave only populates those when a single invoice is asked for, so use 'Get invoice' for those.

Inputs

Businessbusiness_idtextRequired
Which set of books to work in. Pick from the list; the value sent is the business's Wave ID. 'List businesses' returns these in 'business_ids'.
Statusstatustext
Only invoices in this state. Leave empty for every state.One of: DRAFT, SAVED (Saved (approved, not yet sent)), SENT, VIEWED (Viewed by the customer), UNPAID, PARTIAL (Partially paid), PAID, OVERDUE, OVERPAID.
Customer IDcustomer_idtext
Only invoices for this customer. Leave empty for all of them. 'List customers' returns these in 'customer_ids'.
Invoice dated on or afterinvoice_date_startdate
Earliest invoice date to include.
Invoice dated on or beforeinvoice_date_enddate
Latest invoice date to include.
Invoice number containsinvoice_numbertext
Matches on containment, not equality: '12' also finds 112, 120 and 121. Check the results rather than assuming one.
Sort bysorttext
How to order the results.One of: INVOICE_DATE_DESC (Invoice date, newest first), INVOICE_DATE_ASC (Invoice date, oldest first), DUE_AT_ASC (Due date, soonest first), DUE_AT_DESC (Due date, latest first), CREATED_AT_DESC (Created, newest first), CREATED_AT_ASC (Created, oldest first), MODIFIED_AT_DESC (Modified, newest first), INVOICE_NUMBER_ASC (Invoice number, ascending), INVOICE_NUMBER_DESC (Invoice number, descending), AMOUNT_DUE_DESC (Amount due, largest first), and 7 more. Default: INVOICE_DATE_DESC.
Pagepagenumber
Which page of results to read, counting from 1. Feed 'next_page' from a previous run back in here to read the next one.From 1 to 100000. Default: 1.
Results per pagepage_sizenumber
How many results one page holds, 1-200. Defaults to 25.From 1 to 200. Default: 25.

Outputs

business_idtext
The business these came from
countnumber
How many are on this page
has_moretrue/false
Whether a page follows
invoice_idslist
Just the IDs, for chaining into a later step
invoiceslist
The invoices on this page
next_pagenumber
The 'page' that reads the next page, or empty at the end
pagenumber
Which page this is
total_countnumber
How many records match in total
total_pagesnumber
How many pages there are
Example output
{
  "business_id": "QnVzaW5lc3M6MTIzNA==",
  "count": 1,
  "has_more": false,
  "invoice_ids": [
    "SW52b2ljZTo3Nzc3"
  ],
  "invoices": [
    {
      "amountDue": {
        "currency": {
          "code": "USD",
          "exponent": 2,
          "name": "US dollar",
          "symbol": "$"
        },
        "minorUnitValue": "12000",
        "value": "120.00"
      },
      "amountPaid": {
        "currency": {
          "code": "USD",
          "exponent": 2,
          "name": "US dollar",
          "symbol": "$"
        },
        "minorUnitValue": "0",
        "value": "0.00"
      },
      "currency": {
        "code": "USD",
        "exponent": 2,
        "name": "US dollar",
        "symbol": "$"
      },
      "customer": {
        "email": "billing@acme.example.com",
        "id": "Q3VzdG9tZXI6NTY3OA==",
        "name": "Acme Supplies"
      },
      "dueDate": "2026-10-01",
      "exchangeRate": "1",
      "id": "SW52b2ljZTo3Nzc3",
      "invoiceDate": "2026-09-01",
      "invoiceNumber": "17",
      "items": [
        {
          "account": {
            "id": "QWNjb3VudDoxMDAx",
            "name": "Sales"
          },
          "description": "Billable consulting time",
          "id": "SW52b2ljZUl0ZW06MQ==",
          "product": {
            "id": "UHJvZHVjdDo0MzIx",
            "name": "Consulting hour"
          },
          "quantity": "1",
          "subtotal": {
            "currency": {
              "code": "USD",
              "exponent": 2,
              "name": "US dollar",
              "symbol": "$"
            },
            "minorUnitValue": "12000",
            "value": "120.00"
          },
          "taxes": [],
          "total": {
            "currency": {
              "code": "USD",
              "exponent": 2,
              "name": "US dollar",
              "symbol": "$"
            },
            "minorUnitValue": "12000",
            "value": "120.00"
          },
          "unitPrice": "120.00"
        }
      ],
      "status": "SAVED",
      "subtotal": {
        "currency": {
          "code": "USD",
          "exponent": 2,
          "name": "US dollar",
          "symbol": "$"
        },
        "minorUnitValue": "12000",
        "value": "120.00"
      },
      "taxTotal": {
        "currency": {
          "code": "USD",
          "exponent": 2,
          "name": "US dollar",
          "symbol": "$"
        },
        "minorUnitValue": "0",
        "value": "0.00"
      },
      "title": "Invoice",
      "total": {
        "currency": {
          "code": "USD",
          "exponent": 2,
          "name": "US dollar",
          "symbol": "$"
        },
        "minorUnitValue": "12000",
        "value": "120.00"
      },
      "viewUrl": "https://invoice.waveapps.com/example"
    }
  ],
  "next_page": null,
  "page": 1,
  "total_count": 1,
  "total_pages": 1
}

List products

List a business's products and services, optionally narrowed to the ones it sells or the ones it buys. Returns each one's unit price and the accounts it posts to.

Inputs

Businessbusiness_idtextRequired
Which set of books to work in. Pick from the list; the value sent is the business's Wave ID. 'List businesses' returns these in 'business_ids'.
Sold by the businessis_soldtext
Only products the business sells (the ones that can go on an invoice), only the ones it does not, or either.One of: any (Either), true (Yes), false (No). Default: any.
Bought by the businessis_boughttext
Only products the business buys (the ones that can go on a bill), only the ones it does not, or either.One of: any (Either), true (Yes), false (No). Default: any.
Sort bysorttext
How to order the results.One of: NAME_ASC (Name, A to Z), NAME_DESC (Name, Z to A), CREATED_AT_DESC (Created, newest first), CREATED_AT_ASC (Created, oldest first), MODIFIED_AT_DESC (Modified, newest first), MODIFIED_AT_ASC (Modified, oldest first). Default: NAME_ASC.
Archivedarchivedtext
Whether to include archived records. Wave keeps archived records for the history they carry, so 'Only active' is what a workflow normally wants.One of: false (Only active), true (Only archived), any (Both). Default: false.
Pagepagenumber
Which page of results to read, counting from 1. Feed 'next_page' from a previous run back in here to read the next one.From 1 to 100000. Default: 1.
Results per pagepage_sizenumber
How many results one page holds, 1-200. Defaults to 25.From 1 to 200. Default: 25.

Outputs

business_idtext
The business these came from
countnumber
How many are on this page
has_moretrue/false
Whether a page follows
next_pagenumber
The 'page' that reads the next page, or empty at the end
pagenumber
Which page this is
product_idslist
Just the IDs, for chaining into a later step
productslist
The products on this page
total_countnumber
How many records match in total
total_pagesnumber
How many pages there are
Example output
{
  "business_id": "QnVzaW5lc3M6MTIzNA==",
  "count": 1,
  "has_more": false,
  "next_page": null,
  "page": 1,
  "product_ids": [
    "UHJvZHVjdDo0MzIx"
  ],
  "products": [
    {
      "defaultSalesTaxes": [],
      "description": "Billable consulting time",
      "id": "UHJvZHVjdDo0MzIx",
      "incomeAccount": {
        "id": "QWNjb3VudDoxMDAx",
        "name": "Sales",
        "subtype": {
          "value": "INCOME"
        }
      },
      "isArchived": false,
      "isBought": false,
      "isSold": true,
      "name": "Consulting hour",
      "unitPrice": "120.00"
    }
  ],
  "total_count": 1,
  "total_pages": 1
}

List sales taxes

List a business's sales taxes with the rate in force today and the dated history behind it. Rates come back as decimals - 0.13 means 13%.

Inputs

Businessbusiness_idtextRequired
Which set of books to work in. Pick from the list; the value sent is the business's Wave ID. 'List businesses' returns these in 'business_ids'.
Archivedarchivedtext
Whether to include archived records. Wave keeps archived records for the history they carry, so 'Only active' is what a workflow normally wants.One of: false (Only active), true (Only archived), any (Both). Default: false.
Modified aftermodified_afterdate and time
Only records changed after this moment. Leave empty for all.
Modified beforemodified_beforedate and time
Only records changed before this moment. Leave empty for all.
Pagepagenumber
Which page of results to read, counting from 1. Feed 'next_page' from a previous run back in here to read the next one.From 1 to 100000. Default: 1.
Results per pagepage_sizenumber
How many results one page holds, 1-200. Defaults to 25.From 1 to 200. Default: 25.

Outputs

business_idtext
The business these came from
countnumber
How many are on this page
has_moretrue/false
Whether a page follows
next_pagenumber
The 'page' that reads the next page, or empty at the end
pagenumber
Which page this is
sales_tax_idslist
Just the IDs, for chaining into a later step
sales_taxeslist
The sales taxes on this page
total_countnumber
How many records match in total
total_pagesnumber
How many pages there are
Example output
{
  "business_id": "QnVzaW5lc3M6MTIzNA==",
  "count": 1,
  "has_more": false,
  "next_page": null,
  "page": 1,
  "sales_tax_ids": [
    "U2FsZXNUYXg6MTE="
  ],
  "sales_taxes": [
    {
      "abbreviation": "HST",
      "id": "U2FsZXNUYXg6MTE=",
      "isArchived": false,
      "isCompound": false,
      "isRecoverable": true,
      "name": "HST",
      "rate": "0.13"
    }
  ],
  "total_count": 1,
  "total_pages": 1
}

Record invoice payment

Record a payment against an approved invoice. The payment lands in the account you choose, which is normally a cash-or-bank one - 'List accounts' filtered to 'Cash and bank' finds it.

Inputs

Invoice IDinvoice_idtextRequired
The invoice's Wave ID. 'List invoices' returns these in 'invoice_ids', and 'Create invoice' reports the one it made as 'invoice_id'.
Deposit intopayment_account_idtextRequired
Which account the money lands in - normally a cash-or-bank account. Each option's subtype is shown in square brackets and the business it belongs to after the dash.
AmountamountnumberRequired
How much was paid, in the ordinary currency amount - 120.50, not 12050. Less than the total records a partial payment.
Payment datepayment_datedateRequired
The date the payment was actually made.
Payment methodpayment_methodtext
How the customer paid.One of: CASH, CHEQUE, BANK_TRANSFER (Bank transfer), CREDIT_CARD (Credit card), PAYPAL, OTHER, UNSPECIFIED. Default: OTHER.
Memomemotext
A note kept with the payment.
Exchange rateexchange_ratenumber
Only matters when the invoice and the deposit account are in different currencies. Leave empty for 1.Default: 1.

Outputs

invoice_idtext
The invoice it was recorded against
paymentobject
payment_idtext
The new payment's Wave ID
recordedtrue/false
Always true
Example output
{
  "invoice_id": "SW52b2ljZTo3Nzc3",
  "payment": {
    "account": {
      "currency": {
        "code": "USD",
        "exponent": 2,
        "name": "US dollar",
        "symbol": "$"
      },
      "id": "QWNjb3VudDo5OTk5",
      "name": "Cash on Hand"
    },
    "amount": "120.00",
    "customer": {
      "id": "Q3VzdG9tZXI6NTY3OA==",
      "name": "Acme Supplies"
    },
    "exchangeRate": "1",
    "id": "SW52b2ljZVBheW1lbnQ6MjI=",
    "paymentDate": "2026-09-05",
    "paymentMethod": "CASH"
  },
  "payment_id": "SW52b2ljZVBheW1lbnQ6MjI=",
  "recorded": true
}

Update customer

Change an existing customer. Only the fields you fill in are sent - anything left empty keeps the value it already has, rather than being cleared.

Inputs

Customer IDcustomer_idtextRequired
The customer's Wave ID. 'List customers' returns these in 'customer_ids', and every create/update step reports the one it touched as 'customer_id'.
Namenametext
The customer's name, or their business name. This is what appears on an invoice. Leave empty to keep the current name.
Contact first namefirst_nametext
First name of the person to contact at the customer.
Contact last namelast_nametext
Last name of the person to contact at the customer.
Emailemailtext
Where invoices are sent. Wave does not require it, and does not enforce that it is unique.
Phonephonetext
The customer's telephone number.
Mobilemobiletext
The contact's mobile number.
Websitewebsitetext
The customer's website address.
Currencycurrencytext
The currency to use. Leave empty to use the business's own currency, which is what almost every workflow wants.
Account numberdisplay_idtext
Your own reference for this customer. Wave shows it as the customer's account number.
Internal notesinternal_notestext
Notes kept on the customer record. Never shown to the customer.
Address line 1address_line1text
Street address, PO box, or company name.
Address line 2address_line2text
Apartment, suite, unit, or building.
Citycitytext
City, district, suburb, town, or village.
Countrycountry_codetext
The customer's country. Pick one first to load its states/provinces below, if it has any.
State / provinceprovince_codetext
The customer's state, province, or region. Wave only recognises the values it lists for the country picked above - most countries have none, in which case this stays empty. Pick a country first.
Postal codepostal_codetext
ZIP or postal code.

Outputs

customerobject
customer_idtext
The customer's Wave ID
updatedtrue/false
Always true
Example output
{
  "customer": {
    "currency": {
      "code": "USD",
      "exponent": 2,
      "name": "US dollar",
      "symbol": "$"
    },
    "email": "billing@acme.example.com",
    "id": "Q3VzdG9tZXI6NTY3OA==",
    "isArchived": false,
    "name": "Acme Supplies",
    "outstandingAmount": {
      "currency": {
        "code": "USD",
        "exponent": 2,
        "name": "US dollar",
        "symbol": "$"
      },
      "minorUnitValue": "12000",
      "value": "120.00"
    },
    "overdueAmount": {
      "currency": {
        "code": "USD",
        "exponent": 2,
        "name": "US dollar",
        "symbol": "$"
      },
      "minorUnitValue": "0",
      "value": "0.00"
    }
  },
  "customer_id": "Q3VzdG9tZXI6NTY3OA==",
  "updated": true
}

Update product

Change an existing product or service. Only the fields you fill in are sent - anything left empty keeps the value it has.

Inputs

Product IDproduct_idtextRequired
The product or service's Wave ID. 'List products' returns these in 'product_ids'.
Namenametext
What the product is called. Leave empty to keep the current name.
Unit priceunit_pricenumber
Price for one unit, in the ordinary currency amount. Leave empty to keep the current price.
Descriptiondescriptiontext
What appears under the name on an invoice line. Leave empty to keep the current description.
Income accountincome_account_idtext
Which income account the sales of this product post to. Attaching one is what makes a product sellable - Wave will not put a product with no income account on an invoice. Wave accepts only accounts whose subtype is INCOME, DISCOUNTS, OTHER_INCOME; each option's subtype is shown in square brackets.
Expense accountexpense_account_idtext
Which expense account purchases of this product post to, which is what lets it go on a bill. Wave accepts only accounts whose subtype is EXPENSE, COST_OF_GOODS_SOLD, PAYMENT_PROCESSING_FEES, PAYROLL_EXPENSES; each option's subtype is shown in square brackets.
Default sales taxessales_tax_idslist
Sales taxes applied to this product by default whenever it goes on an invoice. Leave empty for none.

Outputs

productobject
product_idtext
The product's Wave ID
updatedtrue/false
Always true
Example output
{
  "product": {
    "defaultSalesTaxes": [],
    "description": "Billable consulting time",
    "id": "UHJvZHVjdDo0MzIx",
    "incomeAccount": {
      "id": "QWNjb3VudDoxMDAx",
      "name": "Sales",
      "subtype": {
        "value": "INCOME"
      }
    },
    "isArchived": false,
    "isBought": false,
    "isSold": true,
    "name": "Consulting hour",
    "unitPrice": "120.00"
  },
  "product_id": "UHJvZHVjdDo0MzIx",
  "updated": true
}

On this page