TrackingAPI API Reference

API for retrieving tracking data and changing settings on LightBug & RemoteThings tracking devices

API Endpoint
https://cp.remotethings.co.uk/api
Request Content-Types: application/json, application/x-www-form-urlencoded, application/xml, text/xml
Response Content-Types: application/json, application/xml, text/xml, application/javascript, text/javascript
Schemes: https
Version: 1.1.0

device

Retrieve a specific point for a device

GET /devices/{id}/points/{fk}
fk

Foreign key for points

type
number (integer)
in
path
id

device id

type
number (integer)
in
path
200 OK

Body (JSON)

Response Example (200 OK)
{
  "location": {
    "lat": "number",
    "lng": "number"
  },
  "timestamp": "string (date-time)",
  "speed": "number",
  "altitude": "number",
  "course": "number",
  "num_value": "string",
  "stringValue": "string",
  "sendReason": "number",
  "sats": "number",
  "hdop": "number",
  "accuracy": "number",
  "locationType": "string",
  "batteryVoltage": "number",
  "averageCharge": "number",
  "created": "string (date-time)",
  "address": "string",
  "alertType": "number",
  "id": "number",
  "deviceId": "number"
}

Delete a specific point for a device

DELETE /devices/{id}/points/{fk}
fk

Foreign key for points

type
number (integer)
in
path
id

device id

type
number (integer)
in
path
204 No Content

Request was successful

Retrieve configuration for a device

GET /devices/{id}/config
refresh

unused

type
boolean
in
query
id

device id

type
number (integer)
in
path
200 OK

Body (JSON)

Response Example (200 OK)
{
  "currentFW": "string",
  "otaFW": "string",
  "interval": "number",
  "sleepInterval": "number",
  "checkInInterval": "number",
  "packing": "number",
  "movementSensitivity": "number",
  "debounce": "number",
  "movementSensitivity2": "number",
  "behavior": "number",
  "modeControl": "number",
  "gpsTimeout": "number",
  "transmitTimeout": "number",
  "gpsStabilize": "number",
  "gpsCheckInterval": "number",
  "stopTimeout": "number",
  "tolerancePercentage": "number",
  "reasonsToWake": [
    "object"
  ],
  "modified": "string (date-time)",
  "forceFw": "boolean",
  "receivedAt": "string (date-time)",
  "reset": "number",
  "flashTryCount": "number",
  "homeWifiNetwork": "string",
  "homeWifiPassword": "string",
  "wakeAction": "string",
  "onDemandTime": "number",
  "alertAction": "string",
  "id": "number",
  "deviceId": "number",
  "safeZoneId": "number"
}

Update configuration for a device

PUT /devices/{id}/config

Body (JSON)

id

device id

type
number (integer)
in
path
Request Example
{
  "currentFW": "string",
  "otaFW": "string",
  "interval": "number",
  "sleepInterval": "number",
  "checkInInterval": "number",
  "packing": "number",
  "movementSensitivity": "number",
  "debounce": "number",
  "movementSensitivity2": "number",
  "behavior": "number",
  "modeControl": "number",
  "gpsTimeout": "number",
  "transmitTimeout": "number",
  "gpsStabilize": "number",
  "gpsCheckInterval": "number",
  "stopTimeout": "number",
  "tolerancePercentage": "number",
  "reasonsToWake": [
    "object"
  ],
  "modified": "string (date-time)",
  "forceFw": "boolean",
  "receivedAt": "string (date-time)",
  "reset": "number",
  "flashTryCount": "number",
  "homeWifiNetwork": "string",
  "homeWifiPassword": "string",
  "wakeAction": "string",
  "onDemandTime": "number",
  "alertAction": "string",
  "id": "number",
  "deviceId": "number",
  "safeZoneId": "number"
}
200 OK

Body (JSON)

Response Example (200 OK)
{
  "currentFW": "string",
  "otaFW": "string",
  "interval": "number",
  "sleepInterval": "number",
  "checkInInterval": "number",
  "packing": "number",
  "movementSensitivity": "number",
  "debounce": "number",
  "movementSensitivity2": "number",
  "behavior": "number",
  "modeControl": "number",
  "gpsTimeout": "number",
  "transmitTimeout": "number",
  "gpsStabilize": "number",
  "gpsCheckInterval": "number",
  "stopTimeout": "number",
  "tolerancePercentage": "number",
  "reasonsToWake": [
    "object"
  ],
  "modified": "string (date-time)",
  "forceFw": "boolean",
  "receivedAt": "string (date-time)",
  "reset": "number",
  "flashTryCount": "number",
  "homeWifiNetwork": "string",
  "homeWifiPassword": "string",
  "wakeAction": "string",
  "onDemandTime": "number",
  "alertAction": "string",
  "id": "number",
  "deviceId": "number",
  "safeZoneId": "number"
}

