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

ToolVersionResultDetail
pdfops APIhosted, tested 2026-08-07verified + deterministic flatten89/89 supported fields landed; flatten=true byte-deterministic (sha256 bfb967dd759e…)
pdf-lib1.17.1verified (89/89)89 fields filled in-process; XFA layer dropped on save
@cantoo/pdf-lib (fork)2.6.5verified (89/89)89 fields filled in-process; XFA layer dropped on save
pypdf6.15.0text fields verified (45/45)45 text fields written and re-read (text fields only)
pdftk-java3.3.3verified (89/89)89 fields filled via FDF and re-dumped
qpdf --check11.9.0structurally cleanerrors that qpdf cannot detect
poppler render check24.02.0values 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

Quirks & limitations

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 nameTypemaxLengthOptions
topmostSubform[0].Page1[0].PgHeader[0].f1_1[0]TextField10
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]TextField11
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]TextField11
topmostSubform[0].Page1[0].c1_3[1]CheckBox
topmostSubform[0].Page1[0].f1_14[0]TextField11
topmostSubform[0].Page1[0].c1_3[2]CheckBox
topmostSubform[0].Page1[0].c1_3[3]CheckBox
topmostSubform[0].Page1[0].f1_15[0]TextField11
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]TextField11
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]TextField10
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.