Products

API change history

API to handle products

GetClusteredProductsAround

Retrieve the clusters of products around a specific location

Try it

Request

Request URL

https://gateway-preview.be-mo.io/products/v1/api/cluster?latitude={latitude}&longitude={longitude}&code={code}&distance={distance}[&placeNetwork][&available][&targetDateTime][&connectors][&tariffCodes][&digitalJourney][&zoom]

Request parameters

  • string

    A valid latitude (-90 to 90)

  • string

    A valid longitude (-180 to 180)

  • string

    List references separated with a comma. Codes of the required products. Use API GetProductCodes for reference.

  • number

    A distance in Km

  • (optional)
    string

    List references separated with a comma. Codes of the required networks. Use API GetPlaceNetwork for reference.

  • (optional)
    boolean

    true if requiring only available product

  • (optional)
    string

    Date time (as date-time in RFC3339). The date of consumption

  • (optional)
    string

    List references separated with a comma. Codes of the requested EV connectors. Use API GetConnectors for reference. Filter applied only to EV charging products.

  • (optional)
    string

    List references separated with a comma. Filter Tariff Codes applied on products according to the date of search

  • (optional)
    boolean

    true if requiring only digital journey

  • (optional)
    number

    Value between 1 and 12 to cluster the products according to desired zoom level.

Request headers

  • string

    A JwtToken generated by GetVehicleToken

  • string
    Subscription key which provides access to this API. Found in your Profile.

Responses

200 OK

Success

Representations

