---
openapi: 3.1.0
info:
  title: Meridian Requirements API
  version: 0.1.3
  description: Canonical visa requirements resource (sectioned). Single source of
    truth for the MCP tool, the public REST API, the CLI, and the SEO render layer.
servers:
- url: https://usemeridian.app
  description: Production
paths:
  "/api/requirements":
    get:
      summary: Look up visa requirements for a corridor.
      description: Returns the canonical sectioned requirements envelope for a passport
        + destination + purpose. Use `legs=ORIG-DEST:N,...` for multi-leg trips (returns
        object=requirements_trip).
      operationId: getRequirements
      parameters:
      - name: passport
        in: query
        required: true
        schema:
          type: string
          description: ISO-3166 alpha-2 passport country (case-insensitive).
      - name: destination
        in: query
        required: false
        schema:
          type: string
          description: ISO-3166 alpha-2 destination country. Omit when ?legs= is supplied.
      - name: purpose
        in: query
        required: false
        schema:
          type: string
          description: Travel purpose (tourism, business, study, etc.). Optional.
      - name: residence
        in: query
        required: false
        schema:
          type: string
          description: ISO-3166 alpha-2 country of long-term residence. Drives reciprocity
            rules.
      - name: legs
        in: query
        required: false
        schema:
          type: string
          description: 'Multi-leg trip primitive. Format: ''LOS-CPH:2,CPH-LOS:2''
            (origin-destination:nights pairs, comma-separated). When supplied, the
            response is object=requirements_trip with per-leg sub-envelopes.'
      - name: Meridian-Version
        in: header
        required: false
        schema:
          type: string
          description: Optional schema version pin (e.g. '2026-06-01'). Omitted =
            latest.
      responses:
        '200':
          description: Sectioned requirements envelope.
          content:
            application/json:
              schema:
                oneOf:
                - "$ref": "#/components/schemas/Requirements"
                - "$ref": "#/components/schemas/RequirementsTrip"
        '400':
          description: Invalid parameters (malformed ISO, conflicting params, etc.).
        '429':
          description: Rate-limited (anon tier). Not yet enforced; see meridian-s88c.15.