Retrieve a specific reading for a device

GET /devices/{id}/readings/{fk}
fk

Foreign key for readings

type
number (integer)
in
path
id

device id

type
number (integer)
in
path
200 OK

Body (JSON)

Response Example (200 OK)
{
  "timestamp": "string (date-time)",
  "created": "string (date-time)",
  "type": "string",
  "value": "object",
  "meta": "object",
  "id": "number",
  "gatewayId": "number",
  "deviceId": "number",
  "sensorDeviceId": "string",
  "datapointId": "number"
}

Retrieve points for a device

GET /devices/{id}/points
filter

JSON Filter object

type
string (JSON)
in
query
id

device id

type
number (integer)
in
path
200 OK

Request was successful

Response Example (200 OK)
[
  {
    "location": {
      "lat": "number",
      "lng": "number"
    },
    "timestamp": "string (date-time)",
    "speed": "number",
    "altitude": "number",
    "course": "number",
    "num_value": "string",
    "stringValue": "string",
    "sendReason": "number",
    "sats": "number",
    "hdop": "number",
    "accuracy": "number",
    "locationType": "string",
    "batteryVoltage": "number",
    "averageCharge": "number",
    "created": "string (date-time)",
    "address": "string",
    "alertType": "number",
    "id": "number",
    "deviceId": "number"
  }
]

Retrieve readings for a device

GET /devices/{id}/readings
filter

JSON Filter object

type
string (JSON)
in
query
id

device id

type
number (integer)
in
path
200 OK

Request was successful

Response Example (200 OK)
[
  {
    "timestamp": "string (date-time)",
    "created": "string (date-time)",
    "type": "string",
    "value": "object",
    "meta": "object",
    "id": "number",
    "gatewayId": "number",
    "deviceId": "number",
    "sensorDeviceId": "string",
    "datapointId": "number"
  }
]

Get alerts for device

GET /devices/{id}/notificationTriggers
filter

JSON Filter object

type
string (JSON)
in
query
id

device id

type
number (integer)
in
path

Request was successful

Response Example (200 OK)
[
  {
    "name": "string",
    "type": "string",
    "parameters": "object",
    "muteFor": "number",
    "lastTriggered": "string (date-time)",
    "delivery": "object",
    "id": "number",
    "deviceId": "number",
    "userId": "number"
  }
]

Create alert/notification trigger for device

POST /devices/{id}/notificationTriggers

Body (JSON)

id

device id

type
number (integer)
in
path
Request Example
{
  "name": "string",
  "type": "string",
  "parameters": "object",
  "muteFor": "number",
  "lastTriggered": "string (date-time)",
  "delivery": "object",
  "id": "number",
  "deviceId": "number",
  "userId": "number"
}

Body (JSON)

Response Example (200 OK)
{
  "name": "string",
  "type": "string",
  "parameters": "object",
  "muteFor": "number",
  "lastTriggered": "string (date-time)",
  "delivery": "object",
  "id": "number",
  "deviceId": "number",
  "userId": "number"
}

Remove all alert/notification trigger for device

DELETE /devices/{id}/notificationTriggers
id

device id

type
number (integer)
in
path
204 No Content

Request was successful

Find a model instance by {{id}} from the data source.

GET /devices/{id}
id

Model id

type
string (JSON)
in
path
filter

Filter defining fields and include - must be a JSON-encoded string ({"something":"value"})

type
string (JSON)
in
query
200 OK

Body (JSON)

Response Example (200 OK)
{
  "imei": "string",
  "iccid": "string",
  "imsi": "string",
  "btMacAddress": "string",
  "serial": "string",
  "type": "string",
  "lastConnection": "string (date-time)",
  "firstSeen": "string (date-time)",
  "mode": "string",
  "name": "string",
  "batteryVoltage": "number",
  "batteryType": "string",
  "tags": [
    "string"
  ],
  "currentMode": "number",
  "color": "string",
  "saveToWeb": "boolean",
  "expires": "string (date-time)",
  "plan": "string",
  "active": "boolean",
  "deepSleep": "boolean",
  "simstate": "string",
  "stripeSubscription": "string",
  "subscriptionType": "string",
  "meta": "object",
  "id": "number",
  "ownerId": "number",
  "securePhoneId": "number"
}

