ChargeAlong
Sign in

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 first
  • 503 The database is unavailable
curl
curl -sS "https://api.chargealong.io/v1/countries"
Node
const url = new URL("https://api.chargealong.io/v1/countries");

const res = await fetch(url);
const { data } = await res.json();
Python
import 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 call
  • 503 The database is unavailable
curl
curl -sS "https://api.chargealong.io/v1/overview"
Node
const url = new URL("https://api.chargealong.io/v1/overview");

const res = await fetch(url);
const { data } = await res.json();
Python
import 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 regions
  • 404 No such country
  • 503 The database is unavailable
curl
curl -sS "https://api.chargealong.io/v1/countries/australia"
Node
const url = new URL("https://api.chargealong.io/v1/countries/australia");

const res = await fetch(url);
const { data } = await res.json();
Python
import 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, required
  • region string, in the path, required. Region slug: victoria

Answers

  • 200 The region and its localities
  • 404 No such region
  • 503 The database is unavailable
curl
curl -sS "https://api.chargealong.io/v1/countries/australia/regions/victoria"
Node
const url = new URL("https://api.chargealong.io/v1/countries/australia/regions/victoria");

const res = await fetch(url);
const { data } = await res.json();
Python
import 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 first
  • 404 No such country
  • 503 The database is unavailable
curl
curl -sS "https://api.chargealong.io/v1/countries/australia/networks"
Node
const url = new URL("https://api.chargealong.io/v1/countries/australia/networks");

const res = await fetch(url);
const { data } = await res.json();
Python
import 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, required
  • network string, in the path, required. Network slug: evie-networks

Answers

  • 200 The network, its regions and its busiest places
  • 404 No such network in that country
  • 503 The database is unavailable
curl
curl -sS "https://api.chargealong.io/v1/countries/australia/networks/evie-networks"
Node
const url = new URL("https://api.chargealong.io/v1/countries/australia/networks/evie-networks");

const res = await fetch(url);
const { data } = await res.json();
Python
import 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, required
  • region string, in the path, required
  • locality string, in the path, required. Locality slug: sunshine

Answers

  • 200 The locality, its sites, its facet counts and its neighbours
  • 404 No such locality
  • 503 The database is unavailable
curl
curl -sS "https://api.chargealong.io/v1/localities/australia/victoria/sunshine"
Node
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

  • publicID string, 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.
  • 404 No such site
  • 503 The database is unavailable
curl
curl -sS "https://api.chargealong.io/v1/sites/abcd2345"
Node
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/nearby

The 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 places
  • lng number, in the query string, required. Longitude in degrees, rounded to four places
  • min_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 kilometres
  • limit integer, in the query string, optional. How many sites to return, nearest first
  • connector 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 distance
  • 400 The coordinates are missing or out of range
  • 503 The database is unavailable
curl
curl -sS "https://api.chargealong.io/v1/nearby?lat=-37.7886&lng=144.8311&min_kw=100"
Node
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

  • from string, in the query string, required. Where the trip starts, as latitude,longitude
  • to string, in the query string, required. Where the trip ends, as latitude,longitude. Somewhere other than from.
  • range_km number, 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.
  • reserve number, in the query string, optional. Never arrive anywhere below this percentage, including at the destination
  • start number, in the query string, optional. Battery percentage at the start. Must be above the reserve: at least reserve + 1.
  • charge_to number, 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_kwh number, 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_kw number, in the query string, optional. The most DC power the car accepts
  • max_ac_kw number, in the query string, optional. The most AC power the car accepts
  • min_kw number, in the query string, optional. Ignore chargers slower than this. A slow charger is not a stop on a long trip.
  • connectors string, 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.
curl
curl -sS "https://api.chargealong.io/v1/trips/plan?from=-37.814%2C144.963&to=-33.869%2C151.209&range_km=450&connectors=ccs2%2Ctype-2"
Node
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

  • q string, 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.
  • limit integer, 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.
  • all boolean, 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
curl
curl -sS "https://api.chargealong.io/v1/vehicles?q=model%203"
Node
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

  • slug string, 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.
curl
curl -sS "https://api.chargealong.io/v1/vehicles/<slug>"
Node
const url = new URL("https://api.chargealong.io/v1/vehicles/<slug>");

const res = await fetch(url);
const { data } = await res.json();
Python
import requests

res = requests.get(
    "https://api.chargealong.io/v1/vehicles/<slug>",
)
data = res.json()["data"]
GET /v1/openapi.json

This document

Answers

  • 200 The OpenAPI description of this API
curl
curl -sS "https://api.chargealong.io/v1/openapi.json"
Node
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

  • path string, in the query string, required. A path on this site, starting with a slash: /en/australia/victoria/hampton/ampcharge/x-abcd2345/

Answers

  • 200 Where it went, and with which status
  • 400 That is not a path on this site
  • 404 That path has not moved
  • 503 The database is unavailable
curl
curl -sS "https://api.chargealong.io/v1/redirect?path=%3Cpath%3E"
Node
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

  • country string, in the path, required. Country slug: australia

Answers

  • 200 The highways, longest gap at 50 kW first
  • 404 No such country
  • 503 The database is unavailable
curl
curl -sS "https://api.chargealong.io/v1/countries/australia/routes"
Node
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

  • country string, in the path, required. Country slug: australia
  • slug string, in the path, required. Highway slug: hume-highway

Answers

  • 200 The highway
  • 404 No such country, or no such highway computed there
  • 503 The database is unavailable
curl
curl -sS "https://api.chargealong.io/v1/countries/australia/routes/<slug>"
Node
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_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 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.