Accounting
Wave
API integration
Ship Accounting features without building the integration. Full Wave API access via Proxy, normalized data through Unified APIs, and 50+ MCP-ready tools for AI agents — all extensible to your exact use case.
Talk to usUse Cases
Why integrate with Wave
Common scenarios for SaaS companies building Wave integrations for their customers.
Automate expense tracking for micro-business spend tools
Corporate card providers and spend management platforms can push categorized transactions directly into their users' Wave accounts, eliminating manual reconciliation for freelancers and solopreneurs who rely on Wave's free accounting.
Sync client records between vertical SaaS and Wave
Field service apps, booking platforms, and vertical CRMs can keep customer and vendor contact data in sync with Wave, ensuring billing details are always current without forcing end users to maintain records in two places.
Push invoices from job-completion workflows into Wave
Vertical SaaS platforms for service businesses can generate Wave invoices the moment a job, booking, or deal is marked complete, so their users see updated receivables in Wave without any manual data entry.
Map SaaS transactions to the correct Wave ledger accounts
Any SaaS product that generates financial events — revenue, fees, expenses — can fetch a user's Wave chart of accounts and let them configure exactly where each transaction type lands, ensuring clean books from day one.
Consolidate daily sales summaries into Wave
POS systems and booking platforms can roll up daily revenue, taxes, and fees into a single journal entry in Wave, keeping micro-business ledgers balanced without flooding them with thousands of individual line items.
What You Can Build
Ship these features with Truto + Wave
Concrete product features your team can ship faster by leveraging Truto’s Wave integration instead of building from scratch.
Account category mapper
Fetch a user's Wave chart of accounts and present a mapping UI so end users can route each SaaS-generated transaction to the correct income or expense account.
Bi-directional contact sync
Automatically create, update, and deduplicate customer and vendor records between your platform and Wave so invoices and expenses always reference the right contact.
Automated expense push on card swipe
Write categorized expenses into Wave in real time as corporate card transactions occur, linking each to the appropriate vendor contact and ledger account.
Job-complete to invoice pipeline
Trigger invoice creation in Wave when a job, booking, or deal closes in your product, pulling the correct contact and account data automatically.
One-click Wave account connection
Let end users authenticate their Wave account through Truto's managed auth flow and start syncing data without your team building or maintaining OAuth handling.
SuperAI
Wave AI agent tools
Comprehensive AI agent toolset with fine-grained control. Integrates with MCP clients like Cursor and Claude, or frameworks like LangChain.
wave_users_me
Get the currently authenticated Wave user. Returns: id, defaultEmail, firstName, lastName, createdAt, modifiedAt.
create_a_wave_account
Create a Wave account via the accountCreate mutation. Required input: businessId, name, subtype. Returns the created account with id, name, currency, type, and subtype. inputErrors[] surfaces field-level validation failures.
delete_a_wave_account_by_id
Delete (archive) a Wave account via the accountArchive mutation. Required: input.id (account ID). Returns didSucceed and any inputErrors for validation failures.
update_a_wave_account_by_id
Update (patch) a Wave account via the accountPatch mutation. Required input fields: id, sequence. Optional: name, description, displayId. Returns the patched account and any inputErrors for validation failures.
create_a_wave_customer
Create a Wave customer via the customerCreate mutation. Required: input (object with businessId, name). Returns the created customer. inputErrors[] surfaces field-level validation failures.
delete_a_wave_customer_by_id
Delete a Wave customer via the customerDelete mutation. Required: input.id (customer ID). Returns didSucceed and inputErrors[] for validation failures.
update_a_wave_customer_by_id
Update (patch) a Wave customer via the customerPatch mutation. Input requires customer id and any fields to update. Returns the patched customer and inputErrors[] for field-level validation failures.
list_all_wave_account_subtypes
List account subtypes in Wave's Chart of Accounts. Returns: name, value, type (with normalBalanceType), archivable, systemCreated, description.
list_all_wave_account_types
List Wave account types (e.g. Asset, Equity, Expense, Income, Liability). Returns: name, normalBalanceType, value. No pagination; returns all types in a single response.
list_all_wave_businesses
List businesses on Wave. Returns: id, name, isPersonal, currency, timezone, phone, website, isArchived. Offset-paginated via page/pageSize.
get_single_wave_business_by_id
Get a Wave business by ID. If no ID is provided and the token is scoped to one business, returns that business; otherwise returns the user's default business. Returns: id, name, currency, address, phone, timezone.
list_all_wave_countries
List all countries in Wave. Returns: code (ISO 3166-1 alpha-2), name, nameWithArticle, and default currency details. No pagination — returns the full list.
get_single_wave_country_by_id
Get a country by its ISO 3166-1 alpha-2 code from Wave. Returns: code, name, nameWithArticle, default currency, and provinces.
list_all_wave_currencies
List all ISO 4217 currencies available in Wave. Returns: code, symbol, name, plural, exponent. No pagination; returns the full set.
get_single_wave_currency_by_id
Get a Wave currency by ISO 4217 code. Required: code (CurrencyCode). Returns: code, symbol, name, plural, exponent.
create_a_wave_estimate
Create a Wave estimate via the estimateCreate mutation. Required input: businessId, customerId. Returns the created estimate with id, status, estimateNumber, and validation errors on failure.
delete_a_wave_estimate_by_id
Delete a Wave estimate via the estimateDelete mutation. Required: input.estimateId. Returns didSucceed and inputErrors for validation failures.
update_a_wave_estimate_by_id
Update a Wave estimate via the estimatePatch mutation. Required: input (object with id, customerId, status, title, estimateDate, currency, exchangeRate, dueDate). Returns the updated estimate and inputErrors for validation failures.
wave_estimates_convert_to_invoice
Convert a Wave estimate into an invoice via convertEstimateToInvoice. Required: input.estimateId. Returns: invoiceId, didSucceed. inputErrors[] surfaces field-level validation failures.
wave_estimates_approve
Approve a Wave estimate via the estimateApprove mutation. Required input: estimateId. Returns the approved estimate and any validation errors.
wave_estimates_clone
Clone a Wave estimate via the estimateClone mutation. Required input: estimateId. Returns the cloned estimate with key fields. inputErrors[] surfaces field-level validation failures.
wave_estimates_send_deposit_payment_receipt
Send a receipt for an estimate deposit payment in Wave via estimateDepositPaymentReceiptSend. Required: input (estimateId, estimatePaymentId, to). Returns didSucceed and inputErrors for validation failures.
wave_estimates_generate_pdf
Generate a PDF for a Wave estimate via estimateGeneratePdf mutation. Required: input.estimateId. Returns: pdfUrl, didSucceed, and inputErrors for validation failures.
wave_estimates_mark_accepted
Mark a Wave estimate as accepted via the estimateMarkAccepted mutation. Required input: estimateId. Returns the updated estimate and any validation errors.
wave_estimates_mark_sent
Mark a Wave estimate as sent via the estimateMarkSent mutation. Required input: estimateId, sendMethod. Returns the updated estimate and inputErrors[] for validation failures.
wave_estimates_reset_acceptance
Reset the acceptance status of a Wave estimate via estimateResetAcceptance. Required input: estimateId. Returns the reset estimate and any validation errors.
wave_estimates_send
Send a Wave estimate via the estimateSend mutation. Required input: estimateId, to (email addresses). Returns the sent estimate and any inputErrors for validation failures.
wave_estimates_send_acceptance_customer_email
Send acceptance notification email to customer for a Wave estimate via estimateSendAcceptanceCustomerEmail mutation. Required: input with estimateId. Returns didSucceed, estimate details, and inputErrors for validation failures.
delete_a_wave_estimate_payment_by_id
Delete a Wave estimate manual payment via estimatePaymentDelete. Required: input.id (estimate payment ID). Returns didSucceed and inputErrors for validation failures.
delete_a_wave_invoice_payment_by_id
Delete a manual invoice payment in Wave via invoicePaymentDelete. Required: input.id (invoice payment ID). Returns didSucceed and inputErrors for validation failures.
update_a_wave_invoice_payment_by_id
Update a Wave invoice payment via invoicePaymentPatch. Required: input (object with id and optional fields like amount, paymentDate, paymentMethod, memo, exchangeRate, paymentAccountId). Returns the updated invoice payment and any inputErrors.
create_a_wave_invoice_payment
Record a manual payment against a Wave invoice via invoicePaymentCreateManual. Required: input (invoiceId, paymentAccountId, amount, paymentDate, paymentMethod, exchangeRate). Returns the created invoicePayment and any inputErrors.
create_a_wave_invoice
Create a Wave invoice via the invoiceCreate mutation. Required input: businessId, customerId. Returns the created invoice with key fields. inputErrors[] surfaces field-level validation failures.
update_a_wave_invoice_by_id
Update (patch) a Wave invoice via the invoicePatch mutation. Required: input.id. Only provided fields are updated. Returns the patched invoice and inputErrors[] for field-level validation failures.
delete_a_wave_invoice_by_id
Delete a Wave invoice via the invoiceDelete mutation. Required: input.invoiceId. Returns didSucceed and inputErrors[] for validation failures.
wave_invoices_approve
Approve a Wave invoice via the invoiceApprove mutation. Required: input.invoiceId. Returns the approved invoice and any validation errors.
wave_invoices_clone
Clone a Wave invoice via the invoiceClone mutation. Required: input.invoiceId. Returns the cloned invoice with key fields. inputErrors[] surfaces validation failures.
wave_invoices_mark_sent
Mark a Wave invoice as sent via the invoiceMarkSent mutation. Required input: invoiceId, sendMethod. Optional: sentAt. Returns the updated invoice and any inputErrors for validation failures.
wave_invoices_send_payment_receipt
Send an invoice payment receipt email in Wave via invoicePaymentReceiptSend. Required input: invoiceId, invoicePaymentId, to (email addresses). Returns didSucceed and inputErrors for validation.
wave_invoices_send
Send a Wave invoice via the invoiceSend mutation. Requires Business.emailSendEnabled to be true. Input: invoiceId, to (email addresses), subject, message, attachPDF, fromAddress, ccMyself. Returns the sent invoice and any input errors.
create_a_wave_money_deposit_transaction
Create a money deposit transaction in Wave via moneyDepositTransactionCreate. Required input: businessId, date, description, deposit, lineItems, origin. Returns didSucceed and inputErrors for validation.
create_a_wave_money_transaction
Create a Wave money transaction via moneyTransactionCreate mutation (BETA). Requires isClassicAccounting to be false. Input includes businessId, externalId, date, description, anchor, and lineItems. inputErrors[] surfaces field-level validation failures.
wave_money_transactions_bulk_create
Bulk create money transactions in Wave via moneyTransactionsCreate mutation. BETA: requires isClassicAccounting to be false. Input: businessId, transactions array. Returns created transaction ids and inputErrors for validation failures.
get_single_wave_o_auth_application_by_id
Get the current OAuth application in Wave. Returns: id, name, description, clientId, extraData, createdAt, modifiedAt.
create_a_wave_product
Create a product in Wave via the productCreate mutation. Required input: businessId, name, unitPrice. Returns the created product and any inputErrors for validation failures.
update_a_wave_product_by_id
Update a Wave product via the productPatch mutation. Input requires product id; optional fields: name, description, unitPrice, defaultSalesTaxIds, incomeAccountId, expenseAccountId. Returns updated product and inputErrors for validation failures.
delete_a_wave_product_by_id
Delete (archive) a Wave product via the productArchive mutation. Requires input with the product ID. Returns the archived product and any validation errors.
get_single_wave_province_by_id
Get a Wave province (state/county/region) by its ISO 3166-2 code. Returns: code, name.
create_a_wave_sales_tax
Create a sales tax in Wave via the salesTaxCreate mutation. Required input: businessId, name, abbreviation, rate. Returns the created sales tax. inputErrors[] surfaces field-level validation failures.
update_a_wave_sales_tax_by_id
Update a Wave sales tax via the salesTaxPatch mutation. Required: input (object with id and optional name, abbreviation, description, taxNumber, rates). Returns the updated sales tax and any inputErrors for validation failures.
delete_a_wave_sales_tax_by_id
Delete (archive) a Wave sales tax via the salesTaxArchive mutation. Required: input with sales tax ID. Returns the archived sales tax and validation errors if any.
Why Truto
Why use Truto’s MCP server for Wave
Other MCP servers give you a static tool list for one app. Truto gives you a managed, multi-tenant MCP infrastructure across 650+ integrations.
Auto-generated, always up to date
Tools are dynamically generated from curated documentation — not hand-coded. As integrations evolve, tools stay current without manual maintenance.
Fine-grained access control
Scope each MCP server to read-only, write-only, specific methods, or tagged tool groups. Expose only what your AI agent needs — nothing more.
Multi-tenant by design
Each MCP server is scoped to a single connected account with its own credentials. The URL itself is the auth token — no shared secrets, no credential leaking across tenants.
Works with every MCP client
Standard JSON-RPC 2.0 protocol. Paste the URL into Claude, ChatGPT, Cursor, or any MCP-compatible agent framework — tools are discovered automatically.
Built-in auth, rate limits, and error handling
Tool calls execute through Truto’s proxy layer with automatic OAuth refresh, rate-limit handling, and normalized error responses. No raw API plumbing in your agent.
Expiring and auditable servers
Create time-limited MCP servers for contractors or automated workflows. Optional dual-auth requires both the URL and a Truto API token for high-security environments.
Unified APIs
Unified APIs for Wave
Skip writing code for every integration. Use Truto’s category-specific Unified APIs out of the box or customize the mappings with AI.
How It Works
From zero to integrated
Go live with Wave in under an hour. No boilerplate, no maintenance burden.
Link your customer’s Wave account
Use Truto’s frontend SDK to connect your customer’s Wave account. We handle all OAuth and API key flows — you don’t need to create the OAuth app.
We handle authentication
Don’t spend time refreshing access tokens or figuring out secure storage. We handle it and inject credentials into every API request.
Call our API, we call Wave
Truto’s Proxy API is a 1-to-1 mapping of the Wave API. You call us, we call Wave, and pass the response back in the same cycle.
Unified response format
Every response follows a single format across all integrations. We translate Wave’s pagination into unified cursor-based pagination. Data is always in the result attribute.
FAQs
Common questions about Wave on Truto
Authentication, rate limits, data freshness, and everything else you need to know before you integrate.
What type of API does Wave use, and how does Truto help?
Wave exposes a GraphQL API, which differs from the REST conventions most developers expect. Truto abstracts this behind its Unified Accounting API, so you interact with standard resources like Accounts, Contacts, and Expenses without writing GraphQL queries.
Which Unified API resources are available for Wave?
Wave is covered by Truto's Unified Accounting API, which includes Accounts (chart of accounts), Contacts (customers and vendors), and Expenses. Additional resources or custom tools can be built on request.
How does authentication work for Wave integrations through Truto?
Truto manages the OAuth flow for Wave on your behalf. Your end users connect their Wave account through Truto's embedded auth experience, and Truto handles token storage, refresh, and lifecycle management.
Can I both read and write data to Wave through Truto?
Yes. The Unified Accounting API supports read and write operations for the covered resources. You can fetch a user's chart of accounts, create or update contacts, and push expenses into Wave programmatically.
What if I need Wave capabilities beyond Accounts, Contacts, and Expenses?
Truto builds integration tools on request. If you need access to invoices, products, journal entries, or other Wave resources not yet covered by the Unified API, you can request a custom tool and Truto will build it for your use case.
Who is the typical end user connecting a Wave account?
Wave skews heavily toward micro-SMBs — freelancers, solopreneurs, and service-based businesses with fewer than 10 employees. If your product serves this segment, a Wave integration covers users who rely on free, simple accounting software.
Wave
Get Wave integrated into your app
Our team understands what it takes to make a Wave integration successful. A short, crisp 30 minute call with folks who understand the problem.
Talk to us