Send wake instruction to device

GET /devices/{id}/wakeUp
duration

(no description)

type
number
in
query
id

device id

type
number (integer)
in
path
200 OK

Request was successful

Response Example (200 OK)
"object"

Send sleep instruction to device

GET /devices/{id}/sleep
duration

(no description)

type
number
in
query
id

device id

type
number (integer)
in
path
200 OK

Request was successful

Response Example (200 OK)
"object"

Update safe-zone for device

POST /devices/{id}/setSafeZone

Array of {lat:x,lng:y} points denoting the vertices of the safe-zone

GeoPoint
id

device id

type
number (integer)
in
path
Request Example
[
  {
    "lat": "number",
    "lng": "number"
  }
]
200 OK

Body (JSON)

Response Example (200 OK)
{
  "outline": [
    "object"
  ],
  "type": "string",
  "name": "string",
  "wasInside": "boolean",
  "lastChecked": "string (date-time)",
  "modified": "boolean",
  "id": "number",
  "deviceId": "number",
  "configId": "number",
  "userId": "number"
}

Get safe-zone for device

GET /devices/{id}/getSafeZone
id

device id

type
number (integer)
in
path
200 OK

Body (JSON)

Response Example (200 OK)
{
  "outline": [
    "object"
  ],
  "type": "string",
  "name": "string",
  "wasInside": "boolean",
  "lastChecked": "string (date-time)",
  "modified": "boolean",
  "id": "number",
  "deviceId": "number",
  "configId": "number",
  "userId": "number"
}

user

Find a related item by id for geofences.

GET /users/{id}/geofences/{fk}
fk

Foreign key for geofences

type
number (integer)
in
path
id

user id

type
string (JSON)
in
path
200 OK

Body (JSON)

Response Example (200 OK)
{
  "outline": [
    "object"
  ],
  "type": "string",
  "name": "string",
  "wasInside": "boolean",
  "lastChecked": "string (date-time)",
  "modified": "boolean",
  "id": "number",
  "deviceId": "number",
  "configId": "number",
  "userId": "number"
}

Delete a related item by id for geofences.

DELETE /users/{id}/geofences/{fk}
fk

Foreign key for geofences

type
number (integer)
in
path
id

user id

type
string (JSON)
in
path
204 No Content

Request was successful

Update a related item by id for geofences.

PUT /users/{id}/geofences/{fk}

Body (JSON)

fk

Foreign key for geofences

type
number (integer)
in
path
id

user id

type
string (JSON)
in
path
Request Example
{
  "outline": [
    "object"
  ],
  "type": "string",
  "name": "string",
  "wasInside": "boolean",
  "lastChecked": "string (date-time)",
  "modified": "boolean",
  "id": "number",
  "deviceId": "number",
  "configId": "number",
  "userId": "number"
}
200 OK

Body (JSON)

Response Example (200 OK)
{
  "outline": [
    "object"
  ],
  "type": "string",
  "name": "string",
  "wasInside": "boolean",
  "lastChecked": "string (date-time)",
  "modified": "boolean",
  "id": "number",
  "deviceId": "number",
  "configId": "number",
  "userId": "number"
}

Queries devices of user.

GET /users/{id}/devices
filter

JSON Filter object

type
string (JSON)
in
query
id

user id

type
string (JSON)
in
path
200 OK

Request was successful

Response Example (200 OK)
[
  {
    "imei": "string",
    "iccid": "string",
    "imsi": "string",
    "btMacAddress": "string",
    "serial": "string",
    "type": "string",
    "lastConnection": "string (date-time)",
    "firstSeen": "string (date-time)",
    "mode": "string",
    "name": "string",
    "batteryVoltage": "number",
    "batteryType": "string",
    "tags": [
      "string"
    ],
    "currentMode": "number",
    "color": "string",
    "saveToWeb": "boolean",
    "expires": "string (date-time)",
    "plan": "string",
    "active": "boolean",
    "deepSleep": "boolean",
    "simstate": "string",
    "stripeSubscription": "string",
    "subscriptionType": "string",
    "meta": "object",
    "id": "number",
    "ownerId": "number",
    "securePhoneId": "number"
  }
]

