Registry entry
Denmark Personal Income Tax Return (Oplysningsskemaet) — Employee/Pensioner Filer
Denmark's annual personal income tax return, "Oplysningsskemaet" (form 04.003), issued by Skattestyrelsen (the Danish Tax Agency) to taxpayers exempt from the digital-filing duty (e.g. exempt from Digital Post, or not subject to VAT/payroll-tax registration). This schema is deliberately bounded to the single most common filer profile — an employee or pensioner with no self-employment/business income — and models the return's own page 1-2 content in full: the applicant's name/address and CPR identification, the spouse's CPR, every personal-income and personal-income-deduction rubrik that carries its own fillable box on this paper specimen, every capital-income and capital-income-deduction rubrik with its own fillable box, the ligningsmæssige fradrag (itemized deductions) section, and the owner-occupied-housing (ejendomsværdiskat) information-confirmation checkboxes. It deliberately does NOT model: any rubrik marked "Felt låst" (locked) or "Anvend blanket ..." (use a separate companion form) on the source PDF — this registry's coordinate-based extraction (see VERIFICATION.md) confirmed these rubrikker carry no corresponding AcroForm widget on this specimen at all, because Skattestyrelsen pre-fills them from third-party data (employer/bank/pension reports) or routes them to a dedicated companion form (04.071, 04.072) instead; and it does not model pages 3-4 (Virksomhedsbeløb / Virksomhedsoplysninger — the self-employment, sole-proprietorship accounting, and virksomhedsordning/kapitalafkastordning sections), which are open backlog candidates for a future companion schema, the same treatment this registry has already given the Czech Republic's own base-return-plus-Přílohy sequence. It does not submit the return; the live source (skat.dk / TastSelv) is always authoritative. GovSchema is independent and is not affiliated with, endorsed by, or operated by the Kingdom of Denmark or Skattestyrelsen.
Registry entry
dk/skattestyrelsen/oplysningsskemaet
Machine access
- Schema document
registry/dk/skattestyrelsen/oplysningsskemaet/1.0.0/schema.jsonapplication/schema+json- Verification record
registry/dk/skattestyrelsen/oplysningsskemaet/1.0.0/VERIFICATION.mdtext/markdown- Registry catalog
registry/index.jsonone record per schema id
Field reference
34 fields, read from the published schema.json, with names, types, requiredness, and validation as the document states them. The live government form remains the authoritative source.
Fields
-
applicantNameAndAddressstring requiredThe taxpayer's full name and postal address, as printed/corrected on the return. On the source PDF this is one wide, multi-line free-text box (Text field #1) occupying the left column of the page 1 header.
length: 0–500classification: pii -
applicantCivilRegistrationNumberstring requiredThe taxpayer's 10-digit Danish CPR number (personnummer), a single-line text box in the page 1 header's right column.
patternclassification: sensitive-pii -
spouseCivilRegistrationNumberstring optionalThe 10-digit Danish CPR number (personnummer) of the taxpayer's spouse, if married, a single-line text box directly below the applicant's own CPR box in the page 1 header.
patternclassification: sensitive-pii -
otherPersonalIncomeSubjectToLaborMarketContributionnumber optionalOther personal income subject to the 8% labour-market contribution (AM-bidrag), e.g. income from private childminding (privat dagpleje). The sole fillable rubrik in the 'Personlig indkomst, hvoraf der skal betales AM-bidrag' section on this specimen; every other rubrik in that section (11, 12, 14) is Skattestyrelsen-prefilled/redirected and carries no widget.
classification: financial -
maintenancePaymentsReceivednumber optionalMaintenance/alimony payments received (underholdsbidrag), personal income not subject to the labour-market contribution.
classification: financial -
returnOnHybridBondsnumber optionalReturn on hybrid bonds (afkast på hybride obligationer), personal income not subject to the labour-market contribution.
classification: financial -
otherPersonalIncomeNotSubjectToLaborMarketContributionnumber optionalOther personal income not subject to the labour-market contribution, e.g. minor employee benefits with a combined value over DKK 1,400, income from long-term subletting of a rented or cooperative housing unit, or income from renting out a car or boat.
classification: financial -
employeeInvestmentCompanyDividendnumber optionalDividend received from an employee investment company (medarbejderinvesteringsselskab).
classification: financial -
employeeInvestmentCompanyDisposalGainnumber optionalDistribution and gain on disposal of shares in an employee investment company.
classification: financial -
investmentDeductionRecapturenumber optionalRecapture (re-taxation) of a previously claimed investor deduction (investorfradrag).
classification: financial -
lifelongPensionContributionnumber optionalContributions and premiums paid to privately-taken-out lifelong pension schemes with recurring payouts, including cessation pension schemes (ophørspensionsordninger) for self-employed persons; see rubrik 24 in relation to rubrik 21 (Skattestyrelsen-prefilled, not modelled here).
classification: financial -
startupAccountDeductibleDepositnumber optionalDeductible deposit paid into a start-up account (iværksætterkonto).
classification: financial -
foreignGuestStudentDeductionnumber optionalDeduction for certain foreign guest students who began their studies after 2010.
classification: financial -
otherPersonalIncomeDeductionsnumber optionalOther deductions in personal income not covered by a more specific rubrik on this return.
classification: financial -
bondGainLossRegulatedMarketnumber optionalGain or loss on Danish bonds admitted to trading on a regulated market. Deductible losses are entered with a minus sign.
classification: financial -
creditAssociationRefundDistributionnumber optionalReserve-fund distributions from credit associations, amounts passed on by an adviser from bond-based investment institutions/investment companies, capital-value increases on pension schemes, and customer-scheme amounts.
classification: financial -
shippingPartnershipResultnumber optionalSurplus/deficit from certain shipping projects (deficit entered with a minus sign), and surplus from other limited-partnership business activity (anpartsvirksomhed).
classification: financial -
shippingPartnershipDisposalGainnumber optionalGain or loss on cessation of certain shipping projects, and gain on cessation of other limited-partnership business activity.
classification: financial -
partYearRentalIncomenumber optionalIncome from renting out a year-round residence for part of the year; summer-house and room rental; income from renting out one flat in a two-family house; and income from renting out housing generally (owner-occupied, rental, or cooperative housing).
classification: financial -
financialContractsIncomenumber optionalIncome relating to financial contracts.
classification: financial -
otherCapitalIncomenumber optionalOther capital income not covered by a more specific rubrik on this return.
classification: financial -
bondGainLossUnregulatedMarketnumber optionalGain or loss on Danish bonds not admitted to trading on a regulated market.
classification: financial -
commutingDeductionnumber optionalCommuting deduction (transport between home and workplace).
classification: financial -
travelExpensesDeductionnumber optionalTravel-expense deduction (deduction for meals and lodging while travelling for work), capped at DKK 32,800 per the form's own printed limit.
range: −∞–32800classification: financial -
fishermenDISIncomeDeductionnumber optionalDeduction for fishermen, and for DIS (Danish International Ship Register) income on vessels in limited/restricted trade.
classification: financial -
investorDeductionnumber optionalInvestor deduction (investorfradrag) claimed under the itemized-deductions section.
classification: financial -
establishmentAccountDeductibleDepositnumber optionalDeductible deposit paid into an establishment account (etableringskonto).
classification: financial -
otherEmployeeExpensesnumber optionalOther employee expenses. Per the form's own instruction, the first DKK 7,300 of such expenses must already be deducted before entering the remaining amount here.
classification: financial -
protectedBuildingExpensesnumber optionalExpenses relating to listed/protected buildings (fredede bygninger).
classification: financial -
tradesmenDeductionnumber optionalTradesmen's/craftsmen's deduction (håndværkerfradrag), capped at DKK 8,600 per the form's own printed limit.
range: −∞–8600classification: financial -
serviceDeductionnumber optionalHousehold-service deduction (servicefradrag), capped at DKK 17,500 per the form's own printed limit.
range: −∞–17500classification: financial -
sicknessOccupationalInjuryInsuranceForCoWorkingSpousenumber optionalDeduction for sickness and occupational-injury insurance, for persons who receive income as a co-working spouse (medarbejdende ægtefælle).
classification: financial -
ownerOccupiedPropertyInfoAgreedboolean optionalConfirms the taxpayer agrees that the property information Skattestyrelsen already holds about their owner-occupied property/properties, used to calculate ejendomsværdiskat (property value tax), is complete and correct.
-
ownerOccupiedPropertyInfoDisputedboolean optionalIndicates the taxpayer disagrees with the property information Skattestyrelsen holds, or has an owner-occupied property Skattestyrelsen has no information about. Per the form's own instruction, checking this box requires enclosing supporting documents (bilag) about ejendomsværdiskat for the property/properties concerned.
Verification record
Candidate selection
This session's brief (GOV-2253, "GovSchema Standard Research") re-confirmed the four legacy-named National ID candidates (DE Steuer-ID, SG NRIC, NZ RealMe, "remaining voter registration") are all already resolved, then picked up Denmark's remaining vertical backlog. Denmark opened as the registry's 33rd jurisdiction via dk/um/application-for-danish-passport (GOV-2244, Passport, 1/6 verticals); CATALOG.md's own Known Gaps section (item 4) had flagged genuine, fresh, unauthenticated AcroForm-PDF candidates for Denmark's DMV and Taxes verticals as strong enough to author, without naming a specific agency or form.
Both were screened fresh this cycle:
- DMV: Færdselsstyrelsen's driving-licence application, form P23 (
https://cdn.fstyr.dk/faerdselsstyrelsen/Media/638554152455559004/Ansøgning%20om%20kørekort%20-%20(P23).pdf, created June 2024) is a genuine, current, fillable AcroForm — but it resolves to 397 raw field names structured as a shared record card with 18 repeated licence-category blocks (proeve/kategori/paategningskode), filled progressively over the licence's lifetime by driving schools, police, kommune, and examiners — only ~15 fields are actually applicant-entered, and the document is not fundamentally a citizen-facing intake form. Motorstyrelsen's vehicle-registration/re-registration flow (motorregister.skat.dk) is exclusively MitID/TastSelv-login-gated, no static-form fallback. Two further downloadable Motorstyrelsen forms (21.063 border-plate registration, 21.115 import-vehicle inspection/registration) are current but carry zero AcroForm fields — flat print specimens. DMV was set aside as a poor candidate. - Taxes: Skattestyrelsen's form 04.003, "Oplysningsskemaet" (the personal income tax return issued to taxpayers exempt from the digital filing duty), is a genuine, current, fillable AcroForm with a field-by-field printed rubrik/felt-nr numbering scheme baked directly into the document's own text layer — no separate vejledning/guide document exists or is needed. Taxes was picked.
Source
- URL:
https://skat.dk/media/ftiduwhm/04003_januar2026-t.pdf - Fetched fresh this session with a plain HTTP GET: HTTP 200,
461,975bytes, confirmed a genuine PDF (%PDF-1.7header) containing an/AcroFormdictionary. - Edition: January 2026, for indkomstår (tax year) 2025 — the form's own footer prints
04.003 Skattestyrelsen er en del af Skatteforvaltningen 2026.01on every page, and page 1 states the filing deadline as "Husk fristen den 1. juli 2026" (1 July 2026), consistent with a 2025 tax-year return filed in 2026. - No separate companion vejledning/guide document was needed or found: every input row on the form's own 4 pages is printed as
[label] [Rubrik #] [optional lock/redirect note] [Felt nr. #], giving a complete, self-documenting rubrik map directly in the specimen's own text content stream.
Extraction technique
pdfjs-dist (build/pdf.js, loaded via require() from a cached /tmp/node_modules install, same environment used by prior cycles) was used for three independent passes, not one:
doc.getFieldObjects()— resolved 109 distinct field names across the document's 4 pages (99Txtext fields, ~10Btncheckbox/radio widgets). Field names are entirely generic (Text field #1..#94,Knap_1..Knap_10,Radioknap_1..Radioknap_5) — no self-documenting names, unlike some other jurisdictions' specimens in this registry.page.getTextContent()clustered into visual lines — each text item'stransform[4]/transform[5](x/y) was used to group items into rows (items within 2.5pt of the same y treated as one printed line), then lines sorted top-to-bottom per page. This reconstructed the full rubrik/felt-nr table for all 4 pages independent of any AcroForm metadata.page.getAnnotations()widget rects cross-referenced against the clustered lines — for everyTxwidget, its own rect's y-range (rect[1]torect[3]) was checked against which clustered line(s) fall inside that exact vertical span, rather than assuming the field-name numbering (#1, #2, #3...) matches visual reading order. This distrust was deliberate: the raw field-name sequence is demonstrably not a reliable position proxy on this specimen — e.g.Text field #93and#94are interleaved out of numeric order between#28/#29andKnap_3/#32respectively, yet sit in the visually correct row on the page. A purely name-ordered mapping would have silently mis-attributed several rows.
The "locked/redirected rows have no widget" finding (disclosed, not assumed)
Walking every Tx widget's rect against the clustered lines on pages 1-2 turned up an exact, exhaustive 1:1 correspondence: every rubrik row printed with a "Felt låst" (locked) or "Anvend blanket 04.071/04.072" (use companion form) annotation has literally no AcroForm widget anywhere on this specimen. This was checked exhaustively, not sampled:
- Page 1 body: 20 rubrik rows total (11, 12, 14, 15, 16, 17, 18, 19, 347, 251, 20, 784, 785, 786, 21, 23, 24, 27, 437, 29); 9 carry a lock/redirect annotation (11, 12, 14, 16, 17, 18, 347, 21, 23); the remaining 11 (15, 19, 251, 20, 784, 785, 786, 24, 27, 437, 29) have no annotation and map 1:1, in rect order, onto the page's 11 body widgets (
Text field #4through#14). - Page 2 body: 22 rubrik/amount rows (32, 33, 34, 35, 36, 37, 346, 39, 40, 41, 42, 43, 44, 50, 51, 52, 53, 54, 55, 447, 448, 56, 449, 57, 58, 59, 460, 461, 466, 961) plus 2 checkbox rows (166, 167); 12 of the amount rows carry a lock/redirect annotation (34, 41, 42, 43, 44, 50, 52, 55, 447, 448, 56, 466); the remaining 18 amount rows (32, 33, 35, 36, 37, 346, 39, 40, 51, 53, 54, 449, 57, 58, 59, 460, 461, 961) plus the 2 checkbox rows map 1:1, in rect order, onto the page's 18 body text widgets (
Text field #15,#15-2,#16-#21,#22-#30,#93) and 2 button widgets (Knap_1,Knap_2). - Zero widgets were left unaccounted for and zero un-annotated rows were left unmatched on either page.
This means the exclusion of locked/redirected rubrikker from this schema is a hard structural fact about the specimen, not an editorial scope choice: Skattestyrelsen's own paper form gives the taxpayer no box to write in for a line it already has from third-party reporting (employer, bank, pension provider) or that it routes to a dedicated companion form (04.071 for certain interest/maintenance items, 04.072 for certain wage/pension/dividend items).
Header-block widget mapping
Three widgets on page 1 cover the header area (Navn og adresse, Personnummer, Ægtefællens personnummer, plus purely-informational Skattekommune/Skatteprocenter/Kommune/Kirke/Personfradrag/Indregnet restskat figures), disambiguated by rect geometry rather than assumed:
Text field #1: rectx 56.7–307.4, y 669.9–745.5,multiLine: true— a wide box on the page's left column spanning ~76pt vertically, matching the free-text "Navn og adresse" block.Text field #2: rectx 449.4–575.4, y 766.6–779.8— a narrow single-line box in the right column at the "Personnummer" row height.Text field #3: rectx 449.4–575.4, y 740.4–753.6— an identically narrow single-line box directly below, at the "Ægtefællens personnummer" row height.
No other widget exists in the header region — Skattekommune, Skatteprocenter, Kommune, Kirke, Personfradrag, and "Indregnet restskat 2023" are pure Skattestyrelsen-supplied reference figures printed for the specific addressee and are not modelled.
Scope decision: pages 1-2 only (employee/pensioner filer)
This schema models pages 1-2 in full (Personlig indkomst, Kapitalindkomst, Fradrag i kapitalindkomst, Ligningsmæssige fradrag, and the ejendomsværdiskat confirmation checkboxes) and deliberately excludes pages 3-4 (Virksomheds ophør, Virksomhedsbeløb, Øvrige virksomhedsoplysninger, Kapitalafkastordning, Virksomhedsordning, Særlig kapitalafkastberegning, and Virksomhedsoplysninger/regnskab/revisor disclosure) — the self-employment/sole-proprietorship accounting sections. These pages are confirmed present and well-populated with their own fillable widgets (not screened field-by-field this cycle) and are left as an open backlog candidate for a future companion schema, the same treatment this registry already gives the Czech Republic's own base-return-plus-Přílohy sequence (cz/mf/priznani-k-dani-z-prijmu-fyzickych-osob plus Přílohy č. 1-4). Page 1's own printed text reinforces that this form's own designers already route business income elsewhere: "Resultat af udenlandsk virksomhed skal angives på blanket 04.011."
Money amounts are modelled as type: "number" representing whole Danish kroner (DKK), the convention this registry already uses for other jurisdictions whose forms print unlabelled currency-unit boxes (e.g. cz/mf/*, pt/at/declaracao-rendimentos-irs-modelo-3). The three form-printed deduction caps (travelExpensesDeduction ≤ DKK 32,800, tradesmenDeduction ≤ DKK 8,600, serviceDeduction ≤ DKK 17,500) are encoded as validation.maximum, taken directly from the amounts printed in each row's own label text ("- højst 32.800 kr.", "- højst 8.600 kr.", "– højst 17.500 kr.").
Field-by-field source mapping
All 34 fields cite their exact Rubrik <N> / Felt nr. <N> pair (or, for the 3 header fields, the specific page-1 header box) directly in sourceRef — see schema.json. Every citation was read from the clustered-line text extracted directly from the live PDF this session, not copied from any secondary source.
Mock conformance test run
Two scenarios were built under conformance/dk/skattestyrelsen/oplysningsskemaet/1.0.0/ and checked against this schema's required/validation grammar with a disposable checker script (/tmp/gov2253/check_conformance.mjs, not committed — same technique used across this registry's other v1.0.0 cycles):
application-packet-minimal-required-only.json: only the two required identity fields filled (name/address, CPR). 2 fields collected, 32 correctly not-applicable, 0 errors.application-packet-full-employee-filer.json: a salaried employee with a spouse, minor personal/capital income, several itemized deductions at or under their printed caps, and both ejendomsværdiskat checkboxes set. 13 fields collected, 21 correctly not-applicable, 0 errors.- Four mutation/negative controls, each derived from a base scenario with exactly one defect introduced, each correctly raised the expected error:
- Removing the required
applicantCivilRegistrationNumber→missing-required. - Setting
applicantCivilRegistrationNumberto"12345"(violatespattern: ^[0-9]{10}$) →pattern-violation. - Setting
tradesmenDeductionto15000(exceeds the printed DKK 8,600 cap) →maximum-violation. - Setting
serviceDeductionto20000(exceeds the printed DKK 17,500 cap) →maximum-violation.
- Removing the required
The schema was also validated against the GovSchema v0.3 meta-schema with node tools/validate-ajv.mjs (passes standalone) and node tools/validate.mjs (passes against the full registry, 346/346 documents after this addition, 3/3 mapping.json companions).
Scope and jurisdiction notes
This document models Denmark's Taxes vertical (2/6 for Denmark; DMV, Business Formation, Visa, and National ID & Civic Documents remain open, unscreened-or-screened-and-set-aside backlog candidates — see CATALOG.md's Known Gaps section). It does not submit the return on the taxpayer's behalf; the live source (skat.dk / TastSelv) is always authoritative. GovSchema is independent and is not affiliated with, endorsed by, or operated by the Kingdom of Denmark or Skattestyrelsen.
View the raw record (VERIFICATION.md)
Version history
-
1.0.0draftlatestthis pagehas verification recordschema.json
Independent and non-affiliated
GovSchema is an independent, open-source project. This reference is not produced, reviewed, or endorsed by Skattestyrelsen (Danish Tax Agency) or any government. The authoritative source is always the live government form and its official instructions.