Registry

IRS Form W-9 — programmatic fill compatibility

Request for Taxpayer Identification Number and Certification · Internal Revenue Service (IRS) · Rev. March 2024. Tested 2026-08-06 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-06verified + deterministic flatten23/23 supported fields landed; flatten=true byte-deterministic (sha256 839629ab6af4…)
pdf-lib1.17.1verified (23/23)23 fields filled in-process; XFA layer dropped on save
@cantoo/pdf-lib (fork)2.6.5verified (23/23)23 fields filled in-process; XFA layer dropped on save
pypdf6.15.0text fields verified (15/15)15 text fields written and re-read (text fields only)
pdftk-java3.3.3verified (23/23)23 fields filled via FDF and re-dumped
qpdf --check11.9.0structurally cleanerrors that qpdf cannot detect
poppler render check24.02.0values render (15/15)15/15 filled text values present in pdftotext output of the pdf-lib-filled file; page-1 raster sha256 5bd3e897396f…

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 23 supported fields). With flatten=true, two identical runs produced byte-identical output — sha256 839629ab6af446b43adc6894d0e767f82e2dfc69936e96dc439ea80a4e3608b9.

curl -X POST https://pdfops.dev/api/fill-form \
  -F "pdf=@irs-w-9.pdf" \
  -F 'fields={"topmostSubform[0].Page1[0].f1_01[0]":"Jane Doe","topmostSubform[0].Page1[0].f1_02[0]":"Jane Doe"}' \
  -F "flatten=true" \
  -o filled.pdf

Enumerate all 23 field names first with the inspector or POST /api/inspect.

Field schema

All 23 fields (name, type, maxLength, options)
Field nameTypemaxLengthOptions
topmostSubform[0].Page1[0].f1_01[0]TextField
topmostSubform[0].Page1[0].f1_02[0]TextField
topmostSubform[0].Page1[0].Boxes3a-b_ReadOrder[0].c1_1[0]CheckBox
topmostSubform[0].Page1[0].Boxes3a-b_ReadOrder[0].c1_1[1]CheckBox
topmostSubform[0].Page1[0].Boxes3a-b_ReadOrder[0].c1_1[2]CheckBox
topmostSubform[0].Page1[0].Boxes3a-b_ReadOrder[0].c1_1[3]CheckBox
topmostSubform[0].Page1[0].Boxes3a-b_ReadOrder[0].c1_1[4]CheckBox
topmostSubform[0].Page1[0].Boxes3a-b_ReadOrder[0].c1_1[5]CheckBox
topmostSubform[0].Page1[0].Boxes3a-b_ReadOrder[0].f1_03[0]TextField1
topmostSubform[0].Page1[0].Boxes3a-b_ReadOrder[0].c1_1[6]CheckBox
topmostSubform[0].Page1[0].Boxes3a-b_ReadOrder[0].f1_04[0]TextField
topmostSubform[0].Page1[0].Boxes3a-b_ReadOrder[0].c1_2[0]CheckBox
topmostSubform[0].Page1[0].f1_05[0]TextField
topmostSubform[0].Page1[0].f1_06[0]TextField
topmostSubform[0].Page1[0].Address_ReadOrder[0].f1_07[0]TextField
topmostSubform[0].Page1[0].Address_ReadOrder[0].f1_08[0]TextField
topmostSubform[0].Page1[0].f1_09[0]TextField
topmostSubform[0].Page1[0].f1_10[0]TextField
topmostSubform[0].Page1[0].f1_11[0]TextField3
topmostSubform[0].Page1[0].f1_12[0]TextField2
topmostSubform[0].Page1[0].f1_13[0]TextField4
topmostSubform[0].Page1[0].f1_14[0]TextField2
topmostSubform[0].Page1[0].f1_15[0]TextField7

Frequently asked

Can I fill the IRS Form W-9 programmatically?

Yes — the blank Rev. March 2024 IRS Form W-9 is a fillable AcroForm with 23 fields. In our tested run, all 23 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 IRS Form W-9 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.