Registry entry
Finland Residence Permit Application for an Employed Person (Työntekijän oleskelulupahakemus, OLE_TY1 / 'TTOL')
Maahanmuuttovirasto's (the Finnish Immigration Service, Migri) form OLE_TY1, the residence permit application for an employed person ('TTOL'), used by a non-EU/EEA national coming to Finland to work for a Finnish (or Finland-operating) employer under a signed employment contract or accepted binding job offer, subject to labour market testing (the employer must first check whether suitable labour is available within the EU/EEA). A single bounded 10-page English-language fillable AcroForm PDF covering: the applicant's own personal details, passport, and digital-passport-photo details (sections 1-3); home-country and Finland contact information (section 4); intended residence in Finland, applicable only to first-time applicants (section 5); the applicant's spouse and up to 3 children under 18 (section 6); the sponsoring employer's own details (section 7); the terms of employment — occupation, working time, grounds for pay, and up to 3 taxable fringe-benefit rows — required only when the employer lacks Migri's own employer certification (section 8); criminal history and entry-ban questions covering conduct outside Finland only, since Migri obtains Finland-internal records itself (section 9); free-text additional information (section 10); a supporting-attachments checklist with up to 4 free-form 'other attachment' rows (section 11); informational text on personal-data processing with no fillable fields (section 12); and the final date/place/signature/declaration block (section 13). Opens Finland as GovSchema's 34th jurisdiction, via one of GovSchema's weakest-covered verticals (Visa). This document describes the form only; it does not submit anything, and does not imply Finnish government endorsement.
Registry entry
fi/migri/residence-permit-employed-person
Authoritative source OLE_TY1, 'Residence permit application for an employed person (\'TTOL\')', Migri's own English-language fillable AcroForm PDF
Machine access
- Schema document
registry/fi/migri/residence-permit-employed-person/1.0.0/schema.jsonapplication/schema+json- Verification record
registry/fi/migri/residence-permit-employed-person/1.0.0/VERIFICATION.mdtext/markdown- Registry catalog
registry/index.jsonone record per schema id
Field reference
134 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
-
applicationTypeenum requiredThe form's own two mutually-exclusive cover-page checkboxes ('a first residence permit' / 'an extended permit'), implemented on the source PDF as two independent checkbox widgets (Haen_ensimmaista_oleskelulupaa / Haen_jatkolupaa), not a shared radio group.
enum: first_permit | extended_permit -
lastNamestring requiredLast name
length: 1–200classification: pii -
firstNamesstring requiredFirst names
length: 1–200classification: pii -
formerLastNamesstring optionalFormer last names (if any)
length: 0–300classification: pii -
formerFirstNamesstring optionalFormer first names (if any)
length: 0–300classification: pii -
genderenum requiredThe form's own two-option 'Gender' checkbox pair (no third option is printed on this form).
enum: female | maleclassification: sensitive-pii -
dateOfBirthdate requiredThe source PDF splits this date across three separate day/month/year text-field widgets (dd.mm.yyyy); combined here into a single ISO date field, per this registry's established convention for split date widgets.
classification: sensitive-pii -
finnishPersonalIdentityCodestring optionalFinnish personal identity code (if applicable)
length: 0–20classification: sensitive-pii -
countryOfBirthstring requiredCountry of birth
length: 1–100classification: pii -
placeOfBirthstring requiredPlace of birth
length: 1–200classification: pii -
currentCitizenshipstring requiredCurrent citizenship(s)
length: 1–200classification: pii -
formerCitizenshipstring optionalFormer citizenship(s) (if any)
length: 0–200classification: pii -
maritalStatusenum requiredMarital status
enum: unmarried | married | cohabiting | divorced | widowed | registered_partnership -
currentOccupationstring optionalCurrent occupation
length: 0–200 -
educationLevelstring optionalEducation
length: 0–200 -
nativeLanguagestring requiredNative language
length: 1–100 -
preferredContactLanguageenum requiredLanguage you wish to use
enum: finnish | swedish | english -
passportNumberstring requiredPassport number
length: 1–50classification: sensitive-pii -
passportTypeenum requiredThe form's own 6 mutually-exclusive passport-type checkboxes, including 'I do not have a passport' as one of the options.
enum: ordinary | official_diplomatic | refugee_travel_document | aliens_passport | other | no_passport -
passportTypeOtherDescriptionstring optionalPassport type — other, please specify
length: 0–200 -
noPassportExplanationstring optionalI do not have a passport. Explain why not
length: 0–500 -
passportCountryOfIssuestring optionalCountry of issue
length: 0–100classification: pii -
passportIssuingAuthoritystring optionalIssuing authority
length: 0–200 -
passportDateOfIssuedate optionalThe source PDF splits this date across three separate day/month/year text-field widgets (dd.mm.yyyy); combined here into a single ISO date field.
-
passportDateOfExpirydate optionalThe source PDF splits this date across three separate day/month/year text-field widgets (dd.mm.yyyy); combined here into a single ISO date field.
-
hasDigitalPassportPhotoboolean requiredDo you have a digital passport photo?
-
digitalPassportPhotoRetrievalCodestring optionalRetrieval code for your digital passport photo
length: 0–50 -
homeStreetAddressstring requiredStreet address (in place of residence)
length: 1–300classification: pii -
homePostalCodestring requiredPostal code (in place of residence)
length: 1–50classification: pii -
homeCitystring requiredCity/town (in place of residence)
length: 1–150classification: pii -
homeCountrystring requiredCountry (in place of residence)
length: 1–100classification: pii -
homeTelephonestring requiredTelephone number (in place of residence)
length: 1–50classification: pii -
homeEmailstring requiredEmail address (in place of residence)
length: 1–200classification: pii -
finlandStreetAddressstring optionalStreet address in Finland (if different from above)
length: 0–300classification: pii -
finlandPostalCodestring optionalPostal code in Finland (if different from above)
length: 0–50classification: pii -
finlandCitystring optionalCity/town in Finland (if different from above)
length: 0–150classification: pii -
finlandTelephonestring optionalTelephone number in Finland (if different from above)
length: 0–50classification: pii -
finlandEmailstring optionalEmail address in Finland (if different from above)
length: 0–200classification: pii -
intendedMoveToFinlandDatedate optionalThe source form instructs: 'Fill in this section only if you are applying for a first residence permit.' The source PDF splits this date across three separate day/month/year widgets; combined here into a single ISO date field.
-
arrivalInFinlandDatedate optionalOnly applicable if the applicant is already physically in Finland while applying for a first residence permit. The source PDF splits this date across three separate day/month/year widgets; combined here into a single ISO date field.
-
intendedLengthOfStaystring optionalThe source form instructs: 'Fill in this section only if you are applying for a first residence permit.'
length: 0–300 -
noSpouseboolean optionalNo spouse
-
spouseLastNamestring optionalSpouse: last name
length: 0–200classification: pii -
spouseFirstNamesstring optionalSpouse: first names
length: 0–200classification: pii -
spouseFormerLastNamesstring optionalSpouse: former last names (if any)
length: 0–300classification: pii -
spouseFormerFirstNamesstring optionalSpouse: former first names (if any)
length: 0–300classification: pii -
spouseGenderenum optionalSpouse: gender
enum: female | maleclassification: sensitive-pii -
spouseDateOfBirthdate optionalThe source PDF splits this date across three separate day/month/year widgets; combined here into a single ISO date field.
classification: sensitive-pii -
spouseFinnishPersonalIdentityCodestring optionalSpouse: Finnish personal identity code (if applicable)
length: 0–20classification: sensitive-pii -
spouseCountryOfBirthstring optionalSpouse: country of birth
length: 0–100classification: pii -
spousePlaceOfBirthstring optionalSpouse: place of birth
length: 0–200classification: pii -
spouseCurrentCitizenshipstring optionalSpouse: current citizenship(s)
length: 0–200classification: pii -
spouseApplyingSimultaneouslyboolean optionalThe spouse must fill in a separate application form, per the source form's own note.
-
noChildrenUnder18boolean optionalNo children
-
child1LastNamestring optionalThe form provides 3 rows for children under 18 ('If you have more than three children, give the same details of your other children as a separate attachment.'); bounded to 3 rows here, matching the source's own printed row count.
length: 0–200classification: pii -
child1FirstNamesstring optionalChild 1: first names
length: 0–200classification: pii -
child1Genderenum optionalChild 1: gender
enum: female | male -
child1DateOfBirthdate optionalThe source PDF splits this date across three separate day/month/year widgets; combined here into a single ISO date field.
classification: sensitive-pii -
child1ApplyingSimultaneouslyboolean optionalA separate application form must be filled in for the child, per the source form's own note.
-
child2LastNamestring optionalChild 2: last name
length: 0–200classification: pii -
child2FirstNamesstring optionalChild 2: first names
length: 0–200classification: pii -
child2Genderenum optionalChild 2: gender
enum: female | male -
child2DateOfBirthdate optionalThe source PDF splits this date across three separate day/month/year widgets; combined here into a single ISO date field.
classification: sensitive-pii -
child2ApplyingSimultaneouslyboolean optionalA separate application form must be filled in for the child, per the source form's own note.
-
child3LastNamestring optionalChild 3: last name
length: 0–200classification: pii -
child3FirstNamesstring optionalChild 3: first names
length: 0–200classification: pii -
child3Genderenum optionalChild 3: gender
enum: female | male -
child3DateOfBirthdate optionalThe source PDF splits this date across three separate day/month/year widgets; combined here into a single ISO date field.
classification: sensitive-pii -
child3ApplyingSimultaneouslyboolean optionalA separate application form must be filled in for the child, per the source form's own note.
-
employerNamestring requiredName of company
length: 1–300 -
employerBusinessIdstring requiredInstead of a Business ID, the form permits stating the personal identity code of a private individual who is the applicant's employer.
length: 1–50 -
employerStreetAddressstring requiredEmployer: street address
length: 1–300 -
employerPostalCodestring requiredEmployer: postal code
length: 1–50 -
employerCitystring requiredEmployer: city/town
length: 1–150 -
employerCountrystring requiredEmployer: country
length: 1–100 -
employerContactNamestring optionalThe person who will give additional information on behalf of the employer if needed.
length: 0–200classification: pii -
employerContactTelephonestring optionalTelephone number of contact person
length: 0–50 -
employerContactEmailstring optionalEmail address of contact person
length: 0–200 -
jobOccupationstring requiredThe source form instructs: 'Fill in section 8 only if your employer has no employer certification.' A certified employer instead attaches its own certification in lieu of section 8; this schema still models every section-8 field for the (more common, for a first-time applicant's employer) uncertified case.
length: 1–200 -
mainDutiesstring requiredMain duties
length: 1–1000 -
workingTimeBasisenum requiredThe form's own 'Choose one' instruction over 4 mutually-exclusive working-time bases.
enum: per_week | over_three_weeks | per_month | other -
workingTimeHoursPerWeeknumber optionalWorking time: hours per week
range: 0–∞ -
workingTimeHoursPerThreeWeeksnumber optionalWorking time: hours over three weeks
range: 0–∞ -
workingTimeHoursPerMonthnumber optionalWorking time: hours per month
range: 0–∞ -
workingTimeOtherDescriptionstring optionalWorking time: other, please specify
length: 0–300 -
workingTimeOtherHoursnumber optionalWorking time: other — hours
range: 0–∞ -
paymentBasisenum requiredThe form's own 'Choose one' instruction over 3 mutually-exclusive grounds for pay.
enum: hourly | monthly | seasonal_piece_project -
hourlyPayRatenumber optionalHourly pay (EUR per hour)
range: 0–∞classification: financial -
monthlyPayRatenumber optionalMonthly pay (EUR per month)
range: 0–∞classification: financial -
seasonalPieceProjectPayRatenumber optionalChoose this option if paid a lump sum for work done during a certain period (e.g. the entire employment relationship), or per task, piece, season, or project.
range: 0–∞classification: financial -
payPeriodFromdate optionalThe time period for which wages will be paid, when paid a lump sum by season/task/piece/project. The source PDF splits each of the two dates across three separate day/month/year widgets; combined here into single ISO date fields.
-
payPeriodTodate optionalPay period: to
-
benefit1Namestring optionalThe form provides 3 rows to list taxable fringe benefits provided by the employer (such as accommodation benefit, meal allowance, full room and board, commuter tickets, company car, or telephone benefit); bounded to 3 rows here, matching the source's own printed row count.
length: 0–300 -
benefit1PartOfSalaryboolean optionalTaxable fringe benefit 1: as part of the salary
-
benefit1PartOfSalaryValuenumber optionalTaxable fringe benefit 1: taxable value as part of salary (EUR per month)
range: 0–∞classification: financial -
benefit1InAdditionToSalaryboolean optionalTaxable fringe benefit 1: in addition to the salary
-
benefit1InAdditionToSalaryValuenumber optionalTaxable fringe benefit 1: taxable value in addition to salary (EUR per month)
range: 0–∞classification: financial -
benefit1Descriptionstring optionalTaxable fringe benefit 1: description
length: 0–300 -
benefit2Namestring optionalTaxable fringe benefit 2
length: 0–300 -
benefit2PartOfSalaryboolean optionalTaxable fringe benefit 2: as part of the salary
-
benefit2PartOfSalaryValuenumber optionalTaxable fringe benefit 2: taxable value as part of salary (EUR per month)
range: 0–∞classification: financial -
benefit2InAdditionToSalaryboolean optionalTaxable fringe benefit 2: in addition to the salary
-
benefit2InAdditionToSalaryValuenumber optionalTaxable fringe benefit 2: taxable value in addition to salary (EUR per month)
range: 0–∞classification: financial -
benefit2Descriptionstring optionalTaxable fringe benefit 2: description
length: 0–300 -
benefit3Namestring optionalTaxable fringe benefit 3
length: 0–300 -
benefit3PartOfSalaryboolean optionalTaxable fringe benefit 3: as part of the salary
-
benefit3PartOfSalaryValuenumber optionalTaxable fringe benefit 3: taxable value as part of salary (EUR per month)
range: 0–∞classification: financial -
benefit3InAdditionToSalaryboolean optionalTaxable fringe benefit 3: in addition to the salary
-
benefit3InAdditionToSalaryValuenumber optionalTaxable fringe benefit 3: taxable value in addition to salary (EUR per month)
range: 0–∞classification: financial -
benefit3Descriptionstring optionalTaxable fringe benefit 3: description
length: 0–300 -
convictedOfCrimeAbroadboolean requiredThe Finnish Immigration Service obtains information on crimes and suspected crimes committed in Finland itself from official registers; this question and section 9.2 concern only crimes/suspected crimes in other countries.
-
crimeDescriptionstring optionalCrime
length: 0–500classification: sensitive-pii -
crimeCountrystring optionalCountry where the crime took place
length: 0–100classification: sensitive-pii -
crimeDatedate optionalThe source PDF splits this date across three separate day/month/year widgets; combined here into a single ISO date field.
classification: sensitive-pii -
crimePunishmentstring optionalPunishment sentenced for the crime
length: 0–500classification: sensitive-pii -
suspectedOfCrimeAbroadboolean requiredAre you suspected of committing a crime in countries other than Finland?
-
suspectedCrimeDescriptionstring optionalCrime that you are suspected of
length: 0–500classification: sensitive-pii -
suspectedCrimeCountrystring optionalCountry where the suspected crime took place
length: 0–100classification: sensitive-pii -
suspectedCrimeDatedate optionalThe source PDF splits this date across three separate day/month/year widgets; combined here into a single ISO date field.
classification: sensitive-pii -
hasOrHadEntryBanboolean requiredI have or have had an entry ban
-
entryBanCountrystring optionalCountry imposing the entry ban
length: 0–100classification: sensitive-pii -
entryBanValidPeriodstring optionalDuring which time was/is the entry ban valid?
length: 0–300classification: sensitive-pii -
additionalInformationstring optionalAdditional information for the application
length: 0–2000 -
otherAttachment1Includedboolean optionalThe form provides 4 blank rows for any other attachments the applicant wants to name, each with its own checkbox and free-text name field; bounded to 4 rows here, matching the source's own printed row count.
-
otherAttachment1Descriptionstring optionalOther attachment 1: name of document
length: 0–200 -
otherAttachment2Includedboolean optionalOther attachment 2 included
-
otherAttachment2Descriptionstring optionalOther attachment 2: name of document
length: 0–200 -
otherAttachment3Includedboolean optionalOther attachment 3 included
-
otherAttachment3Descriptionstring optionalOther attachment 3: name of document
length: 0–200 -
otherAttachment4Includedboolean optionalOther attachment 4 included
-
otherAttachment4Descriptionstring optionalOther attachment 4: name of document
length: 0–200 -
signatureDatedate requiredThe source PDF splits this date across three separate day/month/year widgets; combined here into a single ISO date field.
-
signaturePlacestring requiredPlace
length: 1–150 -
signatureNameInBlockLettersstring requiredName in block letters
length: 1–200classification: pii
Verification record
Candidate selection
This session's brief (GOV-2276, "GovSchema Standard Research") targeted opening Finland as GovSchema's 34th jurisdiction, via Finland's Visa vertical — one of GovSchema's weakest-covered verticals globally. The target form, Migri's OLE_TY1 ("Residence permit application for an employed person", Finnish short name "TTOL"), had already been scouted in a prior pass as a genuine, unauthenticated, English-language fillable AcroForm PDF, with a rough estimate of ~205 fields across 14 pages. This session re-derived the form's structure entirely from scratch rather than trusting that estimate.
Source
- Scouted URL (from the prior pass): a shorter, un-suffixed
migri.fi/documents/5202425/5790178/...path. Fetched fresh this session with a plain HTTP GET: HTTP 404. The URL as scouted no longer resolves. - Corrected, currently-live URL (found via web search against
migri.fi's own site, which surfaced the form's full CDN path including its UUID suffix):https://migri.fi/documents/5202425/5790178/Ty%C3%B6ntekij%C3%A4n+oleskelulupahakemus+(TTOL),+OLE_TY1+(en)/24dfac76-fe3e-43ab-b61d-94be6f1c6f76/Ty%C3%B6ntekij%C3%A4n+oleskelulupahakemus+(TTOL),+OLE_TY1+(en).pdf. Fetched fresh with a plain HTTP GET: HTTP 200, content-typeapplication/pdf, 477,135 bytes — matching the prior scouting pass's ~477 KB estimate exactly, independently reproduced rather than assumed. Confirmed a genuine PDF (%PDF-1.6header) with an/AcroFormdictionary (a genuine, non-flattened fillable form). - Landing/guidance pages (read for context, not for field extraction — this form is entirely self-documenting via its own printed section numbering 1–13):
migri.fi/en/residence-permit-for-an-employed-personandmigri.fi/en/residence-permit-applications.
Extraction technique
pdfjs-dist v4 (legacy/build/pdf.mjs, installed fresh into a scratch directory) was used for a three-pass technique matching this registry's established is/utl / dk/skattestyrelsen / dk/erst precedent:
page.getAnnotations({ intent: "display" })per page — captured every/Widgetannotation'sfieldName,fieldType(Tx/Btn/Ch),rect,checkBox/radioButtonflags, and export value. Result: exactly 10 pages (not the scouted 14) and exactly 194 distinct AcroForm widgets — 131Txtext fields, 63Btncheckboxes, 0Chchoice fields.annotation.radioButtonwasfalseandannotation.checkBoxwastruefor all 63Btnwidgets — confirming none of the checkbox groups on this form share a PDF radio-group parent; every checkbox is independently named and independently checkable, and mutual exclusivity (e.g. gender, marital status, passport type) is a form-design convention only, not a PDF-structural one. This is the same situation this registry'sat/bmeiaandse/migrationsverketschemas already document.page.getTextContent(), clustered into visual lines by y-coordinate (3pt tolerance) and read in page order — reconstructed the form's full printed English text for all 10 pages independent of any AcroForm metadata. This form's own visible text is entirely in English (Migri's English-language edition of OLE_TY1); the underlying AcroForm field keys are Finnish (e.g.Sukunimi_1_1,Etunimet_1_1) — a deliberate cross-check against relying on the field-name strings as if they were English labels.- Cross-reference: every widget's rect x/y range matched against the clustered text lines by proximity (same line for left/right-column siblings; nearest line above for label-above-blank-field layouts), confirming each field's real label and column order (e.g.
Nainen_1_1["woman"] sits left ofMies_1_1["man"] at x=201 vs x=278, matching the printed "☐ Female ☐ Male" order — not assumed from the Finnish variable names alone).
The 194 widgets were consolidated into 134 fields[] entries plus 6 documents[] entries by exhaustive, script-checked reconciliation (see below) — not a hand count.
Widget → field consolidation
Two categories of widget were combined into single fields, both matching this registry's own established conventions:
- 14 printed day/month/year date splits (
dd.mm.yyyyacross 3 separate text widgets each — 42 widgets total):dateOfBirth,passportDateOfIssue,passportDateOfExpiry,intendedMoveToFinlandDate,arrivalInFinlandDate,spouseDateOfBirth,child1DateOfBirth,child2DateOfBirth,child3DateOfBirth,payPeriodFrom,payPeriodTo,crimeDate,suspectedCrimeDate,signatureDate— each combined into a singletype: "date"field, perdk/cpr/notification-of-entry's andis/utl/other-residence-permit-application's own precedent for split date widgets, with the split disclosed in each field'sdescription. - 15 mutually-exclusive independent-checkbox groups (42 widgets total):
applicationType(2),gender(2),maritalStatus(6),preferredContactLanguage(3),passportType(6),hasDigitalPassportPhoto(2),spouseGender/child1Gender/child2Gender/child3Gender(2 each = 4 groups),workingTimeBasis(4),paymentBasis(3),convictedOfCrimeAbroad/suspectedOfCrimeAbroad/hasOrHadEntryBan(2 each = 3 groups) — each combined into a singleenumorbooleanfield, since no PDF radio-group parent exists to group them structurally.
A disposable reconciliation script (/tmp/fi-migri-extract/reconcile.mjs, not committed) mapped every one of the 194 extracted widget names to exactly one of: a grouped field, a 1:1 single field, or a documents[] checklist widget — with 0 leftover and 0 double-counted widget names, confirmed by set-difference against the full widget list extracted directly from the PDF.
Total: 134 fields[] + 6 documents[] entries. Arithmetic: 14 date groups (42 widgets) + 15 checkbox groups (42 widgets) = 29 grouped fields, consuming 84 widgets; the remaining 110 widgets split into 105 singleton fields[] (1 widget = 1 field each) and 5 documents[] checklist widgets (section 11.1's fixed attachment list, see below). 29 + 105 = 134 fields[]; 5 + 1 (the attestation entry with no widget of its own, also below) = 6 documents[]. The script's own printed output — field count (groups + singles): 134, document checklist widgets: 5, leftover widgets (0), names referenced but not found in PDF (0) — is the authoritative source for these counts; schema.json was generated directly from this mapping, not hand-transcribed from it.
documents[]
5 of section 11.1's fixed attachment-checklist checkboxes were modelled as documents[] entries (matching is/utl/other-residence-permit-application's established convention for checklist blocks) rather than invented per-item boolean fields: colorCopyOfPassportPages, passportPhotoOrRetrievalCode, proofOfLegalStayInCountryOfApplication, formMP1 (conditionally needed only for a first-permit applicant already in Finland, per the form's own note), and termsOfEmploymentForm (required unless the employer holds Migri's own employer certification, per section 8's own note). A 6th documents[] entry, applicantSignatureDeclaration (category attestation), quotes the section 13 declaration paragraph verbatim; it has no corresponding AcroForm widget of its own — the physical signature line is not a fillable text field on this specimen, only the date/place/name-in-block-letters fields are.
Section 11.1's 4 free-form "other attachment" rows (a checkbox + a free-text name field per row) are, by contrast, modelled as ordinary bounded-repeating-group fields[] (otherAttachment1Included/ otherAttachment1Description … otherAttachment4...), since they are applicant-named, not fixed document types.
Disclosed scope decisions
- Section 5 ("Residence in Finland") carries the form's own printed instruction "Fill in this section only if you are applying for a first residence permit." Since
applicationType(first_permit / extended_permit) already exists as a field on this form, this gating is expressed structurally viavisibleWhen/requiredWhenagainstapplicationType, not left as prose alone. - Section 8 ("Terms of employment") carries the form's own printed instruction "Fill in section 8 only if your employer has no employer certification." Unlike section 5, there is no corresponding "is my employer certified?" field anywhere on the form to gate against structurally, so this remains disclosed in the field
description/sourceRefonly; all section 8 fields are modelled asrequired: true, matching the more common case (a first-time applicant's employer, not yet Migri-certified). - Gender is modelled as a 2-value enum (
female/male) — this form prints no third option, unlikeis/utl/other-residence-permit-application's 3-option ("Female"/"Male"/"Non binary/Other") D-110 form. Confirmed by reading the raw text stream at every gender checkbox row on this specimen (applicant, spouse, and all 3 child rows): none print a third option. - Children (section 6.2) and "other attachments" (section 11.1) are each disclosed, bounded repeating groups — 3 rows and 4 rows respectively, matching the source's own printed row counts exactly — flattened to numbered slots (
child1…child3,otherAttachment1…otherAttachment4) per this registry's established repeating-group convention, since GovSchema's flat field model (SPEC.md §6.1) has no array/nested-object field type.
Mock conformance test run
Two scenarios and eight mutation/negative controls were built and checked against this schema's own required/requiredWhen/visibleWhen/ validation/crossFieldValidation grammar with a disposable checker script (/tmp/fi-migri-extract/check_conformance.mjs, not committed — same technique as this registry's other recent cycles):
application-minimal-extended-permit-no-dependents.json: a Finnish applicant renewing/extending their own permit (applicationType: extended_permit, so section 5 is not visible/required), with no spouse, no children, an ordinary passport with no digital photo, a monthly-paid software-developer role, and no criminal-history/entry-ban disclosures. 44 fields collected, 90 correctly not-applicable (spouse/children detail fields, section 5's first-permit-only fields, fringe-benefit rows, working-time/pay-basis alternatives not chosen, criminal/entry-ban detail fields, other-attachment rows), 0 errors.application-full-coverage-first-permit-with-family.json: a maximal-coverage scenario — an Indian software engineer applying for a first residence permit (applicationType: first_permit, activating section 5) to work for a Finnish employer, with a spouse and 2 children applying simultaneously, a digital passport photo, 2 fringe-benefit rows, a disclosed minor foreign conviction (all 4 conditional crime-detail fields populated), and 2 "other attachment" rows. 96 fields collected, 38 correctly not-applicable (the 3rd child slot, the suspected-crime and entry-ban detail fields since those questions were answered "no", the 3rd fringe-benefit row, the 2 unused working-time/pay-basis alternatives and their conditional detail fields, otherAttachment rows 3–4), 0 errors.- Eight mutation/negative controls, each derived from the full-coverage scenario with exactly one defect introduced, each correctly raising exactly one error:
- Removing the required
lastName→missing-required. - Setting
genderto"unspecified"(not in its 2-optionenum) →enum-violation. - Setting
monthlyPayRateto-500(violatesvalidation.minimum: 0) →minimum-violation. - Setting
noSpousetofalsewhile removingspouseLastName→missing-required(requiredWhenconditional-required violation). - Setting
paymentBasistoseasonal_piece_projectwithpayPeriodFrom: "2026-06-01"andpayPeriodTo: "2026-01-01"(return before departure) →cross-field-violationonpayPeriodToNotBeforePayPeriodFrom— confirmingcrossFieldValidationactually fires. - Removing the required
signatureNameInBlockLetters→missing-required. - Setting
otherAttachment1Includedtotruewhile removingotherAttachment1Description→missing-required(requiredWhenconditional-required violation). - Setting
lastNameto a 300-character string (violatesvalidation.maxLength: 200) →maxLength-violation. - Removing
termsOfEmploymentFormfromdocuments(violates adocuments[].required: trueentry with norequiredWhen) →missing-required-document.
- Removing the required
Correction (independent re-check, review gate): the disposable checker script above only checked fields[] against required/requiredWhen/visibleWhen/validation/crossFieldValidation — it never checked documents[] requiredness, and neither committed scenario originally carried a documents key at all. Both scenarios were therefore silently missing all 5 of this schema's unconditionally-required documents[] entries (colorCopyOfPassportPages, passportPhotoOrRetrievalCode, proofOfLegalStayInCountryOfApplication, termsOfEmploymentForm, applicantSignatureDeclaration), which a from-scratch re-check (extending the checker to also evaluate documents[].required/requiredWhen, matching this registry's own established documents-array convention — e.g. at/gewerbebehoerde, dk/um/application-for-danish-passport) confirmed by raising exactly 5 missing-required-document errors on each scenario as originally committed. Both scenario files were corrected to include a documents array marking these 5 entries provided: true (mutation control 9 above added to cover the gap going forward); the re-check now confirms 0 errors on both scenarios with the corrected fixtures, and field collection counts (44/90 and 96/38) are unchanged. formMP1, the schema's one optional documents[] entry, is intentionally omitted from both scenarios.
The schema was also validated against the GovSchema v0.3 meta-schema with node tools/validate.mjs and node tools/validate-ajv.mjs — both pass, individually and as part of the full 348-document registry run (347 pre-existing + this one; no other document affected).
Pre-PR re-verification
The corrected PDF URL was re-fetched a final time immediately before finalizing this record with curl -sSL -o /dev/null -w "%{http_code} %{size_download}", confirming HTTP 200 and 477,135 bytes remain stable and reproducible.
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 Maahanmuuttovirasto (Finnish Immigration Service) or any government. The authoritative source is always the live government form and its official instructions.