{
  "status": "Success",
  "errors": null,
  "data": [
    {
      "attributes": [
        "capability.charging_profile_capable",
        "capability.remote_start_stop_capable",
        "capability.rfid_reader",
        "connector.chademo_cable",
        "connector.domestic_e_socket",
        "connector.iec_62196_t2_cable",
        "connector.iec_62196_t2_combo_cable",
        "connector.iec_62196_t2_socket",
        "connector.iec_62196_t3c_socket"
      ],
      "count": 42,
      "mode": "Cluster",
      "latitude": 48.847298728571438,
      "longitude": 2.3398118813854181,
      "availableAssetCount": 30,
      "assetCount": 44
    },
    {
      "count": 1,
      "mode": "Product",
      "address": "Place Gaston Beau ",
      "cityKey": "Étampes",
      "countryKey": "FR",
      "distance": 3.4455934330410973,
      "latitude": 48.438222,
      "longitude": 2.159919,
      "openingTimes": {
        "regularHours": [
          {
            "weekDay": "Sunday",
            "periodBegin": "2023-10-26",
            "periodEnd": "2023-10-26"
          },
          {
            "weekDay": "Monday",
            "periodBegin": "2023-10-26",
            "periodEnd": "2023-10-26"
          },
          {
            "weekDay": "Tuesday",
            "periodBegin": "2023-10-26",
            "periodEnd": "2023-10-26"
          },
          {
            "weekDay": "Wednesday",
            "periodBegin": "2023-10-26",
            "periodEnd": "2023-10-26"
          },
          {
            "weekDay": "Thursday",
            "periodBegin": "2023-10-26",
            "periodEnd": "2023-10-26"
          },
          {
            "weekDay": "Friday",
            "periodBegin": "2023-10-26",
            "periodEnd": "2023-10-26"
          },
          {
            "weekDay": "Saturday",
            "periodBegin": "2023-10-26",
            "periodEnd": "2023-10-26"
          }
        ],
        "exceptionalOpenings": [],
        "exceptionalClosings": []
      },
      "placeId": "407378",
      "placeName": "Effia/FR*P01*P91223*A",
      "placeNetwork": "Effia",
      "placeNetworkId": "FR*P01",
      "placeType": "Unknown",
      "products": [
        {
          "attributes": [
            "connector.domestic_f_socket",
            "connector.iec_62196_t2_socket",
            "capability.rfid_reader"
          ],
          "available": true,
          "category": "Charging",
          "code": "E_Standard",
          "description": null,
          "digitalJourney": false,
          "displayedPrices": [],
          "ePayment": false,
          "id": "d97fb9-kwKmNDA3Mzc4zgAQAAA=",
          "availableAssetCount": 1,
          "assetCount": 1,
          "tariffCodes": {
            "defaultCode": "BM-06",
            "specificPeriods": []
          },
          "score": {
            "digitalScore": null,
            "physicalScore": null,
            "networkDigitalScore": null,
            "networkPhysicalScore": null
          }
        }
      ],
      "timeZone": "+02:00",
      "zipCode": "91150",
      "availableAssetCount": 1,
      "assetCount": 1
    }
  ],
  "version": "1.0"
}
{
  "allOf": [
    {
      "properties": {
        "status": {
          "enum": [
            "Success",
            "Error"
          ],
          "type": "string",
          "description": "Code describing the status of the response"
        },
        "errors": {
          "type": "array",
          "items": {
            "required": [
              "code",
              "message"
            ],
            "type": "object",
            "properties": {
              "code": {
                "type": "string",
                "description": "Code of the error."
              },
              "message": {
                "type": "string",
                "description": "Readable message describing the error."
              }
            }
          }
        },
        "version": {
          "type": "string",
          "description": "Version number of the response"
        }
      }
    },
    {
      "type": "object",
      "properties": {
        "data": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "description": "Unique id of the product"
              },
              "code": {
                "enum": [
                  "B7",
                  "B10"
                ],
                "type": "string",
                "description": "Id of the product"
              },
              "description": {
                "type": "string",
                "description": "Specific description of the product."
              },
              "category": {
                "enum": [
                  "Fueling",
                  "Charging",
                  "Washing",
                  "Parking"
                ],
                "type": "string",
                "description": "Category of the product"
              },
              "placeType": {
                "type": "string",
                "description": "Place type where the product can be consumed"
              },
              "placeId": {
                "type": "string",
                "description": "Technical Id of the place where the product can be consumed"
              },
              "available": {
                "type": "boolean",
                "description": "true if the product is available at this place."
              },
              "allowed": {
                "type": "boolean",
                "description": "True if digital consumption of product is allowed by your subscription."
              },
              "address": {
                "type": "string",
                "description": "Street address of the place."
              },
              "countryKey": {
                "type": "string",
                "description": "ISO alpha-2 country code."
              },
              "cityKey": {
                "type": "string"
              },
              "zipCode": {
                "type": "string"
              },
              "placeName": {
                "type": "string",
                "description": "User-friendly name of the place."
              },
              "placeNetwork": {
                "type": "string",
                "description": "Network of this product."
              },
              "placeNetworkId": {
                "type": "string",
                "description": "Network id of this product."
              },
              "ePayment": {
                "type": "boolean",
                "description": "Deprecated, true if product available for digital journey.",
                "deprecated": true
              },
              "digitalJourney": {
                "type": "boolean",
                "description": "true if product available for digital journey."
              },
              "latitude": {
                "maximum": 90.0,
                "minimum": -90.0,
                "type": "number",
                "description": "Latitude of the place."
              },
              "longitude": {
                "maximum": 180.0,
                "minimum": -180.0,
                "type": "number",
                "description": "Longitude of the place."
              },
              "openingTimes": {
                "type": "object",
                "properties": {
                  "regularHours": {
                    "type": "object",
                    "properties": {
                      "weekDay": {
                        "enum": [
                          "Monday",
                          "Tuesday",
                          "Wednesday",
                          "Thursday",
                          "Friday",
                          "Saturday",
                          "Sunday"
                        ],
                        "type": "string"
                      },
                      "periodBegin": {
                        "pattern": "([0-1][0-9]|2[0-3]):[0-5][0-9]",
                        "type": "string",
                        "description": "Opening hour. Local time."
                      },
                      "periodEnd": {
                        "pattern": "([0-1][0-9]|2[0-3]):[0-5][0-9]",
                        "type": "string",
                        "description": "Closing hour. Local time."
                      }
                    },
                    "description": "Regular business hours."
                  },
                  "exceptionalOpenings": {
                    "type": "object",
                    "properties": {
                      "description": {
                        "type": "string",
                        "description": "Friendly description of the period. (Ex. maintenance, holidays)"
                      },
                      "periodBegin": {
                        "type": "string",
                        "description": "UTC time",
                        "format": "date-time"
                      },
                      "periodEnd": {
                        "type": "string",
                        "description": "UTC time",
                        "format": "date-time"
                      }
                    }
                  },
                  "exceptionalClosings": {
                    "type": "object",
                    "properties": {
                      "description": {
                        "type": "string",
                        "description": "Friendly description of the period. (Ex. maintenance, holidays)"
                      },
                      "periodBegin": {
                        "type": "string",
                        "description": "UTC time",
                        "format": "date-time"
                      },
                      "periodEnd": {
                        "type": "string",
                        "description": "UTC time",
                        "format": "date-time"
                      }
                    }
                  }
                }
              },
              "attributes": {
                "type": "array",
                "items": {
                  "pattern": "(connector|capability).\\w",
                  "type": "string",
                  "description": "Attributes describing capabilities of the place."
                }
              },
              "displayedPrices": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "description": {
                      "type": "string",
                      "description": "Friendly description of the price."
                    },
                    "quantityUnit": {
                      "enum": [
                        "L",
                        "kWh",
                        "s",
                        "Flat",
                        "Unknown"
                      ],
                      "type": "string",
                      "description": "Quantity unit of this price."
                    },
                    "unitPrice": {
                      "type": "number",
                      "description": "Unit price"
                    },
                    "stepSize": {
                      "type": "integer",
                      "description": "Indicates the step size. Means for how many quantity unit (s, L, etc.) the current price is available."
                    },
                    "currencyKey": {
                      "type": "string",
                      "description": "Currency key (ISO 4217)"
                    }
                  }
                }
              },
              "tariffCodes": {
                "type": "object",
                "properties": {
                  "defaultCode": {
                    "pattern": "BM-([0-1][0-9]|20)",
                    "type": "string",
                    "description": "Default tariff code applicable to this period."
                  },
                  "specificPeriods": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "pattern": "BM-([0-1][0-9]|20)",
                          "type": "string",
                          "description": "Tariff code applicable to this period."
                        },
                        "tag": {
                          "type": "string",
                          "description": "Describes this specific tariff reason (ex: night/day)."
                        },
                        "weekDay": {
                          "enum": [
                            "Monday",
                            "Tuesday",
                            "Wednesday",
                            "Thursday",
                            "Friday",
                            "Saturday",
                            "Sunday"
                          ],
                          "type": "string"
                        },
                        "periodBegin": {
                          "pattern": "([0-1][0-9]|2[0-3]):[0-5][0-9]",
                          "type": "string",
                          "description": "Starting hour. UTC time."
                        },
                        "periodEnd": {
                          "pattern": "([0-1][0-9]|2[0-3]):[0-5][0-9]",
                          "type": "string",
                          "description": "End hour. UTC time."
                        }
                      },
                      "description": "Specific tariff period."
                    }
                  }
                },
                "description": "Describes tariff classification for this product."
              },
              "timeZone": {
                "type": "string"
              }
            }
          }
        }
      }
    }
  ]
}

