curl --request POST \
--url https://{environment}.plugsurfing.com/drive/v1/users/{userId}/sessions/start \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"connectorId": "O9UXK+YI5Q6i0FoI4qHwcA=="
}
'import requests
url = "https://{environment}.plugsurfing.com/drive/v1/users/{userId}/sessions/start"
payload = { "connectorId": "O9UXK+YI5Q6i0FoI4qHwcA==" }
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({connectorId: 'O9UXK+YI5Q6i0FoI4qHwcA=='})
};
fetch('https://{environment}.plugsurfing.com/drive/v1/users/{userId}/sessions/start', 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/drive/v1/users/{userId}/sessions/start",
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([
'connectorId' => 'O9UXK+YI5Q6i0FoI4qHwcA=='
]),
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/drive/v1/users/{userId}/sessions/start"
payload := strings.NewReader("{\n \"connectorId\": \"O9UXK+YI5Q6i0FoI4qHwcA==\"\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/drive/v1/users/{userId}/sessions/start")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"connectorId\": \"O9UXK+YI5Q6i0FoI4qHwcA==\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://{environment}.plugsurfing.com/drive/v1/users/{userId}/sessions/start")
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 \"connectorId\": \"O9UXK+YI5Q6i0FoI4qHwcA==\"\n}"
response = http.request(request)
puts response.read_body{
"sessionId": "AAdmD55q8Vz",
"threeDSClientSecret": "pi_3MtwBwLkdIwHu8ix28v3tqPa_secret_YrKJUkribcBjcG7HVhfZluoGH"
}{
"message": "Invalid request payload",
"details": [
"field X is required"
]
}{
"message": "Resource not found"
}{
"message": "Resource not found"
}{
"message": "Resource not found"
}Start a remote charging session
Start a remote charging session. Important implementation details: 1. Only chargers with REMOTE_START_STOP_CAPABLE capability can be used 2. Allow up to 2 minutes for session to transition from WAITING_TO_START to STARTED 3. Wait at least 1 minute before retrying failed starts 4. Multiple ongoing sessions are possible 5. Subsequent start requests within 60 seconds on same connector are blocked 6. Session events will notify about session status changes 7. If a user has CREDIT_CARD payment method, and 3DS challenge mode is set to CHALLENGE, then threeDSClientSecret might be present instead of sessionId, which your frontend needs to prompt the user to sign. After the user successfully signs the challenge, do a second start request!
curl --request POST \
--url https://{environment}.plugsurfing.com/drive/v1/users/{userId}/sessions/start \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"connectorId": "O9UXK+YI5Q6i0FoI4qHwcA=="
}
'import requests
url = "https://{environment}.plugsurfing.com/drive/v1/users/{userId}/sessions/start"
payload = { "connectorId": "O9UXK+YI5Q6i0FoI4qHwcA==" }
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({connectorId: 'O9UXK+YI5Q6i0FoI4qHwcA=='})
};
fetch('https://{environment}.plugsurfing.com/drive/v1/users/{userId}/sessions/start', 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/drive/v1/users/{userId}/sessions/start",
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([
'connectorId' => 'O9UXK+YI5Q6i0FoI4qHwcA=='
]),
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/drive/v1/users/{userId}/sessions/start"
payload := strings.NewReader("{\n \"connectorId\": \"O9UXK+YI5Q6i0FoI4qHwcA==\"\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/drive/v1/users/{userId}/sessions/start")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"connectorId\": \"O9UXK+YI5Q6i0FoI4qHwcA==\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://{environment}.plugsurfing.com/drive/v1/users/{userId}/sessions/start")
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 \"connectorId\": \"O9UXK+YI5Q6i0FoI4qHwcA==\"\n}"
response = http.request(request)
puts response.read_body{
"sessionId": "AAdmD55q8Vz",
"threeDSClientSecret": "pi_3MtwBwLkdIwHu8ix28v3tqPa_secret_YrKJUkribcBjcG7HVhfZluoGH"
}{
"message": "Invalid request payload",
"details": [
"field X is required"
]
}{
"message": "Resource not found"
}{
"message": "Resource not found"
}{
"message": "Resource not found"
}Authorizations
API key for authentication
Path Parameters
The unique identifier of the user who will own the charging session
Body
request
Request payload to start a charging session remotely.
Connector identifier to start charging on.
"O9UXK+YI5Q6i0FoI4qHwcA=="
Response
SessionId will always be present, unless CREDIT_CARD reservation for a user is required during authentication, then either sessionId or threeDSClientSecret will be present.
This session id should be stored and used in other endpoints.
"AAdmD55q8Vz"
Will only be available for users with CREDIT_CARD payment methods, when CHALLENGE mode has been enabled for 3DS challenges. The 3DS client secret can be used to complete a payment from your frontend. If not present, no user authentication is required to start the session.
"pi_3MtwBwLkdIwHu8ix28v3tqPa_secret_YrKJUkribcBjcG7HVhfZluoGH"