Queries geofences of user.

GET /users/{id}/geofences
filter

JSON Filter object

type
string (JSON)
in
query
id

user id

type
string (JSON)
in
path
200 OK

Request was successful

Response Example (200 OK)
[
  {
    "outline": [
      "object"
    ],
    "type": "string",
    "name": "string",
    "wasInside": "boolean",
    "lastChecked": "string (date-time)",
    "modified": "boolean",
    "id": "number",
    "deviceId": "number",
    "configId": "number",
    "userId": "number"
  }
]

Creates a new instance in geofences of this model.

POST /users/{id}/geofences

Body (JSON)

id

user id

type
string (JSON)
in
path
Request Example
{
  "outline": [
    "object"
  ],
  "type": "string",
  "name": "string",
  "wasInside": "boolean",
  "lastChecked": "string (date-time)",
  "modified": "boolean",
  "id": "number",
  "deviceId": "number",
  "configId": "number",
  "userId": "number"
}
200 OK

Body (JSON)

Response Example (200 OK)
{
  "outline": [
    "object"
  ],
  "type": "string",
  "name": "string",
  "wasInside": "boolean",
  "lastChecked": "string (date-time)",
  "modified": "boolean",
  "id": "number",
  "deviceId": "number",
  "configId": "number",
  "userId": "number"
}

Deletes all geofences of this model.

DELETE /users/{id}/geofences
id

user id

type
string (JSON)
in
path
204 No Content

Request was successful

Login a user with username/email and password.

POST /users/login

Body (JSON)

include

Related objects to include in the response. See the description of return value for more details.

type
string (JSON)
in
query
Request Example
{
  "username": "string",
  "password": "string"
}
200 OK

Body (JSON)

Response Example (200 OK)
{
  "id": "string",
  "ttl": "number",
  "created": "string (date-time)",
  "userId": "number"
}

GET /users/{id}/getMqttCredentials

id

user id

type
string (JSON)
in
path
200 OK

Request was successful

Response Example (200 OK)
{
  "clientId": "string",
  "username": "string",
  "password": "string"
}

Schema Definitions

datapoint:

location: GeoPoint
timestamp: string (date-time)

Timestamp for the datapoint. NB this is not necessarily the same as 'created'

speed: number

Ground velocity in kmh, as determined by the GPS

altitude: number

Altitude in m, as determined by the GPS

course: number

Course in degrees, as determined by the GPS

num_value: string

Internal use only

stringValue: string

Internal use only

sendReason: number

Bitfield indicating reason for datapoint transmission and status of the device at the time.

Bit1(1): Wake mode active,

Bit2(2): Sleep mode active,

Bit3(4): Bluetooth disconnected,

Bit4(8): Outside of Safe-zone,

Bit5(16): Motion detected,

Bit6(32): Device started moving,

Bit7(64): Device stopped moving,

Bit8(128): Position is stale: last known location was used

Special case 255/0xFF: device was checking in with server. Ignore all data

sats: number

Number of visible satellites, as determined by the GPS

hdop: number

Deprecated

accuracy: number

Accuracy of the location in meters

locationType: string gps

Type of position. Can be 'gps', 'wifi', 'gsm' or 'invalid'

batteryVoltage: number

Battery charge level in volts.

averageCharge: number

Internal Use. 255 indicates plugged in and charging.

created: string (date-time)

Timestamp for when the datapoint was received and processed by the server

address: string

A reverse geocode result for the point

alertType: number

Bitfield indicating what alerts where active at transmission time

Bit1(1): Freefall / Drop detected,

Bit2(2): Rotation detected,

Bit3(4): GSM jamming detected,

Bit4(8): Button was pressed,

Bit5(16): Generic Alert

id: number
deviceId: number
Example
{
  "location": {
    "lat": "number",
    "lng": "number"
  },
  "timestamp": "string (date-time)",
  "speed": "number",
  "altitude": "number",
  "course": "number",
  "num_value": "string",
  "stringValue": "string",
  "sendReason": "number",
  "sats": "number",
  "hdop": "number",
  "accuracy": "number",
  "locationType": "string",
  "batteryVoltage": "number",
  "averageCharge": "number",
  "created": "string (date-time)",
  "address": "string",
  "alertType": "number",
  "id": "number",
  "deviceId": "number"
}

