Geocoding, reverse geocoding
& routing β€” without the per-call anxiety

Self-hosted location services with simple key-based auth, transparent usage reporting and predictable limits. Built for fleets, logistics and anything that moves.

Create free account Read the dev guide
# One GET request. That's the whole integration.
curl https://api.example.com/api/v1/Geocode/{your-api-key}/10+Downing+Street+London

{ "Lat": 51.5033, "Lon": -0.1277, "Address": "10 Downing Street, Westminster, London SW1A 2AA" }

Everything you need to put things on a map

Three focused APIs behind one key. No SDKs to learn β€” if you can make an HTTP request, you're integrated.

πŸ“

Forward geocoding

Free-text address or place search to coordinates. Handles partial addresses, postcodes and points of interest.

πŸ”„

Reverse geocoding

Coordinates to a structured, human-readable address. Ideal for telematics pings, photo tagging and check-ins.

πŸ—ΊοΈ

Routing

Point-to-point routes with distance, duration and turn-by-turn geometry, tuned for real road networks.

πŸ”‘

Simple key auth

The key lives in the URL path. No OAuth dance, no signing, no token refresh. Issue and revoke keys yourself.

πŸ“Š

Transparent usage

Per-key success/failure counts, daily breakdowns and monthly trends in your dashboard. No surprise bills.

🏒

Team accounts

Group keys and users under your company. Invite teammates with a link β€” everyone sees the same usage picture.

Dev guide

All endpoints are plain HTTPS GETs that return JSON. Replace {apikey} with a key from your dashboard.

GET /api/v1/Geocode/{apikey}/{phrase} Forward geocode β€” free-text address or place name to coordinates. URL-encode the phrase.
# Geocode an address
curl "https://api.example.com/api/v1/Geocode/{apikey}/1600+Amphitheatre+Parkway"
const r = await fetch(`https://api.example.com/api/v1/Geocode/${apiKey}/${encodeURIComponent(address)}`);
const result = await r.json();
console.log(result.Lat, result.Lon);
using var http = new HttpClient();
var json = await http.GetStringAsync(
    $"https://api.example.com/api/v1/Geocode/{apiKey}/{Uri.EscapeDataString(address)}");
GET /api/v1/ReverseGeocode/{apikey}/{lat}/{lon} Reverse geocode β€” decimal coordinates to the nearest structured address.
# What's at these coordinates?
curl "https://api.example.com/api/v1/ReverseGeocode/{apikey}/51.5033/-0.1277"
const r = await fetch(`https://api.example.com/api/v1/ReverseGeocode/${apiKey}/${lat}/${lon}`);
const place = await r.json();
var json = await http.GetStringAsync(
    $"https://api.example.com/api/v1/ReverseGeocode/{apiKey}/{lat}/{lon}");
GET /api/v1/Route/{apikey}/{start}/{end} Route between two points. Start and end are lat,lon pairs. Returns distance, duration and geometry.
# London β†’ Manchester
curl "https://api.example.com/api/v1/Route/{apikey}/51.5074,-0.1278/53.4808,-2.2426"
const r = await fetch(`https://api.example.com/api/v1/Route/${apiKey}/${start}/${end}`);
const route = await r.json();
console.log(route.DistanceMeters, route.DurationSeconds);
var json = await http.GetStringAsync(
    $"https://api.example.com/api/v1/Route/{apiKey}/{start}/{end}");

Every response is JSON. Failed lookups return an empty result with HTTP 200; auth failures return 401/429 with a reason. Rate limits and allowed services are per-account β€” see your dashboard.

Up and running in three steps

No sales call, no card required to start.

Create your account

Register with email or single sign-on. Enter your company name β€” or join your team with an invite link.

Issue an API key

One click in the dashboard. The key is shown once β€” keep it safe, revoke and reissue any time.

Make your first call

Drop the key into any example above. Watch the request land in your usage dashboard seconds later.

Ready to build?

Create an account and make your first geocoding call in under two minutes.

Get started β€” it's free