Geocoding API
CSV2GEO provides a REST API with 48 endpoints for geocoding, reverse geocoding, places search, administrative boundaries (including postcode → polygon, ancestors walk-up, children walk-down, consolidated cities), IP geolocation, address autocomplete, and account management.
Try in ChatGPT
No code needed — geocode addresses directly in ChatGPT. Type an address or drop a CSV/Excel file.
Getting Your API Key
- Log in to csv2geo.com
- Go to API Keys in the sidebar
- Click Create API Key
- Copy your key — it starts with
geo_live_
Free tier: 3,000 API requests per day, no credit card required.
API Endpoints
The endpoints below are the full set callable from https://csv2geo.com/api/v1/ with a geo_live_* key — i.e. what the Python SDK and Node SDK reach by default.
Geocoding & address tools
| Method | Endpoint | Description |
|---|---|---|
| GET | /v1/geocode | Forward geocode a single address |
| POST | /v1/geocode | Batch forward geocode (up to 10,000) |
| GET | /v1/reverse | Reverse geocode a single coordinate |
| POST | /v1/reverse | Batch reverse geocode (up to 10,000) |
| GET | /v1/autocomplete | Address autocomplete |
| GET | /v1/validate | Check whether an address resolves to a real location |
| POST | /v1/validate | Batch validate addresses |
| GET | /v1/parse | Parse a free-form address into components |
| POST | /v1/parse | Batch parse addresses |
| GET | /v1/standardize | Normalize an address into canonical form |
| POST | /v1/addresses/compare | Compare two addresses for similarity |
| GET | /v1/addresses/nearby | Find addresses within radius of a coordinate |
| GET | /v1/addresses/street | List addresses on a given street + postcode |
| GET | /v1/addresses/random | Random sample of addresses (testing) |
| GET | /v1/addresses/stats | Address-database statistics |
| GET | /v1/addresses/interpolate | Interpolate a coordinate from address-range data |
| GET | /v1/addresses/crossstreet | Find the cross-street nearest to a coordinate |
Places (POIs)
| Method | Endpoint | Description |
|---|---|---|
| GET | /v1/places | Search 72M+ places by name |
| GET | /v1/places/nearby | Find places near a coordinate |
| GET | /v1/places/by-id/{id} | Get place details by ID |
| GET | /v1/places/categories | List all place categories |
| GET | /v1/places/brands | Search places by brand |
| GET | /v1/places/chain | All locations of a brand/chain |
| GET | /v1/places/count | Count places matching criteria |
| GET | /v1/places/similar | Find places similar to a given place |
| GET | /v1/places/random | Random sample places |
| GET | /v1/places/stats | Database statistics by country/category |
| POST | /v1/places/batch | Batch lookup multiple places by ID |
Administrative boundaries (Divisions)
| Method | Endpoint | Description |
|---|---|---|
| GET | /v1/divisions | Search administrative boundaries by name |
| GET | /v1/divisions/contains | Find what division contains a point |
| GET | /v1/divisions/by-postcode | Postcode → polygon + bbox + population in one call |
| GET | /v1/divisions/by-id/{id} | Get division by ID |
| GET | /v1/divisions/ancestors/{id} | Walk-up "part-of" chain to country |
| GET | /v1/divisions/children/{id} | Walk-down: immediate sub-divisions |
| GET | /v1/divisions/consolidated/{id} | Consolidated cities (e.g. NYC = 5 boroughs) |
| GET | /v1/divisions/hierarchy/{id} | Full hierarchy tree from a node |
| GET | /v1/divisions/subtypes | List division subtypes (locality, county, region, etc.) |
| GET | /v1/divisions/countries | List countries with division data |
| GET | /v1/divisions/random | Random sample divisions |
| GET | /v1/divisions/stats | Division-database statistics |
IP geolocation
| Method | Endpoint | Description |
|---|---|---|
| GET | /v1/ip | IP → country, region, city, county, ASN |
| GET | /v1/ip/me | Geolocate the requester's own IP |
| POST | /v1/ip/batch | Batch IP lookup (up to 1,000) |
Routing & Navigation Pro+ only
Powered by a self-hosted Valhalla engine over the global OpenStreetMap network. All 5 modes share one tile build (drive, truck, walk, bike, motorcycle). Pro plan and above; Free/Growth keys return 403 plan_permission_denied.
| Method | Endpoint | Description |
|---|---|---|
| GET | /v1/routing | Turn-by-turn route through 2-25 waypoints. Supports truck attrs (height/weight/HAZMAT), time-aware ETA, up to 3 alternate routes, 25+ narration languages. |
| GET | /v1/isoline | Reachability polygon(s) — 1-3 ranges per call, time (≤ 3 600 s) or distance (≤ 50 000 m). |
| POST | /v1/route-matrix | N×M distance + duration matrix up to 10 000 cells. |
| POST | /v1/map-match | Snap a GPS trace (2-1 000 points) to the road network. |
| GET | /v1/optimize_route | TSP-style stop ordering for up to 20 waypoints. |
| GET | /v1/locate | Snap a single point to the nearest road; returns way_id, road_class, surface, speed_limit_kmh. |
| GET | /v1/elevation | Per-point elevation lookup (up to 500 points). |
Quick example — point-to-point routing
curl 'https://csv2geo.com/api/v1/routing?waypoints=40.7128,-74.006|34.0522,-118.2437&mode=drive&api_key=YOUR_KEY'
# → distance_m: 4_496_675 (km 4 497), duration_s: 143_484 (h 39.9), geometry: LineStringTruck-aware routing with height restriction
curl 'https://csv2geo.com/api/v1/routing?waypoints=51.5074,-0.1278|48.8566,2.3522&mode=truck&truck_height=4.5&api_key=YOUR_KEY'
# → London → Paris truck route with 4.5m height clearance; auto-routes via Eurotunnel/ferryCoverage & account
| Method | Endpoint | Description |
|---|---|---|
| GET | /v1/coverage | Per-country boundary tier + counts |
| GET | /v1/coverage-stats | Aggregate dataset stats (no API key required) |
| GET | /v1/me | Account info, plan, and rate limits |
Utilities
| Method | Endpoint | Description |
|---|---|---|
| GET | /v1/timezone | IANA timezone for a coordinate |
| GET | /v1/distance | Haversine distance between two coordinates |
Result-quality rank block
Both geocoding and division responses include a rank block — a Geoapify-shaped object describing the strength of the result. Different fields appear depending on the endpoint:
- Geocoding (
/geocode,/reverse): emitsconfidence(0-1, match strength) andmatch_type(e.g.full_match,fuzzy_match). - Divisions (
/divisions/*): emitsimportance(0-1, derived from Wikidata sitelink count — Tokyo, Paris, NYC ≈ 1.0; small rural divisions ~0.2). Use it to disambiguate when multiple divisions match a query. About 1.02M of 4.6M divisions have a value (those with a Wikidata Q-ID).
# Geocode rank: confidence + match_type
curl "https://csv2geo.com/api/v1/geocode?q=90210&country=US&api_key=YOUR_KEY" | jq '.results[0].rank'
# → { "confidence": 1, "match_type": "full_match" }
# Division rank: importance only
curl "https://csv2geo.com/api/v1/divisions/by-id/{nyc_id}?api_key=YOUR_KEY" | jq '.result.rank'
# → { "importance": 1 }Multi-language names
Pass ?lang= (BCP-47 tag) on any places, boundaries, geocode, or reverse-geocode endpoint to get the localized name. Pass ?include=other_names (composable with other includes) to receive the full translation map.
# Place name in Japanese
curl "https://csv2geo.com/api/v1/places/{id}?lang=ja&api_key=YOUR_KEY"
# → "name": "CoCo壱番屋"
# Full translation map on a division
curl "https://csv2geo.com/api/v1/divisions/by-postcode?code=70173&country=DE&include=other_names&api_key=YOUR_KEY"
# → "other_names": { "en": "Stuttgart", "fr": "Stuttgart", "ja": "シュトゥットガルト", ... }
# Geocode with translated admin names (Sprint 2.1c, 2026-05-08)
curl "https://csv2geo.com/api/v1/geocode?q=1010&country=AT&lang=de&api_key=YOUR_KEY"
# → components.country: "Österreich", components.city: "Wien"
# Geocode with full per-level translation maps (Sprint 2.1d)
curl "https://csv2geo.com/api/v1/geocode?q=1010&country=AT&include=other_names&api_key=YOUR_KEY"
# → other_names: {
# "country": { "en": "Austria", "de": "Österreich", "fr": "Autriche", ... 265 langs },
# "region": { ... },
# "locality": { ... }
# }Coverage today:
- Divisions: 1.5M divisions across ~78 languages on average (Overture
names.common) - Places: 234,000 places across 17 languages (Overture
names.rules) - Geocode + reverse: translates the embedded admin-level names (city/state/country/district) by walking the parent_division chain. Street + house_number stay in source language because Overture has no address-level translation data — Geoapify works the same way.
- Falls back to base language (e.g.
pt-BR→pt) then to the primary name
Quick Start
Forward Geocode (Address → Coordinates)
curl "https://csv2geo.com/api/v1/geocode?q=1600+Pennsylvania+Ave,+Washington+DC&country=US&api_key=YOUR_KEY"Reverse Geocode (Coordinates → Address)
curl "https://csv2geo.com/api/v1/reverse?lat=40.7484&lng=-73.9857&api_key=YOUR_KEY"Python SDK
pip install csv2geofrom csv2geo import Client
client = Client("YOUR_API_KEY")
# Forward geocode
result = client.geocode("1600 Pennsylvania Ave, Washington DC", country="US")
print(f"{result.lat}, {result.lng}")
# Reverse geocode
result = client.reverse(lat=40.7484, lng=-73.9857)
print(result.formatted_address)Node.js SDK
npm install csv2geo-sdkconst { Client } = require('csv2geo-sdk');
const client = new Client({ apiKey: 'YOUR_API_KEY' });
const result = await client.geocode('1600 Pennsylvania Ave, Washington DC', { country: 'US' });
console.log(result.lat, result.lng);Import API Collections
Test all 48 endpoints instantly in your favorite API tool:
- Postman Collection — Import into Postman, all endpoints pre-configured
- Insomnia Collection — Import into Insomnia with environment
- OpenAPI Spec — Import into Swagger, Hoppscotch, Bruno, or any tool
Full Documentation
- API Documentation — Interactive docs with live testing
- GitHub — Source code, SDKs, and examples
- RapidAPI — Test and subscribe via RapidAPI Hub
Rate Limits
| Tier | Requests/day | Batch Size |
|---|---|---|
| Free | 1,000 | 100 |
| Starter | 50,000 | 1,000 |
| Growth | 250,000 | 5,000 |
| Pro | 1,000,000 | 10,000 |
Check response headers for your current usage:
X-RateLimit-Limit— Maximum requests per minuteX-RateLimit-Remaining— Requests remainingX-RateLimit-Reset— When the window resets