Registry
Form SSA-89 — programmatic fill compatibility
Authorization for the Social Security Administration to Release Social Security Number Verification · Social Security Administration (SSA) · 05-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 | fails at parse | encrypted_pdf: this PDF is encrypted (often with an empty user password: it opens in viewers but rejects programmatic inspection). Decrypt it first — e.g. `qpdf --decrypt in.pdf out.pdf` — then retry. Verified examp |
| pdf-lib | 1.17.1 | fails at load | Error: Input document to `PDFDocument.load` is encrypted. You can use `PDFDocument.load(..., { ignoreEncryption: true })` if you wish to load the document anyways. |
| @cantoo/pdf-lib (fork) | 2.6.5 | fails at load | Error: Input document to `PDFDocument.load` is encrypted. You can use `PDFDocument.load(..., { ignoreEncryption: true })` if you wish to load the document anyways. |
| 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 | warnings | WARNING: public/registry/blank/ssa-89.pdf: page 0: shared object 209: in hint table but not computed list | qpdf: operation succeeded with warnings |
| poppler render check | no filled output to render | no filled PDF from the pdf-lib leg to render |
File facts
- Source: https://www.ssa.gov/forms/ssa-89.pdf (issuer page: here)
- Blank tested: ssa-89.pdf · 51 KB · sha256
c47e19193c0d1f4897f82f4ac07d866e3e818f478a31ad8070156dfcefc49f7a - License: US federal government work — public domain (17 U.S.C. § 105). The hash-verified blank is redistributed here unmodified.
- Structure: ? pages · no AcroForm · encrypted
- Fields: not enumerable on the unmodified file (post-load access failed: Error: Expected instance of PDFDict, but got instance of undefined)
Quirks & limitations
- Signed by borrowers in nearly every US mortgage closing (SSN verification consent under the CBSV program), so document-prep systems fill it constantly.
- ssa.gov refuses plain curl/script fetches of this file; the blank here was retrieved through a real browser session. Automate the FILL, and fetch the blank once by hand or through a browser lane.
Tested request
The unmodified blank is rejected at parse time, so there is no working direct request to show — see the quirks above for the verified decrypt-first workaround.
Frequently asked
Can I fill the Form SSA-89 programmatically?
Not directly with pdf-lib-family tooling — the unmodified blank ships encrypted, and pdf-lib and the pdfops API refuse it at parse time. Verified workaround: decrypt first (qpdf --decrypt), after which it fills as a normal AcroForm; pypdf with the cryptography extra opens it directly (text fields only). pdftk-java fills the encrypted blank natively — 23 fields across all field types via fill_form, no decrypt step — and writes a decrypted output.
Why do PDF libraries reject the Form SSA-89?
The blank is AES-encrypted with an empty user password: anyone can open it in a viewer, but the owner password restricts modification, and strict parsers refuse the file outright. qpdf --decrypt removes the restriction losslessly; pypdf can open it directly when its optional cryptography dependency is installed; pdftk-java both reads and fills it natively (its output is decrypted).
← All forms in the registry · Inspect your own PDF · Make a flat PDF fillable