Registry entry

Morocco Passport Application (Demande de Passeport)

The Direction Générale de la Sûreté Nationale's (DGSN) online passport request form, served unauthenticated at passeport.ma/FormDemande/FormDemande. Completing this form online produces a reference number/receipt for an in-person appointment at a passport bureau (in Morocco) or consulate (abroad), where the biometric capture and physical supporting documents are handled; this schema models only the online data-entry step, not the in-person biometric/document-submission step. The form's single 'Raison' (reason/applicant-category) radio group drives four branches: an adult applicant ('Majeur'), an adult under legal guardianship ('Majeur placé sous tutelle'), a minor aged 12 to 18 ('Mineur de 12 à 18 ans'), and a minor under 12 ('Mineur moins de 12 ans'). The three minor/guardianship branches additionally render a parents'-information block and a legal-representative block; the legal-representative block itself can hand off to a proxy/mandatary ('mandataire') block if the representative grants a power of attorney. This schema does NOT model: the CAPTCHA field (`CaptchaText`), a bot-mitigation control rather than an application datum; the six document-upload/checklist pages linked from the site's own 'Pièces à fournir' menu (physical documents checked in person, not uploaded through this form); the five explanatory modal dialogs describing each non-parent legal-representative category (Tuteur Testamentaire, Kafil, Juge, Tuteur Datif, Autre) — informational prose only, with no additional form fields of their own; and the ~194-entry static country-name option lists behind `countryOfBirth`, `fatherNationality`, `motherNationality`, `legalRepresentativeNationality`, `mandataryNationality`, and the numerically-coded ~194-entry list behind `countryOfResidence` — all six are modelled as open strings rather than reproduced as literal enums, to avoid transcription error at that scale (see verification.notes for the exact option-value scheme each one uses, which is not consistent across the form). This schema was sourced directly from the live, unauthenticated HTML the site returns to a plain, unauthenticated GET request plus its own linked `FormDemande.js`, both fetched with a standard desktop browser User-Agent and no login/CAPTCHA/WAF gate on either asset (the CAPTCHA only gates final submission, not the page/field data itself). No application was actually submitted and no fee was paid in producing this schema. Filing this application is a traveller/citizen action performed directly with the Direction Générale de la Sûreté Nationale through passeport.ma; this schema does not file the application itself, and the live source is always authoritative. GovSchema is independent and is not affiliated with, endorsed by, or operated by Morocco or its Direction Générale de la Sûreté Nationale.

Registry entry

ma/dgsn/passport-application

Jurisdiction
Morocco · national
Version
1.0.0
Verification
draft

Authoritative source The live 'Demande de passeport au Maroc' page's own rendered HTML `<form id="FormDemande">` (every `name`/`id`/`data-val*`/`required` attribute and `<option>` list read directly from the served markup) plus its linked `js/FormDemande.js`, whose jQuery `.change()`/`.show()`/`.hide()` handlers on `.RadioRaison`, `#procuration`, `#pinconnu`/`#pdecede`, and `#minconnu`/`#mdecede` define every conditional-visibility and field-disabling rule this schema's `visibleWhen`/`requiredWhen` conditions are sourced from.

Machine access

Schema document
registry/ma/dgsn/passport-application/1.0.0/schema.jsonapplication/schema+json
Registry catalog
registry/index.jsonone record per schema id

Field reference

49 fields across 5 steps, 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.

Application Category & Fee

  • reasonForApplication string required

    The applicant category, selected from a 4-option radio group that determines which downstream blocks (parents, legal representative, mandatary) apply. Modelled with the form's own literal wire values: "1" = Majeur (adult), "2" = Majeur placé sous tutelle (adult under legal guardianship), "3" = Mineur de 12 à 18 ans (minor aged 12-18), "4" = Mineur moins de 12 ans (minor under 12). "1" is pre-selected by default in the live form.

    enum: 1 | 2 | 3 | 4
  • feeExemptionClaimed boolean optional

    Whether the applicant claims exemption from the stamp-duty fee. Only rendered by the live form for the Majeur, Mineur, and Mineur-12 branches (hidden entirely for Majeur placé sous tutelle). Carries `data-val-required` per the ASP.NET MVC checkbox idiom disclosed in verification.notes; modelled as an optional attestation, not a hard requirement.

  • stampCode string optional

    The pre-purchased electronic stamp-duty code ("e-Timbre") the applicant enters instead of paying in person. Required unless the applicant has claimed fee exemption via `feeExemptionClaimed`.

    patternlength: 0–16
  • cnieNumber string optional

    The applicant's Carte Nationale d'Identité Electronique number. Required for the Majeur, Majeur placé sous tutelle, and Mineur (12-18) branches; the live form hides the field's required-asterisk (`#cnieAsterix`) specifically for the Mineur-12 (under-12) branch, since children under 12 typically do not yet hold a CNIE.

    patternlength: 0–10classification: sensitive-pii