401 Unauthorized

Unauthorized

Representations

{
  "TokenExpired": {
    "status": "Error",
    "errors": [
      {
        "code": "TokenExpired",
        "message": "Lifetime validation failed, the JWT is expired."
      }
    ],
    "version": "1.0"
  }
}
{
  "properties": {
    "status": {
      "enum": [
        "Success",
        "Error"
      ],
      "type": "string",
      "description": "Code describing the status of the response"
    },
    "errors": {
      "type": "array",
      "items": {
        "required": [
          "code",
          "message"
        ],
        "type": "object",
        "properties": {
          "code": {
            "type": "string",
            "description": "Code of the error."
          },
          "message": {
            "type": "string",
            "description": "Readable message describing the error."
          }
        }
      }
    },
    "version": {
      "type": "string",
      "description": "Version number of the response"
    }
  }
}

403 Forbidden

Forbidden

Representations

{
  "status": "Error",
  "errors": [
    {
      "code": "InvalidJWT",
      "message": "Unable to decode the JWT."
    }
  ],
  "version": "1.0"
}
{
  "properties": {
    "status": {
      "enum": [
        "Success",
        "Error"
      ],
      "type": "string",
      "description": "Code describing the status of the response"
    },
    "errors": {
      "type": "array",
      "items": {
        "required": [
          "code",
          "message"
        ],
        "type": "object",
        "properties": {
          "code": {
            "type": "string",
            "description": "Code of the error."
          },
          "message": {
            "type": "string",
            "description": "Readable message describing the error."
          }
        }
      }
    },
    "version": {
      "type": "string",
      "description": "Version number of the response"
    }
  }
}