deviceConfig:

currentFW: string

Current Firmware version

otaFW: string

Pending Firmware version. If non null, the unit will be told to upgrade to this version when it next transmits in sleep mode.

interval: number 300

The wake mode interval in seconds. The unit will connect to the server this often when awake.

sleepInterval: number 43200

Sleep mode interval in seconds. The unit will try to connect this often to the server when asleep

checkInInterval: number 43500

Internal Use. A failsafe to ensure the unit connects to the server at least this often.

packing: number 1

The number of GPS points to send with each transmission. A packing setting of 3 with an 'interval' of 60s will result in points recorded approximately every 20s, but they will only be sent together. This increases the time you have to wait for locations to come through to the server but improves battery life

movementSensitivity: number 1

Deprecated. See debounce.

debounce: number 3

Movement sensitivity on a scale of 1 to 10, with 1 being the most sensitive. It is correlated to the number of consecutive milliseconds the acceleration needs to exceed the movementSensitivity threshold

movementSensitivity2: number 1

A secondary debounce value. Typically this value is lower or equal to debounce, representing increased sensitivity to movement once the device is already moving.

behavior: number

Char Bitfield with various flags. Advanced use only. DisableBluetooth:32 | Encrypt:128 | GsmOnWhenAwake:1 | GsmOnWhenAsleep:2 | GpsOnWhenAwake:4 | DisableWifiAccuracyAssist:8 | RepeatSleep:16 | DisableWifi:64

modeControl: number

Char Bitfield with various flags. Advanced use only. StartStopOnly:1 | LockAwakeOnAlert:2 | SendSleepLocAfterBtDisconnect:4 |

gpsTimeout: number 90

How long to let the GPS searches for a lock in seconds before giving up. Max 255s.

transmitTimeout: number

When the unit first wakes up from sleep, how long to wait before trying to transmit in multiples of 30 seconds. 0 = instant, 1 = 30s, 2 = 60s...

Useful to avoid detection or draining battery inside shielded buildings.

gpsStabilize: number 10

How long to let the GPS stabilise in seconds once a lock is achieved before sending the position. Higher values may increase accuracy.

gpsCheckInterval: number 300

If a safe-zone is used, how often to check the wifi & gps to see if its still inside it (only applies when motion is detected)

stopTimeout: number 90

The total amount of time in seconds the unit has to be stationary for before deeming the journey over and switching to sleep mode

tolerancePercentage: number 3

Reserved for internal use.

reasonsToWake: object[] [object Object]
modified: string (date-time)

Set to any non null date to indicate the configuration should be pushed to the device when it next connects

forceFw: boolean

Internal use.

