ChargeAlong API
Version 1.0.0
Every charging site ChargeAlong lists, with its plugs, power, price, network and position, and the browse hierarchy the site itself is built from.
Free, anonymous and read only. There is no key, no quota and no sign up. Limits at the edge are generous and are there to stop a flood, not to ration use; verified crawlers are not limited at all. Answers are cached for an hour and may be cached by you.
Attribution is a licence condition, not a courtesy: the data comes from Open Charge Map contributors and each record names its own source and licence. Keep those with anything you publish.
Per record: see each site's sources. Full copyright notice.
Everything is under https://api.chargealong.io, over HTTPS, and every answer is JSON wrapped in a data field.
GET /v1/countries
Every country with charging sites, and how many each has
Answers
200 The countries, busiest first503 The database is unavailable
curlcurl -sS "https://api.chargealong.io/v1/countries"
Nodeconst url = new URL("https://api.chargealong.io/v1/countries");
const res = await fetch(url);
const { data } = await res.json();
Pythonimport requests
res = requests.get(
"https://api.chargealong.io/v1/countries",
)
data = res.json()["data"]
GET /v1/overview
What the whole directory holds: countries with their busiest places
Answers
200 One answer for a home page or a first call503 The database is unavailable
curlcurl -sS "https://api.chargealong.io/v1/overview"
Nodeconst url = new URL("https://api.chargealong.io/v1/overview");
const res = await fetch(url);
const { data } = await res.json();
Pythonimport requests
res = requests.get(
"https://api.chargealong.io/v1/overview",
)
data = res.json()["data"]
GET /v1/countries/{country}
One country: its regions and their counts
Parameters
country string, in the path, required. Country slug, as in a page URL: australia
Answers
200 The country and its regions404 No such country
curlcurl -sS "https://api.chargealong.io/v1/countries/australia"
Nodeconst url = new URL("https://api.chargealong.io/v1/countries/australia");
const res = await fetch(url);
const { data } = await res.json();
Pythonimport requests
res = requests.get(
"https://api.chargealong.io/v1/countries/australia",
)
data = res.json()["data"]
GET /v1/countries/{country}/regions/{region}
One region: the places in it that have charging sites
Parameters
country string, in the path, requiredregion string, in the path, required. Region slug: victoria
Answers
200 The region and its localities404 No such region
curlcurl -sS "https://api.chargealong.io/v1/countries/australia/regions/victoria"
Nodeconst url = new URL("https://api.chargealong.io/v1/countries/australia/regions/victoria");
const res = await fetch(url);
const { data } = await res.json();
Pythonimport requests
res = requests.get(
"https://api.chargealong.io/v1/countries/australia/regions/victoria",
)
data = res.json()["data"]
GET /v1/countries/{country}/networks
Every charging network in a country, with its site and region counts
Parameters
country string, in the path, required
Answers
200 The networks, biggest first404 No such country
curlcurl -sS "https://api.chargealong.io/v1/countries/australia/networks"
Nodeconst url = new URL("https://api.chargealong.io/v1/countries/australia/networks");
const res = await fetch(url);
const { data } = await res.json();
Pythonimport requests
res = requests.get(
"https://api.chargealong.io/v1/countries/australia/networks",
)
data = res.json()["data"]
GET /v1/countries/{country}/networks/{network}
One network in a country: where it reaches, and a sample of its sites
Parameters
country string, in the path, requirednetwork string, in the path, required. Network slug: evie-networks
Answers
200 The network, its regions and its busiest places404 No such network in that country
curlcurl -sS "https://api.chargealong.io/v1/countries/australia/networks/evie-networks"
Nodeconst url = new URL("https://api.chargealong.io/v1/countries/australia/networks/evie-networks");
const res = await fetch(url);
const { data } = await res.json();
Pythonimport requests
res = requests.get(
"https://api.chargealong.io/v1/countries/australia/networks/evie-networks",
)
data = res.json()["data"]
GET /v1/localities/{country}/{region}/{locality}
One suburb or town: every charging site in it, with facet counts
Parameters
country string, in the path, requiredregion string, in the path, requiredlocality string, in the path, required. Locality slug: sunshine
Answers
200 The locality, its sites, its facet counts and its neighbours404 No such locality
curlcurl -sS "https://api.chargealong.io/v1/localities/australia/victoria/sunshine"
Nodeconst url = new URL("https://api.chargealong.io/v1/localities/australia/victoria/sunshine");
const res = await fetch(url);
const { data } = await res.json();
Pythonimport requests
res = requests.get(
"https://api.chargealong.io/v1/localities/australia/victoria/sunshine",
)
data = res.json()["data"]
GET /v1/sites/{publicID}One charging site: connectors, power, price, access, network and position
The public id is the last segment of a site's slug in its page URL, eight characters.
Parameters
publicID string, in the path, required
Answers
200 The site, its connectors, its sources and nearby alternatives404 No such site410 The site was removed from its source
curlcurl -sS "https://api.chargealong.io/v1/sites/abcd2345"
Nodeconst url = new URL("https://api.chargealong.io/v1/sites/abcd2345");
const res = await fetch(url);
const { data } = await res.json();
Pythonimport requests
res = requests.get(
"https://api.chargealong.io/v1/sites/abcd2345",
)
data = res.json()["data"]
GET /v1/search
Places and sites matching a name
Parameters
q string, in the query string, required. At least two charactersprefer string, in the query string, optional. Two letter country code, upper case. Places in that country rank first, which is what a search box wants when it knows where the reader is.
Answers
200 Matching places and sites, best first400 The term is too short
curlcurl -sS "https://api.chargealong.io/v1/search?q=sunshine"
Nodeconst url = new URL("https://api.chargealong.io/v1/search");
url.searchParams.set("q", "sunshine");
const res = await fetch(url);
const { data } = await res.json();
Pythonimport requests
res = requests.get(
"https://api.chargealong.io/v1/search",
params={"q": "sunshine"},
)
data = res.json()["data"]
GET /v1/nearbyThe charging sites nearest a coordinate
Answers the question an answer engine is usually resolving: what is nearest to here, and how fast is it.
Parameters
lat number, in the query string, required. Latitude in degrees, rounded to four placeslng number, in the query string, required. Longitude in degrees, rounded to four placesmin_kw number, in the query string, optional. Only sites with a connector of at least this many kW. 100 is roughly the line between a stop and a break.radius_km number, in the query string, optional. How far to look, in kilometreslimit integer, in the query string, optional. How many sites to return, nearest firstconnector string, in the query string, optional. Only sites with one of these connectors. Repeat the parameter for more than one.network string, in the query string, optional. Only sites on this network, by slug: evie-networks
Answers
200 Sites near the point, nearest first, with their distance400 The coordinates are missing or out of range
curlcurl -sS "https://api.chargealong.io/v1/nearby?lat=-37.7886&lng=144.8311&min_kw=100"
Nodeconst url = new URL("https://api.chargealong.io/v1/nearby");
url.searchParams.set("lat", "-37.7886");
url.searchParams.set("lng", "144.8311");
url.searchParams.set("min_kw", "100");
const res = await fetch(url);
const { data } = await res.json();
Pythonimport requests
res = requests.get(
"https://api.chargealong.io/v1/nearby",
params={"lat": "-37.7886", "lng": "144.8311", "min_kw": "100"},
)
data = res.json()["data"]
GET /v1/openapi.json
This document
Answers
200 The OpenAPI description of this API
curlcurl -sS "https://api.chargealong.io/v1/openapi.json"
Nodeconst url = new URL("https://api.chargealong.io/v1/openapi.json");
const res = await fetch(url);
const spec = await res.json();
Pythonimport requests
res = requests.get(
"https://api.chargealong.io/v1/openapi.json",
)
spec = res.json()
For an agent: the MCP server
The same directory is four tools over MCP, at https://api.chargealong.io/mcp. Streamable HTTP, stateless, and keyless like the rest: no key, no account, nothing to sign up for. Every answer carries the page it came from and the date the record was last checked, so an agent can cite it and say how fresh it is.
find_chargers What is nearest a coordinate and how fast it is, nearest first. Narrow it by power, by plug or by network.search_places Turns a suburb, town or postcode into a coordinate to search around.get_charger One site in full: its connectors with power and quantity, the price, how to get in, and when the record was last checked.list_networks Who operates chargers in a country, biggest first, with how far each one reaches.
Claude Codeclaude mcp add --transport http chargealong https://api.chargealong.io/mcp
claude.ai and other MCP clients take the same URL. Paste it where the client asks for a remote or HTTP server and leave the key field empty, because there is not one. ChatGPT takes it under Settings, Apps and Connectors. Where a client asks how to authenticate, including those two, the answer is no authentication: this server never asks who you are, and a connector set to OAuth sits waiting for a consent screen that never comes.