# Visa Requirements API
> Look up visa requirements between 199 passports and 199 destinations: whether a passport holder needs a visa, can enter visa-free, gets a visa on arrival, an e-visa or an eTA, or is not admitted — including the allowed length of stay in days. Get a full breakdown for any passport (every destination with category counts and a passport-power mobility score), the reverse view for any destination (which passports may enter), a ranking that compares the mobility of several passports, and the list of supported countries. Countries can be given as ISO-2, ISO-3 or exact name, and every endpoint accepts input via the query string or the request body. Pure server-side data (no third-party upstream), so responses are instant and always available. Ideal for travel-booking flows, relocation and immigration tools, fintech onboarding and travel apps.

## Authentication
All requests require your oanor API key in the `x-oanor-key` header. Get one at https://www.oanor.com/developer/keys.

```bash
curl -H "x-oanor-key: oanor_live_…" "https://api.oanor.com/visa-api/..."
```

## Pricing
- **Free** (Free) — 25,000 calls/Mo, 3 req/s
- **Basic** ($6/Mo) — 350,000 calls/Mo, 12 req/s
- **Pro** ($17/Mo) — 2,500,000 calls/Mo, 40 req/s
- **Mega** ($44/Mo) — 12,000,000 calls/Mo, 120 req/s

## Endpoints

### Visa

#### `GET /v1/compare` — Rank passports by mobility

**Parameters:**
- `passports` (query, required, string) — Comma-separated countries (max 20) Example: `DE,US,JP,SG`

**Example:**
```bash
curl -H "x-oanor-key: $KEY" \
  "https://api.oanor.com/visa-api/v1/compare?passports=DE%2CUS%2CJP%2CSG"
```

**Response:**
```json
{
    "data": {
        "count": 4,
        "results": [
            {
                "rank": 1,
                "passport": {
                    "code": "DEU",
                    "iso2": "DE",
                    "name": "Germany",
                    "region": "Europe"
                },
                "by_category": {
                    "eta": 8,
                    "e_visa": 18,
                    "visa_free": 126,
                    "visa_required": 15,
                    "visa_on_arrival": 31
                },
                "mobility_score": 183
            },
            {
                "rank": 2,
                "passport": {
                    "code": "JPN",
                    "iso2": "JP",
                    "name": "Japan",
                    "region": "Asia"
                },
                "by_category": {
                    "eta": 9,
                    "e_visa": 18,
                    "visa_free": 117,
                    "visa_required": 16,
                    "visa_on_arrival": 38
                },
                "mobility_score": 182
            },
            {
                "rank": 3,
                "passport": {
                    "code": "SGP",
                    "iso2": "SG",
                    "name": "Singapore",
                    "region": "Asia"
                },
                "by_category": {
                    "eta": 8,
                    "e_visa": 16,
                    "visa_free": 130,
                    "
…(truncated, see openapi.json for full schema)
```

#### `GET /v1/countries` — All supported countries

**Example:**
```bash
curl -H "x-oanor-key: $KEY" \
  "https://api.oanor.com/visa-api/v1/countries"
```

**Response:**
```json
{
    "data": {
        "count": 199,
        "results": [
            {
                "code": "AFG",
                "iso2": "AF",
                "name": "Afghanistan",
                "region": "Asia"
            },
            {
                "code": "AGO",
                "iso2": "AO",
                "name": "Angola",
                "region": "Africa"
            },
            {
                "code": "ALB",
                "iso2": "AL",
                "name": "Albania",
                "region": "Europe"
            },
            {
                "code": "AND",
                "iso2": "AD",
                "name": "Andorra",
                "region": "Europe"
            },
            {
                "code": "ARE",
                "iso2": "AE",
                "name": "United Arab Emirates",
                "region": "Asia"
            },
            {
                "code": "ARG",
                "iso2": "AR",
                "name": "Argentina",
                "region": "Americas"
            },
            {
                "code": "ARM",
                "iso2": "AM",
                "name": "Armenia",
                "region": "Asia"
            },
            {
                "code": "ATG",
                "iso2": "AG",
                "name": "Antigua and Barbuda",
                "region": "Americas"
            },
            {
                "code": "AUS",
                "iso2": "AU",
                "name": "Australia",
                "regi
…(truncated, see openapi.json for full schema)
```

#### `GET /v1/destination` — Which passports may enter a destination

