Integrations
Accounting, ERP, ecommerce, payroll, payments: one way in for records and documents, with the client's consent.
An integration is a connection between your application and one client tax profile, in one environment, with the permissions the profile owner granted: records.import, records.read, documents.write. The owner grants it and can revoke it from the profile's settings; you can end it too. Every category the site names is a connection category (ACCOUNTING, ERP, ECOMMERCE, PAYROLL, PAYMENTS, CUSTOM) so the substrate is the same whether the records come from a ledger, an order feed, a payroll run or a payout report.
Two ways to connect
- Invite: POST /v1/connections with the client's email; TaxPio emails them a link, they pick a profile and the permissions, and the connection turns ACTIVE. You receive connection.activated.
- Connect code: every application has a connect code (tpapp_…) in the developer console. The client enters it from their profile's Connected apps page. Same result, no email.
curl https://api.taxpio.com/v1/connections \
-H "Authorization: Bearer tp_test_…" \
-H "Content-Type: application/json" \
-d '{"client_email":"owner@example.com","client_name":"Acme Widgets","category":"ACCOUNTING","system_name":"QuickBooks Online","permissions":["records.import","records.read","documents.write"]}'Push records
POST /v1/connections/{connectionId}/records with up to 500 records. Each carries your stable external_id, a date, a description and a signed amount in the profile's currency (negative for money out). A repeat of the same external_id is counted as a duplicate and never written twice, so replaying a day is safe. Records land as unreviewed transactions with receipt-match suggestions, exactly as a bank sync does; the owner confirms them inside TaxPio. A counterparty you send is folded into the description when it is not already named there, and the category travels in the import's audit trail; TaxPio's own classification is set at review. You receive records.imported.
curl https://api.taxpio.com/v1/connections/con_…/records \
-H "Authorization: Bearer tp_test_…" \
-H "Idempotency-Key: 2026-09-07-batch-1" \
-H "Content-Type: application/json" \
-d '{"records":[{"external_id":"inv-1042","occurred_at":"2026-09-01","description":"Invoice 1042 · Northwind","amount":"1250.00","counterparty":"Northwind Traders","category":"Sales"},{"external_id":"bill-88","occurred_at":"2026-09-02","description":"Hosting September","amount":"-89.00","counterparty":"Cloud Host Inc"}]}'| Category | What to send as a record |
|---|---|
ACCOUNTING | Each journal line or bank-feed line the client wants in TaxPio: invoices as money in, bills and expenses as money out, in the ledger's own ids. |
ERP | Posted transactions from the sub-ledgers you own (sales, purchasing, expenses); keep the ERP document number as external_id. |
ECOMMERCE | Payouts or settled orders, net of fees as separate lines (order as money in, fee as money out), refunds as negative lines. |
PAYROLL | Each pay run's totals as money out (gross pay, employer contributions) with the run id; per-employee detail stays in payroll. |
PAYMENTS | Settlements and fees from the processor, one line per settlement and one per fee, in the processor's transaction ids. |
CUSTOM | Anything else with a stable id, a date, a description and a signed amount. |
Upload documents
POST /v1/connections/{connectionId}/documents as multipart/form-data with the file (PDF, JPEG, PNG or WebP, up to 15 MB): invoices, receipts, statements. The vault's pipeline and AI suggestions run as for any capture, and the owner sees the document under Docs with its provenance.
Nothing an application pushes is filed. Records arrive unreviewed; documents arrive as evidence; government transmission always requires the person's own authorization inside TaxPio.