REST API

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

Your first call

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.

shell
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 }
    ]
  }'
Design principles

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.

Endpoints

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.

POST /v1/routing/route

Driving, walking, and cycling directions.

Point-to-point or multi-stop routes with terrain analytics. Answer 'is this walkable?' without a second call.

See it
POST /v1/routing/optimize

The fastest order to visit your stops.

Travelling salesman in milliseconds. Returns the optimised order, the savings, and per-leg breakdowns.

See it
POST /v1/routing/compare

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.

See it
POST /v1/routing/find-and-route

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.

See it
POST /v1/routing/isochrone

Where can you reach in 30 minutes?

Reachability polygons by time or distance from any starting point. Walking, cycling, or driving.

See it
POST /v1/routing/matrix

Travel times between every pair.

An N-by-M travel-time matrix between sources and destinations. The basis for assignment, dispatch, and ETA quotes.

See it
POST /v1/routing/elevation

Altitude for any point or path.

Heights in metres above sea level, with summary statistics for total ascent and descent.

See it
POST /v1/routing/snap

Clean up a GPS trace.

Map-match a noisy GPS recording to the road network. Returns the corrected path plus per-segment road attributes.

See it
POST /v1/routing/search-along-route

Find stops along the way.

Coffee, charging, fuel, food. Ranked by how little detour they add to the existing route.

See it

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.

Natural Language1

An LLM pre-step for the messy reality of customer-typed addresses. Cleans typos, expands abbreviations, reformats components. Downstream geocoding actually hits.

Response shape

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.

200 OK · /v1/routing/route
{
  "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
          }
        ]
      }
    ]
  }
}
Why Footstep

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

Geometry is opt-in. Set 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

Plain HTTP, JSON in and out. Idempotent retries. Call it from a server, edge function, or lambda.

Units in the field name

Field names carry units. distance_meters, duration_seconds, grade_percent. Your model never has to guess.
response shape
{
  "distance_meters": 5765,
  "duration_seconds": 812,
  "terrain": {
    "total_ascent_meters": 12.4,
    "avg_grade_percent": 1.2,
    "difficulty": "flat"
  }
}

Every major runtime

Streamable HTTP MCP works with the major agent runtimes. Or call REST from anything that speaks HTTP. Same auth.
ClaudeCursorOpenAI AgentsVercel AI SDKGeminiLangChain
How it works

Signup to first call
in under a minute.

Step 01

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.

Step 02

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.

Step 03

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.

Step 04

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.

Open formats

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.

Drop-in renderable

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.

Explicit-unit fields

distance_meters, duration_seconds, grade_percent. Field names carry their unit, so reasoning over outputs is unambiguous in code review and in LLM context.

Versioned data

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.