500 Internal Server Error

Internal server error

Representations

{
  "status": "Error",
  "errors": [
    {
      "code": "ErrorCode",
      "message": "Error message/description."
    }
  ],
  "version": "1.0"
}
{
  "properties": {
    "status": {
      "enum": [
        "Success",
        "Error"
      ],
      "type": "string",
      "description": "Code describing the status of the response"
    },
    "errors": {
      "type": "array",
      "items": {
        "required": [
          "code",
          "message"
        ],
        "type": "object",
        "properties": {
          "code": {
            "type": "string",
            "description": "Code of the error."
          },
          "message": {
            "type": "string",
            "description": "Readable message describing the error."
          }
        }
      }
    },
    "version": {
      "type": "string",
      "description": "Version number of the response"
    }
  }
}

Code samples

@ECHO OFF

curl -v -X GET "https://gateway-preview.be-mo.io/products/v1/api/cluster?latitude={latitude}&longitude={longitude}&code={code}&distance={distance}?placeNetwork={string}&available={boolean}&targetDateTime={string}&connectors={string}&tariffCodes={string}&digitalJourney={boolean}&zoom={number}"
-H "Authorization: "
-H "Api-Subscription-Key: {subscription key}"

--data-ascii "{body}" 
using System;
using System.Net.Http.Headers;
using System.Text;
using System.Net.Http;
using System.Web;

namespace CSHttpClientSample
{
    static class Program
    {
        static void Main()
        {
            MakeRequest();
            Console.WriteLine("Hit ENTER to exit...");
            Console.ReadLine();
        }
        
        static async void MakeRequest()
        {
            var client = new HttpClient();
            var queryString = HttpUtility.ParseQueryString(string.Empty);

            // Request headers
            client.DefaultRequestHeaders.Add("Authorization", "");
            client.DefaultRequestHeaders.Add("Api-Subscription-Key", "{subscription key}");

            // Request parameters
            queryString["placeNetwork"] = "{string}";
            queryString["available"] = "{boolean}";
            queryString["targetDateTime"] = "{string}";
            queryString["connectors"] = "{string}";
            queryString["tariffCodes"] = "{string}";
            queryString["digitalJourney"] = "{boolean}";
            queryString["zoom"] = "{number}";
            var uri = "https://gateway-preview.be-mo.io/products/v1/api/cluster?latitude={latitude}&longitude={longitude}&code={code}&distance={distance}&" + queryString;

            var response = await client.GetAsync(uri);
        }
    }
}	
// // This sample uses the Apache HTTP client from HTTP Components (http://hc.apache.org/httpcomponents-client-ga/)
import java.net.URI;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;

