Passport Index API: Check visa requirement
Checks a passport holder's visa requirement and permitted stay for a destination on Passport Index. This is guidance; travellers should confirm entry rules with the embassy before travel. Visits to the passport's issuing country are not listed.
Unofficial. Not affiliated with or endorsed by Passport Index.
Inputs
Values from the run on Oct 31, 2026, shown under Output.
- Passport Country, required
passport_country Country that issued the passport, as a name or two-letter code, for example India or IN.
US
- Destination Country, required
destination_country Country to visit, as a name or two-letter code, for example Japan or JP.
France
Input as JSON
{ "passport_country": "US", "destination_country": "France"}Output
{ "requirement": "visa free", "allowed_stay": "90 days", "raw_requirement": "visa-free", "passport_country": "United States of America", "destination_country": "France", "passport_index_link": "https://www.passportindex.org/passport/united-states-of-america/" }Code
curl https://api.fous.com/v1/runs \ -H "Authorization: Bearer $FOUS_API_KEY" \ -H "Content-Type: application/json" \ -d '{"method":"passportindex.org/check_visa_requirement","input":{"passport_country":"US","destination_country":"France"}}' # Save as fous.py, then run: python3 fous.pyimport json, os, timefrom urllib.error import HTTPErrorfrom urllib.request import Request, urlopenAPI = "https://api.fous.com/v1/runs" KEY = os.environ["FOUS_API_KEY"]HEADERS = { "Authorization": f"Bearer {KEY}", "Content-Type": "application/json" ,}def call(url, body=None): data = json.dumps(body).encode() if body else None request = Request(url, data, HEADERS) try: with urlopen(request, timeout=120) as r: return r.status, json.load(r) except HTTPError as error: message = json.load(error)["error"]["message"] raise RuntimeError(message) from errorstatus, run = call(API, { "method": "passportindex.org/check_visa_requirement" , "input": { "passport_country": "US", "destination_country": "France" }})# 202: still going after 30 s. Ask again until it ends.while status == 202: time.sleep(2) status, run = call(f"{API}/{run['id']}")print(json.dumps(run["data"], indent=2))// Save as fous.mjs, then run: node fous.mjsconst api = "https://api.fous.com/v1/runs" ;const headers = { Authorization: `Bearer ${process.env.FOUS_API_KEY}`, "Content-Type": "application/json" ,};let response = await fetch(api, { method: "POST", headers, body: JSON.stringify({ "method": "passportindex.org/check_visa_requirement" , "input": { "passport_country": "US", "destination_country": "France" } }), signal: AbortSignal.timeout(120_000),});let run = await response.json();// 202: still going after 30 s. Ask again until it ends.while (response.status === 202) { await new Promise((done) => setTimeout(done, 2_000)); response = await fetch(`${api}/${run.id}`, { headers }); run = await response.json();}if (!response.ok) throw new Error(run.error.message);console.log(run.data);# Connect your agent to Fous once, over MCP (Streamable HTTP):# https://api.fous.com/mcp# Set FOUS_API_KEY first: create a key at https://app.fous.com/keys.# Claude Codeclaude mcp add \ --scope user \ --transport http fous https://api.fous.com/mcp \ --header "Authorization: Bearer ${FOUS_API_KEY:?Set FOUS_API_KEY to your Fous API key}"# Codexcodex mcp add fous \ --url https://api.fous.com/mcp \ --bearer-token-env-var FOUS_API_KEY# Cursor, VS Code, Windsurf, Cline and morenpx -y add-mcp https://api.fous.com/mcp -g -n fous \ --header "Authorization: Bearer ${FOUS_API_KEY:?Set FOUS_API_KEY to your Fous API key}"# Then ask your agent:# "Use Fous to run passportindex.org/check_visa_requirement# with {"passport_country":"US","destination_country":"France"}"Over HTTP, the answer’s data holds the output. A run still going after 30 seconds answers 202 with its id: ask GET /v1/runs/{id} until it ends.
Schema
Input schema
{ "type": "object", "required": [ "passport_country", "destination_country" ], "properties": { "passport_country": { "type": "string", "description": "Country that issued the passport, as a name or two-letter code, for example India or IN." }, "destination_country": { "type": "string", "description": "Country to visit, as a name or two-letter code, for example Japan or JP." } }}Output schema
{ "type": "object", "required": [ "passport_country", "destination_country", "requirement", "allowed_stay", "passport_index_link", "raw_requirement" ], "properties": { "requirement": { "type": "string", "description": "Visa or entry requirement in plain words." }, "allowed_stay": { "type": [ "string", "null" ], "description": "Allowed stay as stated by Passport Index, if shown." }, "raw_requirement": { "type": "string", "description": "Requirement value as shown by Passport Index.", "x-fous-developer": true }, "passport_country": { "type": "string", "description": "Passport issuing country." }, "destination_country": { "type": "string", "description": "Destination country." }, "passport_index_link": { "type": "string", "description": "Passport Index passport page containing the requirement." } }, "additionalProperties": false}- Price
- 1 credit per completed run (1¢ with pay as you go); failed runs are free.
- Method
passportindex.org/check_visa_requirement- Returns
- requirement, allowed stay, raw requirement, Passport Index link
Use it from your agent
Give your agent this line. It reads SKILL.md, gets a Fous API key and connects the Fous MCP server. Its run then takes the method passportindex.org/check_visa_requirement with the inputs above.
Ask your agent
- Do I need a visa to visit Japan with an Indian passport, and how long can I stay?
- I hold a Nigerian passport and I'm planning a trip to Turkey next month. What's the entry requirement there?
- Check on passportindex.org whether a US passport holder needs a visa for Brazil.
- Can someone with a Philippine passport enter Thailand visa-free? If so, for how many days?
- Look up on Passport Index what a Canadian (CA) passport gets for Vietnam (VN): visa on arrival, e-visa, or visa-free, and the permitted stay.
See more
All Passport Index methodsLooks up a country's passport on Passport Index and returns its global rank, mobility score, visa requirement counts and optionally every destination's requirement.
passportindex.org/get_passport_rankReturns current UK government (FCDO) travel warnings, entry requirements for British passport holders, safety, health and emergency information for a country. Summaries are shortened; follow the link for full details.
gov.uk/get_travel_adviceGets CDC traveler vaccines, medicines, the routine vaccine reminder and malaria guidance for a destination country. Recommendations can vary by itinerary and traveler, so read the linked country page for details.
cdc.gov/get_travel_vaccinesFinds available hostels, hotels and guesthouses on Hostelworld in a city for given dates, with per-night dorm and private room prices, ratings, facilities and booking links.
hostelworld.com/search_hostelsChecks a name against the current UK Sanctions List and returns possible matches in the site's best-match order, with designation details. Results may include entries that only mention the name in their reasons, so check each entry before identifying anyone.
gov.uk/check_sanctionsChecks whether an app or website has current problems in a country on Downdetector: its status, reports in the latest 15-minute interval, the usual report count, the most reported problem types and the most affected locations when shown. The service must have a public Downdetector page in that country.
downdetector.com/check_service_statusLists EU Sanctions Map regimes concerning a country, with measures, EUR-Lex legal acts, amendment dates and listed person and entity counts.
sanctionsmap.eu/get_country_sanctionsGets a city's current air quality, weather, daily forecast and health advice from IQAir.
iqair.com/get_air_quality