---
title: "Full visa intelligence (30 data points)"
method: GET
path: "/api/v1/visa"
tags: ["Visa data"]
---

# Full visa intelligence (30 data points)

`GET /api/v1/visa`

The flagship endpoint. Returns the full `VisaData` object — documents,
process, fees, embassies, transit visa, vaccinations, safety advisories,
overstay penalties, and more — in 15 languages.

Plan gating:
- `free` returns the core fields plus upgrade stubs; non-English requires Starter or above.
- `starter` unlocks every extended field except `remote_work_visa` and `reciprocity_history`.
- `pro+` returns all 32 fields including bidirectional embassy info.

Counts against monthly quota.

## Query parameters

- `passport` string, required — ISO 3166-1 alpha-3 country code.
- `destination` string, required — ISO 3166-1 alpha-3 country code.
- `lang` 'en' | 'fr' | 'es' | 'pt' | 'de' | 'it' | 'ja' | 'ko' | 'zh' | 'ru' | 'ar' | 'hi' | 'th' | 'vi' | 'tl'

## Headers

- `Accept` 'application/json' | 'text/markdown'

## Response `200`

Visa data successfully returned.

- VisaResponse
  - `data` VisaData, required
    - `passport` string, required — ISO 3166-1 alpha-3 country code.
    - `destination` string, required — ISO 3166-1 alpha-3 country code.
    - `requirement` 'visa_free' | 'visa_required' | 'e_visa' | 'visa_on_arrival' | 'eta' | 'no_admission', required
    - `visa_free_days` integer, nullable
    - `visa_required` boolean, required
    - `description` string, required
    - `documents_required` string[]
    - `process` string[]
    - `tips` string[]
    - `country_info` CountryInfo, required
      - `currency` string
      - `language` string
      - `timezone` string
      - `capital` string
    - `verified` boolean, required
    - `source` string, nullable — Where the value came from (`official`, `manual`, …).
    - `requirement_status` 'uncertain' — **Present only on pairs whose legal regime is unsettled — the key is absent otherwise, so test for presence, not for a value.** Burkina Faso, Mali and Niger left ECOWAS on 2025-01-29. Visa-free movement between them and the remaining member states now rests on unilateral, revocable declarations rather than on a treaty. This is a separate, additive field: `requirement` is untouched and stays `visa_free`, because that is what happens at the border today. The status says the right no longer exists; the requirement says the practice continues. A client that ignores this field sees no change.
    - `requirement_status_note` string, nullable — Plain-English reason the regime is unsettled. Safe to show to a traveller verbatim.
    - `source_url` string, uri, nullable — Official page this pair was read from. **`null` on pairs not yet re-sourced, which is most of them** — 56 of 199 passport countries currently have an official source on file. A `null` means we cannot show you a document, not that the answer is wrong; if your product makes a claim a user could act on, treat it as unverified.
    - `last_verified_at` string, date, nullable — Date `source_url` was last read. `null` whenever `source_url` is `null`.
    - `transit_visa` TransitVisa
      - `hubs` TransitHub[]
        - `airport` string
        - `city` string
        - `transit_visa_required` boolean
        - `transit_free_hours` integer
        - `conditions` string
    - `passport_validity_months` integer
    - `visa_fee` VisaFee
      - `single_entry` MoneyAmount
        - `amount` number
        - `currency` string
      - `multiple_entry` MoneyAmount
        - `amount` number
        - `currency` string
    - `processing_days` ProcessingDays
      - `standard` integer, nullable
      - `express` integer, nullable
      - `rush` integer, nullable
    - `photo_specs` PhotoSpecs
      - `width_mm` number
      - `height_mm` number
      - `background` string
      - `glasses_allowed` boolean
      - `head_covering_allowed` string
    - `vaccinations_required` string[]
    - `insurance_required` InsuranceRequired
      - `required` boolean
      - `min_coverage` number
      - `currency` string
    - `dual_nationality_warnings` string[]
    - `stamp_warnings` string[]
    - `minor_rules` MinorRules
      - `solo_travel_min_age` integer
      - `single_parent_letter_required` boolean
      - `notarized_consent_required` boolean
    - `overstay_penalty` OverstayPenalty
      - `fine_per_day` string
      - `ban_days` integer
      - `criminal` boolean
      - `details` string
    - `entry_by_mode` EntryByMode
      - `air` integer
      - `land` integer
      - `sea` integer
    - `remote_work_visa` RemoteWorkVisa
      - `available` boolean
      - `duration_months` integer
      - `fee` MoneyAmount
        - `amount` number
        - `currency` string
      - `requirements` string[]
    - `extension_rules` ExtensionRules
      - `possible` boolean
      - `max_days` integer
      - `fee` string
      - `where` string
      - `notes` string
    - `reciprocity_history` ReciprocityChange[]
      - `date` string
      - `from` string
      - `to` string
      - `note` string
    - `safety` SafetyInfo
      - `level` integer
      - `advisory` string
      - `source` string
      - `updated_at` string
    - `best_apply_period` string, nullable
    - `health_requirements` HealthRequirements
      - `covid_test` boolean
      - `vaccination_proof` boolean
      - `health_declaration` boolean
      - `quarantine_days` integer
      - `ebola_screening` boolean
    - `embassy` EmbassyData
      - `your_embassy_at_destination` EmbassyInfo
        - `name` string
        - `address` string
        - `city` string
        - `phone` string
        - `emergency_phone` string
        - `email` string, email
        - `website` string, uri
      - `visa_application_embassy` EmbassyInfo
        - `name` string
        - `address` string
        - `city` string
        - `phone` string
        - `emergency_phone` string
        - `email` string, email
        - `website` string, uri
  - `meta` VisaMeta, required
    - `lang` 'en' | 'fr' | 'es' | 'pt' | 'de' | 'it' | 'ja' | 'ko' | 'zh' | 'ru' | 'ar' | 'hi' | 'th' | 'vi' | 'tl'
    - `api_version` string
    - `coverage` string
    - `languages` integer
    - `data_points` integer

## Other responses

- `400` — Missing or malformed parameter.
- `401` — Missing API key, query param or session cookie.
- `403` — Invalid / inactive key, or plan below the endpoint's minimum tier.
- `404` — No data for the requested resource.
- `429` — Monthly quota or burst rate exceeded.

---

[API](https://skmtc.net/orizn/apis/orizn-visa-api.md) · [All operations](https://skmtc.net/orizn/apis/orizn-visa-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/orizn/orizn-visa-api/revisions/97ea5156ef11/schema)