public class JavaSample 
{
    public static void main(String[] args) 
    {
        HttpClient httpclient = HttpClients.createDefault();

        try
        {
            URIBuilder builder = new URIBuilder("https://gateway-preview.be-mo.io/products/v1/api/cluster?latitude={latitude}&longitude={longitude}&code={code}&distance={distance}");

            builder.setParameter("placeNetwork", "{string}");
            builder.setParameter("available", "{boolean}");
            builder.setParameter("targetDateTime", "{string}");
            builder.setParameter("connectors", "{string}");
            builder.setParameter("tariffCodes", "{string}");
            builder.setParameter("digitalJourney", "{boolean}");
            builder.setParameter("zoom", "{number}");

            URI uri = builder.build();
            HttpGet request = new HttpGet(uri);
            request.setHeader("Authorization", "");
            request.setHeader("Api-Subscription-Key", "{subscription key}");


            // Request body
            StringEntity reqEntity = new StringEntity("{body}");
            request.setEntity(reqEntity);

            HttpResponse response = httpclient.execute(request);
            HttpEntity entity = response.getEntity();

            if (entity != null) 
            {
                System.out.println(EntityUtils.toString(entity));
            }
        }
        catch (Exception e)
        {
            System.out.println(e.getMessage());
        }
    }
}

<!DOCTYPE html>
<html>
<head>
    <title>JSSample</title>
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js"></script>
</head>
<body>

<script type="text/javascript">
    $(function() {
        var params = {
            // Request parameters
            "placeNetwork": "{string}",
            "available": "{boolean}",
            "targetDateTime": "{string}",
            "connectors": "{string}",
            "tariffCodes": "{string}",
            "digitalJourney": "{boolean}",
            "zoom": "{number}",
        };
      
        $.ajax({
            url: "https://gateway-preview.be-mo.io/products/v1/api/cluster?latitude={latitude}&longitude={longitude}&code={code}&distance={distance}&" + $.param(params),
            beforeSend: function(xhrObj){
                // Request headers
                xhrObj.setRequestHeader("Authorization","");
                xhrObj.setRequestHeader("Api-Subscription-Key","{subscription key}");
            },
            type: "GET",
            // Request body
            data: "{body}",
        })
        .done(function(data) {
            alert("success");
        })
        .fail(function() {
            alert("error");
        });
    });
</script>
</body>
</html>
#import <Foundation/Foundation.h>

int main(int argc, const char * argv[])
{
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    
    NSString* path = @"https://gateway-preview.be-mo.io/products/v1/api/cluster?latitude={latitude}&longitude={longitude}&code={code}&distance={distance}";
    NSArray* array = @[
                         // Request parameters
                         @"entities=true",
                         @"placeNetwork={string}",
                         @"available={boolean}",
                         @"targetDateTime={string}",
                         @"connectors={string}",
                         @"tariffCodes={string}",
                         @"digitalJourney={boolean}",
                         @"zoom={number}",
                      ];
    
    NSString* string = [array componentsJoinedByString:@"&"];
    path = [path stringByAppendingFormat:@"?%@", string];

    NSLog(@"%@", path);

    NSMutableURLRequest* _request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:path]];
    [_request setHTTPMethod:@"GET"];
    // Request headers
    [_request setValue:@"" forHTTPHeaderField:@"Authorization"];
    [_request setValue:@"{subscription key}" forHTTPHeaderField:@"Api-Subscription-Key"];
    // Request body
    [_request setHTTPBody:[@"{body}" dataUsingEncoding:NSUTF8StringEncoding]];
    
    NSURLResponse *response = nil;
    NSError *error = nil;
    NSData* _connectionData = [NSURLConnection sendSynchronousRequest:_request returningResponse:&response error:&error];

    if (nil != error)
    {
        NSLog(@"Error: %@", error);
    }
    else
    {
        NSError* error = nil;
        NSMutableDictionary* json = nil;
        NSString* dataString = [[NSString alloc] initWithData:_connectionData encoding:NSUTF8StringEncoding];
        NSLog(@"%@", dataString);
        
        if (nil != _connectionData)
        {
            json = [NSJSONSerialization JSONObjectWithData:_connectionData options:NSJSONReadingMutableContainers error:&error];
        }
        
        if (error || !json)
        {
            NSLog(@"Could not parse loaded json with error:%@", error);
        }
        
        NSLog(@"%@", json);
        _connectionData = nil;
    }
    
    [pool drain];

    return 0;
}
<?php
// This sample uses the Apache HTTP client from HTTP Components (http://hc.apache.org/httpcomponents-client-ga/)
require_once 'HTTP/Request2.php';

