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
| Tool | Version | Result | Detail |
|---|---|---|---|
| pdfops API | hosted, tested 2026-08-06 | verified + deterministic flatten | 23/23 supported fields landed; flatten=true byte-deterministic (sha256 839629ab6af4…) |
| pdf-lib | 1.17.1 | verified (23/23) | 23 fields filled in-process; XFA layer dropped on save |
| @cantoo/pdf-lib (fork) | 2.6.5 | verified (23/23) | 23 fields filled in-process; XFA layer dropped on save |
| pypdf | 6.15.0 | text fields verified (15/15) | 15 text fields written and re-read (text fields only) |
| pdftk-java | 3.3.3 | verified (23/23) | 23 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 (15/15) | 15/15 filled text values present in pdftotext output of the pdf-lib-filled file; page-1 raster sha256 5bd3e897396f… |
File facts
- Source: https://www.irs.gov/pub/irs-pdf/fw9.pdf (issuer page: here)
- Blank tested: irs-w-9.pdf · 138 KB · sha256
2d420cbb4123dcf1fb82595b2359cfbb5d81f00b9df9d359fcc7af361d093f53 - License: US federal government work — public domain (17 U.S.C. § 105). The hash-verified blank is redistributed here unmodified.
- Structure: 6 pages · AcroForm + XFA layer (hybrid)
- Fields: 23 (15 text, 8 checkbox)
Quirks & limitations
- The most-requested form in US contractor onboarding: payers collect it from every freelancer and vendor, so it is the highest-volume automation target in this registry.
- Hybrid AcroForm/XFA: the PDF carries both a standard AcroForm field tree and an XFA (XML Forms Architecture) layer. pdf-lib-family libraries fill the AcroForm layer and drop the XFA layer on save — the output is a plain AcroForm PDF. Viewers that render the XFA layer (older Adobe products) will show the pre-fill template; every mainstream viewer renders the filled AcroForm.
- The federal tax classification is 7 individual checkboxes plus a free-text 'other' line, not a radio group — nothing stops you from checking several. Enforce single-choice in your own layer.
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 name | Type | maxLength | Options |
|---|---|---|---|
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] | TextField | 1 | |
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] | TextField | 3 | |
topmostSubform[0].Page1[0].f1_12[0] | TextField | 2 | |
topmostSubform[0].Page1[0].f1_13[0] | TextField | 4 | |
topmostSubform[0].Page1[0].f1_14[0] | TextField | 2 | |
topmostSubform[0].Page1[0].f1_15[0] | TextField | 7 |
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.
← All forms in the registry · Inspect your own PDF · Make a flat PDF fillable