components:
  schemas:
    Requirements:
      type: object
      description: Visa requirements resource for a single corridor.
      properties:
        object:
          type: string
          const: requirements
        id:
          type: string
          description: Stable id, prefix 'req_'.
        data:
          type: object
          properties:
            corridor:
              type: object
              description: The resolved corridor (passport, destination, optional
                purpose + residence).
              properties:
                passport:
                  type: string
                  description: ISO-3166 alpha-2 passport country.
                destination:
                  type: string
                  description: ISO-3166 alpha-2 destination country.
                purpose:
                  type:
                  - string
                  - 'null'
                  description: Travel purpose (tourism, business, study, etc.).
                residence:
                  type:
                  - string
                  - 'null'
                  description: ISO-3166 alpha-2 of the traveler's residence when distinct
                    from passport.
              required:
              - passport
              - destination
              additionalProperties: true
            verdict:
              type: string
              enum:
              - visa_required
              - visa_free
              - visa_on_arrival
              - eta
              - reciprocity
              description: 'High-level verdict for the corridor: visa_required, visa_free,
                visa_on_arrival, eta, or reciprocity. Intentionally distinct from
                `sections.visa.kind` (section-scoped classification).'
            passport_iso_source:
              type: string
              enum:
              - vault
              - request
              description: "'vault' = used the user's stored passport (MCP/auth-scoped
                only); 'request' = used the value supplied in arguments. Key is omitted
                on the public REST surface (no vault to source from)."
            sections:
              type: object
              description: Locked section set. `reciprocity` may be absent when no
                rule applies.
              properties:
                visa:
                  type: object
                  description: 'Visa classification: kind (required/free/on-arrival/eta/reciprocity),
                    visa type label, fee, validity, multi-entry.'
                  properties:
                    kind:
                      type: string
                      enum:
                      - required
                      - free
                      - visa_on_arrival
                      - eta
                      - reciprocity
                      description: Section-scoped visa classification. Intentionally
                        distinct from `data.verdict` — this enum is shorter ('required'
                        vs 'visa_required') because section renderers don't need to
                        disambiguate from non-visa verdicts.
                    visa_type:
                      type: object
                      description: Resolved visa type label for the corridor + purpose.
                      properties:
                        label:
                          type: string
                          description: Generic label for the corridor (e.g. 'Schengen
                            Short-Stay (C)').
                        effective_label:
                          type: string
                          description: Purpose-specific label when one exists; falls
                            back to label.
                        mismatch_warning:
                          type: string
                          description: Present when the corridor's visa data doesn't
                            match the requested purpose.
                      additionalProperties: true
                    fee:
                      type: object
                      description: Visa application fee. Absent when no fee data is
                        available.
                      properties:
                        amount:
                          type: number
                          description: Numeric amount. May be a float for non-integer
                            currencies.
                        currency:
                          type: string
                          description: ISO 4217 currency code.
                        formatted:
                          type: string
                          description: Human-formatted amount (e.g. '€80').
                      additionalProperties: true
                    validity_days:
                      type:
                      - integer
                      - 'null'
                      description: How long the visa remains valid for entry, in days.
                    multi_entry:
                      type:
                      - boolean
                      - 'null'
                      description: True when the visa permits multiple entries; nil
                        when unknown.
                  required:
                  - kind
                  additionalProperties: true
                passport:
                  type: object
                  description: 'Passport-side rules: minimum validity, recency, blank-page
                    requirements.'
                  properties:
                    min_validity_months:
                      type:
                      - integer
                      - 'null'
                      description: Months of remaining validity required at entry.
                    issued_within_years:
                      type:
                      - integer
                      - 'null'
                      description: Passport must be issued within this many years.
                    blank_pages:
                      type:
                      - integer
                      - 'null'
                      description: Number of blank visa pages required.
                  additionalProperties: true
                documents:
                  type: object
                  description: Document checklist with stable req_* ids.
                  properties:
                    checklist:
                      type: array
                      items:
                        type: object
                        description: A single document requirement with stable req_*
                          id and conditional metadata.
                        properties:
                          requirement_id:
                            type: string
                            description: Stable req_* id. Canonical when possible;
                              deterministic SHA-256 hash otherwise.
                          canonical_id:
                            type:
                            - string
                            - 'null'
                            description: Canonical document slug from CanonicalDocuments
                              registry.
                          document_type:
                            type:
                            - string
                            - 'null'
                            description: Mirrors Document.document_type when the canonical_id
                              maps to one.
                          category:
                            type:
                            - string
                            - 'null'
                            description: Document category (identity, financial, trip,
                              etc.).
                          name:
                            type: string
                            description: Human-readable name.
                          status:
                            type: string
                            enum:
                            - required
                            - recommended
                            - optional
                            description: Whether the document is required, recommended,
                              or optional.
                          description:
                            type:
                            - string
                            - 'null'
                          condition:
                            type:
                            - string
                            - 'null'
                            description: Condition under which the document applies.
                          alternatives:
                            type:
                            - array
                            - 'null'
                            items:
                              type: string
                          validity_window:
                            type:
                            - object
                            - 'null'
                            properties:
                              min_recency_months:
                                type: integer
                            additionalProperties: true
                          translation:
                            type:
                            - object
                            - 'null'
                            properties:
                              required:
                                type: boolean
                              type:
                                type:
                                - string
                                - 'null'
                            additionalProperties: true
                          visa_categories:
                            type:
                            - array
                            - 'null'
                            items:
                              type: string
                          source:
                            type: object
                            properties:
                              rule_ids:
                                type: array
                                items:
                                  type: string
                              confidence:
                                type:
                                - number
                                - 'null'
                            additionalProperties: true
                        required:
                        - requirement_id
                        - name
                        - status
                        additionalProperties: true
                    count:
                      type: integer
                      description: Number of documents in the checklist.
                  required:
                  - checklist
                  - count
                  additionalProperties: true
                process:
                  type: object
                  description: 'Application process: steps, action URLs, processing
                    time, decision model.'
                  properties:
                    steps:
                      type: array
                      items:
                        type: object
                        properties:
                          step:
                            type:
                            - integer
                            - 'null'
                          name:
                            type: string
                          url:
                            type:
                            - string
                            - 'null'
                        additionalProperties: true
                    action_urls:
                      type: object
                      description: Action URLs keyed by intent.
                      properties:
                        apply:
                          type:
                          - string
                          - 'null'
                        book_appointment:
                          type:
                          - string
                          - 'null'
                        track:
                          type:
                          - string
                          - 'null'
                        portal:
                          type:
                          - string
                          - 'null'
                      additionalProperties: true
                    processing_time:
                      type:
                      - object
                      - 'null'
                      properties:
                        min_days:
                          type:
                          - integer
                          - 'null'
                        max_days:
                          type:
                          - integer
                          - 'null'
                        formatted:
                          type:
                          - string
                          - 'null'
                      additionalProperties: true
                    decision_model:
                      type:
                      - string
                      - 'null'
                      description: e.g. 'threshold_based', 'discretionary'.
                  required:
                  - steps
                  - action_urls
                  additionalProperties: true
                reciprocity:
                  type: object
                  description: Reciprocity rule when applicable (Schengen residence
                    permit, CTA, etc.). Absent when no rule applies.
                  properties:
                    kind:
                      type: string
                      description: Reciprocity kind (e.g. 'schengen_residence_permit',
                        'cta').
                    max_stay_days:
                      type:
                      - integer
                      - 'null'
                    rule:
                      type: string
                      description: Plain-language summary of the rule.
                    legal_basis:
                      type:
                      - string
                      - 'null'
                      description: Citation of the relevant legal source.
                  required:
                  - kind
                  - rule
                  additionalProperties: true
                health:
                  type: object
                  description: 'Health requirements: vaccinations, malaria, travel
                    advisories.'
                  properties:
                    vaccinations:
                      type: array
                      items:
                        type: string
                    malaria:
                      type:
                      - string
                      - 'null'
                    advisories:
                      type: array
                      items:
                        type: string
                  additionalProperties: true
                rejection:
                  type: object
                  description: Rejection-rate intelligence for the corridor.
                  properties:
                    rate_pct:
                      type:
                      - number
                      - 'null'
                      description: Rejection rate as a percentage.
                    common_reasons:
                      type: array
                      items:
                        type: string
                    confidence:
                      type:
                      - number
                      - 'null'
                    last_updated:
                      type:
                      - string
                      - 'null'
                      format: date-time
                      description: When the rejection data was last verified — surface
                        alongside rate_pct as a freshness signal.
                  additionalProperties: true
                provenance:
                  type: object
                  description: Where the data came from and how confident we are.
                  properties:
                    layer_confidence:
                      type: object
                      description: Confidence by merge layer (bloc, destination, local
                        route).
                      properties:
                        bloc:
                          type:
                          - number
                          - 'null'
                        destination:
                          type:
                          - number
                          - 'null'
                        local:
                          type:
                          - number
                          - 'null'
                      additionalProperties: true
                    sources:
                      type: array
                      items:
                        type: object
                        properties:
                          url:
                            type: string
                          label:
                            type: string
                        additionalProperties: true
                    rule_ids:
                      type: array
                      items:
                        type: string
                    confidence:
                      type:
                      - number
                      - 'null'
                      description: Overall merged confidence, 0-1.
                    last_updated:
                      type:
                      - string
                      - 'null'
                      format: date-time
                  additionalProperties: true
                readiness:
                  type: object
                  description: Pointer to the readiness-check resource. Pure pointer;
                    full readiness lives at /api/readiness.
                  properties:
                    available:
                      type: boolean
                      description: True when readiness data is reachable for this
                        corridor.
                    href:
                      type: string
                      description: Path to the readiness resource for this corridor.
                    score_summary:
                      type:
                      - object
                      - 'null'
                      description: Optional precomputed summary for cheap UI rendering.
                      additionalProperties: true
                  required:
                  - available
                  - href
                  additionalProperties: true
              required:
              - visa
              - passport
              - documents
              - process
              - health
              - rejection
              - provenance
              - readiness
              additionalProperties: false
          required:
          - corridor
          - verdict
          - sections
          additionalProperties: true
        schema_version:
          type: string
          const: '2026-06-01'
        view_url:
          type: string
          description: Web view of the requirements on usemeridian.app.
        updated_at:
          type: string
          format: date-time
      required:
      - object
      - data
      - schema_version
      - view_url
      - updated_at
      additionalProperties: true
    RequirementsTrip:
      type: object
      description: Multi-leg trip wrapper. Each leg is a single-corridor requirements
        resource.
      properties:
        object:
          type: string
          const: requirements_trip
        id:
          type: string
          description: Stable trip id, prefix 'trip_'.
        data:
          type: object
          properties:
            corridor:
              type: object
              description: 'Trip-level corridor: passport + purpose + leg list.'
              properties:
                passport:
                  type: string
                purpose:
                  type:
                  - string
                  - 'null'
                legs:
                  type: array
                  items:
                    type: object
                    description: 'A single trip leg: origin → destination + nights
                      stayed.'
                    properties:
                      origin:
                        type: string
                        description: ISO-3166 alpha-2 origin country (where the leg
                          starts).
                      destination:
                        type: string
                        description: ISO-3166 alpha-2 destination country.
                      nights:
                        type:
                        - integer
                        - 'null'
                        description: Nights spent at the destination, when provided.
                    required:
                    - origin
                    - destination
                    additionalProperties: true
              required:
              - passport
              - legs
              additionalProperties: true
            legs:
              type: array
              description: Per-leg requirements envelopes (object=requirements).
              items:
                type: object
                description: Visa requirements resource for a single corridor.
                properties:
                  object:
                    type: string
                    const: requirements
                  id:
                    type: string
                    description: Stable id, prefix 'req_'.
                  data:
                    type: object
                    properties:
                      corridor:
                        type: object
                        description: The resolved corridor (passport, destination,
                          optional purpose + residence).
                        properties:
                          passport:
                            type: string
                            description: ISO-3166 alpha-2 passport country.
                          destination:
                            type: string
                            description: ISO-3166 alpha-2 destination country.
                          purpose:
                            type:
                            - string
                            - 'null'
                            description: Travel purpose (tourism, business, study,
                              etc.).
                          residence:
                            type:
                            - string
                            - 'null'
                            description: ISO-3166 alpha-2 of the traveler's residence
                              when distinct from passport.
                        required:
                        - passport
                        - destination
                        additionalProperties: true
                      verdict:
                        type: string
                        enum:
                        - visa_required
                        - visa_free
                        - visa_on_arrival
                        - eta
                        - reciprocity
                        description: 'High-level verdict for the corridor: visa_required,
                          visa_free, visa_on_arrival, eta, or reciprocity. Intentionally
                          distinct from `sections.visa.kind` (section-scoped classification).'
                      passport_iso_source:
                        type: string
                        enum:
                        - vault
                        - request
                        description: "'vault' = used the user's stored passport (MCP/auth-scoped
                          only); 'request' = used the value supplied in arguments.
                          Key is omitted on the public REST surface (no vault to source
                          from)."
                      sections:
                        type: object
                        description: Locked section set. `reciprocity` may be absent
                          when no rule applies.
                        properties:
                          visa:
                            type: object
                            description: 'Visa classification: kind (required/free/on-arrival/eta/reciprocity),
                              visa type label, fee, validity, multi-entry.'
                            properties:
                              kind:
                                type: string
                                enum:
                                - required
                                - free
                                - visa_on_arrival
                                - eta
                                - reciprocity
                                description: Section-scoped visa classification. Intentionally
                                  distinct from `data.verdict` — this enum is shorter
                                  ('required' vs 'visa_required') because section
                                  renderers don't need to disambiguate from non-visa
                                  verdicts.
                              visa_type:
                                type: object
                                description: Resolved visa type label for the corridor
                                  + purpose.
                                properties:
                                  label:
                                    type: string
                                    description: Generic label for the corridor (e.g.
                                      'Schengen Short-Stay (C)').
                                  effective_label:
                                    type: string
                                    description: Purpose-specific label when one exists;
                                      falls back to label.
                                  mismatch_warning:
                                    type: string
                                    description: Present when the corridor's visa
                                      data doesn't match the requested purpose.
                                additionalProperties: true
                              fee:
                                type: object
                                description: Visa application fee. Absent when no
                                  fee data is available.
                                properties:
                                  amount:
                                    type: number
                                    description: Numeric amount. May be a float for
                                      non-integer currencies.
                                  currency:
                                    type: string
                                    description: ISO 4217 currency code.
                                  formatted:
                                    type: string
                                    description: Human-formatted amount (e.g. '€80').
                                additionalProperties: true
                              validity_days:
                                type:
                                - integer
                                - 'null'
                                description: How long the visa remains valid for entry,
                                  in days.
                              multi_entry:
                                type:
                                - boolean
                                - 'null'
                                description: True when the visa permits multiple entries;
                                  nil when unknown.
                            required:
                            - kind
                            additionalProperties: true
                          passport:
                            type: object
                            description: 'Passport-side rules: minimum validity, recency,
                              blank-page requirements.'
                            properties:
                              min_validity_months:
                                type:
                                - integer
                                - 'null'
                                description: Months of remaining validity required
                                  at entry.
                              issued_within_years:
                                type:
                                - integer
                                - 'null'
                                description: Passport must be issued within this many
                                  years.
                              blank_pages:
                                type:
                                - integer
                                - 'null'
                                description: Number of blank visa pages required.
                            additionalProperties: true
                          documents:
                            type: object
                            description: Document checklist with stable req_* ids.
                            properties:
                              checklist:
                                type: array
                                items:
                                  type: object
                                  description: A single document requirement with
                                    stable req_* id and conditional metadata.
                                  properties:
                                    requirement_id:
                                      type: string
                                      description: Stable req_* id. Canonical when
                                        possible; deterministic SHA-256 hash otherwise.
                                    canonical_id:
                                      type:
                                      - string
                                      - 'null'
                                      description: Canonical document slug from CanonicalDocuments
                                        registry.
                                    document_type:
                                      type:
                                      - string
                                      - 'null'
                                      description: Mirrors Document.document_type
                                        when the canonical_id maps to one.
                                    category:
                                      type:
                                      - string
                                      - 'null'
                                      description: Document category (identity, financial,
                                        trip, etc.).
                                    name:
                                      type: string
                                      description: Human-readable name.
                                    status:
                                      type: string
                                      enum:
                                      - required
                                      - recommended
                                      - optional
                                      description: Whether the document is required,
                                        recommended, or optional.
                                    description:
                                      type:
                                      - string
                                      - 'null'
                                    condition:
                                      type:
                                      - string
                                      - 'null'
                                      description: Condition under which the document
                                        applies.
                                    alternatives:
                                      type:
                                      - array
                                      - 'null'
                                      items:
                                        type: string
                                    validity_window:
                                      type:
                                      - object
                                      - 'null'
                                      properties:
                                        min_recency_months:
                                          type: integer
                                      additionalProperties: true
                                    translation:
                                      type:
                                      - object
                                      - 'null'
                                      properties:
                                        required:
                                          type: boolean
                                        type:
                                          type:
                                          - string
                                          - 'null'
                                      additionalProperties: true
                                    visa_categories:
                                      type:
                                      - array
                                      - 'null'
                                      items:
                                        type: string
                                    source:
                                      type: object
                                      properties:
                                        rule_ids:
                                          type: array
                                          items:
                                            type: string
                                        confidence:
                                          type:
                                          - number
                                          - 'null'
                                      additionalProperties: true
                                  required:
                                  - requirement_id
                                  - name
                                  - status
                                  additionalProperties: true
                              count:
                                type: integer
                                description: Number of documents in the checklist.
                            required:
                            - checklist
                            - count
                            additionalProperties: true
                          process:
                            type: object
                            description: 'Application process: steps, action URLs,
                              processing time, decision model.'
                            properties:
                              steps:
                                type: array
                                items:
                                  type: object
                                  properties:
                                    step:
                                      type:
                                      - integer
                                      - 'null'
                                    name:
                                      type: string
                                    url:
                                      type:
                                      - string
                                      - 'null'
                                  additionalProperties: true
                              action_urls:
                                type: object
                                description: Action URLs keyed by intent.
                                properties:
                                  apply:
                                    type:
                                    - string
                                    - 'null'
                                  book_appointment:
                                    type:
                                    - string
                                    - 'null'
                                  track:
                                    type:
                                    - string
                                    - 'null'
                                  portal:
                                    type:
                                    - string
                                    - 'null'
                                additionalProperties: true
                              processing_time:
                                type:
                                - object
                                - 'null'
                                properties:
                                  min_days:
                                    type:
                                    - integer
                                    - 'null'
                                  max_days:
                                    type:
                                    - integer
                                    - 'null'
                                  formatted:
                                    type:
                                    - string
                                    - 'null'
                                additionalProperties: true
                              decision_model:
                                type:
                                - string
                                - 'null'
                                description: e.g. 'threshold_based', 'discretionary'.
                            required:
                            - steps
                            - action_urls
                            additionalProperties: true
                          reciprocity:
                            type: object
                            description: Reciprocity rule when applicable (Schengen
                              residence permit, CTA, etc.). Absent when no rule applies.
                            properties:
                              kind:
                                type: string
                                description: Reciprocity kind (e.g. 'schengen_residence_permit',
                                  'cta').
                              max_stay_days:
                                type:
                                - integer
                                - 'null'
                              rule:
                                type: string
                                description: Plain-language summary of the rule.
                              legal_basis:
                                type:
                                - string
                                - 'null'
                                description: Citation of the relevant legal source.
                            required:
                            - kind
                            - rule
                            additionalProperties: true
                          health:
                            type: object
                            description: 'Health requirements: vaccinations, malaria,
                              travel advisories.'
                            properties:
                              vaccinations:
                                type: array
                                items:
                                  type: string
                              malaria:
                                type:
                                - string
                                - 'null'
                              advisories:
                                type: array
                                items:
                                  type: string
                            additionalProperties: true
                          rejection:
                            type: object
                            description: Rejection-rate intelligence for the corridor.
                            properties:
                              rate_pct:
                                type:
                                - number
                                - 'null'
                                description: Rejection rate as a percentage.
                              common_reasons:
                                type: array
                                items:
                                  type: string
                              confidence:
                                type:
                                - number
                                - 'null'
                              last_updated:
                                type:
                                - string
                                - 'null'
                                format: date-time
                                description: When the rejection data was last verified
                                  — surface alongside rate_pct as a freshness signal.
                            additionalProperties: true
                          provenance:
                            type: object
                            description: Where the data came from and how confident
                              we are.
                            properties:
                              layer_confidence:
                                type: object
                                description: Confidence by merge layer (bloc, destination,
                                  local route).
                                properties:
                                  bloc:
                                    type:
                                    - number
                                    - 'null'
                                  destination:
                                    type:
                                    - number
                                    - 'null'
                                  local:
                                    type:
                                    - number
                                    - 'null'
                                additionalProperties: true
                              sources:
                                type: array
                                items:
                                  type: object
                                  properties:
                                    url:
                                      type: string
                                    label:
                                      type: string
                                  additionalProperties: true
                              rule_ids:
                                type: array
                                items:
                                  type: string
                              confidence:
                                type:
                                - number
                                - 'null'
                                description: Overall merged confidence, 0-1.
                              last_updated:
                                type:
                                - string
                                - 'null'
                                format: date-time
                            additionalProperties: true
                          readiness:
                            type: object
                            description: Pointer to the readiness-check resource.
                              Pure pointer; full readiness lives at /api/readiness.
                            properties:
                              available:
                                type: boolean
                                description: True when readiness data is reachable
                                  for this corridor.
                              href:
                                type: string
                                description: Path to the readiness resource for this
                                  corridor.
                              score_summary:
                                type:
                                - object
                                - 'null'
                                description: Optional precomputed summary for cheap
                                  UI rendering.
                                additionalProperties: true
                            required:
                            - available
                            - href
                            additionalProperties: true
                        required:
                        - visa
                        - passport
                        - documents
                        - process
                        - health
                        - rejection
                        - provenance
                        - readiness
                        additionalProperties: false
                    required:
                    - corridor
                    - verdict
                    - sections
                    additionalProperties: true
                  schema_version:
                    type: string
                    const: '2026-06-01'
                  view_url:
                    type: string
                    description: Web view of the requirements on usemeridian.app.
                  updated_at:
                    type: string
                    format: date-time
                required:
                - object
                - data
                - schema_version
                - view_url
                - updated_at
                additionalProperties: true
          required:
          - corridor
          - legs
          additionalProperties: true
        schema_version:
          type: string
          const: '2026-06-01'
        updated_at:
          type: string
          format: date-time
      required:
      - object
      - data
      - schema_version
      - updated_at
      additionalProperties: true
    VisaSection:
      type: object
      description: 'Visa classification: kind (required/free/on-arrival/eta/reciprocity),
        visa type label, fee, validity, multi-entry.'
      properties:
        kind:
          type: string
          enum:
          - required
          - free
          - visa_on_arrival
          - eta
          - reciprocity
          description: Section-scoped visa classification. Intentionally distinct
            from `data.verdict` — this enum is shorter ('required' vs 'visa_required')
            because section renderers don't need to disambiguate from non-visa verdicts.
        visa_type:
          type: object
          description: Resolved visa type label for the corridor + purpose.
          properties:
            label:
              type: string
              description: Generic label for the corridor (e.g. 'Schengen Short-Stay
                (C)').
            effective_label:
              type: string
              description: Purpose-specific label when one exists; falls back to label.
            mismatch_warning:
              type: string
              description: Present when the corridor's visa data doesn't match the
                requested purpose.
          additionalProperties: true
        fee:
          type: object
          description: Visa application fee. Absent when no fee data is available.
          properties:
            amount:
              type: number
              description: Numeric amount. May be a float for non-integer currencies.
            currency:
              type: string
              description: ISO 4217 currency code.
            formatted:
              type: string
              description: Human-formatted amount (e.g. '€80').
          additionalProperties: true
        validity_days:
          type:
          - integer
          - 'null'
          description: How long the visa remains valid for entry, in days.
        multi_entry:
          type:
          - boolean
          - 'null'
          description: True when the visa permits multiple entries; nil when unknown.
      required:
      - kind
      additionalProperties: true
    PassportSection:
      type: object
      description: 'Passport-side rules: minimum validity, recency, blank-page requirements.'
      properties:
        min_validity_months:
          type:
          - integer
          - 'null'
          description: Months of remaining validity required at entry.
        issued_within_years:
          type:
          - integer
          - 'null'
          description: Passport must be issued within this many years.
        blank_pages:
          type:
          - integer
          - 'null'
          description: Number of blank visa pages required.
      additionalProperties: true
    DocumentsSection:
      type: object
      description: Document checklist with stable req_* ids.
      properties:
        checklist:
          type: array
          items:
            type: object
            description: A single document requirement with stable req_* id and conditional
              metadata.
            properties:
              requirement_id:
                type: string
                description: Stable req_* id. Canonical when possible; deterministic
                  SHA-256 hash otherwise.
              canonical_id:
                type:
                - string
                - 'null'
                description: Canonical document slug from CanonicalDocuments registry.
              document_type:
                type:
                - string
                - 'null'
                description: Mirrors Document.document_type when the canonical_id
                  maps to one.
              category:
                type:
                - string
                - 'null'
                description: Document category (identity, financial, trip, etc.).
              name:
                type: string
                description: Human-readable name.
              status:
                type: string
                enum:
                - required
                - recommended
                - optional
                description: Whether the document is required, recommended, or optional.
              description:
                type:
                - string
                - 'null'
              condition:
                type:
                - string
                - 'null'
                description: Condition under which the document applies.
              alternatives:
                type:
                - array
                - 'null'
                items:
                  type: string
              validity_window:
                type:
                - object
                - 'null'
                properties:
                  min_recency_months:
                    type: integer
                additionalProperties: true
              translation:
                type:
                - object
                - 'null'
                properties:
                  required:
                    type: boolean
                  type:
                    type:
                    - string
                    - 'null'
                additionalProperties: true
              visa_categories:
                type:
                - array
                - 'null'
                items:
                  type: string
              source:
                type: object
                properties:
                  rule_ids:
                    type: array
                    items:
                      type: string
                  confidence:
                    type:
                    - number
                    - 'null'
                additionalProperties: true
            required:
            - requirement_id
            - name
            - status
            additionalProperties: true
        count:
          type: integer
          description: Number of documents in the checklist.
      required:
      - checklist
      - count
      additionalProperties: true
    ProcessSection:
      type: object
      description: 'Application process: steps, action URLs, processing time, decision
        model.'
      properties:
        steps:
          type: array
          items:
            type: object
            properties:
              step:
                type:
                - integer
                - 'null'
              name:
                type: string
              url:
                type:
                - string
                - 'null'
            additionalProperties: true
        action_urls:
          type: object
          description: Action URLs keyed by intent.
          properties:
            apply:
              type:
              - string
              - 'null'
            book_appointment:
              type:
              - string
              - 'null'
            track:
              type:
              - string
              - 'null'
            portal:
              type:
              - string
              - 'null'
          additionalProperties: true
        processing_time:
          type:
          - object
          - 'null'
          properties:
            min_days:
              type:
              - integer
              - 'null'
            max_days:
              type:
              - integer
              - 'null'
            formatted:
              type:
              - string
              - 'null'
          additionalProperties: true
        decision_model:
          type:
          - string
          - 'null'
          description: e.g. 'threshold_based', 'discretionary'.
      required:
      - steps
      - action_urls
      additionalProperties: true
    ReciprocitySection:
      type: object
      description: Reciprocity rule when applicable (Schengen residence permit, CTA,
        etc.). Absent when no rule applies.
      properties:
        kind:
          type: string
          description: Reciprocity kind (e.g. 'schengen_residence_permit', 'cta').
        max_stay_days:
          type:
          - integer
          - 'null'
        rule:
          type: string
          description: Plain-language summary of the rule.
        legal_basis:
          type:
          - string
          - 'null'
          description: Citation of the relevant legal source.
      required:
      - kind
      - rule
      additionalProperties: true
    HealthSection:
      type: object
      description: 'Health requirements: vaccinations, malaria, travel advisories.'
      properties:
        vaccinations:
          type: array
          items:
            type: string
        malaria:
          type:
          - string
          - 'null'
        advisories:
          type: array
          items:
            type: string
      additionalProperties: true
    RejectionSection:
      type: object
      description: Rejection-rate intelligence for the corridor.
      properties:
        rate_pct:
          type:
          - number
          - 'null'
          description: Rejection rate as a percentage.
        common_reasons:
          type: array
          items:
            type: string
        confidence:
          type:
          - number
          - 'null'
        last_updated:
          type:
          - string
          - 'null'
          format: date-time
          description: When the rejection data was last verified — surface alongside
            rate_pct as a freshness signal.
      additionalProperties: true
    ProvenanceSection:
      type: object
      description: Where the data came from and how confident we are.
      properties:
        layer_confidence:
          type: object
          description: Confidence by merge layer (bloc, destination, local route).
          properties:
            bloc:
              type:
              - number
              - 'null'
            destination:
              type:
              - number
              - 'null'
            local:
              type:
              - number
              - 'null'
          additionalProperties: true
        sources:
          type: array
          items:
            type: object
            properties:
              url:
                type: string
              label:
                type: string
            additionalProperties: true
        rule_ids:
          type: array
          items:
            type: string
        confidence:
          type:
          - number
          - 'null'
          description: Overall merged confidence, 0-1.
        last_updated:
          type:
          - string
          - 'null'
          format: date-time
      additionalProperties: true
    ReadinessSection:
      type: object
      description: Pointer to the readiness-check resource. Pure pointer; full readiness
        lives at /api/readiness.
      properties:
        available:
          type: boolean
          description: True when readiness data is reachable for this corridor.
        href:
          type: string
          description: Path to the readiness resource for this corridor.
        score_summary:
          type:
          - object
          - 'null'
          description: Optional precomputed summary for cheap UI rendering.
          additionalProperties: true
      required:
      - available
      - href
      additionalProperties: true
