Skip to content

Get City Recommendations

GET
/api/v1/geo/recommendations
curl --request GET \
--url 'https://indepai.app/api/v1/geo/recommendations?budget=2500&preferences=safety%2Cinternet%2Cclimate&limit=10'

Get personalized city recommendations based on budget and preferences. Accepts query parameters for budget, preferences (comma-separated), and limit.

budget

Monthly budget in USD

number
> 0
Example
2500
preferences

Comma-separated preference tags

string
Example
safety,internet,climate
limit

Number of recommendations to return

integer
>= 1 <= 50
Example
10

City recommendations

Media typeapplication/json
object
success
required
boolean
data
required
object
recommendations
required
Array<object>
object
city
required
object
id
required

City identifier

string
name
required

City name

string
country
required

Country name

string
countryCode
required

ISO 3166-1 alpha-2 country code

string
>= 2 characters <= 2 characters
region
required

Geographic region

string
coordinates
required

City coordinates

object
lat
required
number
>= -90 <= 90
lng
required
number
>= -180 <= 180
costOfLiving
required
object
monthlyTotal
required

Total monthly cost of living (EUR)

number
housing
required

Monthly housing cost (EUR)

number
food
required

Monthly food cost (EUR)

number
transportation
required

Monthly transportation cost (EUR)

number
utilities
required

Monthly utilities cost (EUR)

number
entertainment
required

Monthly entertainment cost (EUR)

number
other
required

Other monthly costs (EUR)

number
qualityOfLife
required
object
overall
required

Overall quality of life score (0-100)

number
<= 100
safety
required

Safety score (0-100)

number
<= 100
healthcare
required

Healthcare quality score (0-100)

number
<= 100
climate
required

Climate score (0-100)

number
<= 100
internet
required

Internet quality score (0-100)

number
<= 100
englishFriendly
required

English-friendliness score (0-100)

number
<= 100
taxInfo
required
object
incomeTaxRate
required

Top marginal income tax rate (%)

number
<= 100
capitalGainsTaxRate
required

Capital gains tax rate (%)

number
<= 100
specialPrograms
required

Available special tax programs

Array<string>
nomadScore
required

Overall nomad-friendliness score (0-100)

number
<= 100
visaInfo
required
object
schengen
required

Is in Schengen area

boolean
digitalNomadVisa
required

Offers digital nomad visa

boolean
visaFreeFor
required

Countries with visa-free access

Array<string>
currency
required

Local currency code

string
>= 3 characters <= 3 characters
lastUpdated
required

Last data update timestamp

string format: date-time
matchScore
required

How well this city matches preferences

number
<= 100
savingsPerMonth
required

Monthly savings compared to current location

number
fiYearsGained
required

Additional FI runway years at this location

number
highlights
required

Key highlights for this recommendation

Array<string>
summary
required
object
potentialSavings
required

Average potential monthly savings

number
avgFiYearsGained
required

Average additional FI years across recommendations

number
meta
required
object
timestamp
required
string format: date-time
Example
{
"success": true,
"data": {
"recommendations": [
{
"city": {
"id": "lisbon-portugal",
"name": "Lisbon",
"country": "Portugal",
"countryCode": "PT",
"region": "Western Europe",
"coordinates": {
"lat": 38.7223,
"lng": -9.1393
},
"costOfLiving": {
"monthlyTotal": 1800,
"housing": 900,
"food": 350,
"transportation": 50,
"utilities": 100,
"entertainment": 200,
"other": 200
},
"qualityOfLife": {
"overall": 75,
"safety": 80,
"healthcare": 70,
"climate": 85,
"internet": 75,
"englishFriendly": 70
},
"taxInfo": {
"incomeTaxRate": 48,
"capitalGainsTaxRate": 28,
"specialPrograms": [
"NHR (Non-Habitual Resident)"
]
},
"nomadScore": 82,
"visaInfo": {
"visaFreeFor": [
"US",
"UK",
"CA",
"AU"
]
},
"currency": "EUR"
},
"highlights": [
"50% lower cost of living",
"Excellent healthcare",
"Digital nomad visa available"
]
}
]
}
}

Validation error

Media typeapplication/json
object
success
required

Always false for error responses

boolean
error
required

Error type

string
code

Machine-readable error code

string
details

Detailed validation errors

Array<object>
object
path
required

Path to the invalid field

string
message
required

Error message

string
Example
{
"success": false,
"error": "Validation error",
"code": "VALIDATION_ERROR",
"details": [
{
"path": "currentAge",
"message": "Must be between 18 and 100"
}
]
}