Access and pricing
Key required since 23 October 2026
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 quoteNot 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, requiredYour key. Never in the URL.
fromstring, requiredTraveller nationality, ISO 3166-1 alpha-2 code (e.g. SN).
tostring, requiredDestination country, ISO 3166-1 alpha-2 code (e.g. FR).
localestring, optionalResponse language: fr, en or es. Default: fr.
| Name | Type | Description |
|---|---|---|
X-API-Key | header, required | Your key. Never in the URL. |
from | string, required | Traveller nationality, ISO 3166-1 alpha-2 code (e.g. SN). |
to | string, required | Destination country, ISO 3166-1 alpha-2 code (e.g. FR). |
locale | string, optional | Response language: fr, en or es. Default: fr. |
Request examples
curl -H "X-API-Key: $IZIVISAS_API_KEY" \
"https://izivisas.com/api/public/visa-check?from=SN&to=FR&locale=en"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:
{
"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.regimeMost permissive regime for a short tourist stay (see below).
verdict.colorgreen, yellow, red or null, for a traffic-light display.
verdict.durationPermitted length of stay, or null.
visaReferenced tourist visa, or null. price, processingTime and officialUrl may be null.
arrivalFormMandatory 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.
detailsUrlIziVisas page for the route, to use as a “learn more” link.
attributionReady-to-display attribution text.
| Field | Description |
|---|---|
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 neededonArrivalVisa on arrivaleVisaElectronic visa, applied for onlineconsularVisa from the embassy or consulatenotEligibleTourist entry not possible for this nationalityunknownNo 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.
GET https://izivisas.com/api/public/country-info?code=TH&locale=enX-API-Keyheader, requiredYour key, upgraded to the paid plan.
codestring, requiredCountry, ISO 3166-1 alpha-2 code (e.g. TH).
localestring, optionalLanguage of the texts: fr, en or es. Default: en.
| Name | Type | Description |
|---|---|---|
X-API-Key | header, required | Your key, upgraded to the paid plan. |
code | string, required | Country, ISO 3166-1 alpha-2 code (e.g. TH). |
locale | string, optional | Language of the texts: fr, en or es. Default: en. |
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):
{
"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.statussafe, unsafe, varies (depends on the city or region) or unknown.
tapWater.labelStatus label in the requested language, or null.
tapWater.noteExtra detail when there is one (“use bottled water”), otherwise null.
tippingTipping customs, or null.
costsPrices 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.
electricityPlug types, voltage and frequency.
emergencyEmergency numbers: police, ambulance, fire (sometimes general).
drivingSideleft, right or null.
currency, timezone, callingCodeCurrency, IANA time zone, dialling code.
detailsUrlCountry page on IziVisas.
| Field | Description |
|---|---|
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
400Invalid country codes: two ISO letters expected.
401Key missing, unknown or revoked.
403Practical info requested with a free key.
404Country code unknown to the database.
429The key’s quota for the last 24 hours or the last hour is used up: retry after the delay in the Retry-After header.
500Internal error.
| Code | Meaning |
|---|---|
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.
<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.