Applicant Information

  • lastNameLatin string required

    The applicant's last/family name in Latin characters.

    patternlength: 0–45classification: pii
  • firstNameLatin string required

    The applicant's first/given name in Latin characters.

    patternlength: 0–45classification: pii
  • firstNameArabic string required

    The applicant's first/given name in Arabic characters.

    patternlength: 0–45classification: pii
  • lastNameArabic string required

    The applicant's last/family name in Arabic characters.

    patternlength: 0–45classification: pii
  • birthDateUnknownDayMonth boolean optional

    Attestation that neither day nor month of birth is known, waiving `birthDay` and `birthMonth`. See verification.notes on the ASP.NET MVC checkbox idiom.

  • birthDateUnknownDay boolean optional

    Attestation that only the day of birth is unknown, waiving `birthDay`. See verification.notes on the ASP.NET MVC checkbox idiom.

  • birthDay string optional

    Two-digit day of birth. The source's own `data-val-regex-pattern` (`[0-9]{2}$`) is not left-anchored; modelled here with the evidently-intended `^[0-9]{2}$` (see verification.notes).

    patternclassification: pii
  • birthMonth string optional

    Two-digit month of birth. The source's own `data-val-regex-pattern` (`[0-9]{2}$`) is not left-anchored; modelled here with the evidently-intended `^[0-9]{2}$` (see verification.notes).

    patternclassification: pii
  • birthYear string required

    Four-digit year of birth; always required, with no corresponding "unknown" waiver checkbox.

    patternclassification: pii
  • gender string required

    The applicant's declared gender. The live form's own wire values are counter-intuitive: "1" = Féminin (female), "2" = Masculin (male) — confirmed directly from the two radio inputs' `value` attributes.

    enum: 1 | 2classification: pii
  • placeOfBirth string required

    The applicant's city/town of birth.

    patternlength: 0–30classification: pii
  • countryOfBirth string required

    The applicant's country of birth, chosen from the form's own static ~194-entry country dropdown. Modelled as an open string rather than a literal enum to avoid transcription error at that scale (see verification.notes); the option `value` is the country's own display name (e.g. "ALGERIE"), not an ISO code — a scheme distinct from `countryOfResidence` (see verification.notes finding 1).

  • phone string optional

    The applicant's Moroccan mobile phone number (9 digits, entered after a fixed, non-editable "+212" prefix). The source's own `data-val-regex-pattern` (`^[5-6-7]{1}[0-9]{8}$`) contains a malformed character class; modelled here with the evidently-intended `^[5-7][0-9]{8}$` (see verification.notes). Carries no `data-val-required` in the fetched markup.

    patternclassification: pii
  • email string optional

    The applicant's email address, format-checked on blur by a `checkEmail()` JavaScript function rather than an inline regex. Carries no `data-val-required` in the fetched markup.

    length: 0–80classification: pii
  • postalAddress string required

    The applicant's postal address. The source's own `data-val-regex-pattern` is prefixed `(?i)`, a .NET-only inline case-insensitivity flag invalid in JavaScript `RegExp`, so the client-side check never actually fires in-browser (see verification.notes); modelled here with the `(?i)` prefix stripped.

    patternlength: 0–60classification: pii
  • city string required

    The applicant's city of residence.

    length: 0–20classification: pii
  • postalCode string required

    The applicant's postal code.

    length: 0–10
  • countryOfResidence string required

    The applicant's country of residence, chosen from a separate ~194-entry country dropdown whose option `value`s are an unrelated numeric code (e.g. "201" for Afghanistan, "202" for Afrique du Sud) rather than the country name used by `countryOfBirth` and the other nationality selects on this same form (see verification.notes finding 1). Modelled as an open string rather than a literal enum to avoid transcription error at that scale.

