TaxWallet API Documentation
A RESTful API for the workflows behind modern tax preparation — identity, taxpayers, e-file and returns, documents and OCR, bank products, and notifications. Built for partners, service bureaus, and software integrators building on the six TaxWallet API services.
Powering tax preparation across 50+ offices and 30,000+ returns since 2022.
Introduction
The TaxWallet API is tax infrastructure exposed as a clean, RESTful interface. It is the same engine that powers tax preparation across 50+ offices and more than 30,000 returns since 2022, made available so you can build the tax workflow directly into your own product.
It is designed for three audiences:
- Partners — embedding tax preparation and e-file into an existing platform.
- Service bureaus — managing many preparers and offices through a single integration.
- Software integrators — building new experiences on top of the six TaxWallet API services.
Everything is organized around six services: Authentication & Identity, Taxpayers / Citizens, E-File & Returns, Documents & OCR, Payments & Bank Products, and Notifications. Each is documented below with example endpoints, requests, and responses.
Conventions. All requests and responses are JSON. Resource paths are versioned under /v1. Amounts are integer cents with an explicit currency. Timestamps are ISO 8601 (UTC).
Base URLs
The API is available in two independent environments. They do not share data — credentials, taxpayers, and returns created in the sandbox never appear in production.
| Environment | Base URL | Use for |
|---|---|---|
| Production | Released when tests pass | Live taxpayers, real e-file transmissions. |
| Sandbox | https://sandbox.taxwallet.ai | Development and testing with simulated data. |
Examples throughout this page target the sandbox (https://sandbox.taxwallet.ai) so they are safe to copy and run. The production host is published here on release — it goes live once the full test suite passes.
Authentication
Every request is authenticated with a credential pair sent as request headers: a Code that identifies your account and a License key (your secret API key). Both are issued to you on approval.
Header format
X-TaxWallet-Code: <YOUR_CODE>
X-TaxWallet-License: <YOUR_LICENSE_KEY>
Accept: application/jsonKeep your License key secret. Send it only from server-side code, never from a browser or mobile client. Keys are issued on approval and can be rotated at any time — if a key is exposed, request a rotation immediately.
Some integrations exchange the credential pair for a short-lived bearer token at POST /v1/auth/token, then send that token as Authorization: Bearer … on subsequent calls. See Authentication & Identity below.
API Services
The platform is composed of six services. Each exposes a focused set of resources; example endpoints follow.
Authentication & Identity
Exchange credentials for tokens, manage organizations and preparer members, and resolve the identity of the account behind a request.
/v1/auth/tokenExchange your Code + License key for a short-lived bearer token.
curl -X POST \
'https://sandbox.taxwallet.ai/v1/auth/token' \
-H 'X-TaxWallet-Code: <YOUR_CODE>' \
-H 'X-TaxWallet-License: <YOUR_LICENSE_KEY>' \
-H 'Content-Type: application/json' \
-d '{"grantType":"client_credentials"}'{
"accessToken": "tw_tok_9f2c…",
"tokenType": "Bearer",
"expiresIn": 3600
}/v1/organizationsList the organizations (offices / EFINs) your account can act on behalf of.
curl -X GET \
'https://sandbox.taxwallet.ai/v1/organizations' \
-H 'X-TaxWallet-Code: <YOUR_CODE>' \
-H 'X-TaxWallet-License: <YOUR_LICENSE_KEY>' \
-H 'Accept: application/json'{
"data": [
{ "id": "org_4ab21", "name": "Northwind Tax", "officeCount": 3 }
],
"nextCursor": null
}/v1/organizations/{orgId}/membersList preparers and staff who belong to an organization.
curl -X GET \
'https://sandbox.taxwallet.ai/v1/organizations/org_4ab21/members' \
-H 'X-TaxWallet-Code: <YOUR_CODE>' \
-H 'X-TaxWallet-License: <YOUR_LICENSE_KEY>' \
-H 'Accept: application/json'{
"data": [
{ "id": "mbr_77c0", "name": "Dana Cole", "role": "preparer" }
],
"nextCursor": null
}Taxpayers / Citizens
Create and retrieve taxpayer records (“citizens”) — the people a return is filed for, including filing status and dependents.
/v1/citizens?limit=2List taxpayer records with cursor pagination.
curl -X GET \
'https://sandbox.taxwallet.ai/v1/citizens?limit=2' \
-H 'X-TaxWallet-Code: <YOUR_CODE>' \
-H 'X-TaxWallet-License: <YOUR_LICENSE_KEY>' \
-H 'Accept: application/json'{
"data": [
{
"id": "ctz_3kd91m",
"firstName": "Avery",
"lastName": "Stone",
"filingStatus": "single"
}
],
"nextCursor": null
}/v1/citizensCreate a taxpayer record.
curl -X POST \
'https://sandbox.taxwallet.ai/v1/citizens' \
-H 'X-TaxWallet-Code: <YOUR_CODE>' \
-H 'X-TaxWallet-License: <YOUR_LICENSE_KEY>' \
-H 'Content-Type: application/json' \
-d '{"firstName":"Avery","lastName":"Stone","filingStatus":"single"}'{
"id": "ctz_3kd91m",
"firstName": "Avery",
"lastName": "Stone",
"filingStatus": "single",
"createdAt": "2026-01-15T12:00:00Z"
}/v1/citizens/{citizenId}Retrieve a single taxpayer record by ID.
curl -X GET \
'https://sandbox.taxwallet.ai/v1/citizens/ctz_3kd91m' \
-H 'X-TaxWallet-Code: <YOUR_CODE>' \
-H 'X-TaxWallet-License: <YOUR_LICENSE_KEY>' \
-H 'Accept: application/json'{
"id": "ctz_3kd91m",
"firstName": "Avery",
"lastName": "Stone",
"filingStatus": "single",
"dependents": []
}E-File & Returns
Build a return, calculate it, transmit the e-file manifest to the agency, and poll for acknowledgments (accepted / rejected).
/v1/returnsCreate a tax return for a taxpayer and tax year.
curl -X POST \
'https://sandbox.taxwallet.ai/v1/returns' \
-H 'X-TaxWallet-Code: <YOUR_CODE>' \
-H 'X-TaxWallet-License: <YOUR_LICENSE_KEY>' \
-H 'Content-Type: application/json' \
-d '{"citizenId":"ctz_3kd91m","taxYear":2025,"formType":"1040"}'{
"id": "ret_55ab12",
"taxYear": 2025,
"formType": "1040",
"status": "draft"
}/v1/returns/{returnId}/calculateRun the tax engine and compute refund or balance due (integer cents).
curl -X POST \
'https://sandbox.taxwallet.ai/v1/returns/ret_55ab12/calculate' \
-H 'X-TaxWallet-Code: <YOUR_CODE>' \
-H 'X-TaxWallet-License: <YOUR_LICENSE_KEY>' \
-H 'Content-Type: application/json' \
-d '{}'{
"id": "ret_55ab12",
"status": "ready",
"refundOrDue": { "amount": 125000, "currency": "USD" }
}/v1/efilesTransmit the e-file manifest for a return to the filing agency.
curl -X POST \
'https://sandbox.taxwallet.ai/v1/efiles' \
-H 'X-TaxWallet-Code: <YOUR_CODE>' \
-H 'X-TaxWallet-License: <YOUR_LICENSE_KEY>' \
-H 'Content-Type: application/json' \
-d '{"returnId":"ret_55ab12"}'{
"id": "efl_91xk20",
"returnId": "ret_55ab12",
"status": "transmitted",
"submittedAt": "2026-02-01T09:30:00Z"
}/v1/efiles/{efileId}Get the current e-file status, including the agency acknowledgment.
curl -X GET \
'https://sandbox.taxwallet.ai/v1/efiles/efl_91xk20' \
-H 'X-TaxWallet-Code: <YOUR_CODE>' \
-H 'X-TaxWallet-License: <YOUR_LICENSE_KEY>' \
-H 'Accept: application/json'{
"id": "efl_91xk20",
"returnId": "ret_55ab12",
"formType": "1040",
"taxYear": 2025,
"status": "accepted",
"acknowledgedAt": "2026-02-01T15:12:00Z"
}Documents & OCR
Upload source documents and extract structured data. The OCR engine recognizes common tax forms — W-2, 1099, 1098, and 1095-A — and returns typed fields.
/v1/documentsUpload a document (PDF or image) and attach it to a taxpayer.
curl -X POST \
'https://sandbox.taxwallet.ai/v1/documents' \
-H 'X-TaxWallet-Code: <YOUR_CODE>' \
-H 'X-TaxWallet-License: <YOUR_LICENSE_KEY>' \
-H 'Content-Type: application/json' \
-d '{"citizenId":"ctz_3kd91m","type":"W2","fileUrl":"https://files.example.com/w2.pdf"}'{
"id": "doc_a1b2c3",
"type": "W2",
"status": "processing"
}/v1/documents/{documentId}Retrieve a document and its extracted (OCR) fields once processing completes.
curl -X GET \
'https://sandbox.taxwallet.ai/v1/documents/doc_a1b2c3' \
-H 'X-TaxWallet-Code: <YOUR_CODE>' \
-H 'X-TaxWallet-License: <YOUR_LICENSE_KEY>' \
-H 'Accept: application/json'{
"id": "doc_a1b2c3",
"type": "W2",
"status": "extracted",
"fields": {
"employer": "Acme Corp",
"wages": 5820000,
"federalWithheld": 712000
}
}/v1/documents?citizenId=ctz_3kd91mList all documents attached to a taxpayer.
curl -X GET \
'https://sandbox.taxwallet.ai/v1/documents?citizenId=ctz_3kd91m' \
-H 'X-TaxWallet-Code: <YOUR_CODE>' \
-H 'X-TaxWallet-License: <YOUR_LICENSE_KEY>' \
-H 'Accept: application/json'{
"data": [
{ "id": "doc_a1b2c3", "type": "W2", "status": "extracted" },
{ "id": "doc_d4e5f6", "type": "1099", "status": "extracted" }
],
"nextCursor": null
}Payments & Bank Products
Offer bank products on a return — refund transfers that net preparation fees out of the refund, and taxpayer advances disbursed before the refund settles.
/v1/bank-productsCreate a refund transfer bank product on a return.
curl -X POST \
'https://sandbox.taxwallet.ai/v1/bank-products' \
-H 'X-TaxWallet-Code: <YOUR_CODE>' \
-H 'X-TaxWallet-License: <YOUR_LICENSE_KEY>' \
-H 'Content-Type: application/json' \
-d '{"returnId":"ret_55ab12","product":"refund_transfer"}'{
"id": "bp_70cd11",
"returnId": "ret_55ab12",
"product": "refund_transfer",
"status": "pending",
"fees": { "amount": 3995, "currency": "USD" }
}/v1/bank-products/{id}/advanceRequest a taxpayer advance against an approved refund transfer.
curl -X POST \
'https://sandbox.taxwallet.ai/v1/bank-products/bp_70cd11/advance' \
-H 'X-TaxWallet-Code: <YOUR_CODE>' \
-H 'X-TaxWallet-License: <YOUR_LICENSE_KEY>' \
-H 'Content-Type: application/json' \
-d '{"amount":50000,"currency":"USD"}'{
"id": "adv_22ff90",
"bankProductId": "bp_70cd11",
"amount": { "amount": 50000, "currency": "USD" },
"status": "approved"
}/v1/bank-products/{id}Retrieve the current status of a bank product and any disbursements.
curl -X GET \
'https://sandbox.taxwallet.ai/v1/bank-products/bp_70cd11' \
-H 'X-TaxWallet-Code: <YOUR_CODE>' \
-H 'X-TaxWallet-License: <YOUR_LICENSE_KEY>' \
-H 'Accept: application/json'{
"id": "bp_70cd11",
"product": "refund_transfer",
"status": "funded",
"disbursements": [
{ "type": "advance", "amount": 50000, "status": "paid" }
]
}Notifications
Send transactional messages to taxpayers and staff over push, email, and SMS — for example, “your return was accepted” or “documents needed.”
/v1/notificationsSend a notification across one or more channels.
curl -X POST \
'https://sandbox.taxwallet.ai/v1/notifications' \
-H 'X-TaxWallet-Code: <YOUR_CODE>' \
-H 'X-TaxWallet-License: <YOUR_LICENSE_KEY>' \
-H 'Content-Type: application/json' \
-d '{"citizenId":"ctz_3kd91m","channels":["push","sms"],"template":"return_accepted"}'{
"id": "ntf_5e6f7a",
"channels": ["push", "sms"],
"status": "queued"
}/v1/notifications/{id}Retrieve delivery status per channel for a notification.
curl -X GET \
'https://sandbox.taxwallet.ai/v1/notifications/ntf_5e6f7a' \
-H 'X-TaxWallet-Code: <YOUR_CODE>' \
-H 'X-TaxWallet-License: <YOUR_LICENSE_KEY>' \
-H 'Accept: application/json'{
"id": "ntf_5e6f7a",
"status": "delivered",
"results": [
{ "channel": "push", "status": "delivered" },
{ "channel": "sms", "status": "delivered" }
]
}Integrations we offer
Beyond the core API, the platform ships with managed integration categories so you don't have to assemble the supporting infrastructure yourself. Each is available to approved partners and surfaces through the services above.
Banking & refund-transfer partners
Refund transfers and taxpayer advances through integrated bank product providers, surfaced via Payments & Bank Products.
Identity verification
Identity proofing and knowledge-based checks to confirm a taxpayer before filing.
OCR & document AI
Structured extraction of W-2, 1099, 1098, and 1095-A data from uploaded documents.
E-signature
Capture legally binding signatures on consent forms and the completed return.
SMS & push
Transactional messaging and mobile push for status updates and document requests.
White-label client app
A brandable taxpayer-facing mobile and web app that runs on top of your API account.
Webhooks
Subscribe to webhooks to receive events instead of polling. Register an HTTPS endpoint for your account; we POST a signed JSON payload when an event occurs. Verify the X-TaxWallet-Signature header against your webhook secret before trusting a payload.
Common event types
return.calculatedefile.transmittedefile.acceptedefile.rejecteddocument.extractedbank_product.fundedadvance.approvednotification.delivered
Sample payload
{
"id": "evt_8a1b2c",
"type": "efile.accepted",
"createdAt": "2026-02-01T15:12:00Z",
"data": {
"efileId": "efl_91xk20",
"returnId": "ret_55ab12",
"taxYear": 2025,
"status": "accepted"
}
}Respond with 2xx within a few seconds. Non-2xx responses are retried with exponential backoff.
Errors & rate limits
The API uses conventional HTTP status codes. Errors return a consistent JSON shape with a stable machine-readable code and a human-readable message.
{
"error": {
"code": "validation_error",
"message": "filingStatus is required.",
"field": "filingStatus",
"requestId": "req_d29f1a"
}
}Common status codes
| Status | Code | Meaning |
|---|---|---|
| 400 | validation_error | The request body failed validation. |
| 401 | unauthenticated | Missing or invalid credentials. |
| 403 | forbidden | Credentials lack access to this resource. |
| 404 | not_found | The resource does not exist. |
| 409 | conflict | The request conflicts with current state. |
| 429 | rate_limited | Too many requests — slow down. |
| 500 | internal_error | Something went wrong on our end. |
Rate limits
Each response includes X-RateLimit-Limit, X-RateLimit-Remaining, and X-RateLimit-Reset. When you exceed your limit you receive a 429 with a Retry-After header — back off and retry after the indicated interval.
Sandbox & going live
Build and test against the sandbox first. It mirrors production behavior with simulated data — e-file transmissions are acknowledged synthetically, and bank products fund without moving real money.
- 1
Request access
Use the Request API access button. We issue a sandbox
CodeandLicensekey on approval. - 2
Build against sandbox
Point your integration at
https://sandbox.taxwallet.aiand exercise the full workflow — create a taxpayer, build a return, calculate, transmit, and read back the acknowledgment. - 3
Request production access
Production is released once the full test suite passes. When it goes live we publish the production host and issue your credentials — no code changes beyond the base URL and credentials.
Ready to build on TaxWallet?
Tell us what you're building and we'll issue sandbox credentials so you can start integrating today.