EV Charging Stations

Find the nearest EV charging stations by coordinates, with connector, power, and operator filters

GET Request
~100ms response (cached)
1 credit per request

Endpoint

GET https://api.carapi.dev/v1/charging-stations

Query Parameters

ParameterTypeRequiredDescription
latnumberRequiredSearch center latitude, -90 to 90.
lonnumberRequiredSearch center longitude, -180 to 180.
radiusnumberOptionalSearch radius in kilometers. Default 10, min 0.1, max 50. Out-of-range values are rejected with 400, not clamped.
connectorTypeenumOptionaltype2, ccs, or chademo. Only locations with at least one connector of this type are returned.
ownerstringOptionalCase-insensitive substring match on the operator name (1-100 characters), e.g. "ionity".
minPowerKwnumberOptionalOnly locations with a connector at or above this power (kW). Combined with connectorType, applies to that connector type.
limitintegerOptionalMax locations to return. Default 5, min 1, max 10.
tokenstringRequiredAPI authentication token.

Request Examples

cURL

curl -X GET \
  "https://api.carapi.dev/v1/charging-stations?lat=50.1175&lon=14.4908&minPowerKw=150&token=YOUR_API_KEY"

JavaScript

const params = new URLSearchParams({
  token: 'YOUR_API_KEY',
  lat: '50.1175',
  lon: '14.4908',
  connectorType: 'ccs',
  minPowerKw: '150'
});

const response = await fetch(
  `https://api.carapi.dev/v1/charging-stations?${params.toString()}`
);
const data = await response.json();
console.log(data.stations);

Python

import requests

response = requests.get(
    "https://api.carapi.dev/v1/charging-stations",
    params={
        "token": "YOUR_API_KEY",
        "lat": 50.1175,
        "lon": 14.4908,
        "connectorType": "ccs",
        "minPowerKw": 150,
    },
)
print(response.json())

Response Examples

Stations found (200)

{
  "search": {
    "lat": 50.1175,
    "lon": 14.4908,
    "radiusKm": 10,
    "connectorType": null,
    "owner": null,
    "minPowerKw": 150
  },
  "count": 2,
  "stations": [
    {
      "name": "R378",
      "owners": ["CEZ, a. s."],
      "lat": 50.12241,
      "lon": 14.51215,
      "distanceKm": 1.62,
      "stationCount": 4,
      "address": {
        "street": "Kbelská 919/31",
        "city": "Praha 9 - Vysočany",
        "zip": "190 00",
        "country": "CZ"
      },
      "maxPowerKw": 300,
      "connectors": {
        "ccs": {
          "maxPowerKw": 300,
          "minPricePerKwh": null,
          "parkingPricePerHour": null,
          "freeParkingMinutes": null,
          "plugs": 4
        },
        "type2": {
          "maxPowerKw": 22,
          "minPricePerKwh": null,
          "parkingPricePerHour": null,
          "freeParkingMinutes": null,
          "plugs": 1
        }
      }
    },
    {
      "name": "Novovysočanská HUB",
      "owners": ["Pražská energetika, a.s."],
      "lat": 50.0981,
      "lon": 14.48085,
      "distanceKm": 2.28,
      "stationCount": 1,
      "address": {
        "street": "Novovysočanská",
        "city": "Praha",
        "zip": "19000",
        "country": "CZ"
      },
      "maxPowerKw": 400,
      "connectors": {
        "ccs": {
          "maxPowerKw": 400,
          "minPricePerKwh": null,
          "parkingPricePerHour": null,
          "freeParkingMinutes": null,
          "plugs": 1
        }
      }
    }
  ]
}

No stations in range (200)

{
  "search": {
    "lat": 30,
    "lon": -40,
    "radiusKm": 10,
    "connectorType": null,
    "owner": null,
    "minPowerKw": null
  },
  "count": 0,
  "stations": []
}

Error Response (400)

{
  "error": "radius must be a number between 0.1 and 50 (km)"
}

Response Fields

FieldTypeDescription
searchobjectEcho of the search parameters with defaults applied (unused filters are null)
countnumberNumber of locations returned (max 10)
stationsStation[]Physical charging locations, sorted by distance ascending
stations[].namestringLocation name as published by the operator
stations[].ownersstring[]Operator name(s) at this location — some sites host chargers from multiple operators
stations[].lat / lonnumberLocation coordinates
stations[].distanceKmnumberGreat-circle (straight-line) distance from the search point in km — NOT driving distance. 2 decimals.
stations[].stationCountnumberIndividual charge points (EVSEs) grouped into this location
stations[].addressobjectstreet, city, zip (nullable), country (ISO-2)
stations[].maxPowerKwnumber|nullHighest charging power at the location across all connector types
stations[].connectorsobjectPer-connector-type summary keyed by type2 / ccs / chademo (rarely other)
connectors.<type>.maxPowerKwnumber|nullHighest power for this connector type at the location
connectors.<type>.minPricePerKwhnumber|nullLowest known price per kWh in EUR; null when the operator publishes no pricing
connectors.<type>.parkingPricePerHournumber|nullParking price per hour in EUR, if any
connectors.<type>.freeParkingMinutesnumber|nullFree parking duration in minutes, if any
connectors.<type>.plugsnumber|nullDistinct charge-point configurations of this type at the location

Error Codes

400

Bad Request

Missing lat/lon, or a filter out of range (out-of-range values are rejected, never clamped)

403

Forbidden

Invalid or missing API token

502

Bad Gateway

Failed to fetch charging station data upstream

500

Internal Server Error

Server encountered an error processing the request

Important Notes

  • distanceKm is straight-line (great-circle) distance, not driving distance — the actual route by road will be longer.
  • Results are physical locations: multiple charge points at the same site are grouped, with per-connector-type summaries. stationCount tells you how many charge points were merged.
  • Prices are in EUR. minPricePerKwh is often null — many operators do not publish pricing through the roaming network.
  • There is no pagination by design: at most 10 locations within at most 50 km per request. An empty area is a valid 200 with count: 0.
  • Coverage is European (strongest in IT, DE, NL, AT, BE, FR, CZ, PL, HU, RO, SK); data refreshes monthly.
  • Each request consumes 1 API credit from your monthly allowance.