Geospatial endpoints, over plain HTTP.
Stable, documented HTTP endpoints for routing, geocoding, terrain analytics, address parsing, and spatial probability. Use it from web apps, backends, batch pipelines, or anywhere an MCP client doesn't fit.
Authenticate with an x-api-key header. Standard JSON. Per-call billing. REST returns the full response payload; the MCP variants ship trimmed shapes tuned for agent context windows.
api.footstep.ai
Three lines of cURL, or whatever your stack speaks
Authentication is a single header. Body is JSON. There is no SDK to install. A `requests`-style helper or a generated TypeScript client would each be about ten lines if you want one.
curl -X POST https://api.footstep.ai/v1/routing/route \
-H "x-api-key: sk_live_your_key_here" \
-H "Content-Type: application/json" \
-d '{
"locations": [
{ "lat": 51.5322, "lon": -0.1240 },
{ "lat": 51.5055, "lon": -0.0754 }
]
}'const response = await fetch(
"https://api.footstep.ai/v1/routing/route",
{
method: "POST",
headers: {
"x-api-key": "sk_live_your_key_here",
"Content-Type": "application/json",
},
body: JSON.stringify({
locations: [
{ lat: 51.5322, lon: -0.1240 },
{ lat: 51.5055, lon: -0.0754 },
],
}),
},
);
const data = await response.json();import requests
response = requests.post(
"https://api.footstep.ai/v1/routing/route",
headers={"x-api-key": "sk_live_your_key_here"},
json={
"locations": [
{"lat": 51.5322, "lon": -0.1240},
{"lat": 51.5055, "lon": -0.0754},
]
},
)
data = response.json()What to expect from every endpoint
Predictable HTTP
Standard POST and GET semantics. JSON in, JSON out. No SDK to install, no proprietary protocol, your existing HTTP client is enough. Errors come back with descriptive error fields and proper status codes (400 / 401 / 402 / 429 / 500).
Explicit units, every field
distance_meters is always meters. duration_seconds is always seconds. grade_percent is always a percentage. No global units parameter to set, the field name carries the unit. Unambiguous in code review and in LLM context.
Hoisted context, lean payloads
Shared admin fields (country, region, district) are hoisted into a top-level context block when every result shares them. include_geometry is opt-in for endpoints that have heavy geometries, so your bytes go to the data.
Open formats end-to-end
Pass format: "geojson" for RFC 7946 FeatureCollection responses. Encoded polylines for compact route geometry. H3 hex grids for predict. Drop responses straight into deck.gl, Mapbox GL, Leaflet, or QGIS without a transformation step.
The full surface area
Click any endpoint for the full reference: parameter tables, response shapes, and copy-pasteable code samples.
Predict1
A probabilistic spatial model. Returns a per-hex H3 surface scored by likelihood, conditioned on behavioural profile, terrain, and weather.
Predict access and use
Restricted access. Predict is not part of the standard plan. Access is granted by application only, to organisations with appropriate operational expertise. Apply for access.
Decision support only, never a replacement. Predict outputs are probability priors. They must never replace expert human judgment, established response protocols, or any duty-of-care obligation. Outputs may be incorrect, incomplete, or unsuitable for a given scenario. Final decisions sit with qualified human operators.
Routing9
Terrain-aware routing across five travel modes (car, walk, bike, bus, truck), with explicit units everywhere. Your model never has to guess whether the number is metres or feet.
Driving, walking, and cycling directions.
Point-to-point or multi-stop routes with terrain analytics. Answer 'is this walkable?' without a second call.
The fastest order to visit your stops.
Travelling salesman in milliseconds. Returns the optimised order, the savings, and per-leg breakdowns.
Walk, cycle, or drive. Which one fits?
Run multiple travel modes through the same A to B and get a side-by-side comparison plus a natural-language summary.
Directions from A to B, by name.
Geocode both ends and compute the route in one call. The agent says 'how do I get from Kings Cross to Tower Bridge'. The tool handles the rest.
Where can you reach in 30 minutes?
Reachability polygons by time or distance from any starting point. Walking, cycling, or driving.
Travel times between every pair.
An N-by-M travel-time matrix between sources and destinations. The basis for assignment, dispatch, and ETA quotes.
Altitude for any point or path.
Heights in metres above sea level, with summary statistics for total ascent and descent.
Clean up a GPS trace.
Map-match a noisy GPS recording to the road network. Returns the corrected path plus per-segment road attributes.
Find stops along the way.
Coffee, charging, fuel, food. Ranked by how little detour they add to the existing route.
Geocoding4
Forward, reverse, batch, and POI search backed by an open-data index refreshed weekly. Every result carries place type and confidence, so the agent can decide whether to ask the user or guess.
Where is this place?
Turn an address, landmark, or place name into coordinates. Returns ranked candidates with confidence scores.
What's at this location?
Given a coordinate, return the address or place label. Useful for labelling pins and incident reports.
Geocode a thousand addresses at once.
Run up to 1,000 addresses through geocoding in a single call. Returns coordinates and confidence for each.
What's near here?
Points of interest near a location, by category or by venue name. Sorted by distance.
Natural Language1
An LLM pre-step for the messy reality of customer-typed addresses. Cleans typos, expands abbreviations, reformats components. Downstream geocoding actually hits.
What you actually get back
A worked routing example, lightly trimmed. Explicit-unit field names, a structured terrain block, and turn-by-turn legs ready to deserialise.
{
"route": {
"distance_meters": 5765,
"duration_seconds": 812,
"terrain": {
"total_ascent_meters": 12.4,
"total_descent_meters": 8.1,
"max_elevation_meters": 28,
"min_elevation_meters": 5,
"avg_grade_percent": 1.2,
"max_grade_percent": 4.5,
"difficulty": "flat"
},
"legs": [
{
"distance_meters": 5765,
"duration_seconds": 812,
"steps": [
{
"instruction": "Drive north on Midland Road.",
"distance_meters": 120,
"duration_seconds": 15
}
]
}
]
}
}Built for the way agents
actually consume APIs.
Most geospatial APIs were designed in the era of mobile SDKs and web maps. We design ours for tool-calling LLMs, then surface it as REST so your backend gets the same upgrades.
Token-lean by default
include_geometry: true only when you're rendering on a map. The rest of the time your context window is for reasoning, not encoded polylines.Stateless
Units in the field name
distance_meters, duration_seconds, grade_percent. Your model never has to guess.{
"distance_meters": 5765,
"duration_seconds": 812,
"terrain": {
"total_ascent_meters": 12.4,
"avg_grade_percent": 1.2,
"difficulty": "flat"
}
}Every major runtime
Signup to first call
in under a minute.
Get a key from console.footstep.ai
Sign up at console.footstep.ai and create an API key. £5 of free credit is applied to your account. Keys are scoped per environment, so dev and prod stay separate from day one.
Wire it into your agent or your app
Agents: point your MCP client at mcp.footstep.ai with the x-api-key header. Apps and backends: hit api.footstep.ai with the same key. Pick one or use both.
Call tools, get structured spatial data
Every response carries explicit units, place types, and confidence scores. Shared admin fields are hoisted into a context block. Geometry is opt-in.
Watch usage and cost from the console
Per-key request volume, success rate, and live cost. Drill into recent requests to inspect inputs, outputs, and latency. Bump rate limits as you scale.
Your data, in formats
you already know how to render.
Outputs use open standards. If you ever need to migrate, your data shapes keep working. That's a deliberate design choice, not an accident.
RFC 7946. Pass format: "geojson" and drop responses straight into deck.gl, Leaflet, Mapbox GL, or QGIS.
Uber's hierarchical hex index. Used by predict for probability surfaces. Renders in kepler.gl or deck.gl's H3HexagonLayer out of the box.
Google's compact polyline encoding. Default for routing geometry, swappable via format. Decoded easily with any open-source decoder.
GeoJSON FeatureCollections, H3 cells, and encoded polylines work with the major mapping stacks (deck.gl, Mapbox GL, Leaflet, kepler.gl, QGIS, ArcGIS) with no transformation step.
distance_meters, duration_seconds, grade_percent. Field names carry their unit, so reasoning over outputs is unambiguous in code review and in LLM context.
Every response includes the underlying data version. Pin behaviour to a snapshot for reproducibility, or stay on rolling for fresh updates.
The docs are the product manual. Every endpoint, every parameter, every error code, with copy-pasteable examples.
Read the docs →Building an agent? You probably want MCP.
The same endpoints are exposed as MCP tools at mcp.footstep.ai. Better fit for tool-calling LLMs, same data underneath.