Geolocate: /v1/geolocate¶
Purpose: Determine the current location based on data provided about nearby Bluetooth, cell, or WiFi networks and the IP address used to access the service.
Request¶
Geolocate requests are submitted using a POST request to the URL:
https://location.services.mozilla.com/v1/geolocate?key=<API_KEY>
This implements a similar interface as the Google Maps Geolocation API endpoint also known as GLS or Google Location Service API. Our service implements all of the standard GLS API with a couple of additions.
Geolocate requests are submitted using an HTTP POST request with a JSON body.
Here is a minimal example body using only WiFi networks:
{
"wifiAccessPoints": [{
"macAddress": "01:23:45:67:89:ab",
"signalStrength": -51
}, {
"macAddress": "01:23:45:67:89:cd"
}]
}
A minimal example using a cell network:
{
"cellTowers": [{
"radioType": "wcdma",
"mobileCountryCode": 208,
"mobileNetworkCode": 1,
"locationAreaCode": 2,
"cellId": 1234567,
"signalStrength": -60
}]
}
A complete example including all possible fields:
{
"carrier": "Telecom",
"considerIp": true,
"homeMobileCountryCode": 208,
"homeMobileNetworkCode": 1,
"bluetoothBeacons": [{
"macAddress": "ff:23:45:67:89:ab",
"age": 2000,
"name": "beacon",
"signalStrength": -110
}],
"cellTowers": [{
"radioType": "wcdma",
"mobileCountryCode": 208,
"mobileNetworkCode": 1,
"locationAreaCode": 2,
"cellId": 1234567,
"age": 1,
"psc": 3,
"signalStrength": -60,
"timingAdvance": 1
}],
"wifiAccessPoints": [{
"macAddress": "01:23:45:67:89:ab",
"age": 3,
"channel": 11,
"frequency": 2412,
"signalStrength": -51,
"signalToNoiseRatio": 13
}, {
"macAddress": "01:23:45:67:89:cd"
}],
"fallbacks": {
"lacf": true,
"ipf": true
}
}
Field Definition¶
All of the fields are optional, but in order to get a Bluetooth or WiFi based
position estimate at least two networks need to be provided and include a
macAddress
. The two networks minimum is a mandatory privacy restriction
for Bluetooth and WiFi based location services.
Cell based position estimates require each cell record to contain at least
the five radioType
, mobileCountryCode
, mobileNetworkCode
,
locationAreaCode
, and cellId
values.
Position estimates do get a lot more precise if in addition to these unique
identifiers at least signalStrength
data can be provided for each entry.
Note that all the cell JSON keys use the same names for all radio types, generally using the official GSM name to denote similar concepts even though the actual client side API’s might use different names for each radio type and thus must be mapped to the JSON keys.
Global Fields¶
- carrier
The clear text name of the cell carrier / operator.
- considerIp
Should the clients IP address be used to locate it; defaults to true.
- homeMobileCountryCode
The mobile country code stored on the SIM card.
- homeMobileNetworkCode
The mobile network code stored on the SIM card.
- radioType
Same as the
radioType
entry in each cell record. If all the cell entries have the sameradioType
, it can be provided at the top level instead.
Bluetooth Beacon Fields¶
- macAddress
The address of the Bluetooth Low Energy (BLE) beacon.
- name
The name of the BLE beacon.
- age
The number of milliseconds since this BLE beacon was last seen.
- signalStrength
The measured signal strength of the BLE beacon in dBm.
Cell Tower Fields¶
- radioType
The type of radio network. One of
gsm
,wcdma
, orlte
. This is a custom extension to the GLS API which only defines the top-level radioType field.- mobileCountryCode
The mobile country code.
- mobileNetworkCode
The mobile network code.
- locationAreaCode
The location area code for GSM and WCDMA networks. The tracking area code for LTE networks.
- cellId
The cell id or cell identity.
- age
The number of milliseconds since this networks was last detected.
- psc
The primary scrambling code for WCDMA and physical cell id for LTE. This is an addition to the GLS API.
- signalStrength
The signal strength for this cell network, either the RSSI or RSCP.
- timingAdvance
The timing advance value for this cell network.
WiFi Access Point Fields¶
Note
Hidden WiFi networks and those whose SSID (clear text name) ends with the
string _nomap
must NOT be used for privacy reasons.
It is the responsibility of the client code to filter these out.
- macAddress
The BSSID of the WiFi network.
- age
The number of milliseconds since this network was last detected.
- channel
The WiFi channel for networks in the 2.4GHz range. This often ranges from 1 to 13.
- frequency
The frequency in MHz of the channel over which the client is communicating with the access point. This is an addition to the GLS API and can be used instead of the channel field.
- signalStrength
The received signal strength (RSSI) in dBm.
- signalToNoiseRatio
The current signal to noise ratio measured in dB.
- ssid
The SSID of the Wifi network.
Wifi networks with a SSID ending in
_nomap
must not be collected.
Fallback Fields¶
The fallback section is a custom addition to the GLS API.
By default, both a GeoIP based position fallback and a fallback based on cell
location areas (lac’s) are enabled. Omit the fallbacks
section if you want
to use the defaults. Change the values to false
if you want to disable
either of the fallbacks.
- lacf
If no exact cell match can be found, fall back from exact cell position estimates to more coarse grained cell location area estimates rather than going directly to an even worse GeoIP based estimate.
- ipf
If no position can be estimated based on any of the provided data points, fall back to an estimate based on a GeoIP database based on the senders IP address at the time of the query.
Deviations From GLS API¶
Our API differs from the GLS API in these ways:
The entire Bluetooth section is a custom addition–the GLS API does not have this.
Cell entries allow you to specify the
radioType
per cell network instead of globally. This allows for queries with data from multiple active SIM cards. For example, this allows for queries where one of SIM card is on a GSM connection while the other uses a WCDMA connection.Cell entries take an extra
psc
field.The WiFi
macAddress
field takes both upper- and lower-case characters. It also tolerates:
,-
, or no separator and internally strips them.WiFi entries take an extra
frequency
field.The
fallbacks
section allows some control over the more coarse grained position sources. If no exact match can be found, these can be used to return a “404 Not Found” rather than a coarse grained estimate with a large accuracy value.If either the GeoIP or location area fallbacks were used to determine the response, an additional fallback key will be returned in the response.
The
considerIp
field has the same purpose as the fallbacks/ipf field. It was introduced into the GLS API later on and we continue to support both, with the fallbacks section taking precedence.
Response¶
A successful response returns a position estimate and an accuracy field. Combined these two describe the center and radius of a circle. The user’s true position should be inside the circle with a 95th percentile confidence value. The accuracy is measured in meters.
If the position is to be shown on a map and the returned accuracy is large, it may be advisable to zoom out the map, so that all of the circle can be seen, even if the circle itself is not shown graphically. That way a user should still see his true position on the map and can zoom in further.
If instead the returned position is shown highly zoomed in, the user may just see an arbitrary location that they don’t recognize at all. This typically happens when GeoIP based results are returned and the returned position is the center of a city or the center of a region.
An example of a successful response:
{
"location": {
"lat": -22.7539192,
"lng": -43.4371081
},
"accuracy": 100.0
}
An example of a successful response based on a GeoIP estimate:
{
"location": {
"lat": 51.0,
"lng": -0.1
},
"accuracy": 600000.0,
"fallback": "ipf"
}
Alternatively the fallback field can also state lacf
for an estimate
based on a cell location area.
If no position information could be determined, an HTTP status code 404 will be returned:
{
"error": {
"errors": [{
"domain": "geolocation",
"reason": "notFound",
"message": "Not found",
}],
"code": 404,
"message": "Not found",
}
}