Parents' Information (minors only)

  • fatherUnknown boolean optional

    Attestation that the applicant's father is unknown, which disables and clears the other father fields client-side. See verification.notes on the ASP.NET MVC checkbox idiom.

  • fatherDeceasedNoId boolean optional

    Attestation that the applicant's father is deceased and left no identity document, which disables and clears the other father fields client-side. See verification.notes on the ASP.NET MVC checkbox idiom.

  • fatherLastName string optional

    The father's last name. Carries no `data-val-required` in the fetched markup despite appearing in a visually mandatory-seeming block (see verification.notes finding 3).

    patternlength: 0–45classification: pii
  • fatherFirstName string optional

    The father's first name. Carries no `data-val-required` in the fetched markup despite appearing in a visually mandatory-seeming block (see verification.notes finding 3).

    patternlength: 0–45classification: pii
  • fatherNationality string optional

    The father's nationality, chosen from the same country-name-valued dropdown as `countryOfBirth`. Modelled as an open string for the same reason.

  • fatherIdType string optional

    The type of identity document held by the father, the one father-block field that genuinely carries `data-val-required` in the fetched markup. Required whenever the parent-information block applies and the father is neither declared unknown nor deceased-without-ID.

    enum: 1 | 2 | 3 | 4 | 5 | 6
  • fatherIdNumber string optional

    The father's identity document number. Carries no `data-val` attribute at all in the fetched markup (not even a format check), let alone `data-val-required`.

    length: 0–10classification: sensitive-pii
  • motherUnknown boolean optional

    Attestation that the applicant's mother is unknown, which disables and clears the other mother fields client-side. See verification.notes on the ASP.NET MVC checkbox idiom.

  • motherDeceasedNoId boolean optional

    Attestation that the applicant's mother is deceased and left no identity document, which disables and clears the other mother fields client-side. See verification.notes on the ASP.NET MVC checkbox idiom.

  • motherLastName string optional

    The mother's last name. Carries no `data-val-required` in the fetched markup despite appearing in a visually mandatory-seeming block (see verification.notes finding 3).

    patternlength: 0–45classification: pii
  • motherFirstName string optional

    The mother's first name. Carries no `data-val-required` in the fetched markup despite appearing in a visually mandatory-seeming block (see verification.notes finding 3).

    patternlength: 0–45classification: pii
  • motherNationality string optional

    The mother's nationality, chosen from the same country-name-valued dropdown as `countryOfBirth`. Modelled as an open string for the same reason.

  • motherIdType string optional

    The type of identity document held by the mother, the one mother-block field that genuinely carries `data-val-required` in the fetched markup. Required whenever the parent-information block applies and the mother is neither declared unknown nor deceased-without-ID.

    enum: 1 | 2 | 3 | 4 | 5 | 6
  • motherIdNumber string optional

    The mother's identity document number. Carries no `data-val` attribute at all in the fetched markup (not even a format check), let alone `data-val-required`.

    length: 0–10classification: sensitive-pii

Proxy / Mandatary Information

  • motherIsMandatary boolean optional

    Shortcut attestation that the mother herself is the mandatary, which the live form uses to copy the mother's own name/nationality/ID fields into the mandatary fields. Only rendered for the Mineur and Mineur-12 branches (hidden for Majeur placé sous tutelle, which has no separate mother block to copy from).

  • mandataryLastName string optional

    The mandatary's last name. Carries no `data-val-required` in the fetched markup.

    patternlength: 0–45classification: pii
  • mandataryFirstName string optional

    The mandatary's first name. Carries no `data-val-required` in the fetched markup.

    patternlength: 0–45classification: pii
  • mandataryNationality string optional

    The mandatary's nationality, chosen from the same country-name-valued dropdown as `countryOfBirth`. Modelled as an open string for the same reason.

  • mandataryIdType string optional

    The type of identity document held by the mandatary, the one mandatary-block field that genuinely carries `data-val-required` in the fetched markup. Required whenever a power of attorney has been granted.

    enum: 1 | 2 | 3 | 4 | 5 | 6
  • mandataryIdNumber string optional

    The mandatary's identity document number. Carries no `data-val` attribute at all in the fetched markup (not even a format check), let alone `data-val-required`.

    length: 0–10classification: sensitive-pii

Verification record

Candidate selection

