Registry

OPM Optional Form 306 — programmatic fill compatibility

Declaration for Federal Employment · US Office of Personnel Management (OPM) · Revised October 2019. 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 flatten38/38 supported fields landed; flatten=true byte-deterministic (sha256 8a2c33f31d3c…)
pdf-lib1.17.1verified (38/38)38 fields filled in-process
@cantoo/pdf-lib (fork)2.6.5verified (38/38)38 fields filled in-process
pypdf6.15.0text fields verified (25/25)25 text fields written and re-read (text fields only)
pdftk-java3.3.3verified (38/38)38 fields filled via FDF and re-dumped
qpdf --check11.9.0warningsWARNING: public/registry/blank/opm-of-306.pdf: page 2: shared object 633: in hint table but not computed list | qpdf: operation succeeded with warnings
poppler render check24.02.0values render (25/25)25/25 filled text values present in pdftotext output of the pdf-lib-filled file; page-1 raster sha256 8ddb82581522…

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

curl -X POST https://pdfops.dev/api/fill-form \
  -F "pdf=@opm-of-306.pdf" \
  -F 'fields={"Name":"Jane Doe","SSN":"Jane Doe"}' \
  -F "flatten=true" \
  -o filled.pdf

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

Field schema

All 40 fields (name, type, maxLength, options)
Field nameTypemaxLengthOptions
NameTextField
SSNTextField
PlaceBirthTextField
CitizenRadioGroup2 options
CitizenCountryTextField
BirthdateTextField
OtherNamesTextField
DayPhoneTextField
NightPhoneTextField
MaleRadioGroup2 options
SelectiveServiceRadioGroup2 options
MilitaryRadioGroup2 options
Branch1TextField
From1TextField
To1TextField
Discharge1TextField
Branch2TextField
Branch3TextField
From2TextField
From3TextField
To2TextField
To3TextField
Discharge2TextField
Discharge3TextField
ConvixtedRadioGroup2 options
Court-MartialRadioGroup2 options
CurrentChargesRadioGroup2 options
FiredRadioGroup2 options
DebtRadioGroup2 options
RelativesRadioGroup2 options
RetirementRadioGroup2 options
ExplanationTextField
LeaveLastJobTextField
CancelWaiverRadioGroup3 options
BasicLifeInsuranceRadioGroup3 options
ApplicantDateTextField
AppointingOfficerDateTextField
AppointeeDateTextField
ApplicantSignSignature
AppointeeSignSignature

Frequently asked

Can I fill the OPM Optional Form 306 programmatically?

Yes — the blank Revised October 2019 OPM Optional Form 306 is a fillable AcroForm with 40 fields. In our tested run, all 38 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 listed in the schema on this page.

Can the OPM Optional Form 306's signature fields be filled via API?

No — the form has 2 true digital-signature field(s), which require a certificate-based signing workflow. Value-filling APIs (pdfops included) list them at inspection but skip them rather than faking a value. All other field types on the form filled and verified normally.