Registry
Form SS-4 — programmatic fill compatibility
Application for Employer Identification Number · Internal Revenue Service (IRS) · Rev. December 2025. Tested 2026-08-07 on the unmodified upstream blank — every number below comes from a recorded run, not from documentation.
Verdict at a glance
| Tool | Version | Result | Detail |
|---|---|---|---|
| pdfops API | hosted, tested 2026-08-07 | verified + deterministic flatten | 89/89 supported fields landed; flatten=true byte-deterministic (sha256 bfb967dd759e…) |
| pdf-lib | 1.17.1 | verified (89/89) | 89 fields filled in-process; XFA layer dropped on save |
| @cantoo/pdf-lib (fork) | 2.6.5 | verified (89/89) | 89 fields filled in-process; XFA layer dropped on save |
| pypdf | 6.15.0 | text fields verified (45/45) | 45 text fields written and re-read (text fields only) |
| pdftk-java | 3.3.3 | verified (89/89) | 89 fields filled via FDF and re-dumped |
| qpdf --check | 11.9.0 | structurally clean | errors that qpdf cannot detect |
| poppler render check | 24.02.0 | values render (45/45) | 45/45 filled text values present in pdftotext output of the pdf-lib-filled file; page-1 raster sha256 dae27bd6ac1d… |
File facts
- Source: https://www.irs.gov/pub/irs-pdf/fss4.pdf (issuer page: here)
- Blank tested: irs-ss-4.pdf · 120 KB · sha256
23d295529950b05979596cf58d559db6c433a4ec852407b1820265c117cb3ca2 - License: US federal government work — public domain (17 U.S.C. § 105). The hash-verified blank is redistributed here unmodified.
- Structure: 2 pages · AcroForm + XFA layer (hybrid)
- Fields: 89 (45 text, 44 checkbox)
Quirks & limitations
- The EIN application — company-formation services (Stripe Atlas class) prepare these programmatically for every new entity.
- Applied for by fax or mail when the online EIN assistant is unavailable to the applicant, which keeps the PDF path alive.
Tested request
This exact shape ran against the live API during the recorded test (values here shortened to two fields; the test filled all 89 supported fields). With flatten=true, two identical runs produced byte-identical output — sha256 bfb967dd759ee2f68c807d96b9827069467a57aa2daebdf4a4191eb68d2dea7a.
curl -X POST https://pdfops.dev/api/fill-form \
-F "pdf=@irs-ss-4.pdf" \
-F 'fields={"topmostSubform[0].Page1[0].PgHeader[0].f1_1[0]":"PDFops","topmostSubform[0].Page1[0].f1_2[0]":"Jane Doe"}' \
-F "flatten=true" \
-o filled.pdf
Enumerate all 89 field names first with the inspector or POST /api/inspect.
Field schema
All 89 fields (name, type, maxLength, options)
| Field name | Type | maxLength | Options |
|---|---|---|---|
topmostSubform[0].Page1[0].PgHeader[0].f1_1[0] | TextField | 10 | |
topmostSubform[0].Page1[0].f1_2[0] | TextField | ||
topmostSubform[0].Page1[0].f1_3[0] | TextField | ||
topmostSubform[0].Page1[0].f1_4[0] | TextField | ||
topmostSubform[0].Page1[0].Line4ReadOrder[0].f1_5[0] | TextField | ||
topmostSubform[0].Page1[0].Line4ReadOrder[0].f1_6[0] | TextField | ||
topmostSubform[0].Page1[0].f1_7[0] | TextField | ||
topmostSubform[0].Page1[0].f1_8[0] | TextField | ||
topmostSubform[0].Page1[0].f1_9[0] | TextField | ||
topmostSubform[0].Page1[0].f1_10[0] | TextField | ||
topmostSubform[0].Page1[0].f1_11[0] | TextField | 11 | |
topmostSubform[0].Page1[0].c1_1[0] | CheckBox | ||
topmostSubform[0].Page1[0].c1_1[1] | CheckBox | ||
topmostSubform[0].Page1[0].f1_12[0] | TextField | ||
topmostSubform[0].Page1[0].c1_2[0] | CheckBox | ||
topmostSubform[0].Page1[0].c1_2[1] | CheckBox | ||
topmostSubform[0].Page1[0].c1_3[0] | CheckBox | ||
topmostSubform[0].Page1[0].f1_13[0] | TextField | 11 | |
topmostSubform[0].Page1[0].c1_3[1] | CheckBox | ||
topmostSubform[0].Page1[0].f1_14[0] | TextField | 11 | |
topmostSubform[0].Page1[0].c1_3[2] | CheckBox | ||
topmostSubform[0].Page1[0].c1_3[3] | CheckBox | ||
topmostSubform[0].Page1[0].f1_15[0] | TextField | 11 | |
topmostSubform[0].Page1[0].c1_3[4] | CheckBox | ||
topmostSubform[0].Page1[0].f1_16[0] | TextField | ||
topmostSubform[0].Page1[0].c1_3[5] | CheckBox | ||
topmostSubform[0].Page1[0].f1_17[0] | TextField | 11 | |
topmostSubform[0].Page1[0].c1_3[6] | CheckBox | ||
topmostSubform[0].Page1[0].c1_3[7] | CheckBox | ||
topmostSubform[0].Page1[0].c1_3[8] | CheckBox | ||
topmostSubform[0].Page1[0].c1_3[9] | CheckBox | ||
topmostSubform[0].Page1[0].c1_3[10] | CheckBox | ||
topmostSubform[0].Page1[0].c1_3[11] | CheckBox | ||
topmostSubform[0].Page1[0].c1_3[12] | CheckBox | ||
topmostSubform[0].Page1[0].f1_18[0] | TextField | ||
topmostSubform[0].Page1[0].c1_3[13] | CheckBox | ||
topmostSubform[0].Page1[0].c1_3[14] | CheckBox | ||
topmostSubform[0].Page1[0].c1_3[15] | CheckBox | ||
topmostSubform[0].Page1[0].f1_19[0] | TextField | ||
topmostSubform[0].Page1[0].f1_20[0] | TextField | ||
topmostSubform[0].Page1[0].f1_21[0] | TextField | ||
topmostSubform[0].Page1[0].f1_22[0] | TextField | ||
topmostSubform[0].Page1[0].c1_4[0] | CheckBox | ||
topmostSubform[0].Page1[0].f1_25[0] | TextField | ||
topmostSubform[0].Page1[0].f1_26[0] | TextField | ||
topmostSubform[0].Page1[0].c1_4[1] | CheckBox | ||
topmostSubform[0].Page1[0].f1_27[0] | TextField | ||
topmostSubform[0].Page1[0].c1_4[2] | CheckBox | ||
topmostSubform[0].Page1[0].c1_4[3] | CheckBox | ||
topmostSubform[0].Page1[0].c1_4[4] | CheckBox | ||
topmostSubform[0].Page1[0].f1_28[0] | TextField | ||
topmostSubform[0].Page1[0].c1_4[5] | CheckBox | ||
topmostSubform[0].Page1[0].c1_4[6] | CheckBox | ||
topmostSubform[0].Page1[0].f1_29[0] | TextField | ||
topmostSubform[0].Page1[0].c1_4[7] | CheckBox | ||
topmostSubform[0].Page1[0].c1_4[8] | CheckBox | ||
topmostSubform[0].Page1[0].f1_24[0] | TextField | ||
topmostSubform[0].Page1[0].f1_30[0] | TextField | ||
topmostSubform[0].Page1[0].f1_31[0] | TextField | ||
topmostSubform[0].Page1[0].f1_32[0] | TextField | ||
topmostSubform[0].Page1[0].f1_33[0] | TextField | ||
topmostSubform[0].Page1[0].f1_34[0] | TextField | ||
topmostSubform[0].Page1[0].f1_35[0] | TextField | ||
topmostSubform[0].Page1[0].c1_5[0] | CheckBox | ||
topmostSubform[0].Page1[0].f1_36[0] | TextField | ||
topmostSubform[0].Page1[0].c1_6[0] | CheckBox | ||
topmostSubform[0].Page1[0].c1_6[1] | CheckBox | ||
topmostSubform[0].Page1[0].c1_6[2] | CheckBox | ||
topmostSubform[0].Page1[0].c1_6[3] | CheckBox | ||
topmostSubform[0].Page1[0].c1_6[4] | CheckBox | ||
topmostSubform[0].Page1[0].c1_6[5] | CheckBox | ||
topmostSubform[0].Page1[0].c1_6[6] | CheckBox | ||
topmostSubform[0].Page1[0].c1_6[7] | CheckBox | ||
topmostSubform[0].Page1[0].c1_6[8] | CheckBox | ||
topmostSubform[0].Page1[0].c1_6[9] | CheckBox | ||
topmostSubform[0].Page1[0].c1_6[10] | CheckBox | ||
topmostSubform[0].Page1[0].c1_6[11] | CheckBox | ||
topmostSubform[0].Page1[0].f1_37[0] | TextField | ||
topmostSubform[0].Page1[0].f1_38[0] | TextField | ||
topmostSubform[0].Page1[0].c1_7[0] | CheckBox | ||
topmostSubform[0].Page1[0].c1_7[1] | CheckBox | ||
topmostSubform[0].Page1[0].f1_39[0] | TextField | 10 | |
topmostSubform[0].Page1[0].f1_40[0] | TextField | ||
topmostSubform[0].Page1[0].f1_41[0] | TextField | ||
topmostSubform[0].Page1[0].f1_42[0] | TextField | ||
topmostSubform[0].Page1[0].f1_43[0] | TextField | ||
topmostSubform[0].Page1[0].f1_44[0] | TextField | ||
topmostSubform[0].Page1[0].f1_45[0] | TextField | ||
topmostSubform[0].Page1[0].f1_46[0] | TextField |
Frequently asked
Can I fill the Form SS-4 programmatically?
Yes — the blank Rev. December 2025 Form SS-4 is a fillable AcroForm with 89 fields. In our tested run, all 89 supported fields were filled through the pdfops API and verified by re-inspecting the output; upstream pdf-lib also round-trips it, and pypdf handled its text fields. Field names are positional (e.g. topmostSubform[0].Page1[0].f1_01[0]) — enumerate them via inspection rather than guessing.
Is the Form SS-4 an XFA form?
It is a hybrid: the PDF carries both a standard AcroForm field tree and an XFA layer. Programmatic fillers in the pdf-lib family fill the AcroForm layer and drop the XFA layer on save, so the output is a plain AcroForm PDF — which every mainstream viewer renders. Only XFA-first viewers (older Adobe products) behave differently.
← All forms in the registry · Inspect your own PDF · Make a flat PDF fillable