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
| Action | What it does |
|---|---|
| Approve invoice | Approve a draft invoice, which makes it final and records it in the books. |
| Archive product | Archive a product or service so it stops being offered on new invoices. |
| Create customer | Add a customer to a business. |
| Create invoice | Create an invoice for a customer. |
| Create product | Add a product or service to a business. |
| Delete customer | Delete a customer. |
| Delete invoice | Delete an invoice. |
| Delete invoice payment | Remove a recorded payment from an invoice, putting the amount back on what is owed. |
| Get business | Read one business - its currency, address, timezone, and whether Wave's email sending is enabled for it. |
| Get customer | Read one customer, including how much they currently owe and how much of that is overdue. |
| Get invoice | Read one invoice with its line items, taxes, totals and every payment recorded against it. |
| List accounts | Read a business's chart of accounts, optionally narrowed by type or subtype. |
| List businesses | List every business in the connected Wave account. |
| List customers | List a business's customers, optionally narrowed to one email address or to a window of when they were last changed. |
| List invoices | List a business's invoices, narrowed by status, customer, date range or invoice number. |
| List products | List a business's products and services, optionally narrowed to the ones it sells or the ones it buys. |
| List sales taxes | List a business's sales taxes with the rate in force today and the dated history behind it. |
| Record invoice payment | Record a payment against an approved invoice. |
| Update customer | Change an existing customer. |
| Update product | Change 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 ID
invoice_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
invoiceobjectinvoice_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 ID
product_idtextRequired - The product or service's Wave ID. 'List products' returns these in 'product_ids'.
Outputs
archivedtrue/false- Always true
productobjectproduct_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
- Business
business_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'.
- Name
nametextRequired - The customer's name, or their business name. This is what appears on an invoice.
- Contact first name
first_nametext - First name of the person to contact at the customer.
- Contact last name
last_nametext - Last name of the person to contact at the customer.
- Email
emailtext - Where invoices are sent. Wave does not require it, and does not enforce that it is unique.
- Phone
phonetext - The customer's telephone number.
- Mobile
mobiletext - The contact's mobile number.
- Website
websitetext - The customer's website address.
- Currency
currencytext - The currency to use. Leave empty to use the business's own currency, which is what almost every workflow wants.
- Account number
display_idtext - Your own reference for this customer. Wave shows it as the customer's account number.
- Internal notes
internal_notestext - Notes kept on the customer record. Never shown to the customer.
- Address line 1
address_line1text - Street address, PO box, or company name.
- Address line 2
address_line2text - Apartment, suite, unit, or building.
- City
citytext - City, district, suburb, town, or village.
- Country
country_codetext - The customer's country. Pick one first to load its states/provinces below, if it has any.
- State / province
province_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 code
postal_codetext - ZIP or postal code.
Outputs
createdtrue/false- Always true
customerobjectcustomer_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
- Business
business_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 ID
customer_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 items
itemslistRequired - 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 as
statustext - 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 date
invoice_datedate - When the invoice is issued. Defaults to today.
- Due date
due_datedate - When payment is due. Leave empty to apply the business's own payment terms to the invoice date.
- Invoice number
invoice_numbertext - Leave empty to let Wave take the next number after the highest one it has.
- PO number
po_numbertext - The customer's purchase or sales order number.
- Title
titletext - The heading at the top of the document. Leave empty for the business's default.
- Subheading
subheadtext - The line under the title. Leave empty for none.
- Memo
memotext - Notes shown to the customer on the invoice.
- Footer
footertext - Text along the bottom of the invoice.
- Currency
currencytext - 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
invoiceobjectinvoice_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
- Business
business_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'.
- Name
nametextRequired - What the product or service is called.
- Unit price
unit_pricenumberRequired - Price for one unit, in the ordinary currency amount - 12.50, not 1250.
- Description
descriptiontext - What appears under the name on an invoice line. Leave empty for none.
- Income account
income_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 account
expense_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 taxes
sales_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
productobjectproduct_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 ID
customer_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 ID
invoice_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 ID
payment_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
- Business
business_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
businessobjectbusiness_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
- Business
business_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 ID
customer_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
customerobjectcustomer_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
- Business
business_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 ID
invoice_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
invoiceobjectinvoice_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
- Business
business_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 types
typeslist - Only accounts of these types. Leave empty for all five.One or more of:
ASSET,LIABILITY,EQUITY,INCOME,EXPENSE. - Account subtypes
subtypeslist - 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. - Archived
archivedtext - 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. - Page
pagenumber - 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 page
page_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
- Page
pagenumber - 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 page
page_sizenumber - How many results one page holds, 1-200. Defaults to 25.From 1 to 200. Default:
25. - Archived
archivedtext - 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
- Business
business_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'.
- Email
emailtext - Only customers with this exact email address. Leave empty for all of them.
- Sort by
sorttext - 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 after
modified_afterdate and time - Only records changed after this moment. Leave empty for all.
- Modified before
modified_beforedate and time - Only records changed before this moment. Leave empty for all.
- Page
pagenumber - 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 page
page_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
- Business
business_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'.
- Status
statustext - 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 ID
customer_idtext - Only invoices for this customer. Leave empty for all of them. 'List customers' returns these in 'customer_ids'.
- Invoice dated on or after
invoice_date_startdate - Earliest invoice date to include.
- Invoice dated on or before
invoice_date_enddate - Latest invoice date to include.
- Invoice number contains
invoice_numbertext - Matches on containment, not equality: '12' also finds 112, 120 and 121. Check the results rather than assuming one.
- Sort by
sorttext - 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. - Page
pagenumber - 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 page
page_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
- Business
business_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 business
is_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 business
is_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 by
sorttext - 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. - Archived
archivedtext - 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. - Page
pagenumber - 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 page
page_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
- Business
business_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'.
- Archived
archivedtext - 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 after
modified_afterdate and time - Only records changed after this moment. Leave empty for all.
- Modified before
modified_beforedate and time - Only records changed before this moment. Leave empty for all.
- Page
pagenumber - 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 page
page_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 ID
invoice_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 into
payment_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.
- Amount
amountnumberRequired - How much was paid, in the ordinary currency amount - 120.50, not 12050. Less than the total records a partial payment.
- Payment date
payment_datedateRequired - The date the payment was actually made.
- Payment method
payment_methodtext - How the customer paid.One of:
CASH,CHEQUE,BANK_TRANSFER(Bank transfer),CREDIT_CARD(Credit card),PAYPAL,OTHER,UNSPECIFIED. Default:OTHER. - Memo
memotext - A note kept with the payment.
- Exchange rate
exchange_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
paymentobjectpayment_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 ID
customer_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'.
- Name
nametext - The customer's name, or their business name. This is what appears on an invoice. Leave empty to keep the current name.
- Contact first name
first_nametext - First name of the person to contact at the customer.
- Contact last name
last_nametext - Last name of the person to contact at the customer.
- Email
emailtext - Where invoices are sent. Wave does not require it, and does not enforce that it is unique.
- Phone
phonetext - The customer's telephone number.
- Mobile
mobiletext - The contact's mobile number.
- Website
websitetext - The customer's website address.
- Currency
currencytext - The currency to use. Leave empty to use the business's own currency, which is what almost every workflow wants.
- Account number
display_idtext - Your own reference for this customer. Wave shows it as the customer's account number.
- Internal notes
internal_notestext - Notes kept on the customer record. Never shown to the customer.
- Address line 1
address_line1text - Street address, PO box, or company name.
- Address line 2
address_line2text - Apartment, suite, unit, or building.
- City
citytext - City, district, suburb, town, or village.
- Country
country_codetext - The customer's country. Pick one first to load its states/provinces below, if it has any.
- State / province
province_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 code
postal_codetext - ZIP or postal code.
Outputs
customerobjectcustomer_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 ID
product_idtextRequired - The product or service's Wave ID. 'List products' returns these in 'product_ids'.
- Name
nametext - What the product is called. Leave empty to keep the current name.
- Unit price
unit_pricenumber - Price for one unit, in the ordinary currency amount. Leave empty to keep the current price.
- Description
descriptiontext - What appears under the name on an invoice line. Leave empty to keep the current description.
- Income account
income_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 account
expense_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 taxes
sales_tax_idslist - Sales taxes applied to this product by default whenever it goes on an invoice. Leave empty for none.
Outputs
productobjectproduct_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
}