Tax withholding
Turn on automatic tax withholding, check the tax savings balance, move money in and out of it, schedule and cancel IRS payments, and read its history.
Tax withholding sets money aside for taxes in a separate savings account that Wingspan holds for you. You choose a rate. You can also deposit, withdraw, and schedule quarterly estimated IRS payments from the balance.
Prerequisites
- A credential with
bookkeeping.business-banking-account:readto read, and:writeto change settings or move money. - A tax withholding account. It is an internal account with
type: TaxWithholding. If you don't have one, open one. See Internal accounts and balances. Balance, deposit, withdraw, payment, and history calls return404when you don't have one. - If you call with a person's login session, deposits, withdrawals, and tax payments need a
HighRiskWriteActionMFA step-up. See Banking and spend.
Set up withholding
Read the current settings with GET /v3/finance/tax-withholdings/settings. If nothing has been saved, you get disabled settings with a zero rate.
Change them with PATCH /v3/finance/tax-withholdings/settings. Send at least one field.
| Field | Notes |
|---|---|
isEnabled | Turns automatic withholding on or off |
withholdingRate | The rate, as a percentage |
filingStatus | Single, MarriedFilingJointly, MarriedFilingSeparately, HeadOfHousehold, or QualifyingSurvivingSpouse |
state | Two-letter US state code |
estimatedAnnualIncome | Whole number |
estimatedAnnualExpenses | Number |
curl -X PATCH "https://api.wingspan.app/v3/finance/tax-withholdings/settings" \
-H "Authorization: Bearer $WINGSPAN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"isEnabled": true,
"withholdingRate": 25,
"filingStatus": "Single",
"state": "CA",
"estimatedAnnualIncome": 90000,
"estimatedAnnualExpenses": 12000
}'The response is the settings. It also shows federalRate, stateRate, and selfEmploymentRate when Wingspan has them. An empty body returns 422.
filingStatus, state, and the two estimates are also the inputs to Tax estimates.
Check the balance
Call GET /v3/finance/tax-withholdings/balance. The response has balance, available, hold, pending, currency, and updatedAt.
Deposit and withdraw
POST /v3/finance/tax-withholdings/depositmoves money in.POST /v3/finance/tax-withholdings/withdrawmoves money out.
Both take amount (required) and destinationAccountId (optional), and both require an Idempotency-Key. They return 200 with a transfer.
The other side of the movement is your Wallet unless you name another account in destinationAccountId. A value that starts with ia_ is looked up as one of your Wallet accounts. Any other value is read as the ID of one of your external bank accounts. Anything that isn't yours returns 404.
curl -X POST "https://api.wingspan.app/v3/finance/tax-withholdings/deposit" \
-H "Authorization: Bearer $WINGSPAN_TOKEN" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: tax-deposit-2026-10-20" \
-d '{ "amount": 1500.00 }'Schedule an IRS payment
Call POST /v3/finance/tax-withholdings/tax-payments. It creates an estimated tax payment to the IRS, paid from the tax withholding balance. It isn't a deposit or a withdrawal.
| Field | Required | Notes |
|---|---|---|
amount | Yes | Greater than zero |
quarter | Yes | Q1, Q2, Q3, or Q4 |
year | Yes | A positive whole number |
effectiveAt | No | A date-time |
curl -X POST "https://api.wingspan.app/v3/finance/tax-withholdings/tax-payments" \
-H "Authorization: Bearer $WINGSPAN_TOKEN" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: irs-q4-2026" \
-d '{ "amount": 3200.00, "quarter": "Q4", "year": 2026 }'// 201 Created (trimmed)
{
"id": "Tp4Wn9Qk3Lx6Bz8Mh2Rc5T",
"type": "TaxPayment",
"direction": "Debit",
"status": "Scheduled",
"amount": 3200.00,
"currency": "USD",
"quarter": "Q4",
"year": 2026,
"effectiveAt": "2027-01-15T00:00:00Z"
}To cancel it, call POST /v3/finance/tax-withholdings/tax-payments/{taxPaymentId}/cancel with an Idempotency-Key. A payment can be cancelled while it is scheduled and before Wingspan's internal filing deadline. A payment that has posted or was already cancelled returns 409. The response is the payment with status: Cancelled.
Read the history
Call GET /v3/finance/tax-withholdings/transactions.
| Parameter | Notes |
|---|---|
filter[startDate][eq], filter[endDate][eq] | YYYY-MM-DD |
filter[status][eq] or filter[status][anyOf][] | Scheduled, Processing, Posted, Failed, Cancelled. Use one form, not both. |
sort, page[size], page[token] | See Pagination |
Each row has type (TaxWithholding, TaxPayment, or BookTransfer), subType (Deposit, Withdraw, or Correction), direction (Credit or Debit), status, amount, effectiveAt, and, where they apply, quarter, year, invoiceId, and invoiceNumber.
The feed groups rows by source: scheduled and processing IRS payments, cancelled IRS payments, set-asides from invoices, and posted ledger entries. Date filters and sort apply within each source. The result is not one list in date order across sources.
Errors
| Status | Meaning |
|---|---|
403 | Missing scope, or StepUpMfaRequired |
404 | You have no tax withholding account, the other account isn't yours, or the tax payment doesn't exist |
409 | IdempotencyKeyConflict, or the payment can't be cancelled |
422 | Settings body is empty; amount is zero or less; quarter, year, or effectiveAt is invalid; or the status filter is wrong (both eq and anyOf, another operator, or an unknown status) |
Related pages
Updated about 1 hour ago