Forms / IRS
Generate Form 941 programmatically
Form 941 — Employer's Quarterly Federal Tax Return. Official IRS PDF, 3 pages, 116 fields read automatically.
Payroll software knows every number on the 941 — it computed them. The quarterly ritual is getting those numbers onto the IRS's three pages without a human retyping them into Adobe. At one company that's an annoyance; for a payroll platform doing it per client per quarter, it's a document pipeline that has to exist.
What you send
Real field names, straight from the PDF — the excerpt shows the first 5 of 116. The full list is in the table below, and the template hands you the complete JSON schema to copy.
{
"data": {
"topmostSubform[0].Page1[0].Header[0].EntityArea[0].f1_1[0]": "string",
"topmostSubform[0].Page1[0].Header[0].EntityArea[0].f1_2[0]": "string",
"topmostSubform[0].Page1[0].Header[0].EntityArea[0].f1_3[0]": "string",
"topmostSubform[0].Page1[0].Header[0].EntityArea[0].f1_4[0]": "string",
"topmostSubform[0].Page1[0].Header[0].EntityArea[0].f1_5[0]": "string"
}
}
// …plus 111 more fields, all listed belowWhat you get back
The completed Form 941, streamed back as the response — or delivered to your webhook, HMAC-signed.
curl -X POST https://www.doc2api.co/api/v1/templates/<ID>/fill \ -H "X-Api-Key: d2a_live_…" \ -H "Content-Type: application/json" \ -d @payload.json -o filled.pdf # → the completed Form 941 as a PDF. # With a webhook configured, the reply is JSON and the # document arrives at your endpoint as a signed URL.
Or skip the mapping entirely: embed the actual form on your site and let the person it belongs to fill and sign it — you receive the values as JSON and the finished PDF.
Every field on Form 941
Extracted automatically from the official PDF — this table is generated by the same code that reads your uploads. In the editor, each of these is highlighted on the page itself, so you never map a name blind.
| Field name | Type | Notes |
|---|---|---|
| topmostSubform[0].Page1[0].Header[0].EntityArea[0].f1_1[0] | text | max 2 chars |
| topmostSubform[0].Page1[0].Header[0].EntityArea[0].f1_2[0] | text | max 7 chars |
| topmostSubform[0].Page1[0].Header[0].EntityArea[0].f1_3[0] | text | |
| topmostSubform[0].Page1[0].Header[0].EntityArea[0].f1_4[0] | text | |
| topmostSubform[0].Page1[0].Header[0].EntityArea[0].f1_5[0] | text | |
| topmostSubform[0].Page1[0].Header[0].EntityArea[0].f1_6[0] | text | |
| topmostSubform[0].Page1[0].Header[0].EntityArea[0].f1_7[0] | text | max 2 chars |
| topmostSubform[0].Page1[0].Header[0].EntityArea[0].f1_8[0] | text | max 10 chars |
| topmostSubform[0].Page1[0].Header[0].EntityArea[0].f1_9[0] | text | |
| topmostSubform[0].Page1[0].Header[0].EntityArea[0].f1_10[0] | text | |
| topmostSubform[0].Page1[0].Header[0].EntityArea[0].f1_11[0] | text | |
| topmostSubform[0].Page1[0].Header[0].ReportForQuarter[0].c1_1[0] | checkbox | |
| topmostSubform[0].Page1[0].Header[0].ReportForQuarter[0].c1_1[1] | checkbox | |
| topmostSubform[0].Page1[0].Header[0].ReportForQuarter[0].c1_1[2] | checkbox | |
| topmostSubform[0].Page1[0].Header[0].ReportForQuarter[0].c1_1[3] | checkbox | |
| topmostSubform[0].Page1[0].Header[0].AggregateReturn[0].c1_2[0] | checkbox | |
| topmostSubform[0].Page1[0].Header[0].AggregateReturn[0].c1_2[1] | checkbox | |
| topmostSubform[0].Page1[0].Header[0].AggregateReturn[0].c1_2[2] | checkbox | |
| topmostSubform[0].Page1[0].f1_12[0] | text | |
| topmostSubform[0].Page1[0].f1_13[0] | text | |
| topmostSubform[0].Page1[0].f1_14[0] | text | max 3 chars |
| topmostSubform[0].Page1[0].f1_15[0] | text | |
| topmostSubform[0].Page1[0].f1_16[0] | text | max 3 chars |
| topmostSubform[0].Page1[0].c1_3[0] | checkbox | |
| topmostSubform[0].Page1[0].f1_17[0] | text | |
| topmostSubform[0].Page1[0].f1_18[0] | text | max 3 chars |
| topmostSubform[0].Page1[0].f1_19[0] | text | |
| topmostSubform[0].Page1[0].f1_20[0] | text | max 3 chars |
| topmostSubform[0].Page1[0].f1_21[0] | text | |
| topmostSubform[0].Page1[0].f1_22[0] | text | max 3 chars |
| topmostSubform[0].Page1[0].f1_23[0] | text | |
| topmostSubform[0].Page1[0].f1_24[0] | text | max 3 chars |
| topmostSubform[0].Page1[0].f1_25[0] | text | |
| topmostSubform[0].Page1[0].f1_26[0] | text | max 3 chars |
| topmostSubform[0].Page1[0].f1_27[0] | text | |
| topmostSubform[0].Page1[0].f1_28[0] | text | max 3 chars |
| topmostSubform[0].Page1[0].f1_29[0] | text | |
| topmostSubform[0].Page1[0].f1_30[0] | text | max 3 chars |
| topmostSubform[0].Page1[0].f1_31[0] | text | |
| topmostSubform[0].Page1[0].f1_32[0] | text | max 3 chars |
| topmostSubform[0].Page1[0].f1_33[0] | text | |
| topmostSubform[0].Page1[0].f1_34[0] | text | max 3 chars |
| topmostSubform[0].Page1[0].f1_35[0] | text | |
| topmostSubform[0].Page1[0].f1_36[0] | text | max 3 chars |
| topmostSubform[0].Page1[0].f1_37[0] | text | |
| topmostSubform[0].Page1[0].f1_38[0] | text | max 3 chars |
| topmostSubform[0].Page1[0].f1_39[0] | text | |
| topmostSubform[0].Page1[0].f1_40[0] | text | max 3 chars |
| topmostSubform[0].Page1[0].f1_41[0] | text | |
| topmostSubform[0].Page1[0].f1_42[0] | text | max 3 chars |
| topmostSubform[0].Page1[0].f1_43[0] | text | |
| topmostSubform[0].Page1[0].f1_44[0] | text | max 3 chars |
| topmostSubform[0].Page1[0].f1_45[0] | text | |
| topmostSubform[0].Page1[0].f1_46[0] | text | max 3 chars |
| topmostSubform[0].Page1[0].f1_47[0] | text | |
| topmostSubform[0].Page1[0].f1_48[0] | text | max 3 chars |
| topmostSubform[0].Page1[0].f1_49[0] | text | |
| topmostSubform[0].Page1[0].f1_50[0] | text | max 3 chars |
| topmostSubform[0].Page1[0].f1_51[0] | text | |
| topmostSubform[0].Page1[0].f1_52[0] | text | max 3 chars |
| topmostSubform[0].Page1[0].f1_53[0] | text | |
| topmostSubform[0].Page1[0].f1_54[0] | text | max 3 chars |
| topmostSubform[0].Page1[0].f1_55[0] | text | |
| topmostSubform[0].Page1[0].f1_56[0] | text | max 3 chars |
| topmostSubform[0].Page1[0].c1_4[0] | checkbox | |
| topmostSubform[0].Page1[0].c1_4[1] | checkbox | |
| topmostSubform[0].Page1[0].RoutingNo[0].f1_57[0] | text | max 9 chars |
| topmostSubform[0].Page1[0].c1_5[0] | checkbox | |
| topmostSubform[0].Page1[0].c1_5[1] | checkbox | |
| topmostSubform[0].Page1[0].AccountNo[0].f1_58[0] | text | max 17 chars |
| topmostSubform[0].Page2[0].Name_ReadOrder[0].f1_3[0] | text | |
| topmostSubform[0].Page2[0].EIN_Number[0].f1_1[0] | text | max 2 chars |
| topmostSubform[0].Page2[0].EIN_Number[0].f1_2[0] | text | max 7 chars |
| topmostSubform[0].Page2[0].c2_1[0] | checkbox | |
| topmostSubform[0].Page2[0].c2_1[1] | checkbox | |
| topmostSubform[0].Page2[0].f2_1[0] | text | |
| topmostSubform[0].Page2[0].f2_2[0] | text | max 3 chars |
| topmostSubform[0].Page2[0].f2_3[0] | text | |
| topmostSubform[0].Page2[0].f2_4[0] | text | max 3 chars |
| topmostSubform[0].Page2[0].f2_5[0] | text | |
| topmostSubform[0].Page2[0].f2_6[0] | text | max 3 chars |
| topmostSubform[0].Page2[0].f2_7[0] | text | |
| topmostSubform[0].Page2[0].f2_8[0] | text | max 3 chars |
| topmostSubform[0].Page2[0].c2_1[2] | checkbox | |
| topmostSubform[0].Page2[0].c2_2[0] | checkbox | |
| topmostSubform[0].Page2[0].f2_9[0] | text | max 8 chars |
| topmostSubform[0].Page2[0].c2_3[0] | checkbox | |
| topmostSubform[0].Page2[0].c2_4[0] | checkbox | |
| topmostSubform[0].Page2[0].f2_10[0] | text | |
| topmostSubform[0].Page2[0].f2_11[0] | text | |
| topmostSubform[0].Page2[0].f2_12[0] | text | max 5 chars |
| topmostSubform[0].Page2[0].c2_4[1] | checkbox | |
| topmostSubform[0].Page2[0].f2_13[0] | text | |
| topmostSubform[0].Page2[0].f2_14[0] | text | |
| topmostSubform[0].Page2[0].f2_15[0] | text | |
| topmostSubform[0].Page2[0].c2_5[0] | checkbox | |
| topmostSubform[0].Page2[0].f2_16[0] | text | |
| topmostSubform[0].Page2[0].f2_17[0] | text | max 11 chars |
| topmostSubform[0].Page2[0].f2_18[0] | text | |
| topmostSubform[0].Page2[0].f2_19[0] | text | max 10 chars |
| topmostSubform[0].Page2[0].f2_20[0] | text | |
| topmostSubform[0].Page2[0].f2_21[0] | text | |
| topmostSubform[0].Page2[0].f2_22[0] | text | |
| topmostSubform[0].Page2[0].f2_23[0] | text | max 2 chars |
| topmostSubform[0].Page2[0].f2_24[0] | text | max 10 chars |
| topmostSubform[0].Page3[0].EIN_Number[0].f1_1[0] | text | max 2 chars |
| topmostSubform[0].Page3[0].EIN_Number[0].f1_2[0] | text | max 7 chars |
| topmostSubform[0].Page3[0].f4_2[0] | text | |
| topmostSubform[0].Page3[0].f4_3[0] | text | max 3 chars |
| topmostSubform[0].Page3[0].Line3_ReadOrder[0].c4_1[0] | checkbox | |
| topmostSubform[0].Page3[0].Line3_ReadOrder[0].c4_1[1] | checkbox | |
| topmostSubform[0].Page3[0].Line3_ReadOrder[0].c4_1[2] | checkbox | |
| topmostSubform[0].Page3[0].Line3_ReadOrder[0].c4_1[3] | checkbox | |
| topmostSubform[0].Page3[0].f1_3[0] | text | |
| topmostSubform[0].Page3[0].f4_5[0] | text | |
| topmostSubform[0].Page3[0].f4_6[0] | text |
The lines that are sums of other lines
Several 941 lines are arithmetic over the others, and a PDF filled with totals that disagree with their parts is worse than one filled with nothing. Computed fields evaluate expressions server-side at fill time — send the inputs, and the totals are derived in one place instead of being computed in your code and hoped onto the form.
Questions people ask
- Can I file the generated 941 with the IRS?
- This produces the completed form as a PDF — what you do with it (paper filing, records, client review) follows the IRS's own rules. E-filing goes through the IRS e-file system, which is a transmission format, not a PDF.
- How do I run this for hundreds of clients?
- The batch endpoint takes an array of payloads — or a CSV — and returns one document per row, in a single request.
See your Form 941 pipeline working in the next five minutes
The button uploads the official PDF into the editor as a live template with an API key — no account, nothing to cancel. Trial documents are watermarked and kept for 24 hours; sign up to keep your work.
Doc2api is not affiliated with the Internal Revenue Service. Form 941 is a public government work; the copy here is the official revision, refreshed from irs.gov. Nothing on this page is tax or legal advice — how a completed form may be signed, filed or retained is defined by the issuing agency.