GOV-4114 ("GovSchema Standard Research") found no pre-banked candidate still open at cycle start — the prior cycle's Netherlands Visa / Austria DMV pair (GOV-4092/GOV-4094) had both been authored (GOV-4107, GOV-4100). Scouted two fresh candidates in parallel: Morocco's five unscreened verticals (Business Formation, DMV, Passport, Taxes, National ID — every one open since Morocco's only schema, ma/maec/evisa-application, opened the jurisdiction via Visa in GOV-3454), and Egypt's previously-unscreened National ID vertical. Egypt's National ID confirmed weak: the Civil Status Authority's own digital.gov.eg/cso.moi.gov.eg request- initiation front end is real but sits behind an authenticated citizen account, the underlying issuance step remains fundamentally in-person and biometric, and the one third-party site with a detailed field-by-field paper-form transcription had dead download links — left as screened, confirmed weak. Morocco's Passport vertical won decisively: DGSN's own passeport.ma/FormDemande/FormDemande is a plain, unauthenticated ASP.NET MVC form with every field's name/id/data-val* attribute readable directly from the served HTML — no login, CAPTCHA, or WAF gate on the GET itself (the CAPTCHA only gates final submission). This is markedly stronger than Morocco's other four open verticals, all of which remained login-gated or unreachable this session (OMPIC/ directentreprise.ma for Business Formation; NARSA for DMV; DGI/SIMPL for Taxes, with only unverifiable PDF adhesion forms as a fallback; cnie.ma for National ID, unreachable with no field-level secondary source).

Reaching the live source

Fetched https://www.passeport.ma/FormDemande/FormDemande and its linked https://www.passeport.ma/js/FormDemande.js this session with a plain curl and a standard desktop Chrome User-Agent string.

  • Form page: HTTP 200, Content-Type: text/html; charset=utf-8, 132,381 bytes, sha256 a2c802b2722886ee227d5816f97c0ecb504d53a5ce87c77cebdf8e61aac7b116.
  • JS file: HTTP 200, Content-Type: application/javascript, 58,447 bytes, sha256 86e346986f8c665f1bf0d214eaf61c8deea2ca1ead141d22adba505a8caf51c8.

Both served directly with only session/anti-bot cookies set (TS01400756, TS1a8944dc027, MI=...) — no login redirect, no CAPTCHA challenge, and no WAF block on the GET request itself.

Structure of the source

The form is a classic ASP.NET MVC unobtrusive-validation page: every input's real, wire-level name attribute (e.g. _Nom_FR, _Num_CNIE, _Code_Qualite_Representant) and every client-side rule (data-val-required, data-val-regex/data-val-regex-pattern, data-val-length-max, data-val-number) is present as plain, un-minified HTML — not reconstructed from rendered output. The single Raison radio group (name="Raison", values "1"-"4") drives which of the form's five conceptual blocks are relevant, confirmed from FormDemande.js's own .RadioRaison .change() handler (.show()/.hide() calls on #Demandeur, #Min12Ans, #RepLegal, #Mandataire), and the #procuration/#pinconnu/#pdecede/ #minconnu/#mdecede change handlers that disable and clear their respective dependent-person sub-blocks. This schema models 49 fields[] across 5 steps (application_category, applicant_information, parent_information, legal_representative_information, proxy_mandatary_information) and 0 documents[].

Six disclosed findings from this session's own read of the fetched assets

  1. Two inconsistent country-code schemes on the same form. _PaysNaissance_FR (country of birth) and the three dependent-person nationality selects (_Pays_Pere, _Pays_Mere, _Pays_Representant, _Pays_Mandataire) all use the country's own display NAME as the option value (e.g. value="ALGERIE"), while _Pays (country of residence) uses an unrelated numeric code (value="201" for Afghanistan, "202" for Afrique du Sud, ...) — confirmed by a direct diff of the two <select> option blocks in the fetched HTML. Both are modelled as open strings (not literal enums, to avoid transcription error across ~194 options each) with this discrepancy documented in each field's own description.
  2. The ASP.NET MVC boolean-checkbox idiom. Every boolean checkbox on this form (NoMoisJour, NoJour, PereInconnu, PereDecede, MereInconnu, MereDecede, procuration) is paired with a same-named hidden type="false" fallback input and carries a data-val-required attribute. This is the standard Html.CheckBoxFor output pattern (the framework always emits data-val-required so the field always binds to a boolean, not because the box must be checked) — confirmed by checking that none of these boxes are pre-checked and none of the four RadioRaison branches are blocked from proceeding by them. All seven are modelled as optional attestations (required: false), not gated on data-val-required's literal presence.
  3. Asymmetric requiredness inside each dependent-person block. Across all four blocks (père, mère, représentant légal, mandataire), only the "type de pièce d'identité" <select> (typeIdPere/typeIdMere/ typeIdRep/typeIdMan) carries a genuine data-val-required in the fetched markup — confirmed by grepping each block's full markup directly. The corresponding name (_Nom_*/_Prenom_*), nationality (_Pays_*), and ID-number (_Num_CNIE_*) fields in all four blocks carry at most data-val="true" (format-check only) and never data-val-required; two of the four ID-number fields (_Num_CNIE_Pere, _Num_CNIE_Mere) and the mandataire/représentant nationality selects carry no data-val attribute at all. Modelled faithfully — required: false on every name/nationality/ID-number field in these blocks, requiredWhen only on the four ID-type selects — rather than assuming the whole visually-grouped block is mandatory.
  4. A broken client-side regex on the postal address field. _Adresse_FR's own data-val-regex-pattern is (?i)^[a-zA-Z0-9'-/.: ,\s-]+$. The leading (?i) inline case-insensitivity flag is .NET Regex syntax (from the server-side [RegularExpression] attribute); it is not valid JavaScript RegExp syntax. Confirmed this session by attempting new RegExp("(?i)^[a-zA-Z0-9...") in a Node REPL, which throws SyntaxError: Invalid regular expression — meaning jQuery Validate's unobtrusive adapter would throw constructing this pattern in-browser, and the format check silently never fires client-side. Modelled with the (?i) prefix stripped (the evidently-intended pattern).
  5. A non-left-anchored regex on the day/month birth-date fields. _DateNaissanceJour/_DateNaissanceMois's own data-val-regex-pattern is [0-9]{2}$ — anchored only on the right, so it would technically accept any string merely ending in two digits. Modelled with the evidently-intended ^[0-9]{2}$.
  6. A malformed character class on the phone field. _Num_Tel's own data-val-regex-pattern is ^[5-6-7]{1}[0-9]{8}$. [5-6-7] parses as the range 5–6, plus a literal -, plus a literal 7 — not "one of 5, 6, or 7" as the field's own tooltip text (7XXXXXXXX, 6XXXXXXXX ou 5XXXXXXXX) states. Modelled with the evidently-intended ^[5-7][0-9]{8}$.

