curl --request POST \
--url https://{environment}.plugsurfing.com/emp/v1/geosearch/rectangle \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"filters": {
"connectorStandards": [
"Combo"
],
"capabilities": [
"CHARGING_PROFILE_CAPABLE"
]
}
}
'import requests
url = "https://{environment}.plugsurfing.com/emp/v1/geosearch/rectangle"
payload = { "filters": {
"connectorStandards": ["Combo"],
"capabilities": ["CHARGING_PROFILE_CAPABLE"]
} }
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
filters: {connectorStandards: ['Combo'], capabilities: ['CHARGING_PROFILE_CAPABLE']}
})
};
fetch('https://{environment}.plugsurfing.com/emp/v1/geosearch/rectangle', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://{environment}.plugsurfing.com/emp/v1/geosearch/rectangle",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'filters' => [
'connectorStandards' => [
'Combo'
],
'capabilities' => [
'CHARGING_PROFILE_CAPABLE'
]
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-Key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://{environment}.plugsurfing.com/emp/v1/geosearch/rectangle"
payload := strings.NewReader("{\n \"filters\": {\n \"connectorStandards\": [\n \"Combo\"\n ],\n \"capabilities\": [\n \"CHARGING_PROFILE_CAPABLE\"\n ]\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-Key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://{environment}.plugsurfing.com/emp/v1/geosearch/rectangle")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"filters\": {\n \"connectorStandards\": [\n \"Combo\"\n ],\n \"capabilities\": [\n \"CHARGING_PROFILE_CAPABLE\"\n ]\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://{environment}.plugsurfing.com/emp/v1/geosearch/rectangle")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"filters\": {\n \"connectorStandards\": [\n \"Combo\"\n ],\n \"capabilities\": [\n \"CHARGING_PROFILE_CAPABLE\"\n ]\n }\n}"
response = http.request(request)
puts response.read_body{
"locations": [
{
"id": "8rMCionje8s2LtheVGEK90mYnJdJe5OZd48ecF/w1StRJSodFFzfQ3GhJbYbxG0gQhJv/Yjp5FXBJt14SccU9zFRdnC4SV7juPdCRaWkEZo=",
"name": "Ebee Smart Technologies",
"coordinates": {
"latitude": "52.475911",
"longitude": "13.350794"
},
"evses": [
{
"uid": "8rMCionje8s2LtheVGEK90mYnJdJe5OZd48ecF/w1StRJSodFFzfQ3GhJbYbxG0g3wFt7gLfnV3ulxmnoAzR4W/DFEMs63CndZpPK6L2aJG9qMC0Dp9OqeegGRXmiTOE",
"evse_id": "+49*839*030*000074",
"physical_reference": "4",
"status": "AVAILABLE",
"connectors": [
{}
],
"capabilities": [
"RESERVABLE",
"PLUG_AND_CHARGE_CAPABLE",
"PLUG_AND_CHARGE_CAPABLE"
],
"last_updated": "2025-01-15T10:30:00Z"
}
],
"operator": {
"id": "881941",
"name": "Ebee Smart Technologies",
"hotline": "+498944255071",
"external_id": "DE*ABC"
},
"operator_display_name": "Sub-operator X",
"opening_times": {
"twentyfourseven": false,
"regular_hours": [
{
"weekday": 1,
"period_begin": "00:10",
"period_end": "29:59"
}
],
"exceptional_openings": [
{
"period_begin": "2025-01-15T10:30:00Z",
"period_end": "2025-01-15T10:30:00Z"
}
],
"exceptional_closings": [
{
"period_begin": "2025-01-15T10:30:00Z",
"period_end": "2025-01-15T10:30:00Z"
}
]
},
"directions": [
{
"language": "DE",
"text": "example"
}
],
"country": "DEU",
"state": "Bayern",
"city": "Berlin",
"postal_code": 10829,
"address": "EUREF CAMPUS 4-5",
"openNow": false,
"is_green_energy": false,
"last_updated": "2024-03-15T14:30:00Z"
}
],
"aggregates": [
{
"coordinates": {
"latitude": "52.475911",
"longitude": "13.350794"
},
"count": 1
}
]
}{
"message": "Invalid request payload",
"details": [
"field X is required"
]
}{
"message": "Resource not found"
}Search locations within a rectangle
Search for charging locations within a specified rectangle defined by two diagonal points. The rectangle coordinates are passed via the topLatitude, bottomLatitude, leftLongitude, and rightLongitude query parameters; the request body contains only filters and options. Returns up to 300 locations.
curl --request POST \
--url https://{environment}.plugsurfing.com/emp/v1/geosearch/rectangle \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"filters": {
"connectorStandards": [
"Combo"
],
"capabilities": [
"CHARGING_PROFILE_CAPABLE"
]
}
}
'import requests
url = "https://{environment}.plugsurfing.com/emp/v1/geosearch/rectangle"
payload = { "filters": {
"connectorStandards": ["Combo"],
"capabilities": ["CHARGING_PROFILE_CAPABLE"]
} }
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
filters: {connectorStandards: ['Combo'], capabilities: ['CHARGING_PROFILE_CAPABLE']}
})
};
fetch('https://{environment}.plugsurfing.com/emp/v1/geosearch/rectangle', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://{environment}.plugsurfing.com/emp/v1/geosearch/rectangle",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'filters' => [
'connectorStandards' => [
'Combo'
],
'capabilities' => [
'CHARGING_PROFILE_CAPABLE'
]
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-Key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://{environment}.plugsurfing.com/emp/v1/geosearch/rectangle"
payload := strings.NewReader("{\n \"filters\": {\n \"connectorStandards\": [\n \"Combo\"\n ],\n \"capabilities\": [\n \"CHARGING_PROFILE_CAPABLE\"\n ]\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-Key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://{environment}.plugsurfing.com/emp/v1/geosearch/rectangle")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"filters\": {\n \"connectorStandards\": [\n \"Combo\"\n ],\n \"capabilities\": [\n \"CHARGING_PROFILE_CAPABLE\"\n ]\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://{environment}.plugsurfing.com/emp/v1/geosearch/rectangle")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"filters\": {\n \"connectorStandards\": [\n \"Combo\"\n ],\n \"capabilities\": [\n \"CHARGING_PROFILE_CAPABLE\"\n ]\n }\n}"
response = http.request(request)
puts response.read_body{
"locations": [
{
"id": "8rMCionje8s2LtheVGEK90mYnJdJe5OZd48ecF/w1StRJSodFFzfQ3GhJbYbxG0gQhJv/Yjp5FXBJt14SccU9zFRdnC4SV7juPdCRaWkEZo=",
"name": "Ebee Smart Technologies",
"coordinates": {
"latitude": "52.475911",
"longitude": "13.350794"
},
"evses": [
{
"uid": "8rMCionje8s2LtheVGEK90mYnJdJe5OZd48ecF/w1StRJSodFFzfQ3GhJbYbxG0g3wFt7gLfnV3ulxmnoAzR4W/DFEMs63CndZpPK6L2aJG9qMC0Dp9OqeegGRXmiTOE",
"evse_id": "+49*839*030*000074",
"physical_reference": "4",
"status": "AVAILABLE",
"connectors": [
{}
],
"capabilities": [
"RESERVABLE",
"PLUG_AND_CHARGE_CAPABLE",
"PLUG_AND_CHARGE_CAPABLE"
],
"last_updated": "2025-01-15T10:30:00Z"
}
],
"operator": {
"id": "881941",
"name": "Ebee Smart Technologies",
"hotline": "+498944255071",
"external_id": "DE*ABC"
},
"operator_display_name": "Sub-operator X",
"opening_times": {
"twentyfourseven": false,
"regular_hours": [
{
"weekday": 1,
"period_begin": "00:10",
"period_end": "29:59"
}
],
"exceptional_openings": [
{
"period_begin": "2025-01-15T10:30:00Z",
"period_end": "2025-01-15T10:30:00Z"
}
],
"exceptional_closings": [
{
"period_begin": "2025-01-15T10:30:00Z",
"period_end": "2025-01-15T10:30:00Z"
}
]
},
"directions": [
{
"language": "DE",
"text": "example"
}
],
"country": "DEU",
"state": "Bayern",
"city": "Berlin",
"postal_code": 10829,
"address": "EUREF CAMPUS 4-5",
"openNow": false,
"is_green_energy": false,
"last_updated": "2024-03-15T14:30:00Z"
}
],
"aggregates": [
{
"coordinates": {
"latitude": "52.475911",
"longitude": "13.350794"
},
"count": 1
}
]
}{
"message": "Invalid request payload",
"details": [
"field X is required"
]
}{
"message": "Resource not found"
}Authorizations
API key for authentication
Query Parameters
Latitude of the top edge of the rectangle in decimal degrees (e.g. N58°30' is represented as 58.5). Must be greater than bottomLatitude.
-90 <= x <= 90Latitude of the bottom edge of the rectangle in decimal degrees (e.g. S58°30' is represented as -58.5)
-90 <= x <= 90Longitude of the left edge of the rectangle in decimal degrees (e.g. E014°45' is represented as 14.75). Must be less than rightLongitude.
-180 <= x <= 180Longitude of the right edge of the rectangle in decimal degrees (e.g. E014°45' is represented as 14.75)
-180 <= x <= 180Number of locations returned in the response (doesn't apply when aggregation is enabled)
x <= 300If true, the results will be aggregated. For large radius it makes the response much faster.
Value between 2 and 9. The bigger value is, the smaller is the cell size of the grid for aggregation. If not passed, a default value, based on radius, is assumed.
2 <= x <= 9Optional - the id of the fleet organization, will be used to look up locations available for this fleet. If fleet id is not provided, the locations available to the EMP will be provided
Supported languages: en, bg, cy, de, es, fi, fr, hu, is, it, lt, nb, nl, pl, pt, ro, sv.
2Body
Geosearch request constrained to a rectangular area.
Filtering criteria for location selection.
Show child attributes
Show child attributes
Response
OK
Response payload containing matching locations and aggregate metadata for a geosearch query.