Skip to main content
Computer code on a screen

Check a visa in one call

A JSON API that tells you whether a traveller needs a short-stay visa between two countries. Key-based access, free for low volumes.

Price
Free up to 200 calls/day
Key
Required
Paid plan
€9/month
Languages
FR, EN, ES
Endpoint
GET https://izivisas.com/api/public/visa-check?from=SN&to=FR&locale=fr

Access and pricing

Key required since 23 October 2026

The API used to be open without a key. It was mostly used to scrape our catalogue automatically, hundreds of calls in a row, without the link to IziVisas asked in return. Anonymous calls are therefore refused. Genuine integrations remain welcome, and the free key covers everyday use.

Free key

€0

  • 200 calls per rolling 24 hours, at most 50 an hour
  • To show the verdict to your visitors, on a website or an app
  • A visible link to IziVisas is required wherever the data appears
  • Non-commercial use only

Paid plan

€9 a month

or €90 a year

  • Commercial use, such as a paid app or service
  • No link to IziVisas required
  • Country practical info on top of the visa verdict (see below)
  • 500 calls per 24 hours; higher volumes and full catalogue export on quote

Getting a key

Write to us with the name and address of your website or app, what you plan to do and your expected volume. One key per project, usually within 24 hours. For the paid plan, subscribe above: your key is issued, or your existing key upgraded, within 24 hours.

Request a key or a quote

Not allowed without a contract

  • Systematically extracting the catalogue, by any means: the API, the website pages, several keys or several IP addresses.
  • Building or feeding a competing database.
  • Reselling or redistributing the raw data.

A key used this way is revoked without notice.

Parameters

  • X-API-Keyheader, required

    Your key. Never in the URL.

  • fromstring, required

    Traveller nationality, ISO 3166-1 alpha-2 code (e.g. SN).

  • tostring, required

    Destination country, ISO 3166-1 alpha-2 code (e.g. FR).

  • localestring, optional

    Response language: fr, en or es. Default: fr.

Request examples

curl
curl -H "X-API-Key: $IZIVISAS_API_KEY" \
  "https://izivisas.com/api/public/visa-check?from=SN&to=FR&locale=en"
JavaScript (fetch)
const res = await fetch(
  'https://izivisas.com/api/public/visa-check?from=SN&to=FR&locale=en',
  { headers: { 'X-API-Key': process.env.IZIVISAS_API_KEY } }
);
const data = await res.json();
console.log(data.verdict.regime); // "consular"

Coding with an AI assistant? Give it the Markdown version of this page: https://izivisas.com/developers.md

Response

Actual response for a Senegalese traveller going to France:

200 OK, application/json
{
  "from": { "code": "SN", "name": "Sénégal" },
  "to": { "code": "FR", "name": "France" },
  "verdict": {
    "regime": "consular",
    "color": "red",
    "duration": "90 jours par période de 180 jours"
  },
  "visa": {
    "name": "Court séjour (tourisme)",
    "price": { "min": 90, "max": 90, "currency": "EUR" },
    "processingTime": "15 à 45 jours",
    "officialUrl": "https://www.france-visas.gouv.fr/en/short-stay-visa"
  },
  "arrivalForm": null,
  "detailsUrl": "https://izivisas.com/fr/visas/SN/FR",
  "attribution": "Visa data by IziVisas, https://izivisas.com"
}
  • verdict.regime

    Most permissive regime for a short tourist stay (see below).

  • verdict.color

    green, yellow, red or null, for a traffic-light display.

  • verdict.duration

    Permitted length of stay, or null.

  • visa

    Referenced tourist visa, or null. price, processingTime and officialUrl may be null.

  • arrivalForm

    Mandatory online arrival form (Thailand’s TDAC, Malaysia’s MDAC…), even without a visa: name, official url, when (when to fill it in), free, alsoOnExit. null when the destination has none or the nationality is exempt.

  • detailsUrl

    IziVisas page for the route, to use as a “learn more” link.

  • attribution

    Ready-to-display attribution text.

Values of verdict.regime

  • visaFreeNo visa needed
  • onArrivalVisa on arrival
  • eVisaElectronic visa, applied for online
  • consularVisa from the embassy or consulate
  • notEligibleTourist entry not possible for this nationality
  • unknownNo data