Scope boundaries (disclosed, not silently dropped)

  1. CaptchaText. A bot-mitigation control, not an application datum — not modelled, consistent with this registry's existing ma/maec/evisa-application precedent.
  2. Document uploads / in-person supporting-document checklist. This form has no type="file" inputs at all — completing it online produces a reference number for an in-person appointment at a passport bureau (in Morocco) or consulate (abroad), where physical supporting documents are checked. The site's own "Pièces à fournir" menu documents that checklist separately; not modelled, no documents[] array in this schema.
  3. The five representative-category explanatory modals. "Tuteur Testamentaire", "Kafil", "Juge", "Tuteur Datif", and "Autre" each open a Bootstrap modal with explanatory prose about that legal-guardianship category (sourced from Moroccan family/child-protection law) — no additional form fields of their own; not modelled beyond the legalRepresentativeCapacity enum value each corresponds to.
  4. ~194-entry static country lists (six select fields). countryOfBirth, fatherNationality, motherNationality, legalRepresentativeNationality, mandataryNationality (all country-name-valued), and countryOfResidence (numeric-code-valued) are all modelled as open strings rather than literal enum arrays, to avoid transcription error at that scale — see finding 1 above for the two schemes' exact values.
  5. No application was submitted and no fee was paid producing this schema.

Conformance

2 valid fixtures (0 errors each — an adult applicant paying by stamp code with no dependent-person blocks at all, and a 12-to-18-year-old minor with both parents known and the father acting as legal representative with no power of attorney granted) plus 8 mutation-control fixtures (each raising exactly 1 error: a plain missing-required-field case, a requiredWhen fee-exemption cascade violation, an invalid-pattern case on the CNIE number, two requiredWhen cascade violations inside the parent/legal-representative blocks, an invalid-enum case on gender, a requiredWhen cascade violation on the mandatary ID-type field once a power of attorney is granted, and an unknown-field-rejected case) are committed under conformance/ma/dgsn/passport-application/1.0.0/. All 10 were independently checked this session against a from-scratch mock validator implementing this schema's required/requiredWhen/visibleWhen/ pattern/enum/maxLength rules, each producing the exact expected error count. Both tools/validate.mjs and tools/validate-ajv.mjs pass with this document included.

View the raw record (VERIFICATION.md)

Version history

  • 1.0.0 draft latest this page has verification record schema.json

Independent and non-affiliated

GovSchema is an independent, open-source project. This reference is not produced, reviewed, or endorsed by Direction Générale de la Sûreté Nationale or any government. The authoritative source is always the live government form and its official instructions.