Tax forms
28 operations. All areas
- GET /v1/tax-forms/1099
- GET /v1/tax-forms/payer
- POST /v1/tax-forms/payer
- GET /v1/tax-forms/account-boxes
- POST /v1/tax-forms/account-boxes
- POST /v1/vendors/{id}/form1099-box
- GET /v1/vendors/{id}/tax-profile
- POST /v1/vendors/{id}/tax-profile
- POST /v1/vendors/{id}/tax-profile/reveal
- POST /v1/vendors/{id}/tin-match
- GET /v1/w9-requests
- POST /v1/w9-requests
- POST /v1/w9-requests/{id}/cancel
- GET /v1/tax-forms/prior-amounts
- POST /v1/tax-forms/prior-amounts
- POST /v1/tax-forms/prior-amounts/{id}/void
- GET /v1/tax-forms/filings
- POST /v1/tax-forms/filings
- GET /v1/tax-forms/filings/{id}
- POST /v1/tax-forms/filings/{id}/approve
- POST /v1/tax-forms/filings/{id}/reject
- POST /v1/tax-forms/filings/{id}/retry
- POST /v1/tax-forms/filings/{id}/ack
- POST /v1/tax-forms/filings/{id}/refresh
- GET /v1/tax-forms/filings/{id}/filed
- GET /v1/tax-forms/filings/{id}/recipient-copies
- GET /v1/w9/{token}
- POST /v1/w9/{token}
GET/v1/tax-forms/1099
The year's 1099s: per vendor the amounts by box (from the books, plus amounts paid outside Evenbead), which forms are needed at the thresholds, W-9 status, what is already filed, and what blocks filing; the payer, due dates, providers and filings.
- Operation
get1099Workspace - Scope: read
- Read
- Parameters
yearquery, integer, requiredthreshold_centsquery, integer
- Responses
200Workspace (object)- Errors
400,401,403,429,500(Error:error.type,message)
GET/v1/tax-forms/payer
The company as the 1099 payer (TIN masked)
- Operation
getPayerProfile - Scope: read
- Read
- Responses
200Payer (object)- Errors
400,401,403,429,500(Error:error.type,message)
POST/v1/tax-forms/payer
Set the payer's name, address, phone and TIN (people only; the TIN is sealed and needed the first time). Audited.
- Operation
setPayerProfile - Scope: approve
- Write: sets a value, no Idempotency-Key needed
- Request body
namestring, requiredname2stringaddress1string, requiredaddress2stringcitystring, requiredstatestring, requiredzipstring, requiredphonestring, requiredtin_type"EIN" | "SSN" | "ITIN", requiredtinstring The full number (write-only: never returned except by the audited reveal).
- Responses
200Saved (object)- Errors
400,401,403,409,422,429,500(Error:error.type,message)
GET/v1/tax-forms/account-boxes
Expense accounts mapped to 1099 boxes (unmapped accounts use the vendor's default box)
- Operation
listAccountBoxes - Scope: read
- Read
- Responses
200Mapping (object)- Errors
400,401,403,429,500(Error:error.type,message)
POST/v1/tax-forms/account-boxes
Map an expense account to a 1099 box (null removes the mapping). Audited.
- Operation
setAccountBox - Scope: propose
- Write: sets a value, no Idempotency-Key needed
- Request body
accountstring, required Account codebox"NEC1" | "MISC1" | "MISC2" | "MISC3" | "MISC6" | "MISC10", required NEC1 nonemployee compensation; MISC1 rents, MISC2 royalties, MISC3 other income, MISC6 medical and health care payments, MISC10 gross proceeds paid to an attorney.
- Responses
200Saved (object)- Errors
400,401,403,409,422,429,500(Error:error.type,message)
POST/v1/vendors/{id}/form1099-box
A vendor's default 1099 box (where payments to unmapped accounts go). Audited.
- Operation
setVendor1099Box - Scope: propose
- Write: sets a value, no Idempotency-Key needed
- Parameters
idpath, string, required
- Request body
box"NEC1" | "MISC1" | "MISC2" | "MISC3" | "MISC6" | "MISC10", required NEC1 nonemployee compensation; MISC1 rents, MISC2 royalties, MISC3 other income, MISC6 medical and health care payments, MISC10 gross proceeds paid to an attorney.
- Responses
200Saved (object)- Errors
400,401,403,404,409,422,429,500(Error:error.type,message)
GET/v1/vendors/{id}/tax-profile
A vendor's W-9 details (TIN masked), earlier versions and W-9 requests
- Operation
getVendorTaxProfile - Scope: read
- Read
- Parameters
idpath, string, required
- Responses
200Profile (object)- Errors
400,401,403,404,429,500(Error:error.type,message)
POST/v1/vendors/{id}/tax-profile
Enter a vendor's W-9 details (from a paper W-9, say); people only. The TIN is sealed; only its last four digits are shown. A new profile supersedes the old. Audited.
- Operation
setVendorTaxProfile - Scope: propose
- Write: needs Idempotency-Key (or dry_run)
- Parameters
idpath, string, required
- Request body
legal_namestring, requiredbusiness_namestringtax_class"individual" | "c_corp" | "s_corp" | "partnership" | "trust_estate" | "llc_c" | "llc_s" | "llc_p" | "other", required W-9 line 3a: individual/sole proprietor, C corporation, S corporation, partnership, trust/estate, LLC taxed as C, S or partnership, other.tax_class_otherstringforeign_partnersbooleanexempt_payee_codestringfatca_codestringaddress1string, requiredaddress2stringcitystring, requiredstatestring, requiredzipstring, requiredtin_type"SSN" | "EIN" | "ITIN" | "ATIN", requiredtinstring, required The full number (write-only: never returned except by the audited reveal).
- Responses
201Saved (object)- Errors
400,401,403,404,409,422,429,500(Error:error.type,message)
POST/v1/vendors/{id}/tax-profile/reveal
Show a vendor's full TIN: a person with "See full tax IDs" only, never an agent; each reveal is in the audit log.
- Operation
revealVendorTin - Scope: read
- Write: sets a value, no Idempotency-Key needed
- Parameters
idpath, string, required
- Request body
Empty object
{}.- Responses
200TIN (object)- Errors
400,401,403,404,409,422,429,500(Error:error.type,message)
POST/v1/vendors/{id}/tin-match
Check the vendor's name and TIN with the TIN-matching service connected to this deployment (none yet: the answer says so). People only; audited.
- Operation
checkVendorTin - Scope: propose
- Write: sets a value, no Idempotency-Key needed
- Parameters
idpath, string, required
- Request body
Empty object
{}.- Responses
200Result (object)- Errors
400,401,403,404,409,422,429,500(Error:error.type,message)
GET/v1/w9-requests
W-9 requests sent to vendors, newest first
- Operation
listW9Requests - Scope: read
- Read
- Parameters
contact_idquery, string
- Responses
200Requests (object)- Errors
400,401,403,429,500(Error:error.type,message)
POST/v1/w9-requests
Ask a vendor for a W-9: emails a single-use secure link (no sign-in) that expires (default 30 days). The vendor fills in the form and signs it electronically; the TIN is sealed on arrival. Audited.
- Operation
createW9Request - Scope: propose
- Write: needs Idempotency-Key (or dry_run)
- Request body
contact_idstring, requiredemailstringexpires_daysintegermessagestring
- Responses
201Sent (object)- Errors
400,401,403,409,422,429,500(Error:error.type,message)
POST/v1/w9-requests/{id}/cancel
Cancel an open W-9 request (its link stops working). Audited.
- Operation
cancelW9Request - Scope: propose
- Write: needs Idempotency-Key (or dry_run)
- Parameters
idpath, string, required
- Request body
reasonstring, required
- Responses
200Cancelled (object)- Errors
400,401,403,404,409,422,429,500(Error:error.type,message)
GET/v1/tax-forms/prior-amounts
1099 amounts paid outside Evenbead in a year (before switching), per vendor and box
- Operation
listPrior1099Amounts - Scope: read
- Read
- Parameters
yearquery, integer, requiredinclude_voidedquery, boolean
- Responses
200Amounts (object)- Errors
400,401,403,429,500(Error:error.type,message)
POST/v1/tax-forms/prior-amounts
Record what vendors were paid outside Evenbead this year (a mid-year switch: QuickBooks January to April), per vendor and box, so the year's 1099s are complete. Never edited: void and re-enter. Audited.
- Operation
addPrior1099Amounts - Scope: propose
- Write: needs Idempotency-Key (or dry_run)
- Request body
amountsarray of object, required
- Responses
201Recorded (object)- Errors
400,401,403,409,422,429,500(Error:error.type,message)
POST/v1/tax-forms/prior-amounts/{id}/void
Void an amount paid outside Evenbead (with a reason). Audited.
- Operation
voidPrior1099Amount - Scope: propose
- Write: needs Idempotency-Key (or dry_run)
- Parameters
idpath, string, required
- Request body
reasonstring, required
- Responses
200Voided (object)- Errors
400,401,403,404,409,422,429,500(Error:error.type,message)
GET/v1/tax-forms/filings
1099 filings (proposals and what became of them)
- Operation
list1099Filings - Scope: read
- Read
- Parameters
yearquery, integer
- Responses
200Filings (object)- Errors
400,401,403,429,500(Error:error.type,message)
POST/v1/tax-forms/filings
Propose a 1099 filing: the returns the year needs (or CORRECTED returns), through a provider. dry_run shows exactly what would be filed (TINs masked) and its SHA-256; otherwise it becomes a proposal that a person with "File 1099s" approves. Agents may propose; nothing is sent until approval.
- Operation
propose1099Filing - Scope: propose
- Write: needs Idempotency-Key (or dry_run)
- Request body
yearinteger, requiredprovider"iris_csv" | "iris_a2a" | "partner_mock" | "taxbandits", requiredkind"original" | "correction"contact_idsarray of stringcorrectionsarray of objectthreshold_centsinteger The indexed §6041 threshold for years after 2026 (default $2,000).dry_runboolean
- Responses
200Dry run (object)201Proposed (object)- Errors
400,401,403,409,422,429,500(Error:error.type,message)
GET/v1/tax-forms/filings/{id}
A filing with its exact preview, returns and the IRS's answers
- Operation
get1099Filing - Scope: read
- Read
- Parameters
idpath, string, required
- Responses
200Filing (object)- Errors
400,401,403,404,429,500(Error:error.type,message)
POST/v1/tax-forms/filings/{id}/approve
Approve a proposed filing and send it: a person with "File 1099s" only (never an agent or AI app), confirming the preview's SHA-256. The filed copy and the provider's answer go into the audit record.
- Operation
approve1099Filing - Scope: approve
- Write: needs Idempotency-Key (or dry_run)
- Parameters
idpath, string, required
- Request body
preview_sha256string, requirednotestring
- Responses
200Approved and sent (object)- Errors
400,401,403,404,409,422,429,500(Error:error.type,message)
POST/v1/tax-forms/filings/{id}/reject
Reject a proposed filing (with a reason); nothing is sent. People with "File 1099s" only.
- Operation
reject1099Filing - Scope: approve
- Write: needs Idempotency-Key (or dry_run)
- Parameters
idpath, string, required
- Request body
reasonstring, required
- Responses
200Rejected (object)- Errors
400,401,403,404,409,422,429,500(Error:error.type,message)
POST/v1/tax-forms/filings/{id}/retry
Send an approved filing again after the provider failed. People with "File 1099s" only.
- Operation
retry1099Filing - Scope: approve
- Write: needs Idempotency-Key (or dry_run)
- Parameters
idpath, string, required
- Request body
Empty object
{}.- Responses
200Sent (object)- Errors
400,401,403,404,409,422,429,500(Error:error.type,message)
POST/v1/tax-forms/filings/{id}/ack
Record what the IRS answered for files uploaded in the IRIS portal: the Receipt ID and status, optionally per return. People with "File 1099s" only. Audited.
- Operation
record1099Ack - Scope: approve
- Write: needs Idempotency-Key (or dry_run)
- Parameters
idpath, string, required
- Request body
receipt_idstring, requiredstatus"submitted" | "accepted" | "partially_accepted" | "rejected_by_irs", requiredrejected_recordsarray of integernotestring
- Responses
200Recorded (object)- Errors
400,401,403,404,409,422,429,500(Error:error.type,message)
POST/v1/tax-forms/filings/{id}/refresh
Ask the filing partner for the IRS's answer so far and record it: people with "File 1099s" (agents read the filing instead). Audited.
- Operation
refresh1099Filing - Scope: approve
- Write: sets a value, no Idempotency-Key needed
- Parameters
idpath, string, required
- Request body
Empty object
{}.- Responses
200Status (object)- Errors
400,401,403,404,409,422,429,500(Error:error.type,message)
GET/v1/tax-forms/filings/{id}/filed
The filed copy (full TINs): the exact file(s) sent or exported, for a person with "File 1099s"; each download is in the audit log.
- Operation
get1099FiledCopy - Scope: read
- Read
- Parameters
idpath, string, requiredfilequery, integer
- Responses
200File (string)- Errors
400,401,403,404,429,500(Error:error.type,message)
GET/v1/tax-forms/filings/{id}/recipient-copies
Recipient copies (Copy B) as one PDF, or one vendor's; the recipient's TIN truncated, the payer's in full (Pub 1179). People with "File 1099s"; audited.
- Operation
get1099RecipientCopies - Scope: read
- Read
- Parameters
idpath, string, requiredcontact_idquery, string
- Responses
200PDF (string)- Errors
400,401,403,404,429,500(Error:error.type,message)
GET/v1/w9/{token}
The vendor's W-9 link: who asks and until when (no credential; the link is the proof)
- Operation
getW9Form - Scope: none (public)
- Read
- Parameters
tokenpath, string, required
- Responses
200Form (object)- Errors
400,401,409,422,429,500,503(Error:error.type,message)
POST/v1/w9/{token}
The vendor submits the W-9 once, with an electronic signature under penalties of perjury
- Operation
submitW9Form - Scope: none (public)
- Read
- Parameters
tokenpath, string, required
- Request body
legal_namestring, requiredbusiness_namestringtax_class"individual" | "c_corp" | "s_corp" | "partnership" | "trust_estate" | "llc_c" | "llc_s" | "llc_p" | "other", required W-9 line 3a: individual/sole proprietor, C corporation, S corporation, partnership, trust/estate, LLC taxed as C, S or partnership, other.tax_class_otherstringforeign_partnersbooleanexempt_payee_codestringfatca_codestringaddress1string, requiredaddress2stringcitystring, requiredstatestring, requiredzipstring, requiredtin_type"SSN" | "EIN" | "ITIN" | "ATIN", requiredtinstring, required The full number (write-only: never returned except by the audited reveal).signed_namestring, requiredcertifytrue, requiredbackup_withholding_crossedboolean
- Responses
200Received (object)- Errors
400,401,409,422,429,500,503(Error:error.type,message)