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.
const url = new URL("https://api.chargealong.io/v1/localities/australia/victoria/sunshine");
const res = await fetch(url);
const { data } = await res.json();
Python
import 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
publicIDstring, in the path, required. Eight characters from a to z and 2 to 7. Anything else answers 404 without a lookup.
Answers
200 The site, its connectors, its sources and nearby alternatives. A site gone from every source still answers, with site.status removed; the page on chargealong.io answers 410 for it.
const url = new URL("https://api.chargealong.io/v1/sites/abcd2345");
const res = await fetch(url);
const { data } = await res.json();
Python
import 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
qstring, in the query string, required. What to look for: a place, a postcode or a site or network name. At least three letters or digits and at most 100 characters; other punctuation is dropped, so "a-b" is too short.
preferstring, 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.
const 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();
Python
import 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/trips/plan
Plan a trip from A to B through charging stops
Draws the road route, picks charging stops from the sites listed here, and says how long each stop takes. The car never arrives anywhere below the reserve the driver sets, including at the destination: a trip that cannot be made that way comes back as the stretch of road where it fails, never as a plan that breaks the reserve.
Australia and New Zealand for now. The router holds OpenStreetMap data for those two countries, so a trip elsewhere has no road route.
Coordinates are rounded to three decimal places, about 100 m, before anything is planned: a plan depends only on its inputs and the data, so it can be cached, and no exact position reaches a log or a cache key.
Times are estimates from a charging curve, not a promise: a charger may be busy, cold or broken when you arrive. Every stop carries its site's page, where the state of the record is written out.
Parameters
fromstring, in the query string, required. Where the trip starts, as latitude,longitude
tostring, in the query string, required. Where the trip ends, as latitude,longitude. Somewhere other than from.
range_kmnumber, in the query string, required. How far the car goes on a full battery, in kilometres. The real figure, which is usually below the rated one.
reservenumber, in the query string, optional. Never arrive anywhere below this percentage, including at the destination
startnumber, in the query string, optional. Battery percentage at the start. Must be above the reserve: at least reserve + 1.
charge_tonumber, in the query string, optional. Never charge above this percentage. At least 50, and at least reserve + 10. Above 80 a DC charger slows sharply, so stopping more often is usually faster.
battery_kwhnumber, in the query string, optional. Usable battery in kWh. Only charging times need it, and it defaults to range_km multiplied by 0.17.
max_dc_kwnumber, in the query string, optional. The most DC power the car accepts
max_ac_kwnumber, in the query string, optional. The most AC power the car accepts
min_kwnumber, in the query string, optional. Ignore chargers slower than this. A slow charger is not a stop on a long trip.
connectorsstring, in the query string, optional. The connectors the car takes, comma separated. CCS2 and Type 2 in Australia and New Zealand.
Answers
200 The route line, the stops in order with the charge in and out of each, and the totals. A trip that cannot meet the reserve answers here too, with feasible false and the gap named.
400 A parameter is missing, unreadable or outside its range. The problem names it.
422 The problem "no road route between these points": the router found no road between them at all. A trip the car cannot make on the chargers available is not this: it answers 200 with feasible false and the gap named.
503 The problem "trip planning is not available". Either the router is down, or it holds no map covering both points (Melbourne to London): the two are the same answer today. Everything else here is unaffected.
const url = new URL("https://api.chargealong.io/v1/trips/plan");
url.searchParams.set("from", "-37.814,144.963");
url.searchParams.set("to", "-33.869,151.209");
url.searchParams.set("range_km", "450");
url.searchParams.set("connectors", "ccs2,type-2");
const res = await fetch(url);
const { data } = await res.json();
Python
import requests
res = requests.get(
"https://api.chargealong.io/v1/trips/plan",
params={"from": "-37.814,144.963", "to": "-33.869,151.209", "range_km": "450", "connectors": "ccs2,type-2"},
)
data = res.json()["data"]
GET /v1/vehicles
Electric cars: battery, range and how they charge
Every car ChargeAlong holds figures for, sorted by brand. Usable battery in kWh, energy consumption, the range those two give, the fastest AC and DC power the car accepts, its plugs, and its charging curve where the source has measured one.
`curve_is_generic` is true when the curve is the shape the dataset applies to cars it has not measured. Treat those as an estimate rather than as that model's own curve.
Figures from Open EV Data (github.com/KilowattApp/open-ev-data), MIT licensed with attribution required: credit "Open EV Data" wherever you use them. ChargeAlong does not measure cars and states what that dataset says.
The list is built into this API rather than held in its database, so it changes only when the API is deployed and may be cached for a day.
Parameters
qstring, in the query string, optional. Find cars by any part of the brand, model or variant; a brand match ranks first. A term under two characters answers an empty list, not an error.
limitinteger, in the query string, optional. How many cars to return, 1 to 100. A limit outside that range, or one that is not a number, is not an error: it gives the default of 20.
allboolean, in the query string, optional. true returns every car rather than the first page. Ignored when q is given.
Answers
200 The cars, each with its battery, range, charging powers, plugs and curve, and the source they came from
const url = new URL("https://api.chargealong.io/v1/vehicles");
url.searchParams.set("q", "model 3");
const res = await fetch(url);
const { data } = await res.json();
Python
import requests
res = requests.get(
"https://api.chargealong.io/v1/vehicles",
params={"q": "model 3"},
)
data = res.json()["data"]
GET /v1/vehicles/{slug}
One electric car, with how long it takes to charge
One car by its slug, with everything the list carries plus `charging`: how long 10% to 80% takes on a 50, 150 and 350 kW charger, worked out from this car's own charging curve and the same assumptions the trip planner makes, so a car's page and a plan through it never disagree.
Slugs are built from the brand, model and variant and do not change when the source rewrites a record.
Figures from Open EV Data (github.com/KilowattApp/open-ev-data), MIT licensed with attribution required: credit "Open EV Data" wherever you use them. ChargeAlong does not measure cars and states what that dataset says.
The list is built into this API rather than held in its database, so it changes only when the API is deployed and may be cached for a day.
Parameters
slugstring, in the path, required. The car, as the list gives it: tesla-model-3-standard-range-plus
Answers
200 The car, its charging times and the source
404 No car of that name. The list is built into the API, so a 404 means it is not in this release.
const url = new URL("https://api.chargealong.io/v1/openapi.json");
const res = await fetch(url);
const spec = await res.json();
Python
import requests
res = requests.get(
"https://api.chargealong.io/v1/openapi.json",
)
spec = res.json()
GET /v1/redirect
Where a page went, if it moved
URLs here are permanent, so this is the exception: a charging site placed in the wrong suburb has its page moved, and its old address answers from this. Ask before treating a 404 as final.
Parameters
pathstring, in the query string, required. A path on this site, starting with a slash: /en/australia/victoria/hampton/ampcharge/x-abcd2345/
const url = new URL("https://api.chargealong.io/v1/redirect");
url.searchParams.set("path", "<path>");
const res = await fetch(url);
const { data } = await res.json();
Python
import requests
res = requests.get(
"https://api.chargealong.io/v1/redirect",
params={"path": "<path>"},
)
data = res.json()["data"]
GET /v1/countries/{country}/routes
A country's highways ranked by their longest stretch without a fast charger
Each highway's longest gap between chargers a car of that country can fast charge at, at 50 kW and at 150 kW, with the towns at each end, how many chargers count, the month the figures are for and the change since the month before. Recomputed on the 2nd of each month. A charger counts when it is active, within 5 km of the road, and has a DC plug of at least the threshold in the standard the country's cars use (CCS2 in Australia, New Zealand, Great Britain and Ireland; CCS1 or NACS in the United States and Canada); power a source leaves out never counts. Distances and place names only: the road's line is not published.
Parameters
countrystring, in the path, required. Country slug: australia
const url = new URL("https://api.chargealong.io/v1/countries/australia/routes");
const res = await fetch(url);
const { data } = await res.json();
Python
import requests
res = requests.get(
"https://api.chargealong.io/v1/countries/australia/routes",
)
data = res.json()["data"]
GET /v1/countries/{country}/routes/{slug}
One highway's charging gaps: every gap, the chargers that close them, and its months
Every gap along the highway in order at 50 kW and at 150 kW, the chargers that close a gap at 50 kW in order along the road with their distance off it, and up to twelve months of history, newest first. The same rules as listRoutes.
Parameters
countrystring, in the path, required. Country slug: australia
slugstring, in the path, required. Highway slug: hume-highway
Answers
200 The highway
404 No such country, or no such highway computed there
const url = new URL("https://api.chargealong.io/v1/countries/australia/routes/<slug>");
const res = await fetch(url);
const { data } = await res.json();
Python
import requests
res = requests.get(
"https://api.chargealong.io/v1/countries/australia/routes/<slug>",
)
data = res.json()["data"]
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_chargersWhat is nearest a coordinate and how fast it is, nearest first. Narrow it by power, by plug or by network.
search_placesTurns a suburb, town or postcode into a coordinate to search around.
get_chargerOne site in full: its connectors with power and quantity, the price, how to get in, and when the record was last checked.
list_networksWho operates chargers in a country, biggest first, with how far each one reaches.
Claude Code
claude 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.
The document this page is built from is at https://api.chargealong.io/v1/openapi.json. Generate a client from it rather than writing one by hand. If you are building on this and want something it does not answer, say so on the contact page.