Practical info (paid plan)

Paid keys only: what a traveller needs to know on the ground, for one country. Same key and same quota as the visa verdict.

Endpoint
GET https://izivisas.com/api/public/country-info?code=TH&locale=en
  • X-API-Keyheader, required

    Your key, upgraded to the paid plan.

  • codestring, required

    Country, ISO 3166-1 alpha-2 code (e.g. TH).

  • localestring, optional

    Language of the texts: fr, en or es. Default: en.

curl
curl -H "X-API-Key: $IZIVISAS_API_KEY" \
  "https://izivisas.com/api/public/country-info?code=TH&locale=en"

Actual response for Thailand, in English (cost lists shortened to two lines):

200 OK, application/json
{
  "code": "TH",
  "name": "Thailand",
  "currency": { "code": "THB", "symbol": "฿", "name": "Thai Baht" },
  "timezone": "Asia/Bangkok",
  "callingCode": "+66",
  "drivingSide": "left",
  "electricity": {
    "plugs": ["Type A", "Type B", "Type C", "Type O"],
    "voltage": ["220V"],
    "frequency": ["50Hz"]
  },
  "emergency": { "fire": "199", "police": "191", "ambulance": "1669" },
  "tapWater": { "status": "unsafe", "label": "Not safe to drink", "note": null },
  "tipping": "Not mandatory, round up or small tip 10%",
  "costs": {
    "city": "in Bangkok",
    "currency": "USD",
    "updatedAt": "2026-10-10",
    "food": [
      { "label": "Meal at an inexpensive restaurant", "price": "3" },
      { "label": "Meal for two at a mid-range restaurant", "price": "22" }
    ],
    "transport": [
      { "label": "Public transport, one way", "price": "1" },
      { "label": "Monthly transport pass", "price": "42" }
    ],
    "housing": [...],
    "health": [...],
    "leisure": [...],
    "other": [...]
  },
  "detailsUrl": "https://izivisas.com/en/countries/TH"
}
  • tapWater.status

    safe, unsafe, varies (depends on the city or region) or unknown.

  • tapWater.label

    Status label in the requested language, or null.

  • tapWater.note

    Extra detail when there is one (“use bottled water”), otherwise null.

  • tipping

    Tipping customs, or null.

  • costs

    Prices collected in the main city (costs.city), in USD, by category: food, transport, housing, health, leisure, other. A range reads “350-600”. null when there is no data.

  • electricity

    Plug types, voltage and frequency.

  • emergency

    Emergency numbers: police, ambulance, fire (sometimes general).

  • drivingSide

    left, right or null.

  • currency, timezone, callingCode

    Currency, IANA time zone, dialling code.

  • detailsUrl

    Country page on IziVisas.

Errors

  • 400

    Invalid country codes: two ISO letters expected.

  • 401

    Key missing, unknown or revoked.

  • 403

    Practical info requested with a free key.

  • 404

    Country code unknown to the database.

  • 429

    The key’s quota for the last 24 hours or the last hour is used up: retry after the delay in the Retry-After header.

  • 500

    Internal error.

Quota and caching

  • The quota counts successful responses (200) over a rolling 24 hours, with an hourly cap of one quarter of the quota. Errors do not use it up.
  • Verdicts change rarely: cache each response on your side, for at least a day, rather than calling the API on every render.
  • Call the API from your server. A key placed in a page’s code can be read by anyone, and its quota goes with it.
  • Visa verdicts are privately cached for one hour (Cache-Control: private, max-age=3600); practical info is not cached (no-store).

Attribution

With a free key, two conditions apply: non-commercial use, and a visible link to IziVisas wherever the data appears. The link below is enough. A paid app or service that shows our data falls under the paid plan, with no link required. Data is for guidance: always check official sources before travelling.

HTML
<a href="https://izivisas.com">Visa data by IziVisas</a>

No code, no key: the widget

The same checker ships as a widget you paste into a page. It stays free, with no key, attribution included.

See the widget

Privacy Settings

We use cookies to improve your experience. You can choose which cookies to accept. privacy policy