Used with otaFW. Set to true to force the unit to upgrade on next connection (rather than waiting for a sleep connection

receivedAt: string (date-time)

Indicates the last time the settings were sent to the device

reset: number

Non NULL values cause unit to restart on next connection

0 = Normal reboot

1 = Clear settings cache and restart

2 = Clear cache and bluetooth connection data, then restart

flashTryCount: number

Internal use. Set to 0 when changing otaFW

homeWifiNetwork: string (up to 127 chars)

WiFi network name to use as a Safe-zone. When this network is visible, stay asleep

homeWifiPassword: string (up to 127 chars)

WiFi network paswword. If set enables transmission over WiFi.

wakeAction: string normal

What to do when the unit wakes up (ie is moved and not in a safe-zone). Options are 'available' (lost and found), and 'normal' (tracking)

onDemandTime: number 30

Deprecated

alertAction: string nothing

What to do when the button is pressed or the unit is dropped. Options are 'available' (stay registered on the mobile network), 'nothing' (one transmission) and 'lockOn' (keep transmitting at 'interval' until instructed otherwise

id: number
deviceId: number
safeZoneId: number
Example
{
  "currentFW": "string",
  "otaFW": "string",
  "interval": "number",
  "sleepInterval": "number",
  "checkInInterval": "number",
  "packing": "number",
  "movementSensitivity": "number",
  "debounce": "number",
  "movementSensitivity2": "number",
  "behavior": "number",
  "modeControl": "number",
  "gpsTimeout": "number",
  "transmitTimeout": "number",
  "gpsStabilize": "number",
  "gpsCheckInterval": "number",
  "stopTimeout": "number",
  "tolerancePercentage": "number",
  "reasonsToWake": [
    "object"
  ],
  "modified": "string (date-time)",
  "forceFw": "boolean",
  "receivedAt": "string (date-time)",
  "reset": "number",
  "flashTryCount": "number",
  "homeWifiNetwork": "string",
  "homeWifiPassword": "string",
  "wakeAction": "string",
  "onDemandTime": "number",
  "alertAction": "string",
  "id": "number",
  "deviceId": "number",
  "safeZoneId": "number"
}

sensorReading:

timestamp: string (date-time)

Timestamp for the reading

created: string (date-time)

Timestamp for the writing to db

type: string

Sensor type: 'ultra' (fill level), 'temp' (temperature), ...

value: object

JSON value

meta: object

JSON metadata

id: number
gatewayId: number
deviceId: number
sensorDeviceId: string
datapointId: number
Example
{
  "timestamp": "string (date-time)",
  "created": "string (date-time)",
  "type": "string",
  "value": "object",
  "meta": "object",
  "id": "number",
  "gatewayId": "number",
  "deviceId": "number",
  "sensorDeviceId": "string",
  "datapointId": "number"
}

notificationTrigger:

name: string
type: string
parameters: object
muteFor: number
lastTriggered: string (date-time)
delivery: object [object Object]
id: number
deviceId: number
userId: number
Example
{
  "name": "string",
  "type": "string",
  "parameters": "object",
  "muteFor": "number",
  "lastTriggered": "string (date-time)",
  "delivery": "object",
  "id": "number",
  "deviceId": "number",
  "userId": "number"
}

device:

imei: string (up to 15 chars)
iccid: string
imsi: string
btMacAddress: string (up to 17 chars)
serial: string
type: string
lastConnection: string (date-time)
firstSeen: string (date-time)
mode: string default
name: string
batteryVoltage: number
batteryType: string LIO
tags: string[]
currentMode: number
color: string ce0027
saveToWeb: boolean
expires: string (date-time)
plan: string
active: boolean
deepSleep: boolean
simstate: string active
stripeSubscription: string
subscriptionType: string
meta: object
id: number
ownerId: number
securePhoneId: number
Example
{
  "imei": "string",
  "iccid": "string",
  "imsi": "string",
  "btMacAddress": "string",
  "serial": "string",
  "type": "string",
  "lastConnection": "string (date-time)",
  "firstSeen": "string (date-time)",
  "mode": "string",
  "name": "string",
  "batteryVoltage": "number",
  "batteryType": "string",
  "tags": [
    "string"
  ],
  "currentMode": "number",
  "color": "string",
  "saveToWeb": "boolean",
  "expires": "string (date-time)",
  "plan": "string",
  "active": "boolean",
  "deepSleep": "boolean",
  "simstate": "string",
  "stripeSubscription": "string",
  "subscriptionType": "string",
  "meta": "object",
  "id": "number",
  "ownerId": "number",
  "securePhoneId": "number"
}

geofence:

outline: object[]

Array of {lat:x,lng:y} objects representing the vertices of the polygon

type: string

'inside', 'outside' or 'cross'. For device safe-zone the value is ignored (always 'outside')

name: string
wasInside: boolean

If the last point received was inside the geofence. Only updated for notifications (not the safe-zone as that is evaluated on the device)

lastChecked: string (date-time)

When the geofence was last evaluated. Only updated for notifications (not the safe-zone as that is evaluated on the device)

modified: boolean
id: number
deviceId: number
configId: number
userId: number
Example
{
  "outline": [
    "object"
  ],
  "type": "string",
  "name": "string",
  "wasInside": "boolean",
  "lastChecked": "string (date-time)",
  "modified": "boolean",
  "id": "number",
  "deviceId": "number",
  "configId": "number",
  "userId": "number"
}

accessToken:

id: string
ttl: number 1209600

time to live in seconds (2 weeks by default)

created: string (date-time)
userId: number
Example
{
  "id": "string",
  "ttl": "number",
  "created": "string (date-time)",
  "userId": "number"
}

GeoPoint:

lat: number
lng: number
Example
{
  "lat": "number",
  "lng": "number"
}

credentials:

username: string
password: string
Example
{
  "username": "string",
  "password": "string"
}