**Parameters:**
- `country` (query, required, string) — Destination country Example: `JP`
- `category` (query, optional, string) — Filter category Example: `visa_free`

**Example:**
```bash
curl -H "x-oanor-key: $KEY" \
  "https://api.oanor.com/visa-api/v1/destination?country=JP&category=visa_free"
```

**Response:**
```json
{
    "data": {
        "count": 71,
        "passports": [
            {
                "passport": {
                    "code": "AND",
                    "iso2": "AD",
                    "name": "Andorra",
                    "region": "Europe"
                },
                "requirement": {
                    "code": "90",
                    "label": "visa-free (90 days)",
                    "category": "visa_free",
                    "allowed_days": 90
                }
            },
            {
                "passport": {
                    "code": "ARG",
                    "iso2": "AR",
                    "name": "Argentina",
                    "region": "Americas"
                },
                "requirement": {
                    "code": "90",
                    "label": "visa-free (90 days)",
                    "category": "visa_free",
                    "allowed_days": 90
                }
            },
            {
                "passport": {
                    "code": "AUS",
                    "iso2": "AU",
                    "name": "Australia",
                    "region": "Oceania"
                },
                "requirement": {
                    "code": "90",
                    "label": "visa-free (90 days)",
                    "category": "visa_free",
                    "allowed_days": 90
                }
            },
            {
                "passport": {
                    "code": "AUT",
                
…(truncated, see openapi.json for full schema)
```

#### `GET /v1/passport` — All destinations for one passport

**Parameters:**
- `country` (query, required, string) — Passport country Example: `DEU`
- `category` (query, optional, string) — Filter: visa_free|visa_on_arrival|e_visa|eta|visa_required|no_admission Example: `visa_required`

**Example:**
```bash
curl -H "x-oanor-key: $KEY" \
  "https://api.oanor.com/visa-api/v1/passport?country=DEU&category=visa_required"
```

**Response:**
```json
{
    "data": {
        "count": 15,
        "passport": {
            "code": "DEU",
            "iso2": "DE",
            "name": "Germany",
            "region": "Europe"
        },
        "by_category": {
            "eta": 8,
            "e_visa": 18,
            "visa_free": 126,
            "visa_required": 15,
            "visa_on_arrival": 31
        },
        "destinations": [
            {
                "destination": {
                    "code": "AFG",
                    "iso2": "AF",
                    "name": "Afghanistan",
                    "region": "Asia"
                },
                "requirement": {
                    "code": "visa required",
                    "label": "visa required",
                    "category": "visa_required",
                    "allowed_days": null
                }
            },
            {
                "destination": {
                    "code": "DZA",
                    "iso2": "DZ",
                    "name": "Algeria",
                    "region": "Africa"
                },
                "requirement": {
                    "code": "visa required",
                    "label": "visa required",
                    "category": "visa_required",
                    "allowed_days": null
                }
            },
            {
                "destination": {
                    "code": "CAF",
                    "iso2": "CF",
                    "name": "Central African Republic",
              
…(truncated, see openapi.json for full schema)
```

#### `GET /v1/requirement` — Visa rule for a passport → destination

**Parameters:**
- `from` (query, required, string) — Passport country (ISO-2/3 or name) Example: `DE`
- `to` (query, required, string) — Destination country Example: `US`

**Example:**
```bash
curl -H "x-oanor-key: $KEY" \
  "https://api.oanor.com/visa-api/v1/requirement?from=DE&to=US"
```

**Response:**
```json
{
    "data": {
        "to": {
            "code": "USA",
            "iso2": "US",
            "name": "United States",
            "region": "Americas"
        },
        "from": {
            "code": "DEU",
            "iso2": "DE",
            "name": "Germany",
            "region": "Europe"
        },
        "requirement": {
            "code": "eta",
            "label": "electronic travel authorisation",
            "category": "eta",
            "allowed_days": null
        }
    },
    "meta": {
        "timestamp": "2026-05-30T22:48:33.595Z",
        "request_id": "f6058caa-786f-46bb-b63c-517078d281ea"
    },
    "status": "ok",
    "message": "Requirement retrieved",
    "success": true
}
```


---
Marketplace page: https://www.oanor.com/api/visa-api
OpenAPI spec: https://www.oanor.com/api/visa-api/openapi.json