$request = new Http_Request2('https://gateway-preview.be-mo.io/products/v1/api/cluster?latitude={latitude}&longitude={longitude}&code={code}&distance={distance}');
$url = $request->getUrl();

$headers = array(
    // Request headers
    'Authorization' => '',
    'Api-Subscription-Key' => '{subscription key}',
);

$request->setHeader($headers);

$parameters = array(
    // Request parameters
    'placeNetwork' => '{string}',
    'available' => '{boolean}',
    'targetDateTime' => '{string}',
    'connectors' => '{string}',
    'tariffCodes' => '{string}',
    'digitalJourney' => '{boolean}',
    'zoom' => '{number}',
);

$url->setQueryVariables($parameters);

$request->setMethod(HTTP_Request2::METHOD_GET);

// Request body
$request->setBody("{body}");

try
{
    $response = $request->send();
    echo $response->getBody();
}
catch (HttpException $ex)
{
    echo $ex;
}

?>
########### Python 2.7 #############
import httplib, urllib, base64

headers = {
    # Request headers
    'Authorization': '',
    'Api-Subscription-Key': '{subscription key}',
}

params = urllib.urlencode({
    # Request parameters
    'placeNetwork': '{string}',
    'available': '{boolean}',
    'targetDateTime': '{string}',
    'connectors': '{string}',
    'tariffCodes': '{string}',
    'digitalJourney': '{boolean}',
    'zoom': '{number}',
})

try:
    conn = httplib.HTTPSConnection('gateway-preview.be-mo.io')
    conn.request("GET", "/products/v1/api/cluster?latitude={latitude}&longitude={longitude}&code={code}&distance={distance}&%s" % params, "{body}", headers)
    response = conn.getresponse()
    data = response.read()
    print(data)
    conn.close()
except Exception as e:
    print("[Errno {0}] {1}".format(e.errno, e.strerror))

####################################

########### Python 3.2 #############
import http.client, urllib.request, urllib.parse, urllib.error, base64

headers = {
    # Request headers
    'Authorization': '',
    'Api-Subscription-Key': '{subscription key}',
}

params = urllib.parse.urlencode({
    # Request parameters
    'placeNetwork': '{string}',
    'available': '{boolean}',
    'targetDateTime': '{string}',
    'connectors': '{string}',
    'tariffCodes': '{string}',
    'digitalJourney': '{boolean}',
    'zoom': '{number}',
})

try:
    conn = http.client.HTTPSConnection('gateway-preview.be-mo.io')
    conn.request("GET", "/products/v1/api/cluster?latitude={latitude}&longitude={longitude}&code={code}&distance={distance}&%s" % params, "{body}", headers)
    response = conn.getresponse()
    data = response.read()
    print(data)
    conn.close()
except Exception as e:
    print("[Errno {0}] {1}".format(e.errno, e.strerror))

####################################
require 'net/http'

uri = URI('https://gateway-preview.be-mo.io/products/v1/api/cluster?latitude={latitude}&longitude={longitude}&code={code}&distance={distance}')

query = URI.encode_www_form({
    # Request parameters
    'placeNetwork' => '{string}',
    'available' => '{boolean}',
    'targetDateTime' => '{string}',
    'connectors' => '{string}',
    'tariffCodes' => '{string}',
    'digitalJourney' => '{boolean}',
    'zoom' => '{number}'
})
if query.length > 0
  if uri.query && uri.query.length > 0
    uri.query += '&' + query
  else
    uri.query = query
  end
end

request = Net::HTTP::Get.new(uri.request_uri)
# Request headers
request['Authorization'] = ''
# Request headers
request['Api-Subscription-Key'] = '{subscription key}'
# Request body
request.body = "{body}"

response = Net::HTTP.start(uri.host, uri.port, :use_ssl => uri.scheme == 'https') do |http|
    http.request(request)
end

puts response.body