Introduction
Welcome to the BBOXX SMARTSolar API.
The SMARTSolar API is an interface designed to allow users to remotely and automatically control a BBOXX unit and access its information.
This document aims to provide a complete listing of the actions that a user can take, the data available in the SMARTSolar API and the schema and architecture of the API.
The different sections of the Documentation are as follows:
- Schema - A detailed listing of the resources available and how to access them.
- Product Actions - A listing of the actions that a user can make for a specific product.
- Product Data - A listing of what telemetry data is recorded from each product and how to access it.
- Repair Actions - A listing of the actions that a user can make for a specific repair.
- RTC Dead Letter Actions - Endpoints that can be used to perform actions on RTC Dead Letter messages. .
- Custom Endpoints - A listing of other endpoints available to a user not specifically relating to an individual product.
- Notifications (Webhooks) - Information of how to receive data and updates from the SMARTSolar API
- DCM - Information about Device Credit Management
- Using the API - Information about the general use of the API including authentication, filtering and data formats.
Schema
This section describes the full schema of the SMARTSolar Database.
You can find listings of every table and the relationships between objects as well as information on how to query, create and modifiy information via the API.
Action Type
Contains details of the types of Action that a technician can take during a repair
The action_type object
| Field | Description |
|---|---|
| action_type_id int (primary key) |
A unique integer identifier for each action_type. |
| name string (not-null,unique) |
|
| description string |
|
| label string (not-null,unique) |
|
| created_at datetime |
timestamp that the record was created at |
| created_by text |
username of the user who created the record |
| modified_at datetime |
timestamp that the record was last modified |
| modified_by text |
user that last modified the record |
| Relationship | Description |
|---|---|
| action_type_product_type_linker | The associated action_type_product_type_linker |
| repair_action_type_linker | The associated repair_action_type_linker |
An example POST request. Note that
action_type_id,created_at,modified_atandcreated_byare all handled internally by the system and need not be explicitly specified. See Meta Data for more information.
url = "https://smartapi.bboxx.co.uk/v1/action_types"
data = json.dumps({
"name": "test",
"description": "test",
"label": "test",
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.post(url=url, data=data, headers=headers)
r
>>> <Response 201>
r.json()
>>> {
"action_type_id": 1
"name": "test",
"description": "test",
"label": "test",
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve the
action_typecreated by specifying itsaction_type_idin the request url:
url = 'https://smartapi.bboxx.co.uk/v1/action_types/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"action_type_id": 1
"name": "test",
"description": "test",
"label": "test",
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve all
action_typesby omitting theaction_type_id:
url = 'https://smartapi.bboxx.co.uk/v1/action_types'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
u'total_pages': 1,
u'objects': [
{<record>},
{<record>},
{<record>},
{<record>},
{<record>},
],
u'num_results': 10,
u'page': 1
}
We can edit the newly created
action_typewith aPUTrequest:
url = 'https://smartapi.bboxx.co.uk/v1/action_types/1'
data = json.dumps({
"name": "changed",
"description": "changed",
"label": "changed",
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.put(url=url, data=data, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"action_type_id": 1
"name": "changed",
"description": "changed",
"label": "changed",
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": 2016-07-07 12:34:45
}
Note that the
modified_atfield has been updated accordingly.If a user has
SYSTEMpermissions they can delete theaction_type
url = 'https://smartapi.bboxx.co.uk/v1/action_types/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.delete(url=url, headers=headers)
r
>>> <Response 204>
r.text
>>>
Note that the response from a 204 request is empty. This means that
r.json()cannot be called and will throw a JSONDecodeError. In fact the response isu''- an empty unicode string.
POST
| value | |
|---|---|
| endpoint | /v1/action_types |
| method | POST |
| url_params | N/A |
| query params | N/A |
| body | JSON-formatted dictionary with the details of the action_type that you wish to create |
| permissions | SYSTEM |
| response | 201 |
GET
| value | |
|---|---|
| endpoint | /v1/action_types or /v1/action_types/<action_type_id> |
| method | GET |
| url_params | action_type_id (int) |
| query params | > See Query Format and Filtering |
| body | N/A |
| permissions | OVERVIEW |
| response | 200 |
PUT
| value | |
|---|---|
| endpoint | /v1/action_types/<action_type_id> |
| method | PUT |
| url_params | action_type_id of the action_type you wish to edit |
| query params | N/A |
| body | JSON-formatted dictionary of the columns that you wish to alter |
| permissions | SYSTEM |
| response | 200 |
DELETE
| value | |
|---|---|
| endpoint | /v1/action_types/<action_type_id> |
| method | DELETE |
| url_params | action_type_id (int) |
| query params | N/A |
| body | N/A |
| permissions | SYSTEM |
| response | 204 |
Action Type Product Type Linker
Specifies which action-types can be taken on each product-type during a repair.
The action_type_product_type_linker object
| Field | Description |
|---|---|
| action_type_product_type_linker_id int (primary key) |
A unique integer identifier for each action_type_product_type_linker. |
| product_type_id int (not-null,foreign-key) |
|
| action_type_id int (not-null,foreign-key) |
|
| created_at datetime |
timestamp that the record was created at |
| created_by text |
username of the user who created the record |
| modified_at datetime |
timestamp that the record was last modified |
| modified_by text |
user that last modified the record |
| Relationship | Description |
|---|---|
| N/A | There are no relationships for this table. |
An example POST request. Note that
action_type_product_type_linker_id,created_at,modified_atandcreated_byare all handled internally by the system and need not be explicitly specified. See Meta Data for more information.
url = "https://smartapi.bboxx.co.uk/v1/action_type_product_type_linker"
data = json.dumps({
"product_type_id": 1,
"action_type_id": 1,
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.post(url=url, data=data, headers=headers)
r
>>> <Response 201>
r.json()
>>> {
"action_type_product_type_linker_id": 1
"product_type_id": 1,
"action_type_id": 1,
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve the
action_type_product_type_linkercreated by specifying itsaction_type_product_type_linker_idin the request url:
url = 'https://smartapi.bboxx.co.uk/v1/action_type_product_type_linker/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"action_type_product_type_linker_id": 1
"product_type_id": 1,
"action_type_id": 1,
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve all
action_type_product_type_linkerby omitting theaction_type_product_type_linker_id:
url = 'https://smartapi.bboxx.co.uk/v1/action_type_product_type_linker'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
u'total_pages': 1,
u'objects': [
{<record>},
{<record>},
{<record>},
{<record>},
{<record>},
],
u'num_results': 10,
u'page': 1
}
We can edit the newly created
action_type_product_type_linkerwith aPUTrequest:
url = 'https://smartapi.bboxx.co.uk/v1/action_type_product_type_linker/1'
data = json.dumps({
"product_type_id": 2,
"action_type_id": 2,
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.put(url=url, data=data, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"action_type_product_type_linker_id": 1
"product_type_id": 2,
"action_type_id": 2,
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": 2016-07-07 12:34:45
}
Note that the
modified_atfield has been updated accordingly.If a user has
SYSTEMpermissions they can delete theaction_type_product_type_linker
url = 'https://smartapi.bboxx.co.uk/v1/action_type_product_type_linker/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.delete(url=url, headers=headers)
r
>>> <Response 204>
r.text
>>>
Note that the response from a 204 request is empty. This means that
r.json()cannot be called and will throw a JSONDecodeError. In fact the response isu''- an empty unicode string.
POST
| value | |
|---|---|
| endpoint | /v1/action_type_product_type_linker |
| method | POST |
| url_params | N/A |
| query params | N/A |
| body | JSON-formatted dictionary with the details of the action_type_product_type_linker that you wish to create |
| permissions | SYSTEM |
| response | 201 |
GET
| value | |
|---|---|
| endpoint | /v1/action_type_product_type_linker or /v1/action_type_product_type_linker/<action_type_product_type_linker_id> |
| method | GET |
| url_params | action_type_product_type_linker_id (int) |
| query params | > See Query Format and Filtering |
| body | N/A |
| permissions | OVERVIEW |
| response | 200 |
PUT
| value | |
|---|---|
| endpoint | /v1/action_type_product_type_linker/<action_type_product_type_linker_id> |
| method | PUT |
| url_params | action_type_product_type_linker_id of the action_type_product_type_linker you wish to edit |
| query params | N/A |
| body | JSON-formatted dictionary of the columns that you wish to alter |
| permissions | SYSTEM |
| response | 200 |
DELETE
| value | |
|---|---|
| endpoint | /v1/action_type_product_type_linker/<action_type_product_type_linker_id> |
| method | DELETE |
| url_params | action_type_product_type_linker_id (int) |
| query params | N/A |
| body | N/A |
| permissions | SYSTEM |
| response | 204 |
Alert
Contains all of the alerts that exist for each product.
The alert object
| Field | Description |
|---|---|
| alert_id int (primary key) |
A unique integer identifier for each alert. |
| product_imei varchar(15) (not-null,foreign-key) |
|
| alert_type_id int (not-null,foreign-key) |
|
| start_time datetime |
|
| dismissed_at datetime |
|
| dismissed_by string |
|
| dismissal_reason string |
|
| repair_id int (foreign-key) |
|
| extra_info string |
|
| customer_contact_date datetime |
|
| customer_contact_type string |
options: ["visit", "sms", "phone"] |
| created_at datetime |
timestamp that the record was created at |
| created_by text |
username of the user who created the record |
| modified_at datetime |
timestamp that the record was last modified |
| modified_by text |
user that last modified the record |
| Relationship | Description |
|---|---|
| N/A | There are no relationships for this table. |
An example POST request. Note that
alert_id,created_at,modified_atandcreated_byare all handled internally by the system and need not be explicitly specified. See Meta Data for more information.
url = "https://smartapi.bboxx.co.uk/v1/alerts"
data = json.dumps({
"product_imei": "000000000000000",
"alert_type_id": 1,
"start_time": "2000-01-01 00:00:00",
"dismissed_at": "2000-01-01 00:00:00",
"dismissed_by": "test",
"dismissal_reason": "test",
"repair_id": 1,
"extra_info": "test",
"customer_contact_date": "2000-01-01 00:00:00",
"customer_contact_type": "test",
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.post(url=url, data=data, headers=headers)
r
>>> <Response 201>
r.json()
>>> {
"alert_id": 1
"product_imei": "000000000000000",
"alert_type_id": 1,
"start_time": "2000-01-01 00:00:00",
"dismissed_at": "2000-01-01 00:00:00",
"dismissed_by": "test",
"dismissal_reason": "test",
"repair_id": 1,
"extra_info": "test",
"customer_contact_date": "2000-01-01 00:00:00",
"customer_contact_type": "test",
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve the
alertcreated by specifying itsalert_idin the request url:
url = 'https://smartapi.bboxx.co.uk/v1/alerts/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"alert_id": 1
"product_imei": "000000000000000",
"alert_type_id": 1,
"start_time": "2000-01-01 00:00:00",
"dismissed_at": "2000-01-01 00:00:00",
"dismissed_by": "test",
"dismissal_reason": "test",
"repair_id": 1,
"extra_info": "test",
"customer_contact_date": "2000-01-01 00:00:00",
"customer_contact_type": "test",
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve all
alertsby omitting thealert_id:
url = 'https://smartapi.bboxx.co.uk/v1/alerts'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
u'total_pages': 1,
u'objects': [
{<record>},
{<record>},
{<record>},
{<record>},
{<record>},
],
u'num_results': 10,
u'page': 1
}
We can edit the newly created
alertwith aPUTrequest:
url = 'https://smartapi.bboxx.co.uk/v1/alerts/1'
data = json.dumps({
"product_imei": "999999999999999",
"alert_type_id": 2,
"start_time": "2016-07-01 12:34:45",
"dismissed_at": "2016-07-01 12:34:45",
"dismissed_by": "changed",
"dismissal_reason": "changed",
"repair_id": 2,
"extra_info": "changed",
"customer_contact_date": "2016-07-01 12:34:45",
"customer_contact_type": "changed",
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.put(url=url, data=data, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"alert_id": 1
"product_imei": "999999999999999",
"alert_type_id": 2,
"start_time": "2016-07-01 12:34:45",
"dismissed_at": "2016-07-01 12:34:45",
"dismissed_by": "changed",
"dismissal_reason": "changed",
"repair_id": 2,
"extra_info": "changed",
"customer_contact_date": "2016-07-01 12:34:45",
"customer_contact_type": "changed",
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": 2016-07-07 12:34:45
}
Note that the
modified_atfield has been updated accordingly.If a user has
SYSTEMpermissions they can delete thealert
url = 'https://smartapi.bboxx.co.uk/v1/alerts/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.delete(url=url, headers=headers)
r
>>> <Response 204>
r.text
>>>
Note that the response from a 204 request is empty. This means that
r.json()cannot be called and will throw a JSONDecodeError. In fact the response isu''- an empty unicode string.
POST
| value | |
|---|---|
| endpoint | /v1/alerts |
| method | POST |
| url_params | N/A |
| query params | N/A |
| body | JSON-formatted dictionary with the details of the alert that you wish to create |
| permissions | SYSTEM |
| response | 201 |
GET
| value | |
|---|---|
| endpoint | /v1/alerts or /v1/alerts/<alert_id> |
| method | GET |
| url_params | alert_id (int) |
| query params | > See Query Format and Filtering |
| body | N/A |
| permissions | OVERVIEW |
| response | 200 |
PUT
| value | |
|---|---|
| endpoint | /v1/alerts/<alert_id> |
| method | PUT |
| url_params | alert_id of the alert you wish to edit |
| query params | N/A |
| body | JSON-formatted dictionary of the columns that you wish to alter |
| permissions | SYSTEM |
| response | 200 |
DELETE
| value | |
|---|---|
| endpoint | /v1/alerts/<alert_id> |
| method | DELETE |
| url_params | alert_id (int) |
| query params | N/A |
| body | N/A |
| permissions | SYSTEM |
| response | 204 |
Alert Type
Contains details of the different alert-types that can be raised.
The alert_type object
| Field | Description |
|---|---|
| alert_type_id int (primary key) |
A unique integer identifier for each alert_type. |
| name string (not-null) |
|
| version int (not-null) |
|
| category string |
|
| purpose string |
|
| message string |
|
| status string (not-null) |
|
| severity string |
|
| analysis_frequency datetime (not-null) |
|
| cooling_off_period datetime |
|
| active boolean (not-null) |
|
| label string (not-null,unique) |
|
| created_at datetime |
timestamp that the record was created at |
| created_by text |
username of the user who created the record |
| modified_at datetime |
timestamp that the record was last modified |
| modified_by text |
user that last modified the record |
| Relationship | Description |
|---|---|
| alerts | The associated alerts |
| alert_type_entity_anti_linker | The associated alert_type_entity_anti_linker |
| alert_type_product_type_linker | The associated alert_type_product_type_linker |
| analysis_histories | The associated analysis_histories |
| alert_type_state_type_linker | The associated alert_type_state_type_linker |
An example POST request. Note that
alert_type_id,created_at,modified_atandcreated_byare all handled internally by the system and need not be explicitly specified. See Meta Data for more information.
url = "https://smartapi.bboxx.co.uk/v1/alert_types"
data = json.dumps({
"name": "test",
"version": 1,
"category": "test",
"purpose": "test",
"message": "test",
"status": "test",
"severity": "test",
"analysis_frequency": "2000-01-01 00:00:00",
"cooling_off_period": "2000-01-01 00:00:00",
"active": True,
"label": "test",
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.post(url=url, data=data, headers=headers)
r
>>> <Response 201>
r.json()
>>> {
"alert_type_id": 1
"name": "test",
"version": 1,
"category": "test",
"purpose": "test",
"message": "test",
"status": "test",
"severity": "test",
"analysis_frequency": "2000-01-01 00:00:00",
"cooling_off_period": "2000-01-01 00:00:00",
"active": True,
"label": "test",
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve the
alert_typecreated by specifying itsalert_type_idin the request url:
url = 'https://smartapi.bboxx.co.uk/v1/alert_types/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"alert_type_id": 1
"name": "test",
"version": 1,
"category": "test",
"purpose": "test",
"message": "test",
"status": "test",
"severity": "test",
"analysis_frequency": "2000-01-01 00:00:00",
"cooling_off_period": "2000-01-01 00:00:00",
"active": True,
"label": "test",
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve all
alert_typesby omitting thealert_type_id:
url = 'https://smartapi.bboxx.co.uk/v1/alert_types'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
u'total_pages': 1,
u'objects': [
{<record>},
{<record>},
{<record>},
{<record>},
{<record>},
],
u'num_results': 10,
u'page': 1
}
We can edit the newly created
alert_typewith aPUTrequest:
url = 'https://smartapi.bboxx.co.uk/v1/alert_types/1'
data = json.dumps({
"name": "changed",
"version": 2,
"category": "changed",
"purpose": "changed",
"message": "changed",
"status": "changed",
"severity": "changed",
"analysis_frequency": "2016-07-01 12:34:45",
"cooling_off_period": "2016-07-01 12:34:45",
"active": False,
"label": "changed",
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.put(url=url, data=data, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"alert_type_id": 1
"name": "changed",
"version": 2,
"category": "changed",
"purpose": "changed",
"message": "changed",
"status": "changed",
"severity": "changed",
"analysis_frequency": "2016-07-01 12:34:45",
"cooling_off_period": "2016-07-01 12:34:45",
"active": False,
"label": "changed",
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": 2016-07-07 12:34:45
}
Note that the
modified_atfield has been updated accordingly.If a user has
SYSTEMpermissions they can delete thealert_type
url = 'https://smartapi.bboxx.co.uk/v1/alert_types/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.delete(url=url, headers=headers)
r
>>> <Response 204>
r.text
>>>
Note that the response from a 204 request is empty. This means that
r.json()cannot be called and will throw a JSONDecodeError. In fact the response isu''- an empty unicode string.
POST
| value | |
|---|---|
| endpoint | /v1/alert_types |
| method | POST |
| url_params | N/A |
| query params | N/A |
| body | JSON-formatted dictionary with the details of the alert_type that you wish to create |
| permissions | SYSTEM |
| response | 201 |
GET
| value | |
|---|---|
| endpoint | /v1/alert_types or /v1/alert_types/<alert_type_id> |
| method | GET |
| url_params | alert_type_id (int) |
| query params | > See Query Format and Filtering |
| body | N/A |
| permissions | OVERVIEW |
| response | 200 |
PUT
| value | |
|---|---|
| endpoint | /v1/alert_types/<alert_type_id> |
| method | PUT |
| url_params | alert_type_id of the alert_type you wish to edit |
| query params | N/A |
| body | JSON-formatted dictionary of the columns that you wish to alter |
| permissions | SYSTEM |
| response | 200 |
DELETE
| value | |
|---|---|
| endpoint | /v1/alert_types/<alert_type_id> |
| method | DELETE |
| url_params | alert_type_id (int) |
| query params | N/A |
| body | N/A |
| permissions | SYSTEM |
| response | 204 |
Alert Type Entity Anti Linker
Specifies which alert-types can be raised on each entity
The alert_type_entity_anti_linker object
| Field | Description |
|---|---|
| alert_type_entity_anti_linker_id int (primary key) |
A unique integer identifier for each alert_type_entity_anti_linker. |
| alert_type_id int (not-null,foreign-key) |
|
| entity_id int (not-null,foreign-key) |
|
| created_at datetime |
timestamp that the record was created at |
| created_by text |
username of the user who created the record |
| modified_at datetime |
timestamp that the record was last modified |
| modified_by text |
user that last modified the record |
| Relationship | Description |
|---|---|
| N/A | There are no relationships for this table. |
An example POST request. Note that
alert_type_entity_anti_linker_id,created_at,modified_atandcreated_byare all handled internally by the system and need not be explicitly specified. See Meta Data for more information.
url = "https://smartapi.bboxx.co.uk/v1/alert_type_entity_anti_linker"
data = json.dumps({
"alert_type_id": 1,
"entity_id": 1,
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.post(url=url, data=data, headers=headers)
r
>>> <Response 201>
r.json()
>>> {
"alert_type_entity_anti_linker_id": 1
"alert_type_id": 1,
"entity_id": 1,
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve the
alert_type_entity_anti_linkercreated by specifying itsalert_type_entity_anti_linker_idin the request url:
url = 'https://smartapi.bboxx.co.uk/v1/alert_type_entity_anti_linker/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"alert_type_entity_anti_linker_id": 1
"alert_type_id": 1,
"entity_id": 1,
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve all
alert_type_entity_anti_linkerby omitting thealert_type_entity_anti_linker_id:
url = 'https://smartapi.bboxx.co.uk/v1/alert_type_entity_anti_linker'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
u'total_pages': 1,
u'objects': [
{<record>},
{<record>},
{<record>},
{<record>},
{<record>},
],
u'num_results': 10,
u'page': 1
}
We can edit the newly created
alert_type_entity_anti_linkerwith aPUTrequest:
url = 'https://smartapi.bboxx.co.uk/v1/alert_type_entity_anti_linker/1'
data = json.dumps({
"alert_type_id": 2,
"entity_id": 2,
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.put(url=url, data=data, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"alert_type_entity_anti_linker_id": 1
"alert_type_id": 2,
"entity_id": 2,
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": 2016-07-07 12:34:45
}
Note that the
modified_atfield has been updated accordingly.If a user has
SYSTEMpermissions they can delete thealert_type_entity_anti_linker
url = 'https://smartapi.bboxx.co.uk/v1/alert_type_entity_anti_linker/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.delete(url=url, headers=headers)
r
>>> <Response 204>
r.text
>>>
Note that the response from a 204 request is empty. This means that
r.json()cannot be called and will throw a JSONDecodeError. In fact the response isu''- an empty unicode string.
POST
| value | |
|---|---|
| endpoint | /v1/alert_type_entity_anti_linker |
| method | POST |
| url_params | N/A |
| query params | N/A |
| body | JSON-formatted dictionary with the details of the alert_type_entity_anti_linker that you wish to create |
| permissions | SYSTEM |
| response | 201 |
GET
| value | |
|---|---|
| endpoint | /v1/alert_type_entity_anti_linker or /v1/alert_type_entity_anti_linker/<alert_type_entity_anti_linker_id> |
| method | GET |
| url_params | alert_type_entity_anti_linker_id (int) |
| query params | > See Query Format and Filtering |
| body | N/A |
| permissions | OVERVIEW |
| response | 200 |
PUT
| value | |
|---|---|
| endpoint | /v1/alert_type_entity_anti_linker/<alert_type_entity_anti_linker_id> |
| method | PUT |
| url_params | alert_type_entity_anti_linker_id of the alert_type_entity_anti_linker you wish to edit |
| query params | N/A |
| body | JSON-formatted dictionary of the columns that you wish to alter |
| permissions | SYSTEM |
| response | 200 |
DELETE
| value | |
|---|---|
| endpoint | /v1/alert_type_entity_anti_linker/<alert_type_entity_anti_linker_id> |
| method | DELETE |
| url_params | alert_type_entity_anti_linker_id (int) |
| query params | N/A |
| body | N/A |
| permissions | SYSTEM |
| response | 204 |
Alert Type Product Type Linker
Specifies which alert-types can be raised on each product-types
The alert_type_product_type_linker object
| Field | Description |
|---|---|
| alert_type_product_type_linker_id int (primary key) |
A unique integer identifier for each alert_type_product_type_linker. |
| alert_type_id int (not-null,foreign-key) |
|
| product_type_id int (not-null,foreign-key) |
|
| created_at datetime |
timestamp that the record was created at |
| created_by text |
username of the user who created the record |
| modified_at datetime |
timestamp that the record was last modified |
| modified_by text |
user that last modified the record |
| Relationship | Description |
|---|---|
| N/A | There are no relationships for this table. |
An example POST request. Note that
alert_type_product_type_linker_id,created_at,modified_atandcreated_byare all handled internally by the system and need not be explicitly specified. See Meta Data for more information.
url = "https://smartapi.bboxx.co.uk/v1/alert_type_product_type_linker"
data = json.dumps({
"alert_type_id": 1,
"product_type_id": 1,
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.post(url=url, data=data, headers=headers)
r
>>> <Response 201>
r.json()
>>> {
"alert_type_product_type_linker_id": 1
"alert_type_id": 1,
"product_type_id": 1,
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve the
alert_type_product_type_linkercreated by specifying itsalert_type_product_type_linker_idin the request url:
url = 'https://smartapi.bboxx.co.uk/v1/alert_type_product_type_linker/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"alert_type_product_type_linker_id": 1
"alert_type_id": 1,
"product_type_id": 1,
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve all
alert_type_product_type_linkerby omitting thealert_type_product_type_linker_id:
url = 'https://smartapi.bboxx.co.uk/v1/alert_type_product_type_linker'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
u'total_pages': 1,
u'objects': [
{<record>},
{<record>},
{<record>},
{<record>},
{<record>},
],
u'num_results': 10,
u'page': 1
}
We can edit the newly created
alert_type_product_type_linkerwith aPUTrequest:
url = 'https://smartapi.bboxx.co.uk/v1/alert_type_product_type_linker/1'
data = json.dumps({
"alert_type_id": 2,
"product_type_id": 2,
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.put(url=url, data=data, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"alert_type_product_type_linker_id": 1
"alert_type_id": 2,
"product_type_id": 2,
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": 2016-07-07 12:34:45
}
Note that the
modified_atfield has been updated accordingly.If a user has
SYSTEMpermissions they can delete thealert_type_product_type_linker
url = 'https://smartapi.bboxx.co.uk/v1/alert_type_product_type_linker/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.delete(url=url, headers=headers)
r
>>> <Response 204>
r.text
>>>
Note that the response from a 204 request is empty. This means that
r.json()cannot be called and will throw a JSONDecodeError. In fact the response isu''- an empty unicode string.
POST
| value | |
|---|---|
| endpoint | /v1/alert_type_product_type_linker |
| method | POST |
| url_params | N/A |
| query params | N/A |
| body | JSON-formatted dictionary with the details of the alert_type_product_type_linker that you wish to create |
| permissions | SYSTEM |
| response | 201 |
GET
| value | |
|---|---|
| endpoint | /v1/alert_type_product_type_linker or /v1/alert_type_product_type_linker/<alert_type_product_type_linker_id> |
| method | GET |
| url_params | alert_type_product_type_linker_id (int) |
| query params | > See Query Format and Filtering |
| body | N/A |
| permissions | OVERVIEW |
| response | 200 |
PUT
| value | |
|---|---|
| endpoint | /v1/alert_type_product_type_linker/<alert_type_product_type_linker_id> |
| method | PUT |
| url_params | alert_type_product_type_linker_id of the alert_type_product_type_linker you wish to edit |
| query params | N/A |
| body | JSON-formatted dictionary of the columns that you wish to alter |
| permissions | SYSTEM |
| response | 200 |
DELETE
| value | |
|---|---|
| endpoint | /v1/alert_type_product_type_linker/<alert_type_product_type_linker_id> |
| method | DELETE |
| url_params | alert_type_product_type_linker_id (int) |
| query params | N/A |
| body | N/A |
| permissions | SYSTEM |
| response | 204 |
Alert Type State Type Linker
Specifies which alert-types can be raised on each state-types
The alert_type_state_type_linker object
| Field | Description |
|---|---|
| alert_type_state_type_linker_id int (primary key) |
A unique integer identifier for each alert_type_state_type_linker. |
| alert_type_id int (not-null,foreign-key) |
|
| state_type_id int (not-null,foreign-key) |
|
| created_at datetime |
timestamp that the record was created at |
| created_by text |
username of the user who created the record |
| modified_at datetime |
timestamp that the record was last modified |
| modified_by text |
user that last modified the record |
| Relationship | Description |
|---|---|
| N/A | There are no relationships for this table. |
An example POST request. Note that
alert_type_state_type_linker_id,created_at,modified_atandcreated_byare all handled internally by the system and need not be explicitly specified. See Meta Data for more information.
url = "https://smartapi.bboxx.co.uk/v1/alert_type_state_type_linker"
data = json.dumps({
"alert_type_id": 1,
"state_type_id": 1,
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.post(url=url, data=data, headers=headers)
r
>>> <Response 201>
r.json()
>>> {
"alert_type_state_type_linker_id": 1
"alert_type_id": 1,
"state_type_id": 1,
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve the
alert_type_state_type_linkercreated by specifying itsalert_type_state_type_linker_idin the request url:
url = 'https://smartapi.bboxx.co.uk/v1/alert_type_state_type_linker/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"alert_type_state_type_linker_id": 1
"alert_type_id": 1,
"state_type_id": 1,
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve all
alert_type_state_type_linkerby omitting thealert_type_state_type_linker_id:
url = 'https://smartapi.bboxx.co.uk/v1/alert_type_state_type_linker'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
u'total_pages': 1,
u'objects': [
{<record>},
{<record>},
{<record>},
{<record>},
{<record>},
],
u'num_results': 10,
u'page': 1
}
We can edit the newly created
alert_type_state_type_linkerwith aPUTrequest:
url = 'https://smartapi.bboxx.co.uk/v1/alert_type_state_type_linker/1'
data = json.dumps({
"alert_type_id": 2,
"state_type_id": 2,
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.put(url=url, data=data, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"alert_type_state_type_linker_id": 1
"alert_type_id": 2,
"state_type_id": 2,
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": 2016-07-07 12:34:45
}
Note that the
modified_atfield has been updated accordingly.If a user has
SYSTEMpermissions they can delete thealert_type_state_type_linker
url = 'https://smartapi.bboxx.co.uk/v1/alert_type_state_type_linker/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.delete(url=url, headers=headers)
r
>>> <Response 204>
r.text
>>>
Note that the response from a 204 request is empty. This means that
r.json()cannot be called and will throw a JSONDecodeError. In fact the response isu''- an empty unicode string.
POST
| value | |
|---|---|
| endpoint | /v1/alert_type_state_type_linker |
| method | POST |
| url_params | N/A |
| query params | N/A |
| body | JSON-formatted dictionary with the details of the alert_type_state_type_linker that you wish to create |
| permissions | SYSTEM |
| response | 201 |
GET
| value | |
|---|---|
| endpoint | /v1/alert_type_state_type_linker or /v1/alert_type_state_type_linker/<alert_type_state_type_linker_id> |
| method | GET |
| url_params | alert_type_state_type_linker_id (int) |
| query params | > See Query Format and Filtering |
| body | N/A |
| permissions | OVERVIEW |
| response | 200 |
PUT
| value | |
|---|---|
| endpoint | /v1/alert_type_state_type_linker/<alert_type_state_type_linker_id> |
| method | PUT |
| url_params | alert_type_state_type_linker_id of the alert_type_state_type_linker you wish to edit |
| query params | N/A |
| body | JSON-formatted dictionary of the columns that you wish to alter |
| permissions | SYSTEM |
| response | 200 |
DELETE
| value | |
|---|---|
| endpoint | /v1/alert_type_state_type_linker/<alert_type_state_type_linker_id> |
| method | DELETE |
| url_params | alert_type_state_type_linker_id (int) |
| query params | N/A |
| body | N/A |
| permissions | SYSTEM |
| response | 204 |
Analysis History
Records which analyses have been run on which units and at what time.
The analysis_history object
| Field | Description |
|---|---|
| analysis_history_id int (primary key) |
A unique integer identifier for each analysis_history. |
| product_imei varchar(15) (not-null,foreign-key) |
|
| alert_type_id int (not-null,foreign-key) |
|
| timestamp datetime (not-null) |
|
| status string (not-null) |
options: ["success", "failure"] |
| created_at datetime |
timestamp that the record was created at |
| created_by text |
username of the user who created the record |
| modified_at datetime |
timestamp that the record was last modified |
| modified_by text |
user that last modified the record |
| Relationship | Description |
|---|---|
| N/A | There are no relationships for this table. |
An example POST request. Note that
analysis_history_id,created_at,modified_atandcreated_byare all handled internally by the system and need not be explicitly specified. See Meta Data for more information.
url = "https://smartapi.bboxx.co.uk/v1/analysis_history"
data = json.dumps({
"product_imei": "000000000000000",
"alert_type_id": 1,
"timestamp": "2000-01-01 00:00:00",
"status": "test",
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.post(url=url, data=data, headers=headers)
r
>>> <Response 201>
r.json()
>>> {
"analysis_history_id": 1
"product_imei": "000000000000000",
"alert_type_id": 1,
"timestamp": "2000-01-01 00:00:00",
"status": "test",
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve the
analysis_historycreated by specifying itsanalysis_history_idin the request url:
url = 'https://smartapi.bboxx.co.uk/v1/analysis_history/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"analysis_history_id": 1
"product_imei": "000000000000000",
"alert_type_id": 1,
"timestamp": "2000-01-01 00:00:00",
"status": "test",
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve all
analysis_historyby omitting theanalysis_history_id:
url = 'https://smartapi.bboxx.co.uk/v1/analysis_history'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
u'total_pages': 1,
u'objects': [
{<record>},
{<record>},
{<record>},
{<record>},
{<record>},
],
u'num_results': 10,
u'page': 1
}
We can edit the newly created
analysis_historywith aPUTrequest:
url = 'https://smartapi.bboxx.co.uk/v1/analysis_history/1'
data = json.dumps({
"product_imei": "999999999999999",
"alert_type_id": 2,
"timestamp": "2016-07-01 12:34:45",
"status": "changed",
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.put(url=url, data=data, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"analysis_history_id": 1
"product_imei": "999999999999999",
"alert_type_id": 2,
"timestamp": "2016-07-01 12:34:45",
"status": "changed",
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": 2016-07-07 12:34:45
}
Note that the
modified_atfield has been updated accordingly.If a user has
SYSTEMpermissions they can delete theanalysis_history
url = 'https://smartapi.bboxx.co.uk/v1/analysis_history/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.delete(url=url, headers=headers)
r
>>> <Response 204>
r.text
>>>
Note that the response from a 204 request is empty. This means that
r.json()cannot be called and will throw a JSONDecodeError. In fact the response isu''- an empty unicode string.
POST
| value | |
|---|---|
| endpoint | /v1/analysis_history |
| method | POST |
| url_params | N/A |
| query params | N/A |
| body | JSON-formatted dictionary with the details of the analysis_history that you wish to create |
| permissions | SYSTEM |
| response | 201 |
GET
| value | |
|---|---|
| endpoint | /v1/analysis_history or /v1/analysis_history/<analysis_history_id> |
| method | GET |
| url_params | analysis_history_id (int) |
| query params | > See Query Format and Filtering |
| body | N/A |
| permissions | OVERVIEW |
| response | 200 |
PUT
| value | |
|---|---|
| endpoint | /v1/analysis_history/<analysis_history_id> |
| method | PUT |
| url_params | analysis_history_id of the analysis_history you wish to edit |
| query params | N/A |
| body | JSON-formatted dictionary of the columns that you wish to alter |
| permissions | SYSTEM |
| response | 200 |
DELETE
| value | |
|---|---|
| endpoint | /v1/analysis_history/<analysis_history_id> |
| method | DELETE |
| url_params | analysis_history_id (int) |
| query params | N/A |
| body | N/A |
| permissions | SYSTEM |
| response | 204 |
Appliance Action Type Appliance Type Linker
Determines which appliance-actions can be performed on which appliance-types
The appliance_action_type_appliance_type_linker object
| Field | Description |
|---|---|
| appliance_action_type_appliance_type_linker_id int (primary key) |
A unique integer identifier for each appliance_action_type_appliance_type_linker. |
| appliance_type_id int (not-null,foreign-key) |
|
| appliance_action_type_id int (not-null,foreign-key) |
|
| created_at datetime |
timestamp that the record was created at |
| created_by text |
username of the user who created the record |
| modified_at datetime |
timestamp that the record was last modified |
| modified_by text |
user that last modified the record |
| Relationship | Description |
|---|---|
| N/A | There are no relationships for this table. |
An example POST request. Note that
appliance_action_type_appliance_type_linker_id,created_at,modified_atandcreated_byare all handled internally by the system and need not be explicitly specified. See Meta Data for more information.
url = "https://smartapi.bboxx.co.uk/v1/appliance_action_type_appliance_type_linker"
data = json.dumps({
"appliance_type_id": 1,
"appliance_action_type_id": 1,
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.post(url=url, data=data, headers=headers)
r
>>> <Response 201>
r.json()
>>> {
"appliance_action_type_appliance_type_linker_id": 1
"appliance_type_id": 1,
"appliance_action_type_id": 1,
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve the
appliance_action_type_appliance_type_linkercreated by specifying itsappliance_action_type_appliance_type_linker_idin the request url:
url = 'https://smartapi.bboxx.co.uk/v1/appliance_action_type_appliance_type_linker/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"appliance_action_type_appliance_type_linker_id": 1
"appliance_type_id": 1,
"appliance_action_type_id": 1,
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve all
appliance_action_type_appliance_type_linkerby omitting theappliance_action_type_appliance_type_linker_id:
url = 'https://smartapi.bboxx.co.uk/v1/appliance_action_type_appliance_type_linker'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
u'total_pages': 1,
u'objects': [
{<record>},
{<record>},
{<record>},
{<record>},
{<record>},
],
u'num_results': 10,
u'page': 1
}
We can edit the newly created
appliance_action_type_appliance_type_linkerwith aPUTrequest:
url = 'https://smartapi.bboxx.co.uk/v1/appliance_action_type_appliance_type_linker/1'
data = json.dumps({
"appliance_type_id": 2,
"appliance_action_type_id": 2,
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.put(url=url, data=data, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"appliance_action_type_appliance_type_linker_id": 1
"appliance_type_id": 2,
"appliance_action_type_id": 2,
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": 2016-07-07 12:34:45
}
Note that the
modified_atfield has been updated accordingly.If a user has
SYSTEMpermissions they can delete theappliance_action_type_appliance_type_linker
url = 'https://smartapi.bboxx.co.uk/v1/appliance_action_type_appliance_type_linker/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.delete(url=url, headers=headers)
r
>>> <Response 204>
r.text
>>>
Note that the response from a 204 request is empty. This means that
r.json()cannot be called and will throw a JSONDecodeError. In fact the response isu''- an empty unicode string.
POST
| value | |
|---|---|
| endpoint | /v1/appliance_action_type_appliance_type_linker |
| method | POST |
| url_params | N/A |
| query params | N/A |
| body | JSON-formatted dictionary with the details of the appliance_action_type_appliance_type_linker that you wish to create |
| permissions | SYSTEM |
| response | 201 |
GET
| value | |
|---|---|
| endpoint | /v1/appliance_action_type_appliance_type_linker or /v1/appliance_action_type_appliance_type_linker/<appliance_action_type_appliance_type_linker_id> |
| method | GET |
| url_params | appliance_action_type_appliance_type_linker_id (int) |
| query params | > See Query Format and Filtering |
| body | N/A |
| permissions | OVERVIEW |
| response | 200 |
PUT
| value | |
|---|---|
| endpoint | /v1/appliance_action_type_appliance_type_linker/<appliance_action_type_appliance_type_linker_id> |
| method | PUT |
| url_params | appliance_action_type_appliance_type_linker_id of the appliance_action_type_appliance_type_linker you wish to edit |
| query params | N/A |
| body | JSON-formatted dictionary of the columns that you wish to alter |
| permissions | SYSTEM |
| response | 200 |
DELETE
| value | |
|---|---|
| endpoint | /v1/appliance_action_type_appliance_type_linker/<appliance_action_type_appliance_type_linker_id> |
| method | DELETE |
| url_params | appliance_action_type_appliance_type_linker_id (int) |
| query params | N/A |
| body | N/A |
| permissions | SYSTEM |
| response | 204 |
Appliance Action Type
Listing possible actions that could be taken during an appliance repair.
The appliance_action_type object
| Field | Description |
|---|---|
| appliance_action_type_id int (primary key) |
A unique integer identifier for each appliance_action_type. |
| name string (not-null,unique) |
|
| description string |
|
| created_at datetime |
timestamp that the record was created at |
| created_by text |
username of the user who created the record |
| modified_at datetime |
timestamp that the record was last modified |
| modified_by text |
user that last modified the record |
| Relationship | Description |
|---|---|
| appliance_action_type_appliance_type_linker | The associated appliance_action_type_appliance_type_linker |
| repair_action_type_linker | The associated repair_action_type_linker |
An example POST request. Note that
appliance_action_type_id,created_at,modified_atandcreated_byare all handled internally by the system and need not be explicitly specified. See Meta Data for more information.
url = "https://smartapi.bboxx.co.uk/v1/appliance_action_types"
data = json.dumps({
"name": "test",
"description": "test",
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.post(url=url, data=data, headers=headers)
r
>>> <Response 201>
r.json()
>>> {
"appliance_action_type_id": 1
"name": "test",
"description": "test",
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve the
appliance_action_typecreated by specifying itsappliance_action_type_idin the request url:
url = 'https://smartapi.bboxx.co.uk/v1/appliance_action_types/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"appliance_action_type_id": 1
"name": "test",
"description": "test",
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve all
appliance_action_typesby omitting theappliance_action_type_id:
url = 'https://smartapi.bboxx.co.uk/v1/appliance_action_types'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
u'total_pages': 1,
u'objects': [
{<record>},
{<record>},
{<record>},
{<record>},
{<record>},
],
u'num_results': 10,
u'page': 1
}
We can edit the newly created
appliance_action_typewith aPUTrequest:
url = 'https://smartapi.bboxx.co.uk/v1/appliance_action_types/1'
data = json.dumps({
"name": "changed",
"description": "changed",
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.put(url=url, data=data, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"appliance_action_type_id": 1
"name": "changed",
"description": "changed",
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": 2016-07-07 12:34:45
}
Note that the
modified_atfield has been updated accordingly.If a user has
SYSTEMpermissions they can delete theappliance_action_type
url = 'https://smartapi.bboxx.co.uk/v1/appliance_action_types/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.delete(url=url, headers=headers)
r
>>> <Response 204>
r.text
>>>
Note that the response from a 204 request is empty. This means that
r.json()cannot be called and will throw a JSONDecodeError. In fact the response isu''- an empty unicode string.
POST
| value | |
|---|---|
| endpoint | /v1/appliance_action_types |
| method | POST |
| url_params | N/A |
| query params | N/A |
| body | JSON-formatted dictionary with the details of the appliance_action_type that you wish to create |
| permissions | SYSTEM |
| response | 201 |
GET
| value | |
|---|---|
| endpoint | /v1/appliance_action_types or /v1/appliance_action_types/<appliance_action_type_id> |
| method | GET |
| url_params | appliance_action_type_id (int) |
| query params | > See Query Format and Filtering |
| body | N/A |
| permissions | OVERVIEW |
| response | 200 |
PUT
| value | |
|---|---|
| endpoint | /v1/appliance_action_types/<appliance_action_type_id> |
| method | PUT |
| url_params | appliance_action_type_id of the appliance_action_type you wish to edit |
| query params | N/A |
| body | JSON-formatted dictionary of the columns that you wish to alter |
| permissions | SYSTEM |
| response | 200 |
DELETE
| value | |
|---|---|
| endpoint | /v1/appliance_action_types/<appliance_action_type_id> |
| method | DELETE |
| url_params | appliance_action_type_id (int) |
| query params | N/A |
| body | N/A |
| permissions | SYSTEM |
| response | 204 |
Appliance Part Type Replacement Linker
Lists which part_types can replace which during an appliance repair.Can also be used to determine valid appliance part_types for an appliance
The appliance_part_type_replacement_linker object
| Field | Description |
|---|---|
| appliance_part_type_replacement_linker_id int (primary key) |
A unique integer identifier for each appliance_part_type_replacement_linker. |
| appliance_type_id int (not-null,foreign-key) |
|
| existing_appliance_part_type_id int (not-null,foreign-key) |
|
| max_part_count int (default=1) |
Maximum number of parts of this type that can be replaced for this appliance type |
| replacement_appliance_part_type_id int (not-null,foreign-key) |
|
| created_at datetime |
timestamp that the record was created at |
| created_by text |
username of the user who created the record |
| modified_at datetime |
timestamp that the record was last modified |
| modified_by text |
user that last modified the record |
| Relationship | Description |
|---|---|
| N/A | There are no relationships for this table. |
An example POST request. Note that
appliance_part_type_replacement_linker_id,created_at,modified_atandcreated_byare all handled internally by the system and need not be explicitly specified. See Meta Data for more information.
url = "https://smartapi.bboxx.co.uk/v1/appliance_part_type_replacement_linker"
data = json.dumps({
"appliance_type_id": 1,
"existing_appliance_part_type_id": 1,
"replacement_appliance_part_type_id": 1,
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.post(url=url, data=data, headers=headers)
r
>>> <Response 201>
r.json()
>>> {
"appliance_part_type_replacement_linker_id": 1
"appliance_type_id": 1,
"existing_appliance_part_type_id": 1,
"max_part_count": 1,
"replacement_appliance_part_type_id": 1,
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve the
appliance_part_type_replacement_linkercreated by specifying itsappliance_part_type_replacement_linker_idin the request url:
url = 'https://smartapi.bboxx.co.uk/v1/appliance_part_type_replacement_linker/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"appliance_part_type_replacement_linker_id": 1
"appliance_type_id": 1,
"existing_appliance_part_type_id": 1,
"max_part_count": 1,
"replacement_appliance_part_type_id": 1,
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve all
appliance_part_type_replacement_linkerby omitting theappliance_part_type_replacement_linker_id:
url = 'https://smartapi.bboxx.co.uk/v1/appliance_part_type_replacement_linker'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
u'total_pages': 1,
u'objects': [
{<record>},
{<record>},
{<record>},
{<record>},
{<record>},
],
u'num_results': 10,
u'page': 1
}
We can edit the newly created
appliance_part_type_replacement_linkerwith aPUTrequest:
url = 'https://smartapi.bboxx.co.uk/v1/appliance_part_type_replacement_linker/1'
data = json.dumps({
"appliance_type_id": 2,
"existing_appliance_part_type_id": 2,
"replacement_appliance_part_type_id": 2,
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.put(url=url, data=data, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"appliance_part_type_replacement_linker_id": 1
"appliance_type_id": 2,
"existing_appliance_part_type_id": 2,
"max_part_count": 1,
"replacement_appliance_part_type_id": 2,
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": 2016-07-07 12:34:45
}
Note that the
modified_atfield has been updated accordingly.If a user has
SYSTEMpermissions they can delete theappliance_part_type_replacement_linker
url = 'https://smartapi.bboxx.co.uk/v1/appliance_part_type_replacement_linker/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.delete(url=url, headers=headers)
r
>>> <Response 204>
r.text
>>>
Note that the response from a 204 request is empty. This means that
r.json()cannot be called and will throw a JSONDecodeError. In fact the response isu''- an empty unicode string.
POST
| value | |
|---|---|
| endpoint | /v1/appliance_part_type_replacement_linker |
| method | POST |
| url_params | N/A |
| query params | N/A |
| body | JSON-formatted dictionary with the details of the appliance_part_type_replacement_linker that you wish to create |
| permissions | SYSTEM |
| response | 201 |
GET
| value | |
|---|---|
| endpoint | /v1/appliance_part_type_replacement_linker or /v1/appliance_part_type_replacement_linker/<appliance_part_type_replacement_linker_id> |
| method | GET |
| url_params | appliance_part_type_replacement_linker_id (int) |
| query params | > See Query Format and Filtering |
| body | N/A |
| permissions | OVERVIEW |
| response | 200 |
PUT
| value | |
|---|---|
| endpoint | /v1/appliance_part_type_replacement_linker/<appliance_part_type_replacement_linker_id> |
| method | PUT |
| url_params | appliance_part_type_replacement_linker_id of the appliance_part_type_replacement_linker you wish to edit |
| query params | N/A |
| body | JSON-formatted dictionary of the columns that you wish to alter |
| permissions | SYSTEM |
| response | 200 |
DELETE
| value | |
|---|---|
| endpoint | /v1/appliance_part_type_replacement_linker/<appliance_part_type_replacement_linker_id> |
| method | DELETE |
| url_params | appliance_part_type_replacement_linker_id (int) |
| query params | N/A |
| body | N/A |
| permissions | SYSTEM |
| response | 204 |
Appliance Part Type
Lists the types of part that can be used during appliance repair
The appliance_part_type object
| Field | Description |
|---|---|
| appliance_part_type_id int (primary key) |
A unique integer identifier for each appliance_part_type. |
| name string |
|
| description string |
|
| erp_code unknown-type |
|
| image string |
|
| created_at datetime |
timestamp that the record was created at |
| created_by text |
username of the user who created the record |
| modified_at datetime |
timestamp that the record was last modified |
| modified_by text |
user that last modified the record |
| Relationship | Description |
|---|---|
| appliance_repair_appliance_type_linker | The associated appliance_repair_appliance_type_linker |
An example POST request. Note that
appliance_part_type_id,created_at,modified_atandcreated_byare all handled internally by the system and need not be explicitly specified. See Meta Data for more information.
url = "https://smartapi.bboxx.co.uk/v1/appliance_part_types"
data = json.dumps({
"name": "test",
"description": "test",
"erp_code": Unknown column type,
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.post(url=url, data=data, headers=headers)
r
>>> <Response 201>
r.json()
>>> {
"appliance_part_type_id": 1
"name": "test",
"description": "test",
"erp_code": Unknown column type,
"image": "DC+Shaver+V2/000.png",
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve the
appliance_part_typecreated by specifying itsappliance_part_type_idin the request url:
url = 'https://smartapi.bboxx.co.uk/v1/appliance_part_types/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"appliance_part_type_id": 1
"name": "test",
"description": "test",
"erp_code": Unknown column type,
"image": "DC+Shaver+V2/000.png",
"created_at": "2000-01-01 00:00:00",
"created_by": "test.user@bboxx.co.uk",
"modified_at": None
}
We can retrieve all
appliance_part_typesby omitting theappliance_part_type_id:
url = 'https://smartapi.bboxx.co.uk/v1/appliance_part_types'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
u'total_pages': 1,
u'objects': [
{<record>},
{<record>},
{<record>},
{<record>},
{<record>},
],
u'num_results': 10,
u'page': 1
}
We can edit the newly created
appliance_part_typewith aPUTrequest:
url = 'https://smartapi.bboxx.co.uk/v1/appliance_part_types/1'
data = json.dumps({
"name": "changed",
"description": "changed",
"erp_code": Unknown column type,
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.put(url=url, data=data, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"appliance_part_type_id": 1
"name": "changed",
"description": "changed",
"erp_code": Unknown column type,
"image": "DC+Shaver+V2/000.png",
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": 2016-07-07 12:34:45
}
Note that the
modified_atfield has been updated accordingly.If a user has
SYSTEMpermissions they can delete theappliance_part_type
url = 'https://smartapi.bboxx.co.uk/v1/appliance_part_types/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.delete(url=url, headers=headers)
r
>>> <Response 204>
r.text
>>>
Note that the response from a 204 request is empty. This means that
r.json()cannot be called and will throw a JSONDecodeError. In fact the response isu''- an empty unicode string.
POST
| value | |
|---|---|
| endpoint | /v1/appliance_part_types |
| method | POST |
| url_params | N/A |
| query params | N/A |
| body | JSON-formatted dictionary with the details of the appliance_part_type that you wish to create |
| permissions | SYSTEM |
| response | 201 |
GET
| value | |
|---|---|
| endpoint | /v1/appliance_part_types or /v1/appliance_part_types/<appliance_part_type_id> |
| method | GET |
| url_params | appliance_part_type_id (int) |
| query params | > See Query Format and Filtering |
| body | N/A |
| permissions | OVERVIEW |
| response | 200 |
PUT
| value | |
|---|---|
| endpoint | /v1/appliance_part_types/<appliance_part_type_id> |
| method | PUT |
| url_params | appliance_part_type_id of the appliance_part_type you wish to edit |
| query params | N/A |
| body | JSON-formatted dictionary of the columns that you wish to alter |
| permissions | SYSTEM |
| response | 200 |
DELETE
| value | |
|---|---|
| endpoint | /v1/appliance_part_types/<appliance_part_type_id> |
| method | DELETE |
| url_params | appliance_part_type_id (int) |
| query params | N/A |
| body | N/A |
| permissions | SYSTEM |
| response | 204 |
Appliance Repair Appliance Action Type Linker
Contains which appliance actions occured during each appliance repair
The appliance_repair_appliance_action_type_linker object
| Field | Description |
|---|---|
| appliance_repair_appliance_action_type_linker_id int (primary key) |
A unique integer identifier for each appliance_repair_appliance_action_type_linker. |
| appliance_repair_id int (not-null,foreign-key) |
|
| appliance_action_type_id int (not-null,foreign-key) |
|
| created_at datetime |
timestamp that the record was created at |
| created_by text |
username of the user who created the record |
| modified_at datetime |
timestamp that the record was last modified |
| modified_by text |
user that last modified the record |
| Relationship | Description |
|---|---|
| N/A | There are no relationships for this table. |
An example POST request. Note that
appliance_repair_appliance_action_type_linker_id,created_at,modified_atandcreated_byare all handled internally by the system and need not be explicitly specified. See Meta Data for more information.
url = "https://smartapi.bboxx.co.uk/v1/appliance_repair_appliance_action_type_linker"
data = json.dumps({
"appliance_repair_id": 1,
"appliance_action_type_id": 1,
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.post(url=url, data=data, headers=headers)
r
>>> <Response 201>
r.json()
>>> {
"appliance_repair_appliance_action_type_linker_id": 1
"appliance_repair_id": 1,
"appliance_action_type_id": 1,
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve the
appliance_repair_appliance_action_type_linkercreated by specifying itsappliance_repair_appliance_action_type_linker_idin the request url:
url = 'https://smartapi.bboxx.co.uk/v1/appliance_repair_appliance_action_type_linker/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"appliance_repair_appliance_action_type_linker_id": 1
"appliance_repair_id": 1,
"appliance_action_type_id": 1,
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve all
appliance_repair_appliance_action_type_linkerby omitting theappliance_repair_appliance_action_type_linker_id:
url = 'https://smartapi.bboxx.co.uk/v1/appliance_repair_appliance_action_type_linker'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
u'total_pages': 1,
u'objects': [
{<record>},
{<record>},
{<record>},
{<record>},
{<record>},
],
u'num_results': 10,
u'page': 1
}
We can edit the newly created
appliance_repair_appliance_action_type_linkerwith aPUTrequest:
url = 'https://smartapi.bboxx.co.uk/v1/appliance_repair_appliance_action_type_linker/1'
data = json.dumps({
"appliance_repair_id": 2,
"appliance_action_type_id": 2,
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.put(url=url, data=data, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"appliance_repair_appliance_action_type_linker_id": 1
"appliance_repair_id": 2,
"appliance_action_type_id": 2,
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": 2016-07-07 12:34:45
}
Note that the
modified_atfield has been updated accordingly.If a user has
SYSTEMpermissions they can delete theappliance_repair_appliance_action_type_linker
url = 'https://smartapi.bboxx.co.uk/v1/appliance_repair_appliance_action_type_linker/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.delete(url=url, headers=headers)
r
>>> <Response 204>
r.text
>>>
Note that the response from a 204 request is empty. This means that
r.json()cannot be called and will throw a JSONDecodeError. In fact the response isu''- an empty unicode string.
POST
| value | |
|---|---|
| endpoint | /v1/appliance_repair_appliance_action_type_linker |
| method | POST |
| url_params | N/A |
| query params | N/A |
| body | JSON-formatted dictionary with the details of the appliance_repair_appliance_action_type_linker that you wish to create |
| permissions | SYSTEM |
| response | 201 |
GET
| value | |
|---|---|
| endpoint | /v1/appliance_repair_appliance_action_type_linker or /v1/appliance_repair_appliance_action_type_linker/<appliance_repair_appliance_action_type_linker_id> |
| method | GET |
| url_params | appliance_repair_appliance_action_type_linker_id (int) |
| query params | > See Query Format and Filtering |
| body | N/A |
| permissions | OVERVIEW |
| response | 200 |
PUT
| value | |
|---|---|
| endpoint | /v1/appliance_repair_appliance_action_type_linker/<appliance_repair_appliance_action_type_linker_id> |
| method | PUT |
| url_params | appliance_repair_appliance_action_type_linker_id of the appliance_repair_appliance_action_type_linker you wish to edit |
| query params | N/A |
| body | JSON-formatted dictionary of the columns that you wish to alter |
| permissions | SYSTEM |
| response | 200 |
DELETE
| value | |
|---|---|
| endpoint | /v1/appliance_repair_appliance_action_type_linker/<appliance_repair_appliance_action_type_linker_id> |
| method | DELETE |
| url_params | appliance_repair_appliance_action_type_linker_id (int) |
| query params | N/A |
| body | N/A |
| permissions | SYSTEM |
| response | 204 |
Appliance Repair Appliance Part Type Linker
Lists the appliance part_types that were used in a given appliance_repair
The appliance_repair_appliance_part_type_linker object
| Field | Description |
|---|---|
| appliance_repair_appliance_part_type_linker_id int (primary key) |
A unique integer identifier for each appliance_repair_appliance_part_type_linker. |
| appliance_repair_id int (not-null,foreign-key) |
|
| old_appliance_part_type_id int (not-null,foreign-key) |
|
| new_appliance_part_type_id int (foreign-key) |
|
| repaired_parts_count int |
Number of parts of this type replaced in this repair |
| requested_date datetime |
|
| replaced_date datetime |
|
| created_at datetime |
timestamp that the record was created at |
| created_by text |
username of the user who created the record |
| modified_at datetime |
timestamp that the record was last modified |
| modified_by text |
user that last modified the record |
| Relationship | Description |
|---|---|
| N/A | There are no relationships for this table. |
An example POST request. Note that
appliance_repair_appliance_part_type_linker_id,created_at,modified_atandcreated_byare all handled internally by the system and need not be explicitly specified. See Meta Data for more information.
url = "https://smartapi.bboxx.co.uk/v1/appliance_repair_appliance_part_type_linker"
data = json.dumps({
"appliance_repair_id": 1,
"old_appliance_part_type_id": 1,
"new_appliance_part_type_id": 1,
"requested_date": "2000-01-01 00:00:00",
"replaced_date": "2000-01-01 00:00:00",
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.post(url=url, data=data, headers=headers)
r
>>> <Response 201>
r.json()
>>> {
"appliance_repair_appliance_part_type_linker_id": 1
"appliance_repair_id": 1,
"old_appliance_part_type_id": 1,
"new_appliance_part_type_id": 1,
"repaired_parts_count": 1,
"requested_date": "2000-01-01 00:00:00",
"replaced_date": "2000-01-01 00:00:00",
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve the
appliance_repair_appliance_part_type_linkercreated by specifying itsappliance_repair_appliance_part_type_linker_idin the request url:
url = 'https://smartapi.bboxx.co.uk/v1/appliance_repair_appliance_part_type_linker/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"appliance_repair_appliance_part_type_linker_id": 1
"appliance_repair_id": 1,
"old_appliance_part_type_id": 1,
"new_appliance_part_type_id": 1,
"repaired_parts_count": 1,
"requested_date": "2000-01-01 00:00:00",
"replaced_date": "2000-01-01 00:00:00",
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve all
appliance_repair_appliance_part_type_linkerby omitting theappliance_repair_appliance_part_type_linker_id:
url = 'https://smartapi.bboxx.co.uk/v1/appliance_repair_appliance_part_type_linker'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
u'total_pages': 1,
u'objects': [
{<record>},
{<record>},
{<record>},
{<record>},
{<record>},
],
u'num_results': 10,
u'page': 1
}
We can edit the newly created
appliance_repair_appliance_part_type_linkerwith aPUTrequest:
url = 'https://smartapi.bboxx.co.uk/v1/appliance_repair_appliance_part_type_linker/1'
data = json.dumps({
"appliance_repair_id": 2,
"old_appliance_part_type_id": 2,
"new_appliance_part_type_id": 2,
"requested_date": "2016-07-01 12:34:45",
"replaced_date": "2016-07-01 12:34:45",
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.put(url=url, data=data, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"appliance_repair_appliance_part_type_linker_id": 1
"appliance_repair_id": 2,
"old_appliance_part_type_id": 2,
"new_appliance_part_type_id": 2,
"repaired_parts_count": 1,
"requested_date": "2016-07-01 12:34:45",
"replaced_date": "2016-07-01 12:34:45",
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": 2016-07-07 12:34:45
}
Note that the
modified_atfield has been updated accordingly.If a user has
SYSTEMpermissions they can delete theappliance_repair_appliance_part_type_linker
url = 'https://smartapi.bboxx.co.uk/v1/appliance_repair_appliance_part_type_linker/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.delete(url=url, headers=headers)
r
>>> <Response 204>
r.text
>>>
Note that the response from a 204 request is empty. This means that
r.json()cannot be called and will throw a JSONDecodeError. In fact the response isu''- an empty unicode string.
POST
| value | |
|---|---|
| endpoint | /v1/appliance_repair_appliance_part_type_linker |
| method | POST |
| url_params | N/A |
| query params | N/A |
| body | JSON-formatted dictionary with the details of the appliance_repair_appliance_part_type_linker that you wish to create |
| permissions | SYSTEM |
| response | 201 |
GET
| value | |
|---|---|
| endpoint | /v1/appliance_repair_appliance_part_type_linker or /v1/appliance_repair_appliance_part_type_linker/<appliance_repair_appliance_part_type_linker_id> |
| method | GET |
| url_params | appliance_repair_appliance_part_type_linker_id (int) |
| query params | > See Query Format and Filtering |
| body | N/A |
| permissions | OVERVIEW |
| response | 200 |
PUT
| value | |
|---|---|
| endpoint | /v1/appliance_repair_appliance_part_type_linker/<appliance_repair_appliance_part_type_linker_id> |
| method | PUT |
| url_params | appliance_repair_appliance_part_type_linker_id of the appliance_repair_appliance_part_type_linker you wish to edit |
| query params | N/A |
| body | JSON-formatted dictionary of the columns that you wish to alter |
| permissions | SYSTEM |
| response | 200 |
DELETE
| value | |
|---|---|
| endpoint | /v1/appliance_repair_appliance_part_type_linker/<appliance_repair_appliance_part_type_linker_id> |
| method | DELETE |
| url_params | appliance_repair_appliance_part_type_linker_id (int) |
| query params | N/A |
| body | N/A |
| permissions | SYSTEM |
| response | 204 |
Appliance Repair Appliance Symptom Linker
Lists the symptoms that a particular appliance had for a particular repair
The appliance_repair_appliance_symptom_linker object
| Field | Description |
|---|---|
| appliance_repair_appliance_symptom_linker_id int (primary key) |
A unique integer identifier for each appliance_repair_appliance_symptom_linker. |
| appliance_repair_id int (foreign-key) |
|
| appliance_symptom_id int (foreign-key) |
|
| created_at datetime |
timestamp that the record was created at |
| created_by text |
username of the user who created the record |
| modified_at datetime |
timestamp that the record was last modified |
| modified_by text |
user that last modified the record |
| Relationship | Description |
|---|---|
| N/A | There are no relationships for this table. |
An example POST request. Note that
appliance_repair_appliance_symptom_linker_id,created_at,modified_atandcreated_byare all handled internally by the system and need not be explicitly specified. See Meta Data for more information.
url = "https://smartapi.bboxx.co.uk/v1/appliance_repair_appliance_symptom_linker"
data = json.dumps({
"appliance_repair_id": 1,
"appliance_symptom_id": 1,
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.post(url=url, data=data, headers=headers)
r
>>> <Response 201>
r.json()
>>> {
"appliance_repair_appliance_symptom_linker_id": 1
"appliance_repair_id": 1,
"appliance_symptom_id": 1,
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve the
appliance_repair_appliance_symptom_linkercreated by specifying itsappliance_repair_appliance_symptom_linker_idin the request url:
url = 'https://smartapi.bboxx.co.uk/v1/appliance_repair_appliance_symptom_linker/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"appliance_repair_appliance_symptom_linker_id": 1
"appliance_repair_id": 1,
"appliance_symptom_id": 1,
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve all
appliance_repair_appliance_symptom_linkerby omitting theappliance_repair_appliance_symptom_linker_id:
url = 'https://smartapi.bboxx.co.uk/v1/appliance_repair_appliance_symptom_linker'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
u'total_pages': 1,
u'objects': [
{<record>},
{<record>},
{<record>},
{<record>},
{<record>},
],
u'num_results': 10,
u'page': 1
}
We can edit the newly created
appliance_repair_appliance_symptom_linkerwith aPUTrequest:
url = 'https://smartapi.bboxx.co.uk/v1/appliance_repair_appliance_symptom_linker/1'
data = json.dumps({
"appliance_repair_id": 2,
"appliance_symptom_id": 2,
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.put(url=url, data=data, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"appliance_repair_appliance_symptom_linker_id": 1
"appliance_repair_id": 2,
"appliance_symptom_id": 2,
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": 2016-07-07 12:34:45
}
Note that the
modified_atfield has been updated accordingly.If a user has
SYSTEMpermissions they can delete theappliance_repair_appliance_symptom_linker
url = 'https://smartapi.bboxx.co.uk/v1/appliance_repair_appliance_symptom_linker/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.delete(url=url, headers=headers)
r
>>> <Response 204>
r.text
>>>
Note that the response from a 204 request is empty. This means that
r.json()cannot be called and will throw a JSONDecodeError. In fact the response isu''- an empty unicode string.
POST
| value | |
|---|---|
| endpoint | /v1/appliance_repair_appliance_symptom_linker |
| method | POST |
| url_params | N/A |
| query params | N/A |
| body | JSON-formatted dictionary with the details of the appliance_repair_appliance_symptom_linker that you wish to create |
| permissions | SYSTEM |
| response | 201 |
GET
| value | |
|---|---|
| endpoint | /v1/appliance_repair_appliance_symptom_linker or /v1/appliance_repair_appliance_symptom_linker/<appliance_repair_appliance_symptom_linker_id> |
| method | GET |
| url_params | appliance_repair_appliance_symptom_linker_id (int) |
| query params | > See Query Format and Filtering |
| body | N/A |
| permissions | OVERVIEW |
| response | 200 |
PUT
| value | |
|---|---|
| endpoint | /v1/appliance_repair_appliance_symptom_linker/<appliance_repair_appliance_symptom_linker_id> |
| method | PUT |
| url_params | appliance_repair_appliance_symptom_linker_id of the appliance_repair_appliance_symptom_linker you wish to edit |
| query params | N/A |
| body | JSON-formatted dictionary of the columns that you wish to alter |
| permissions | SYSTEM |
| response | 200 |
DELETE
| value | |
|---|---|
| endpoint | /v1/appliance_repair_appliance_symptom_linker/<appliance_repair_appliance_symptom_linker_id> |
| method | DELETE |
| url_params | appliance_repair_appliance_symptom_linker_id (int) |
| query params | N/A |
| body | N/A |
| permissions | SYSTEM |
| response | 204 |
Appliance Repair
Lists repairs of BBOXX appliances
The appliance_repair object
| Field | Description |
|---|---|
| appliance_repair_id int (primary key) |
A unique integer identifier for each appliance_repair. |
| appliance_id int (not-null,foreign-key) |
|
| arrival_date date |
|
| refurbishment_date date |
|
| pending_status boolean |
|
| process string |
options: ["Repair and Return", "Replaced", "Repossessed", "Broken on Arrival"] |
| created_at datetime |
timestamp that the record was created at |
| created_by text |
username of the user who created the record |
| modified_at datetime |
timestamp that the record was last modified |
| modified_by text |
user that last modified the record |
| Relationship | Description |
|---|---|
| replacements | The associated replacements |
| symptoms | The associated symptoms |
| appliance_action_types | The associated appliance_action_types |
An example POST request. Note that
appliance_repair_id,created_at,modified_atandcreated_byare all handled internally by the system and need not be explicitly specified. See Meta Data for more information.
url = "https://smartapi.bboxx.co.uk/v1/appliance_repairs"
data = json.dumps({
"appliance_id": 1,
"arrival_date": "2000-01-01 00:00:00",
"refurbishment_date": "2000-01-01 00:00:00",
"pending_status": True,
"process": "test",
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.post(url=url, data=data, headers=headers)
r
>>> <Response 201>
r.json()
>>> {
"appliance_repair_id": 1
"appliance_id": 1,
"arrival_date": "2000-01-01 00:00:00",
"refurbishment_date": "2000-01-01 00:00:00",
"pending_status": True,
"process": "test",
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve the
appliance_repaircreated by specifying itsappliance_repair_idin the request url:
url = 'https://smartapi.bboxx.co.uk/v1/appliance_repairs/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"appliance_repair_id": 1
"appliance_id": 1,
"arrival_date": "2000-01-01 00:00:00",
"refurbishment_date": "2000-01-01 00:00:00",
"pending_status": True,
"process": "test",
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve all
appliance_repairsby omitting theappliance_repair_id:
url = 'https://smartapi.bboxx.co.uk/v1/appliance_repairs'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
u'total_pages': 1,
u'objects': [
{<record>},
{<record>},
{<record>},
{<record>},
{<record>},
],
u'num_results': 10,
u'page': 1
}
We can edit the newly created
appliance_repairwith aPUTrequest:
url = 'https://smartapi.bboxx.co.uk/v1/appliance_repairs/1'
data = json.dumps({
"appliance_id": 2,
"arrival_date": "2000-01-01 00:00:00",
"refurbishment_date": "2000-01-01 00:00:00",
"pending_status": False,
"process": "changed",
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.put(url=url, data=data, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"appliance_repair_id": 1
"appliance_id": 2,
"arrival_date": "2000-01-01 00:00:00",
"refurbishment_date": "2000-01-01 00:00:00",
"pending_status": False,
"process": "changed",
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": 2016-07-07 12:34:45
}
Note that the
modified_atfield has been updated accordingly.If a user has
SYSTEMpermissions they can delete theappliance_repair
url = 'https://smartapi.bboxx.co.uk/v1/appliance_repairs/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.delete(url=url, headers=headers)
r
>>> <Response 204>
r.text
>>>
Note that the response from a 204 request is empty. This means that
r.json()cannot be called and will throw a JSONDecodeError. In fact the response isu''- an empty unicode string.
POST
| value | |
|---|---|
| endpoint | /v1/appliance_repairs |
| method | POST |
| url_params | N/A |
| query params | N/A |
| body | JSON-formatted dictionary with the details of the appliance_repair that you wish to create |
| permissions | SYSTEM |
| response | 201 |
GET
| value | |
|---|---|
| endpoint | /v1/appliance_repairs or /v1/appliance_repairs/<appliance_repair_id> |
| method | GET |
| url_params | appliance_repair_id (int) |
| query params | > See Query Format and Filtering |
| body | N/A |
| permissions | OVERVIEW |
| response | 200 |
PUT
| value | |
|---|---|
| endpoint | /v1/appliance_repairs/<appliance_repair_id> |
| method | PUT |
| url_params | appliance_repair_id of the appliance_repair you wish to edit |
| query params | N/A |
| body | JSON-formatted dictionary of the columns that you wish to alter |
| permissions | SYSTEM |
| response | 200 |
DELETE
| value | |
|---|---|
| endpoint | /v1/appliance_repairs/<appliance_repair_id> |
| method | DELETE |
| url_params | appliance_repair_id (int) |
| query params | N/A |
| body | N/A |
| permissions | SYSTEM |
| response | 204 |
Appliance
Lists the appliances that BBOXX handles.Appliances can be 'tracked' (known serial) or 'untracked' (invented serial)
The appliance object
| Field | Description |
|---|---|
| appliance_id int (primary key) |
A unique integer identifier for each appliance. |
| appliance_type_id int (not-null,foreign-key) |
|
| serial_number string (unique) |
|
| created_at datetime |
timestamp that the record was created at |
| created_by text |
username of the user who created the record |
| modified_at datetime |
timestamp that the record was last modified |
| modified_by text |
user that last modified the record |
| Relationship | Description |
|---|---|
| appliance_repairs | The associated appliance_repairs |
An example POST request. Note that
appliance_id,created_at,modified_atandcreated_byare all handled internally by the system and need not be explicitly specified. See Meta Data for more information.
url = "https://smartapi.bboxx.co.uk/v1/appliances"
data = json.dumps({
"appliance_type_id": 1,
"serial_number": "test",
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.post(url=url, data=data, headers=headers)
r
>>> <Response 201>
r.json()
>>> {
"appliance_id": 1
"appliance_type_id": 1,
"serial_number": "test",
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve the
appliancecreated by specifying itsappliance_idin the request url:
url = 'https://smartapi.bboxx.co.uk/v1/appliances/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"appliance_id": 1
"appliance_type_id": 1,
"serial_number": "test",
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve all
appliancesby omitting theappliance_id:
url = 'https://smartapi.bboxx.co.uk/v1/appliances'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
u'total_pages': 1,
u'objects': [
{<record>},
{<record>},
{<record>},
{<record>},
{<record>},
],
u'num_results': 10,
u'page': 1
}
We can edit the newly created
appliancewith aPUTrequest:
url = 'https://smartapi.bboxx.co.uk/v1/appliances/1'
data = json.dumps({
"appliance_type_id": 2,
"serial_number": "changed",
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.put(url=url, data=data, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"appliance_id": 1
"appliance_type_id": 2,
"serial_number": "changed",
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": 2016-07-07 12:34:45
}
Note that the
modified_atfield has been updated accordingly.If a user has
SYSTEMpermissions they can delete theappliance
url = 'https://smartapi.bboxx.co.uk/v1/appliances/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.delete(url=url, headers=headers)
r
>>> <Response 204>
r.text
>>>
Note that the response from a 204 request is empty. This means that
r.json()cannot be called and will throw a JSONDecodeError. In fact the response isu''- an empty unicode string.
POST
| value | |
|---|---|
| endpoint | /v1/appliances |
| method | POST |
| url_params | N/A |
| query params | N/A |
| body | JSON-formatted dictionary with the details of the appliance that you wish to create |
| permissions | SYSTEM |
| response | 201 |
GET
| value | |
|---|---|
| endpoint | /v1/appliances or /v1/appliances/<appliance_id> |
| method | GET |
| url_params | appliance_id (int) |
| query params | > See Query Format and Filtering |
| body | N/A |
| permissions | OVERVIEW |
| response | 200 |
PUT
| value | |
|---|---|
| endpoint | /v1/appliances/<appliance_id> |
| method | PUT |
| url_params | appliance_id of the appliance you wish to edit |
| query params | N/A |
| body | JSON-formatted dictionary of the columns that you wish to alter |
| permissions | SYSTEM |
| response | 200 |
DELETE
| value | |
|---|---|
| endpoint | /v1/appliances/<appliance_id> |
| method | DELETE |
| url_params | appliance_id (int) |
| query params | N/A |
| body | N/A |
| permissions | SYSTEM |
| response | 204 |
Appliance Symptom Appliance Type Linker
Lists the symptoms that a particular appliance can have.
The appliance_symptom_appliance_type_linker object
| Field | Description |
|---|---|
| appliance_symptom_appliance_type_linker_id int (primary key) |
A unique integer identifier for each appliance_symptom_appliance_type_linker. |
| appliance_type_id int (foreign-key) |
|
| appliance_symptom_id int (foreign-key) |
|
| created_at datetime |
timestamp that the record was created at |
| created_by text |
username of the user who created the record |
| modified_at datetime |
timestamp that the record was last modified |
| modified_by text |
user that last modified the record |
| Relationship | Description |
|---|---|
| N/A | There are no relationships for this table. |
An example POST request. Note that
appliance_symptom_appliance_type_linker_id,created_at,modified_atandcreated_byare all handled internally by the system and need not be explicitly specified. See Meta Data for more information.
url = "https://smartapi.bboxx.co.uk/v1/appliance_symptom_appliance_type_linker"
data = json.dumps({
"appliance_type_id": 1,
"appliance_symptom_id": 1,
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.post(url=url, data=data, headers=headers)
r
>>> <Response 201>
r.json()
>>> {
"appliance_symptom_appliance_type_linker_id": 1
"appliance_type_id": 1,
"appliance_symptom_id": 1,
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve the
appliance_symptom_appliance_type_linkercreated by specifying itsappliance_symptom_appliance_type_linker_idin the request url:
url = 'https://smartapi.bboxx.co.uk/v1/appliance_symptom_appliance_type_linker/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"appliance_symptom_appliance_type_linker_id": 1
"appliance_type_id": 1,
"appliance_symptom_id": 1,
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve all
appliance_symptom_appliance_type_linkerby omitting theappliance_symptom_appliance_type_linker_id:
url = 'https://smartapi.bboxx.co.uk/v1/appliance_symptom_appliance_type_linker'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
u'total_pages': 1,
u'objects': [
{<record>},
{<record>},
{<record>},
{<record>},
{<record>},
],
u'num_results': 10,
u'page': 1
}
We can edit the newly created
appliance_symptom_appliance_type_linkerwith aPUTrequest:
url = 'https://smartapi.bboxx.co.uk/v1/appliance_symptom_appliance_type_linker/1'
data = json.dumps({
"appliance_type_id": 2,
"appliance_symptom_id": 2,
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.put(url=url, data=data, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"appliance_symptom_appliance_type_linker_id": 1
"appliance_type_id": 2,
"appliance_symptom_id": 2,
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": 2016-07-07 12:34:45
}
Note that the
modified_atfield has been updated accordingly.If a user has
SYSTEMpermissions they can delete theappliance_symptom_appliance_type_linker
url = 'https://smartapi.bboxx.co.uk/v1/appliance_symptom_appliance_type_linker/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.delete(url=url, headers=headers)
r
>>> <Response 204>
r.text
>>>
Note that the response from a 204 request is empty. This means that
r.json()cannot be called and will throw a JSONDecodeError. In fact the response isu''- an empty unicode string.
POST
| value | |
|---|---|
| endpoint | /v1/appliance_symptom_appliance_type_linker |
| method | POST |
| url_params | N/A |
| query params | N/A |
| body | JSON-formatted dictionary with the details of the appliance_symptom_appliance_type_linker that you wish to create |
| permissions | SYSTEM |
| response | 201 |
GET
| value | |
|---|---|
| endpoint | /v1/appliance_symptom_appliance_type_linker or /v1/appliance_symptom_appliance_type_linker/<appliance_symptom_appliance_type_linker_id> |
| method | GET |
| url_params | appliance_symptom_appliance_type_linker_id (int) |
| query params | > See Query Format and Filtering |
| body | N/A |
| permissions | OVERVIEW |
| response | 200 |
PUT
| value | |
|---|---|
| endpoint | /v1/appliance_symptom_appliance_type_linker/<appliance_symptom_appliance_type_linker_id> |
| method | PUT |
| url_params | appliance_symptom_appliance_type_linker_id of the appliance_symptom_appliance_type_linker you wish to edit |
| query params | N/A |
| body | JSON-formatted dictionary of the columns that you wish to alter |
| permissions | SYSTEM |
| response | 200 |
DELETE
| value | |
|---|---|
| endpoint | /v1/appliance_symptom_appliance_type_linker/<appliance_symptom_appliance_type_linker_id> |
| method | DELETE |
| url_params | appliance_symptom_appliance_type_linker_id (int) |
| query params | N/A |
| body | N/A |
| permissions | SYSTEM |
| response | 204 |
Appliance Symptom
Lists the possible symptoms that a BBOXX appliance could have.
The appliance_symptom object
| Field | Description |
|---|---|
| appliance_symptom_id int (primary key) |
A unique integer identifier for each appliance_symptom. |
| name string (unique) |
|
| description string |
|
| created_at datetime |
timestamp that the record was created at |
| created_by text |
username of the user who created the record |
| modified_at datetime |
timestamp that the record was last modified |
| modified_by text |
user that last modified the record |
| Relationship | Description |
|---|---|
| appliance_symptom_appliance_type_linker | The associated appliance_symptom_appliance_type_linker |
| appliance_repair_appliance_symptom_linker | The associated appliance_repair_appliance_symptom_linker |
An example POST request. Note that
appliance_symptom_id,created_at,modified_atandcreated_byare all handled internally by the system and need not be explicitly specified. See Meta Data for more information.
url = "https://smartapi.bboxx.co.uk/v1/appliance_symptoms"
data = json.dumps({
"name": "test",
"description": "test",
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.post(url=url, data=data, headers=headers)
r
>>> <Response 201>
r.json()
>>> {
"appliance_symptom_id": 1
"name": "test",
"description": "test",
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve the
appliance_symptomcreated by specifying itsappliance_symptom_idin the request url:
url = 'https://smartapi.bboxx.co.uk/v1/appliance_symptoms/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"appliance_symptom_id": 1
"name": "test",
"description": "test",
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve all
appliance_symptomsby omitting theappliance_symptom_id:
url = 'https://smartapi.bboxx.co.uk/v1/appliance_symptoms'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
u'total_pages': 1,
u'objects': [
{<record>},
{<record>},
{<record>},
{<record>},
{<record>},
],
u'num_results': 10,
u'page': 1
}
We can edit the newly created
appliance_symptomwith aPUTrequest:
url = 'https://smartapi.bboxx.co.uk/v1/appliance_symptoms/1'
data = json.dumps({
"name": "changed",
"description": "changed",
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.put(url=url, data=data, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"appliance_symptom_id": 1
"name": "changed",
"description": "changed",
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": 2016-07-07 12:34:45
}
Note that the
modified_atfield has been updated accordingly.If a user has
SYSTEMpermissions they can delete theappliance_symptom
url = 'https://smartapi.bboxx.co.uk/v1/appliance_symptoms/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.delete(url=url, headers=headers)
r
>>> <Response 204>
r.text
>>>
Note that the response from a 204 request is empty. This means that
r.json()cannot be called and will throw a JSONDecodeError. In fact the response isu''- an empty unicode string.
POST
| value | |
|---|---|
| endpoint | /v1/appliance_symptoms |
| method | POST |
| url_params | N/A |
| query params | N/A |
| body | JSON-formatted dictionary with the details of the appliance_symptom that you wish to create |
| permissions | SYSTEM |
| response | 201 |
GET
| value | |
|---|---|
| endpoint | /v1/appliance_symptoms or /v1/appliance_symptoms/<appliance_symptom_id> |
| method | GET |
| url_params | appliance_symptom_id (int) |
| query params | > See Query Format and Filtering |
| body | N/A |
| permissions | OVERVIEW |
| response | 200 |
PUT
| value | |
|---|---|
| endpoint | /v1/appliance_symptoms/<appliance_symptom_id> |
| method | PUT |
| url_params | appliance_symptom_id of the appliance_symptom you wish to edit |
| query params | N/A |
| body | JSON-formatted dictionary of the columns that you wish to alter |
| permissions | SYSTEM |
| response | 200 |
DELETE
| value | |
|---|---|
| endpoint | /v1/appliance_symptoms/<appliance_symptom_id> |
| method | DELETE |
| url_params | appliance_symptom_id (int) |
| query params | N/A |
| body | N/A |
| permissions | SYSTEM |
| response | 204 |
Appliance Type
Lists the types of appliance that BBOXX handles.
The appliance_type object
| Field | Description |
|---|---|
| appliance_type_id int (primary key) |
A unique integer identifier for each appliance_type. |
| category string |
|
| name string (unique) |
|
| description string |
|
| erp_code unknown-type (unique) |
|
| tracked boolean |
|
| created_at datetime |
timestamp that the record was created at |
| created_by text |
username of the user who created the record |
| modified_at datetime |
timestamp that the record was last modified |
| modified_by text |
user that last modified the record |
| Relationship | Description |
|---|---|
| appliances | The associated appliances |
| symptoms | The associated symptoms |
| actions | The associated actions |
An example POST request. Note that
appliance_type_id,created_at,modified_atandcreated_byare all handled internally by the system and need not be explicitly specified. See Meta Data for more information.
url = "https://smartapi.bboxx.co.uk/v1/appliance_types"
data = json.dumps({
"category": "test",
"name": "test",
"description": "test",
"erp_code": Unknown column type,
"tracked": True,
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.post(url=url, data=data, headers=headers)
r
>>> <Response 201>
r.json()
>>> {
"appliance_type_id": 1
"category": "test",
"name": "test",
"description": "test",
"erp_code": Unknown column type,
"tracked": True,
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve the
appliance_typecreated by specifying itsappliance_type_idin the request url:
url = 'https://smartapi.bboxx.co.uk/v1/appliance_types/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"appliance_type_id": 1
"category": "test",
"name": "test",
"description": "test",
"erp_code": Unknown column type,
"tracked": True,
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve all
appliance_typesby omitting theappliance_type_id:
url = 'https://smartapi.bboxx.co.uk/v1/appliance_types'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
u'total_pages': 1,
u'objects': [
{<record>},
{<record>},
{<record>},
{<record>},
{<record>},
],
u'num_results': 10,
u'page': 1
}
We can edit the newly created
appliance_typewith aPUTrequest:
url = 'https://smartapi.bboxx.co.uk/v1/appliance_types/1'
data = json.dumps({
"category": "changed",
"name": "changed",
"description": "changed",
"erp_code": Unknown column type,
"tracked": False,
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.put(url=url, data=data, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"appliance_type_id": 1
"category": "changed",
"name": "changed",
"description": "changed",
"erp_code": Unknown column type,
"tracked": False,
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": 2016-07-07 12:34:45
}
Note that the
modified_atfield has been updated accordingly.If a user has
SYSTEMpermissions they can delete theappliance_type
url = 'https://smartapi.bboxx.co.uk/v1/appliance_types/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.delete(url=url, headers=headers)
r
>>> <Response 204>
r.text
>>>
Note that the response from a 204 request is empty. This means that
r.json()cannot be called and will throw a JSONDecodeError. In fact the response isu''- an empty unicode string.
POST
| value | |
|---|---|
| endpoint | /v1/appliance_types |
| method | POST |
| url_params | N/A |
| query params | N/A |
| body | JSON-formatted dictionary with the details of the appliance_type that you wish to create |
| permissions | SYSTEM |
| response | 201 |
GET
| value | |
|---|---|
| endpoint | /v1/appliance_types or /v1/appliance_types/<appliance_type_id> |
| method | GET |
| url_params | appliance_type_id (int) |
| query params | > See Query Format and Filtering |
| body | N/A |
| permissions | OVERVIEW |
| response | 200 |
PUT
| value | |
|---|---|
| endpoint | /v1/appliance_types/<appliance_type_id> |
| method | PUT |
| url_params | appliance_type_id of the appliance_type you wish to edit |
| query params | N/A |
| body | JSON-formatted dictionary of the columns that you wish to alter |
| permissions | SYSTEM |
| response | 200 |
DELETE
| value | |
|---|---|
| endpoint | /v1/appliance_types/<appliance_type_id> |
| method | DELETE |
| url_params | appliance_type_id (int) |
| query params | N/A |
| body | N/A |
| permissions | SYSTEM |
| response | 204 |
Balance
Most recent balance remaining on each DCM unit.
The balance object
| Field | Description |
|---|---|
| balance_id int (primary key) |
A unique integer identifier for each balance. |
| product_imei varchar(15) (not-null,foreign-key) |
|
| balance int (not-null) |
|
| expected_expiry datetime (not-null) |
|
| created_at datetime |
timestamp that the record was created at |
| created_by text |
username of the user who created the record |
| modified_at datetime |
timestamp that the record was last modified |
| modified_by text |
user that last modified the record |
| Relationship | Description |
|---|---|
| N/A | There are no relationships for this table. |
POSTrequests are not allowed at this endpointWe can retrieve the
balancecreated by specifying itsbalance_idin the request url:
url = 'https://smartapi.bboxx.co.uk/v1/balances/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"balance_id": 1
"product_imei": "000000000000000",
"balance": 1,
"expected_expiry": "2000-01-01 00:00:00",
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve all
balancesby omitting thebalance_id:
url = 'https://smartapi.bboxx.co.uk/v1/balances'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
u'total_pages': 1,
u'objects': [
{<record>},
{<record>},
{<record>},
{<record>},
{<record>},
],
u'num_results': 10,
u'page': 1
}
PUTrequests are not allowed at this endpoint
DELETErequests are not allowed at this endpoint
POST
POST requests are not allowed at this endpoint
GET
| value | |
|---|---|
| endpoint | /v1/balances or /v1/balances/<balance_id> |
| method | GET |
| url_params | balance_id (int) |
| query params | > See Query Format and Filtering |
| body | N/A |
| permissions | OVERVIEW |
| response | 200 |
PUT
PUT requests are not allowed at this endpoint
DELETE
DELETE requests are not allowed at this endpoint
Battery Test Result
Test results from the BBOXX Battery Test
The battery_test_result object
| Field | Description |
|---|---|
| battery_test_result_id int (primary key) |
A unique integer identifier for each battery_test_result. |
| product_imei varchar(15) (not-null,foreign-key) |
|
| type string (not-null) |
|
| result string (not-null) |
|
| problem string |
|
| message string |
|
| lvd_time datetime |
|
| energy float |
|
| battery_part_id int (foreign-key) |
|
| repair_workflow_event_id int (foreign-key) |
|
| created_at datetime |
timestamp that the record was created at |
| created_by text |
username of the user who created the record |
| modified_at datetime |
timestamp that the record was last modified |
| modified_by text |
user that last modified the record |
| Relationship | Description |
|---|---|
| N/A | There are no relationships for this table. |
An example POST request. Note that
battery_test_result_id,created_at,modified_atandcreated_byare all handled internally by the system and need not be explicitly specified. See Meta Data for more information.
url = "https://smartapi.bboxx.co.uk/v1/battery_test_results"
data = json.dumps({
"product_imei": "000000000000000",
"type": "test",
"result": "test",
"problem": "test",
"message": "test",
"lvd_time": "2000-01-01 00:00:00",
"energy": 1.0,
"battery_part_id": 1,
"repair_workflow_event_id": 1,
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.post(url=url, data=data, headers=headers)
r
>>> <Response 201>
r.json()
>>> {
"battery_test_result_id": 1
"product_imei": "000000000000000",
"type": "test",
"result": "test",
"problem": "test",
"message": "test",
"lvd_time": "2000-01-01 00:00:00",
"energy": 1.0,
"battery_part_id": 1,
"repair_workflow_event_id": 1,
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve the
battery_test_resultcreated by specifying itsbattery_test_result_idin the request url:
url = 'https://smartapi.bboxx.co.uk/v1/battery_test_results/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"battery_test_result_id": 1
"product_imei": "000000000000000",
"type": "test",
"result": "test",
"problem": "test",
"message": "test",
"lvd_time": "2000-01-01 00:00:00",
"energy": 1.0,
"battery_part_id": 1,
"repair_workflow_event_id": 1,
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve all
battery_test_resultsby omitting thebattery_test_result_id:
url = 'https://smartapi.bboxx.co.uk/v1/battery_test_results'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
u'total_pages': 1,
u'objects': [
{<record>},
{<record>},
{<record>},
{<record>},
{<record>},
],
u'num_results': 10,
u'page': 1
}
We can edit the newly created
battery_test_resultwith aPUTrequest:
url = 'https://smartapi.bboxx.co.uk/v1/battery_test_results/1'
data = json.dumps({
"product_imei": "999999999999999",
"type": "changed",
"result": "changed",
"problem": "changed",
"message": "changed",
"lvd_time": "2016-07-01 12:34:45",
"energy": 2.0,
"battery_part_id": 2,
"repair_workflow_event_id": 2,
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.put(url=url, data=data, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"battery_test_result_id": 1
"product_imei": "999999999999999",
"type": "changed",
"result": "changed",
"problem": "changed",
"message": "changed",
"lvd_time": "2016-07-01 12:34:45",
"energy": 2.0,
"battery_part_id": 2,
"repair_workflow_event_id": 2,
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": 2016-07-07 12:34:45
}
Note that the
modified_atfield has been updated accordingly.If a user has
SYSTEMpermissions they can delete thebattery_test_result
url = 'https://smartapi.bboxx.co.uk/v1/battery_test_results/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.delete(url=url, headers=headers)
r
>>> <Response 204>
r.text
>>>
Note that the response from a 204 request is empty. This means that
r.json()cannot be called and will throw a JSONDecodeError. In fact the response isu''- an empty unicode string.
POST
| value | |
|---|---|
| endpoint | /v1/battery_test_results |
| method | POST |
| url_params | N/A |
| query params | N/A |
| body | JSON-formatted dictionary with the details of the battery_test_result that you wish to create |
| permissions | SYSTEM |
| response | 201 |
GET
| value | |
|---|---|
| endpoint | /v1/battery_test_results or /v1/battery_test_results/<battery_test_result_id> |
| method | GET |
| url_params | battery_test_result_id (int) |
| query params | > See Query Format and Filtering |
| body | N/A |
| permissions | OVERVIEW |
| response | 200 |
PUT
| value | |
|---|---|
| endpoint | /v1/battery_test_results/<battery_test_result_id> |
| method | PUT |
| url_params | battery_test_result_id of the battery_test_result you wish to edit |
| query params | N/A |
| body | JSON-formatted dictionary of the columns that you wish to alter |
| permissions | SYSTEM |
| response | 200 |
DELETE
| value | |
|---|---|
| endpoint | /v1/battery_test_results/<battery_test_result_id> |
| method | DELETE |
| url_params | battery_test_result_id (int) |
| query params | N/A |
| body | N/A |
| permissions | SYSTEM |
| response | 204 |
Channel
A table containing a list of available channels to subscribe to our API service
The channel object
| Field | Description |
|---|---|
| name string (primary key) |
A unique integer identifier for each channel. |
| created_at datetime |
timestamp that the record was created at |
| created_by text |
username of the user who created the record |
| modified_at datetime |
timestamp that the record was last modified |
| modified_by text |
user that last modified the record |
| Relationship | Description |
|---|---|
| N/A | There are no relationships for this table. |
An example POST request. Note that
name,created_at,modified_atandcreated_byare all handled internally by the system and need not be explicitly specified. See Meta Data for more information.
url = "https://smartapi.bboxx.co.uk/v1/channels"
data = json.dumps({
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.post(url=url, data=data, headers=headers)
r
>>> <Response 201>
r.json()
>>> {
"name": "000000000000000"
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve the
channelcreated by specifying itsnamein the request url:
url = 'https://smartapi.bboxx.co.uk/v1/channels/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"name": "000000000000000"
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve all
channelsby omitting thename:
url = 'https://smartapi.bboxx.co.uk/v1/channels'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
u'total_pages': 1,
u'objects': [
{<record>},
{<record>},
{<record>},
{<record>},
{<record>},
],
u'num_results': 10,
u'page': 1
}
We can edit the newly created
channelwith aPUTrequest:
url = 'https://smartapi.bboxx.co.uk/v1/channels/1'
data = json.dumps({
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.put(url=url, data=data, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"name": "000000000000000"
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": 2016-07-07 12:34:45
}
Note that the
modified_atfield has been updated accordingly.If a user has
SYSTEMpermissions they can delete thechannel
url = 'https://smartapi.bboxx.co.uk/v1/channels/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.delete(url=url, headers=headers)
r
>>> <Response 204>
r.text
>>>
Note that the response from a 204 request is empty. This means that
r.json()cannot be called and will throw a JSONDecodeError. In fact the response isu''- an empty unicode string.
POST
| value | |
|---|---|
| endpoint | /v1/channels |
| method | POST |
| url_params | N/A |
| query params | N/A |
| body | JSON-formatted dictionary with the details of the channel that you wish to create |
| permissions | SYSTEM |
| response | 201 |
GET
| value | |
|---|---|
| endpoint | /v1/channels or /v1/channels/<name> |
| method | GET |
| url_params | name (string) |
| query params | > See Query Format and Filtering |
| body | N/A |
| permissions | OVERVIEW |
| response | 200 |
PUT
| value | |
|---|---|
| endpoint | /v1/channels/<name> |
| method | PUT |
| url_params | name of the channel you wish to edit |
| query params | N/A |
| body | JSON-formatted dictionary of the columns that you wish to alter |
| permissions | SYSTEM |
| response | 200 |
DELETE
| value | |
|---|---|
| endpoint | /v1/channels/<name> |
| method | DELETE |
| url_params | name (string) |
| query params | N/A |
| body | N/A |
| permissions | SYSTEM |
| response | 204 |
Connection
Contains details of every connection that every product makes to the SMARTSolar Application.
The connection object
| Field | Description |
|---|---|
| connection_id int (primary key) |
A unique integer identifier for each connection. |
| product_imei varchar(15) (foreign-key) |
|
| location_failed_flag boolean (not-null) |
|
| date datetime (not-null) |
|
| mcc int |
|
| mnc int |
|
| cell_1_lac int |
|
| cell_1_cid int |
|
| cell_1_signal int |
|
| cell_1_mcc int |
|
| cell_1_mnc int |
|
| cell_2_lac int |
|
| cell_2_cid int |
|
| cell_2_signal int |
|
| cell_2_mcc int |
|
| cell_2_mnc int |
|
| cell_3_lac int |
|
| cell_3_cid int |
|
| cell_3_signal int |
|
| cell_3_mcc int |
|
| cell_3_mnc int |
|
| cell_4_lac int |
|
| cell_4_cid int |
|
| cell_4_signal int |
|
| cell_4_mcc int |
|
| cell_4_mnc int |
|
| cell_5_lac int |
|
| cell_5_cid int |
|
| cell_5_signal int |
|
| cell_5_mcc int |
|
| cell_5_mnc int |
|
| cell_6_lac int |
|
| cell_6_cid int |
|
| cell_6_signal int |
|
| cell_6_mcc int |
|
| cell_6_mnc int |
|
| cell_7_lac int |
|
| cell_7_cid int |
|
| cell_7_signal int |
|
| cell_7_mcc int |
|
| cell_7_mnc int |
|
| frequency int |
|
| timing_advance int |
|
| latitude varchar(12) |
|
| longitude varchar(12) |
|
| error_radius int |
|
| address string |
|
| country_code int |
|
| created_at datetime |
timestamp that the record was created at |
| created_by text |
username of the user who created the record |
| modified_at datetime |
timestamp that the record was last modified |
| modified_by text |
user that last modified the record |
| Relationship | Description |
|---|---|
| N/A | There are no relationships for this table. |
POSTrequests are not allowed at this endpointWe can retrieve the
connectioncreated by specifying itsconnection_idin the request url:
url = 'https://smartapi.bboxx.co.uk/v1/connections/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"connection_id": 1
"product_imei": "000000000000000",
"location_failed_flag": True,
"date": "2000-01-01 00:00:00",
"mcc": 1,
"mnc": 1,
"cell_1_lac": 1,
"cell_1_cid": 1,
"cell_1_signal": 1,
"cell_1_mcc": 1,
"cell_1_mnc": 1,
"cell_2_lac": 1,
"cell_2_cid": 1,
"cell_2_signal": 1,
"cell_2_mcc": 1,
"cell_2_mnc": 1,
"cell_3_lac": 1,
"cell_3_cid": 1,
"cell_3_signal": 1,
"cell_3_mcc": 1,
"cell_3_mnc": 1,
"cell_4_lac": 1,
"cell_4_cid": 1,
"cell_4_signal": 1,
"cell_4_mcc": 1,
"cell_4_mnc": 1,
"cell_5_lac": 1,
"cell_5_cid": 1,
"cell_5_signal": 1,
"cell_5_mcc": 1,
"cell_5_mnc": 1,
"cell_6_lac": 1,
"cell_6_cid": 1,
"cell_6_signal": 1,
"cell_6_mcc": 1,
"cell_6_mnc": 1,
"cell_7_lac": 1,
"cell_7_cid": 1,
"cell_7_signal": 1,
"cell_7_mcc": 1,
"cell_7_mnc": 1,
"frequency": 1,
"timing_advance": 1,
"latitude": "-1.111111111",
"longitude": "-1.111111111",
"error_radius": 1,
"address": "test",
"country_code": 1,
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve all
connectionsby omitting theconnection_id:
url = 'https://smartapi.bboxx.co.uk/v1/connections'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
u'total_pages': 1,
u'objects': [
{<record>},
{<record>},
{<record>},
{<record>},
{<record>},
],
u'num_results': 10,
u'page': 1
}
PUTrequests are not allowed at this endpointIf a user has
SYSTEMpermissions they can delete theconnection
url = 'https://smartapi.bboxx.co.uk/v1/connections/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.delete(url=url, headers=headers)
r
>>> <Response 204>
r.text
>>>
Note that the response from a 204 request is empty. This means that
r.json()cannot be called and will throw a JSONDecodeError. In fact the response isu''- an empty unicode string.
POST
POST requests are not allowed at this endpoint
GET
| value | |
|---|---|
| endpoint | /v1/connections or /v1/connections/<connection_id> |
| method | GET |
| url_params | connection_id (int) |
| query params | > See Query Format and Filtering |
| body | N/A |
| permissions | OVERVIEW |
| response | 200 |
PUT
PUT requests are not allowed at this endpoint
DELETE
| value | |
|---|---|
| endpoint | /v1/connections/<connection_id> |
| method | DELETE |
| url_params | connection_id (int) |
| query params | N/A |
| body | N/A |
| permissions | SYSTEM |
| response | 204 |
Default Energy Limit
Default energy_limits for each type of battery in each lifecycle state.
The default_energy_limit object
| Field | Description |
|---|---|
| default_energy_limit_id int (primary key) |
A unique integer identifier for each default_energy_limit. |
| battery_type_id int (not-null,foreign-key) |
|
| state_type_id int (not-null,foreign-key) |
|
| entity_id int (foreign-key) |
|
| energy_limit float (not-null) |
|
| max_energy_limit float (not-null) |
|
| min_energy_limit float (not-null) |
|
| created_at datetime |
timestamp that the record was created at |
| created_by text |
username of the user who created the record |
| modified_at datetime |
timestamp that the record was last modified |
| modified_by text |
user that last modified the record |
| Relationship | Description |
|---|---|
| N/A | There are no relationships for this table. |
POSTrequests are not allowed at this endpoint
GETrequests are not allowed at this endpoint
PUTrequests are not allowed at this endpoint
DELETErequests are not allowed at this endpoint
POST
POST requests are not allowed at this endpoint
### GET
GET requests are not allowed at this endpoint
PUT
PUT requests are not allowed at this endpoint
DELETE
DELETE requests are not allowed at this endpoint
Enable History
Contains a history of the enable-state of every product
The enable_history object
| Field | Description |
|---|---|
| enable_history_id int (primary key) |
A unique integer identifier for each enable_history. |
| product_imei varchar(15) (not-null,foreign-key) |
|
| prev_enable_state string |
options: ["pending_disabled", "pending_enabled", "init", "enabled", "disabled"] |
| current_enable_state string (not-null) |
options: ["pending_disabled", "pending_enabled", "init", "enabled", "disabled"] |
| user string (not-null) |
|
| date datetime (not-null) |
|
| created_at datetime |
timestamp that the record was created at |
| created_by text |
username of the user who created the record |
| modified_at datetime |
timestamp that the record was last modified |
| modified_by text |
user that last modified the record |
| Relationship | Description |
|---|---|
| sms_history | The associated sms_history |
POSTrequests are not allowed at this endpointWe can retrieve the
enable_historycreated by specifying itsenable_history_idin the request url:
url = 'https://smartapi.bboxx.co.uk/v1/enable_history/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"enable_history_id": 1
"product_imei": "000000000000000",
"prev_enable_state": "test",
"current_enable_state": "test",
"user": "test",
"date": "2000-01-01 00:00:00",
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve all
enable_historyby omitting theenable_history_id:
url = 'https://smartapi.bboxx.co.uk/v1/enable_history'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
u'total_pages': 1,
u'objects': [
{<record>},
{<record>},
{<record>},
{<record>},
{<record>},
],
u'num_results': 10,
u'page': 1
}
PUTrequests are not allowed at this endpointIf a user has
SYSTEMpermissions they can delete theenable_history
url = 'https://smartapi.bboxx.co.uk/v1/enable_history/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.delete(url=url, headers=headers)
r
>>> <Response 204>
r.text
>>>
Note that the response from a 204 request is empty. This means that
r.json()cannot be called and will throw a JSONDecodeError. In fact the response isu''- an empty unicode string.
POST
POST requests are not allowed at this endpoint
GET
| value | |
|---|---|
| endpoint | /v1/enable_history or /v1/enable_history/<enable_history_id> |
| method | GET |
| url_params | enable_history_id (int) |
| query params | > See Query Format and Filtering |
| body | N/A |
| permissions | OVERVIEW |
| response | 200 |
PUT
PUT requests are not allowed at this endpoint
DELETE
| value | |
|---|---|
| endpoint | /v1/enable_history/<enable_history_id> |
| method | DELETE |
| url_params | enable_history_id (int) |
| query params | N/A |
| body | N/A |
| permissions | SYSTEM |
| response | 204 |
Entity
Contains details of all of the entities who own BBOXX products
The entity object
| Field | Description |
|---|---|
| entity_id int (primary key) |
A unique integer identifier for each entity. |
| name string (not-null,unique) |
|
| bboxx_company_flag boolean (not-null) |
|
| tariff string |
|
| financier boolean |
|
| geic string (unique) |
|
| created_at datetime |
timestamp that the record was created at |
| created_by text |
username of the user who created the record |
| modified_at datetime |
timestamp that the record was last modified |
| modified_by text |
user that last modified the record |
| Relationship | Description |
|---|---|
| hubs | The associated hubs |
| product_entity_linker | The associated product_entity_linker |
| battery_type_energy_limits | The associated battery_type_energy_limits |
An example POST request. Note that
entity_id,created_at,modified_atandcreated_byare all handled internally by the system and need not be explicitly specified. See Meta Data for more information.
url = "https://smartapi.bboxx.co.uk/v1/entities"
data = json.dumps({
"name": "test",
"bboxx_company_flag": True,
"tariff": "test",
"financier": True,
"geic": "test",
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.post(url=url, data=data, headers=headers)
r
>>> <Response 201>
r.json()
>>> {
"entity_id": 1
"name": "test",
"bboxx_company_flag": True,
"tariff": "test",
"financier": True,
"geic": "test",
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve the
entitycreated by specifying itsentity_idin the request url:
url = 'https://smartapi.bboxx.co.uk/v1/entities/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"entity_id": 1
"name": "test",
"bboxx_company_flag": True,
"tariff": "test",
"financier": True,
"geic": "test",
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve all
entitiesby omitting theentity_id:
url = 'https://smartapi.bboxx.co.uk/v1/entities'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
u'total_pages': 1,
u'objects': [
{<record>},
{<record>},
{<record>},
{<record>},
{<record>},
],
u'num_results': 10,
u'page': 1
}
We can edit the newly created
entitywith aPUTrequest:
url = 'https://smartapi.bboxx.co.uk/v1/entities/1'
data = json.dumps({
"name": "changed",
"bboxx_company_flag": False,
"tariff": "changed",
"financier": False,
"geic": "changed",
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.put(url=url, data=data, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"entity_id": 1
"name": "changed",
"bboxx_company_flag": False,
"tariff": "changed",
"financier": False,
"geic": "changed",
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": 2016-07-07 12:34:45
}
Note that the
modified_atfield has been updated accordingly.If a user has
SYSTEMpermissions they can delete theentity
url = 'https://smartapi.bboxx.co.uk/v1/entities/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.delete(url=url, headers=headers)
r
>>> <Response 204>
r.text
>>>
Note that the response from a 204 request is empty. This means that
r.json()cannot be called and will throw a JSONDecodeError. In fact the response isu''- an empty unicode string.
POST
| value | |
|---|---|
| endpoint | /v1/entities |
| method | POST |
| url_params | N/A |
| query params | N/A |
| body | JSON-formatted dictionary with the details of the entity that you wish to create |
| permissions | SYSTEM |
| response | 201 |
GET
| value | |
|---|---|
| endpoint | /v1/entities or /v1/entities/<entity_id> |
| method | GET |
| url_params | entity_id (int) |
| query params | > See Query Format and Filtering |
| body | N/A |
| permissions | OVERVIEW |
| response | 200 |
PUT
| value | |
|---|---|
| endpoint | /v1/entities/<entity_id> |
| method | PUT |
| url_params | entity_id of the entity you wish to edit |
| query params | N/A |
| body | JSON-formatted dictionary of the columns that you wish to alter |
| permissions | SYSTEM |
| response | 200 |
DELETE
| value | |
|---|---|
| endpoint | /v1/entities/<entity_id> |
| method | DELETE |
| url_params | entity_id (int) |
| query params | N/A |
| body | N/A |
| permissions | SYSTEM |
| response | 204 |
Entity Facility Linker
Indicates which entities have access to manufacturing and repair facilities
The entity_facility_linker object
| Field | Description |
|---|---|
| entity_facility_linker_id int (primary key) |
A unique integer identifier for each entity_facility_linker. |
| entity_id int (not-null,unique,foreign-key) |
Entity identifier |
| test_jig boolean (not-null) |
Indicates whether the Entity has access to a Test Jig tool |
| test_bench boolean (not-null) |
Indicates whether the Entity has access to a Test Bench tool |
| usb_diag_tool boolean (not-null) |
Indicates whether the Entity has access to a USB Diagnostic tool |
| rework_process boolean (not-null) |
Indicates whether the Entity can use the PCB Rework process |
| created_at datetime |
timestamp that the record was created at |
| created_by text |
username of the user who created the record |
| modified_at datetime |
timestamp that the record was last modified |
| modified_by text |
user that last modified the record |
| Relationship | Description |
|---|---|
| N/A | There are no relationships for this table. |
An example POST request. Note that
entity_facility_linker_id,created_at,modified_atandcreated_byare all handled internally by the system and need not be explicitly specified. See Meta Data for more information.
url = "https://smartapi.bboxx.co.uk/v1/entity_facility_linker"
data = json.dumps({
"entity_id": 1,
"test_jig": True,
"test_bench": True,
"usb_diag_tool": True,
"rework_process": True,
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.post(url=url, data=data, headers=headers)
r
>>> <Response 201>
r.json()
>>> {
"entity_facility_linker_id": 1
"entity_id": 1,
"test_jig": True,
"test_bench": True,
"usb_diag_tool": True,
"rework_process": True,
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve the
entity_facility_linkercreated by specifying itsentity_facility_linker_idin the request url:
url = 'https://smartapi.bboxx.co.uk/v1/entity_facility_linker/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"entity_facility_linker_id": 1
"entity_id": 1,
"test_jig": True,
"test_bench": True,
"usb_diag_tool": True,
"rework_process": True,
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve all
entity_facility_linkerby omitting theentity_facility_linker_id:
url = 'https://smartapi.bboxx.co.uk/v1/entity_facility_linker'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
u'total_pages': 1,
u'objects': [
{<record>},
{<record>},
{<record>},
{<record>},
{<record>},
],
u'num_results': 10,
u'page': 1
}
We can edit the newly created
entity_facility_linkerwith aPUTrequest:
url = 'https://smartapi.bboxx.co.uk/v1/entity_facility_linker/1'
data = json.dumps({
"entity_id": 2,
"test_jig": False,
"test_bench": False,
"usb_diag_tool": False,
"rework_process": False,
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.put(url=url, data=data, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"entity_facility_linker_id": 1
"entity_id": 2,
"test_jig": False,
"test_bench": False,
"usb_diag_tool": False,
"rework_process": False,
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": 2016-07-07 12:34:45
}
Note that the
modified_atfield has been updated accordingly.If a user has
SYSTEMpermissions they can delete theentity_facility_linker
url = 'https://smartapi.bboxx.co.uk/v1/entity_facility_linker/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.delete(url=url, headers=headers)
r
>>> <Response 204>
r.text
>>>
Note that the response from a 204 request is empty. This means that
r.json()cannot be called and will throw a JSONDecodeError. In fact the response isu''- an empty unicode string.
POST
| value | |
|---|---|
| endpoint | /v1/entity_facility_linker |
| method | POST |
| url_params | N/A |
| query params | N/A |
| body | JSON-formatted dictionary with the details of the entity_facility_linker that you wish to create |
| permissions | SYSTEM |
| response | 201 |
GET
| value | |
|---|---|
| endpoint | /v1/entity_facility_linker or /v1/entity_facility_linker/<entity_facility_linker_id> |
| method | GET |
| url_params | entity_facility_linker_id (int) |
| query params | > See Query Format and Filtering |
| body | N/A |
| permissions | OVERVIEW |
| response | 200 |
PUT
| value | |
|---|---|
| endpoint | /v1/entity_facility_linker/<entity_facility_linker_id> |
| method | PUT |
| url_params | entity_facility_linker_id of the entity_facility_linker you wish to edit |
| query params | N/A |
| body | JSON-formatted dictionary of the columns that you wish to alter |
| permissions | SYSTEM |
| response | 200 |
DELETE
| value | |
|---|---|
| endpoint | /v1/entity_facility_linker/<entity_facility_linker_id> |
| method | DELETE |
| url_params | entity_facility_linker_id (int) |
| query params | N/A |
| body | N/A |
| permissions | SYSTEM |
| response | 204 |
Factory Log
Product logs from factory and repair centres. (Used to be stored in influx)
The factory_log object
| Field | Description |
|---|---|
| factory_log_id int (primary key) |
A unique integer identifier for each factory_log. |
| app_name string (not-null) |
|
| product_imei varchar(15) |
|
| repair_id int (foreign-key) |
|
| timestamp datetime (not-null) |
|
| tags unknown-type |
|
| fields unknown-type |
|
| created_at datetime |
timestamp that the record was created at |
| created_by text |
username of the user who created the record |
| modified_at datetime |
timestamp that the record was last modified |
| modified_by text |
user that last modified the record |
| Relationship | Description |
|---|---|
| N/A | There are no relationships for this table. |
An example POST request. Note that
factory_log_id,created_at,modified_atandcreated_byare all handled internally by the system and need not be explicitly specified. See Meta Data for more information.
url = "https://smartapi.bboxx.co.uk/v1/factory_logs"
data = json.dumps({
"app_name": "test",
"product_imei": "000000000000000",
"repair_id": 1,
"timestamp": "2000-01-01 00:00:00",
"tags": Unknown column type,
"fields": Unknown column type,
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.post(url=url, data=data, headers=headers)
r
>>> <Response 201>
r.json()
>>> {
"factory_log_id": 1
"app_name": "test",
"product_imei": "000000000000000",
"repair_id": 1,
"timestamp": "2000-01-01 00:00:00",
"tags": Unknown column type,
"fields": Unknown column type,
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve the
factory_logcreated by specifying itsfactory_log_idin the request url:
url = 'https://smartapi.bboxx.co.uk/v1/factory_logs/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"factory_log_id": 1
"app_name": "test",
"product_imei": "000000000000000",
"repair_id": 1,
"timestamp": "2000-01-01 00:00:00",
"tags": Unknown column type,
"fields": Unknown column type,
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve all
factory_logsby omitting thefactory_log_id:
url = 'https://smartapi.bboxx.co.uk/v1/factory_logs'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
u'total_pages': 1,
u'objects': [
{<record>},
{<record>},
{<record>},
{<record>},
{<record>},
],
u'num_results': 10,
u'page': 1
}
PUTrequests are not allowed at this endpoint
DELETErequests are not allowed at this endpoint
POST
| value | |
|---|---|
| endpoint | /v1/factory_logs |
| method | POST |
| url_params | N/A |
| query params | N/A |
| body | JSON-formatted dictionary with the details of the factory_log that you wish to create |
| permissions | SYSTEM |
| response | 201 |
GET
| value | |
|---|---|
| endpoint | /v1/factory_logs or /v1/factory_logs/<factory_log_id> |
| method | GET |
| url_params | factory_log_id (int) |
| query params | > See Query Format and Filtering |
| body | N/A |
| permissions | OVERVIEW |
| response | 200 |
PUT
PUT requests are not allowed at this endpoint
DELETE
DELETE requests are not allowed at this endpoint
Final Balance
Most recent credit_balance remaining on each DCM unit.
The final_balance object
| Field | Description |
|---|---|
| final_balance_id int (primary key) |
A unique integer identifier for each final_balance. |
| product_imei varchar(15) (not-null,foreign-key) |
|
| final_balance int (not-null) |
|
| total_added int (not-null) |
|
| zero_command_id int (not-null,foreign-key) |
|
| status string |
|
| created_at datetime |
timestamp that the record was created at |
| created_by text |
username of the user who created the record |
| modified_at datetime |
timestamp that the record was last modified |
| modified_by text |
user that last modified the record |
| Relationship | Description |
|---|---|
| N/A | There are no relationships for this table. |
POSTrequests are not allowed at this endpointWe can retrieve the
final_balancecreated by specifying itsfinal_balance_idin the request url:
url = 'https://smartapi.bboxx.co.uk/v1/final_balances/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"final_balance_id": 1
"product_imei": "000000000000000",
"final_balance": 1,
"total_added": 1,
"zero_command_id": 1,
"status": "test",
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve all
final_balancesby omitting thefinal_balance_id:
url = 'https://smartapi.bboxx.co.uk/v1/final_balances'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
u'total_pages': 1,
u'objects': [
{<record>},
{<record>},
{<record>},
{<record>},
{<record>},
],
u'num_results': 10,
u'page': 1
}
PUTrequests are not allowed at this endpoint
DELETErequests are not allowed at this endpoint
POST
POST requests are not allowed at this endpoint
GET
| value | |
|---|---|
| endpoint | /v1/final_balances or /v1/final_balances/<final_balance_id> |
| method | GET |
| url_params | final_balance_id (int) |
| query params | > See Query Format and Filtering |
| body | N/A |
| permissions | OVERVIEW |
| response | 200 |
PUT
PUT requests are not allowed at this endpoint
DELETE
DELETE requests are not allowed at this endpoint
Home2 Stock Preparation Tracking
Stores results from home2 stock preparation page.
The home2_stock_preparation_tracking object
| Field | Description |
|---|---|
| home2_stock_preparation_tracking_id int (primary key) |
A unique integer identifier for each home2_stock_preparation_tracking. |
| product_imei varchar(15) (not-null,foreign-key) |
|
| serial_number string (not-null) |
|
| activated boolean (not-null) |
|
| software_updated boolean (not-null) |
|
| temperature_check boolean (not-null) |
|
| battery_charged boolean (not-null) |
|
| recent_data boolean (not-null) |
|
| online_disable boolean (not-null) |
|
| contact_support boolean (not-null) |
|
| created_at datetime |
timestamp that the record was created at |
| created_by text |
username of the user who created the record |
| modified_at datetime |
timestamp that the record was last modified |
| modified_by text |
user that last modified the record |
| Relationship | Description |
|---|---|
| N/A | There are no relationships for this table. |
POSTrequests are not allowed at this endpoint
GETrequests are not allowed at this endpoint
PUTrequests are not allowed at this endpoint
DELETErequests are not allowed at this endpoint
POST
POST requests are not allowed at this endpoint
### GET
GET requests are not allowed at this endpoint
PUT
PUT requests are not allowed at this endpoint
DELETE
DELETE requests are not allowed at this endpoint
Hub
Contains details of all every BBOXX hub-centre (obselete)
The hub object
| Field | Description |
|---|---|
| hub_id int (primary key) |
A unique integer identifier for each hub. |
| name string (not-null,unique) |
|
| guid string (unique) |
|
| entity_id int (not-null,foreign-key) |
|
| latitude varchar(12) |
|
| longitude varchar(12) |
|
| created_at datetime |
timestamp that the record was created at |
| created_by text |
username of the user who created the record |
| modified_at datetime |
timestamp that the record was last modified |
| modified_by text |
user that last modified the record |
| Relationship | Description |
|---|---|
| products | The associated products |
| shops | The associated shops |
An example POST request. Note that
hub_id,created_at,modified_atandcreated_byare all handled internally by the system and need not be explicitly specified. See Meta Data for more information.
url = "https://smartapi.bboxx.co.uk/v1/hubs"
data = json.dumps({
"name": "test",
"guid": "test",
"entity_id": 1,
"latitude": "-1.111111111",
"longitude": "-1.111111111",
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.post(url=url, data=data, headers=headers)
r
>>> <Response 201>
r.json()
>>> {
"hub_id": 1
"name": "test",
"guid": "test",
"entity_id": 1,
"latitude": "-1.111111111",
"longitude": "-1.111111111",
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve the
hubcreated by specifying itshub_idin the request url:
url = 'https://smartapi.bboxx.co.uk/v1/hubs/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"hub_id": 1
"name": "test",
"guid": "test",
"entity_id": 1,
"latitude": "-1.111111111",
"longitude": "-1.111111111",
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve all
hubsby omitting thehub_id:
url = 'https://smartapi.bboxx.co.uk/v1/hubs'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
u'total_pages': 1,
u'objects': [
{<record>},
{<record>},
{<record>},
{<record>},
{<record>},
],
u'num_results': 10,
u'page': 1
}
We can edit the newly created
hubwith aPUTrequest:
url = 'https://smartapi.bboxx.co.uk/v1/hubs/1'
data = json.dumps({
"name": "changed",
"guid": "changed",
"entity_id": 2,
"latitude": "-9.999999999",
"longitude": "-9.999999999",
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.put(url=url, data=data, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"hub_id": 1
"name": "changed",
"guid": "changed",
"entity_id": 2,
"latitude": "-9.999999999",
"longitude": "-9.999999999",
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": 2016-07-07 12:34:45
}
Note that the
modified_atfield has been updated accordingly.If a user has
SYSTEMpermissions they can delete thehub
url = 'https://smartapi.bboxx.co.uk/v1/hubs/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.delete(url=url, headers=headers)
r
>>> <Response 204>
r.text
>>>
Note that the response from a 204 request is empty. This means that
r.json()cannot be called and will throw a JSONDecodeError. In fact the response isu''- an empty unicode string.
POST
| value | |
|---|---|
| endpoint | /v1/hubs |
| method | POST |
| url_params | N/A |
| query params | N/A |
| body | JSON-formatted dictionary with the details of the hub that you wish to create |
| permissions | SYSTEM |
| response | 201 |
GET
| value | |
|---|---|
| endpoint | /v1/hubs or /v1/hubs/<hub_id> |
| method | GET |
| url_params | hub_id (int) |
| query params | > See Query Format and Filtering |
| body | N/A |
| permissions | OVERVIEW |
| response | 200 |
PUT
| value | |
|---|---|
| endpoint | /v1/hubs/<hub_id> |
| method | PUT |
| url_params | hub_id of the hub you wish to edit |
| query params | N/A |
| body | JSON-formatted dictionary of the columns that you wish to alter |
| permissions | SYSTEM |
| response | 200 |
DELETE
| value | |
|---|---|
| endpoint | /v1/hubs/<hub_id> |
| method | DELETE |
| url_params | hub_id (int) |
| query params | N/A |
| body | N/A |
| permissions | SYSTEM |
| response | 204 |
Influx Shard Data
Record of Influx shard identifiers and timespans
The influx_shard_data object
| Field | Description |
|---|---|
| influx_shard_data_id int (primary key) |
A unique integer identifier for each influx_shard_data. |
| shard_data unknown-type |
|
| anomalies unknown-type |
|
| created_at datetime |
timestamp that the record was created at |
| created_by text |
username of the user who created the record |
| modified_at datetime |
timestamp that the record was last modified |
| modified_by text |
user that last modified the record |
| Relationship | Description |
|---|---|
| N/A | There are no relationships for this table. |
POSTrequests are not allowed at this endpoint
GETrequests are not allowed at this endpoint
PUTrequests are not allowed at this endpoint
DELETErequests are not allowed at this endpoint
POST
POST requests are not allowed at this endpoint
### GET
GET requests are not allowed at this endpoint
PUT
PUT requests are not allowed at this endpoint
DELETE
DELETE requests are not allowed at this endpoint
Latest Software
Contains details of the most recent software for each product_type
The latest_software object
| Field | Description |
|---|---|
| latest_software_id int (primary key) |
A unique integer identifier for each latest_software. |
| product_type_id int (not-null,foreign-key) |
|
| software_version_type_id int (not-null,foreign-key) |
|
| date_added datetime (not-null) |
|
| date_removed datetime |
|
| created_at datetime |
timestamp that the record was created at |
| created_by text |
username of the user who created the record |
| modified_at datetime |
timestamp that the record was last modified |
| modified_by text |
user that last modified the record |
| Relationship | Description |
|---|---|
| N/A | There are no relationships for this table. |
POSTrequests are not allowed at this endpoint
GETrequests are not allowed at this endpoint
PUTrequests are not allowed at this endpoint
DELETErequests are not allowed at this endpoint
POST
POST requests are not allowed at this endpoint
### GET
GET requests are not allowed at this endpoint
PUT
PUT requests are not allowed at this endpoint
DELETE
DELETE requests are not allowed at this endpoint
Network
A table holding the available networks that a unit might connect on.
The network object
| Field | Description |
|---|---|
| mccmnc int (primary key) |
A unique integer identifier for each network. |
| name string (not-null) |
|
| mcc int |
|
| mnc int |
|
| created_at datetime |
timestamp that the record was created at |
| created_by text |
username of the user who created the record |
| modified_at datetime |
timestamp that the record was last modified |
| modified_by text |
user that last modified the record |
| Relationship | Description |
|---|---|
| N/A | There are no relationships for this table. |
An example POST request. Note that
mccmnc,created_at,modified_atandcreated_byare all handled internally by the system and need not be explicitly specified. See Meta Data for more information.
url = "https://smartapi.bboxx.co.uk/v1/networks"
data = json.dumps({
"name": "test",
"mcc": 1,
"mnc": 1,
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.post(url=url, data=data, headers=headers)
r
>>> <Response 201>
r.json()
>>> {
"mccmnc": 1
"name": "test",
"mcc": 1,
"mnc": 1,
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve the
networkcreated by specifying itsmccmncin the request url:
url = 'https://smartapi.bboxx.co.uk/v1/networks/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"mccmnc": 1
"name": "test",
"mcc": 1,
"mnc": 1,
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve all
networksby omitting themccmnc:
url = 'https://smartapi.bboxx.co.uk/v1/networks'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
u'total_pages': 1,
u'objects': [
{<record>},
{<record>},
{<record>},
{<record>},
{<record>},
],
u'num_results': 10,
u'page': 1
}
We can edit the newly created
networkwith aPUTrequest:
url = 'https://smartapi.bboxx.co.uk/v1/networks/1'
data = json.dumps({
"name": "changed",
"mcc": 2,
"mnc": 2,
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.put(url=url, data=data, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"mccmnc": 1
"name": "changed",
"mcc": 2,
"mnc": 2,
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": 2016-07-07 12:34:45
}
Note that the
modified_atfield has been updated accordingly.If a user has
SYSTEMpermissions they can delete thenetwork
url = 'https://smartapi.bboxx.co.uk/v1/networks/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.delete(url=url, headers=headers)
r
>>> <Response 204>
r.text
>>>
Note that the response from a 204 request is empty. This means that
r.json()cannot be called and will throw a JSONDecodeError. In fact the response isu''- an empty unicode string.
POST
| value | |
|---|---|
| endpoint | /v1/networks |
| method | POST |
| url_params | N/A |
| query params | N/A |
| body | JSON-formatted dictionary with the details of the network that you wish to create |
| permissions | SYSTEM |
| response | 201 |
GET
| value | |
|---|---|
| endpoint | /v1/networks or /v1/networks/<mccmnc> |
| method | GET |
| url_params | mccmnc (int) |
| query params | > See Query Format and Filtering |
| body | N/A |
| permissions | OVERVIEW |
| response | 200 |
PUT
| value | |
|---|---|
| endpoint | /v1/networks/<mccmnc> |
| method | PUT |
| url_params | mccmnc of the network you wish to edit |
| query params | N/A |
| body | JSON-formatted dictionary of the columns that you wish to alter |
| permissions | SYSTEM |
| response | 200 |
DELETE
| value | |
|---|---|
| endpoint | /v1/networks/<mccmnc> |
| method | DELETE |
| url_params | mccmnc (int) |
| query params | N/A |
| body | N/A |
| permissions | SYSTEM |
| response | 204 |
Parameter
A table containing the values of all parameters set on all unit. Each parameter is of a particular parameter type
The parameter object
| Field | Description |
|---|---|
| parameter_id int (primary key) |
A unique integer identifier for each parameter. |
| parameter_type_id int (not-null,foreign-key) |
|
| product_imei varchar(15) (not-null,foreign-key) |
|
| value string (not-null) |
|
| date_added datetime |
|
| date_removed datetime |
|
| status string |
options: ["active", "removed", "expired", "pending"] |
| created_at datetime |
timestamp that the record was created at |
| created_by text |
username of the user who created the record |
| modified_at datetime |
timestamp that the record was last modified |
| modified_by text |
user that last modified the record |
| Relationship | Description |
|---|---|
| N/A | There are no relationships for this table. |
An example POST request. Note that
parameter_id,created_at,modified_atandcreated_byare all handled internally by the system and need not be explicitly specified. See Meta Data for more information.
url = "http://smartapi.bboxx.co.uk/v1/parameters"
data = json.dumps({
"parameter_type_id": 1,
"product_imei": "000000000000000",
"value": "test",
"date_added": "2000-01-01 00:00:00",
"date_removed": "2000-01-01 00:00:00",
"status": "test",
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.post(url=url, data=data, headers=headers)
r
>>> <Response 201>
r.json()
>>> {
"parameter_id": 1
"parameter_type_id": 1,
"product_imei": "000000000000000",
"value": "test",
"date_added": "2000-01-01 00:00:00",
"date_removed": "2000-01-01 00:00:00",
"status": "test",
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
> We can retrieve the parameter created by specifying its parameter_id in the request url:
url = 'http://smartapi.bboxx.co.uk/v1/parameters/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"parameter_id": 1
"parameter_type_id": 1,
"product_imei": "000000000000000",
"value": "test",
"date_added": "2000-01-01 00:00:00",
"date_removed": "2000-01-01 00:00:00",
"status": "test",
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve all
parametersby omitting theparameter_id:
url = 'http://smartapi.bboxx.co.uk/v1/parameters'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
u'total_pages': 1,
u'objects': [
{<record>},
{<record>},
{<record>},
{<record>},
{<record>},
],
u'num_results': 10,
u'page': 1
}
We can edit the newly created
parameterwith aPUTrequest:
url = 'http://smartapi.bboxx.co.uk/v1/parameters/1'
data = json.dumps({
"parameter_type_id": 2,
"product_imei": "999999999999999",
"value": "changed",
"date_added": "2016-07-01 12:34:45",
"date_removed": "2016-07-01 12:34:45",
"status": "changed",
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.put(url=url, data=data, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"parameter_id": 1
"parameter_type_id": 2,
"product_imei": "999999999999999",
"value": "changed",
"date_added": "2016-07-01 12:34:45",
"date_removed": "2016-07-01 12:34:45",
"status": "changed",
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": 2016-07-07 12:34:45
}
Note that the
modified_atfield has been updated accordingly.If a user has
SYSTEMpermissions they can delete theparameter
url = 'http://smartapi.bboxx.co.uk/v1/parameters/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.delete(url=url, headers=headers)
r
>>> <Response 204>
r.text
>>>
Note that the response from a 204 request is empty. This means that
r.json()cannot be called and will throw a JSONDecodeError. In fact the response isu''- an empty unicode string.
POST
| value | |
|---|---|
| endpoint | /v1/parameters |
| method | POST |
| url_params | N/A |
| query params | N/A |
| body | JSON-formatted dictionary with the details of the parameter that you wish to create |
| permissions | SYSTEM |
| response | 201 |
GET
| value | |
|---|---|
| endpoint | /v1/parameters or /v1/parameters/<parameter_id> |
| method | GET |
| url_params | parameter_id (int) |
| query params | > See Query Format and Filtering |
| body | N/A |
| permissions | OVERVIEW |
| response | 200 |
PUT
| value | |
|---|---|
| endpoint | /v1/parameters/<parameter_id> |
| method | PUT |
| url_params | parameter_id of the parameter you wish to edit |
| query params | N/A |
| body | JSON-formatted dictionary of the columns that you wish to alter |
| permissions | SYSTEM |
| response | 200 |
DELETE
| value | |
|---|---|
| endpoint | /v1/parameters/<parameter_id> |
| method | DELETE |
| url_params | parameter_id (int) |
| query params | N/A |
| body | N/A |
| permissions | SYSTEM |
| response | 204 |
Parameter Type
A table of the possible types of Parameter that may be set. Each ParameterType is linked to oneor more ProductTypes.
The parameter_type object
| Field | Description |
|---|---|
| parameter_type_id int (primary key) |
A unique integer identifier for each parameter_type. |
| name string (not-null,unique) |
|
| data_type string (not-null) |
options: ["float", "datetime", "int", "string", "bool"] |
| validation_rules unknown-type |
|
| description string |
|
| units string |
|
| repeatable boolean (not-null) |
|
| setting boolean (not-null) |
|
| created_at datetime |
timestamp that the record was created at |
| created_by text |
username of the user who created the record |
| modified_at datetime |
timestamp that the record was last modified |
| modified_by text |
user that last modified the record |
| Relationship | Description |
|---|---|
| product_parameters | The associated product_parameters |
An example POST request. Note that
parameter_type_id,created_at,modified_atandcreated_byare all handled internally by the system and need not be explicitly specified. See Meta Data for more information.
url = "https://smartapi.bboxx.co.uk/v1/parameter_types"
data = json.dumps({
"name": "test",
"data_type": "test",
"validation_rules": Unknown column type,
"description": "test",
"units": "test",
"repeatable": True,
"setting": True,
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.post(url=url, data=data, headers=headers)
r
>>> <Response 201>
r.json()
>>> {
"parameter_type_id": 1
"name": "test",
"data_type": "test",
"validation_rules": Unknown column type,
"description": "test",
"units": "test",
"repeatable": True,
"setting": True,
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve the
parameter_typecreated by specifying itsparameter_type_idin the request url:
url = 'https://smartapi.bboxx.co.uk/v1/parameter_types/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"parameter_type_id": 1
"name": "test",
"data_type": "test",
"validation_rules": Unknown column type,
"description": "test",
"units": "test",
"repeatable": True,
"setting": True,
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve all
parameter_typesby omitting theparameter_type_id:
url = 'https://smartapi.bboxx.co.uk/v1/parameter_types'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
u'total_pages': 1,
u'objects': [
{<record>},
{<record>},
{<record>},
{<record>},
{<record>},
],
u'num_results': 10,
u'page': 1
}
We can edit the newly created
parameter_typewith aPUTrequest:
url = 'https://smartapi.bboxx.co.uk/v1/parameter_types/1'
data = json.dumps({
"name": "changed",
"data_type": "changed",
"validation_rules": Unknown column type,
"description": "changed",
"units": "changed",
"repeatable": False,
"setting": False,
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.put(url=url, data=data, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"parameter_type_id": 1
"name": "changed",
"data_type": "changed",
"validation_rules": Unknown column type,
"description": "changed",
"units": "changed",
"repeatable": False,
"setting": False,
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": 2016-07-07 12:34:45
}
Note that the
modified_atfield has been updated accordingly.If a user has
SYSTEMpermissions they can delete theparameter_type
url = 'https://smartapi.bboxx.co.uk/v1/parameter_types/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.delete(url=url, headers=headers)
r
>>> <Response 204>
r.text
>>>
Note that the response from a 204 request is empty. This means that
r.json()cannot be called and will throw a JSONDecodeError. In fact the response isu''- an empty unicode string.
POST
| value | |
|---|---|
| endpoint | /v1/parameter_types |
| method | POST |
| url_params | N/A |
| query params | N/A |
| body | JSON-formatted dictionary with the details of the parameter_type that you wish to create |
| permissions | SYSTEM |
| response | 201 |
GET
| value | |
|---|---|
| endpoint | /v1/parameter_types or /v1/parameter_types/<parameter_type_id> |
| method | GET |
| url_params | parameter_type_id (int) |
| query params | > See Query Format and Filtering |
| body | N/A |
| permissions | OVERVIEW |
| response | 200 |
PUT
| value | |
|---|---|
| endpoint | /v1/parameter_types/<parameter_type_id> |
| method | PUT |
| url_params | parameter_type_id of the parameter_type you wish to edit |
| query params | N/A |
| body | JSON-formatted dictionary of the columns that you wish to alter |
| permissions | SYSTEM |
| response | 200 |
DELETE
| value | |
|---|---|
| endpoint | /v1/parameter_types/<parameter_type_id> |
| method | DELETE |
| url_params | parameter_type_id (int) |
| query params | N/A |
| body | N/A |
| permissions | SYSTEM |
| response | 204 |
Part Product Linker
Specifies which parts are associated with which product.Includes a history of which product each part is associated with.Includes the repair during which the new part was added and what it replaced.
The part_product_linker object
| Field | Description |
|---|---|
| part_product_linker_id int (primary key) |
A unique integer identifier for each part_product_linker. |
| part_id int (not-null,foreign-key) |
|
| product_imei varchar(15) (not-null,foreign-key) |
|
| date_added datetime |
|
| date_removed datetime |
|
| added_repair_id int (foreign-key) |
|
| removed_repair_id int (foreign-key) |
|
| replaced_part_id int (foreign-key) |
|
| created_at datetime |
timestamp that the record was created at |
| created_by text |
username of the user who created the record |
| modified_at datetime |
timestamp that the record was last modified |
| modified_by text |
user that last modified the record |
| Relationship | Description |
|---|---|
| N/A | There are no relationships for this table. |
POSTrequests are not allowed at this endpointWe can retrieve the
part_product_linkercreated by specifying itspart_product_linker_idin the request url:
url = 'https://smartapi.bboxx.co.uk/v1/part_product_linker/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"part_product_linker_id": 1
"part_id": 1,
"product_imei": "000000000000000",
"date_added": "2000-01-01 00:00:00",
"date_removed": "2000-01-01 00:00:00",
"added_repair_id": 1,
"removed_repair_id": 1,
"replaced_part_id": 1,
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve all
part_product_linkerby omitting thepart_product_linker_id:
url = 'https://smartapi.bboxx.co.uk/v1/part_product_linker'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
u'total_pages': 1,
u'objects': [
{<record>},
{<record>},
{<record>},
{<record>},
{<record>},
],
u'num_results': 10,
u'page': 1
}
We can edit the newly created
part_product_linkerwith aPUTrequest:
url = 'https://smartapi.bboxx.co.uk/v1/part_product_linker/1'
data = json.dumps({
"part_id": 2,
"product_imei": "999999999999999",
"date_added": "2016-07-01 12:34:45",
"date_removed": "2016-07-01 12:34:45",
"added_repair_id": 2,
"removed_repair_id": 2,
"replaced_part_id": 2,
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.put(url=url, data=data, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"part_product_linker_id": 1
"part_id": 2,
"product_imei": "999999999999999",
"date_added": "2016-07-01 12:34:45",
"date_removed": "2016-07-01 12:34:45",
"added_repair_id": 2,
"removed_repair_id": 2,
"replaced_part_id": 2,
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": 2016-07-07 12:34:45
}
Note that the
modified_atfield has been updated accordingly.If a user has
SYSTEMpermissions they can delete thepart_product_linker
url = 'https://smartapi.bboxx.co.uk/v1/part_product_linker/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.delete(url=url, headers=headers)
r
>>> <Response 204>
r.text
>>>
Note that the response from a 204 request is empty. This means that
r.json()cannot be called and will throw a JSONDecodeError. In fact the response isu''- an empty unicode string.
POST
POST requests are not allowed at this endpoint
GET
| value | |
|---|---|
| endpoint | /v1/part_product_linker or /v1/part_product_linker/<part_product_linker_id> |
| method | GET |
| url_params | part_product_linker_id (int) |
| query params | > See Query Format and Filtering |
| body | N/A |
| permissions | OVERVIEW |
| response | 200 |
PUT
| value | |
|---|---|
| endpoint | /v1/part_product_linker/<part_product_linker_id> |
| method | PUT |
| url_params | part_product_linker_id of the part_product_linker you wish to edit |
| query params | N/A |
| body | JSON-formatted dictionary of the columns that you wish to alter |
| permissions | SYSTEM |
| response | 200 |
DELETE
| value | |
|---|---|
| endpoint | /v1/part_product_linker/<part_product_linker_id> |
| method | DELETE |
| url_params | part_product_linker_id (int) |
| query params | N/A |
| body | N/A |
| permissions | SYSTEM |
| response | 204 |
Part
Contains details of all of the parts in each BBOXX product.
The part object
| Field | Description |
|---|---|
| part_id int (primary key) |
A unique integer identifier for each part. |
| serial_number string (unique) |
|
| part_type_id int (not-null,foreign-key) |
|
| properties unknown-type |
|
| manufacturer string |
|
| created_at datetime |
timestamp that the record was created at |
| created_by text |
username of the user who created the record |
| modified_at datetime |
timestamp that the record was last modified |
| modified_by text |
user that last modified the record |
| Relationship | Description |
|---|---|
| part_product_linker | The associated part_product_linker |
An example POST request. Note that
part_id,created_at,modified_atandcreated_byare all handled internally by the system and need not be explicitly specified. See Meta Data for more information.
url = "https://smartapi.bboxx.co.uk/v1/parts"
data = json.dumps({
"serial_number": "test",
"part_type_id": 1,
"properties": Unknown column type,
"manufacturer": "test",
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.post(url=url, data=data, headers=headers)
r
>>> <Response 201>
r.json()
>>> {
"part_id": 1
"serial_number": "test",
"part_type_id": 1,
"properties": Unknown column type,
"manufacturer": "test",
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve the
partcreated by specifying itspart_idin the request url:
url = 'https://smartapi.bboxx.co.uk/v1/parts/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"part_id": 1
"serial_number": "test",
"part_type_id": 1,
"properties": Unknown column type,
"manufacturer": "test",
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve all
partsby omitting thepart_id:
url = 'https://smartapi.bboxx.co.uk/v1/parts'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
u'total_pages': 1,
u'objects': [
{<record>},
{<record>},
{<record>},
{<record>},
{<record>},
],
u'num_results': 10,
u'page': 1
}
We can edit the newly created
partwith aPUTrequest:
url = 'https://smartapi.bboxx.co.uk/v1/parts/1'
data = json.dumps({
"serial_number": "changed",
"part_type_id": 2,
"properties": Unknown column type,
"manufacturer": "changed",
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.put(url=url, data=data, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"part_id": 1
"serial_number": "changed",
"part_type_id": 2,
"properties": Unknown column type,
"manufacturer": "changed",
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": 2016-07-07 12:34:45
}
Note that the
modified_atfield has been updated accordingly.If a user has
SYSTEMpermissions they can delete thepart
url = 'https://smartapi.bboxx.co.uk/v1/parts/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.delete(url=url, headers=headers)
r
>>> <Response 204>
r.text
>>>
Note that the response from a 204 request is empty. This means that
r.json()cannot be called and will throw a JSONDecodeError. In fact the response isu''- an empty unicode string.
POST
| value | |
|---|---|
| endpoint | /v1/parts |
| method | POST |
| url_params | N/A |
| query params | N/A |
| body | JSON-formatted dictionary with the details of the part that you wish to create |
| permissions | SYSTEM |
| response | 201 |
GET
| value | |
|---|---|
| endpoint | /v1/parts or /v1/parts/<part_id> |
| method | GET |
| url_params | part_id (int) |
| query params | > See Query Format and Filtering |
| body | N/A |
| permissions | OVERVIEW |
| response | 200 |
PUT
| value | |
|---|---|
| endpoint | /v1/parts/<part_id> |
| method | PUT |
| url_params | part_id of the part you wish to edit |
| query params | N/A |
| body | JSON-formatted dictionary of the columns that you wish to alter |
| permissions | SYSTEM |
| response | 200 |
DELETE
| value | |
|---|---|
| endpoint | /v1/parts/<part_id> |
| method | DELETE |
| url_params | part_id (int) |
| query params | N/A |
| body | N/A |
| permissions | SYSTEM |
| response | 204 |
Part Type Category
The category of parts that each part_type belongs to
The part_type_category object
| Field | Description |
|---|---|
| part_type_category_id int (primary key) |
A unique integer identifier for each part_type_category. |
| name string (not-null,unique) |
|
| created_at datetime |
timestamp that the record was created at |
| created_by text |
username of the user who created the record |
| modified_at datetime |
timestamp that the record was last modified |
| modified_by text |
user that last modified the record |
| Relationship | Description |
|---|---|
| part_types | The associated part_types |
An example POST request. Note that
part_type_category_id,created_at,modified_atandcreated_byare all handled internally by the system and need not be explicitly specified. See Meta Data for more information.
url = "https://smartapi.bboxx.co.uk/v1/part_type_categories"
data = json.dumps({
"name": "test",
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.post(url=url, data=data, headers=headers)
r
>>> <Response 201>
r.json()
>>> {
"part_type_category_id": 1
"name": "test",
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve the
part_type_categorycreated by specifying itspart_type_category_idin the request url:
url = 'https://smartapi.bboxx.co.uk/v1/part_type_categories/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"part_type_category_id": 1
"name": "test",
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve all
part_type_categoriesby omitting thepart_type_category_id:
url = 'https://smartapi.bboxx.co.uk/v1/part_type_categories'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
u'total_pages': 1,
u'objects': [
{<record>},
{<record>},
{<record>},
{<record>},
{<record>},
],
u'num_results': 10,
u'page': 1
}
We can edit the newly created
part_type_categorywith aPUTrequest:
url = 'https://smartapi.bboxx.co.uk/v1/part_type_categories/1'
data = json.dumps({
"name": "changed",
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.put(url=url, data=data, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"part_type_category_id": 1
"name": "changed",
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": 2016-07-07 12:34:45
}
Note that the
modified_atfield has been updated accordingly.If a user has
SYSTEMpermissions they can delete thepart_type_category
url = 'https://smartapi.bboxx.co.uk/v1/part_type_categories/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.delete(url=url, headers=headers)
r
>>> <Response 204>
r.text
>>>
Note that the response from a 204 request is empty. This means that
r.json()cannot be called and will throw a JSONDecodeError. In fact the response isu''- an empty unicode string.
POST
| value | |
|---|---|
| endpoint | /v1/part_type_categories |
| method | POST |
| url_params | N/A |
| query params | N/A |
| body | JSON-formatted dictionary with the details of the part_type_category that you wish to create |
| permissions | SYSTEM |
| response | 201 |
GET
| value | |
|---|---|
| endpoint | /v1/part_type_categories or /v1/part_type_categories/<part_type_category_id> |
| method | GET |
| url_params | part_type_category_id (int) |
| query params | > See Query Format and Filtering |
| body | N/A |
| permissions | OVERVIEW |
| response | 200 |
PUT
| value | |
|---|---|
| endpoint | /v1/part_type_categories/<part_type_category_id> |
| method | PUT |
| url_params | part_type_category_id of the part_type_category you wish to edit |
| query params | N/A |
| body | JSON-formatted dictionary of the columns that you wish to alter |
| permissions | SYSTEM |
| response | 200 |
DELETE
| value | |
|---|---|
| endpoint | /v1/part_type_categories/<part_type_category_id> |
| method | DELETE |
| url_params | part_type_category_id (int) |
| query params | N/A |
| body | N/A |
| permissions | SYSTEM |
| response | 204 |
Part Type Product Type Linker
Specifies which part_types are allowed to be linked to which product_types.
The part_type_product_type_linker object
| Field | Description |
|---|---|
| part_type_product_type_linker_id int (primary key) |
A unique integer identifier for each part_type_product_type_linker. |
| product_type_id int (not-null,foreign-key) |
|
| part_type_id int (not-null,foreign-key) |
|
| created_at datetime |
timestamp that the record was created at |
| created_by text |
username of the user who created the record |
| modified_at datetime |
timestamp that the record was last modified |
| modified_by text |
user that last modified the record |
| Relationship | Description |
|---|---|
| N/A | There are no relationships for this table. |
An example POST request. Note that
part_type_product_type_linker_id,created_at,modified_atandcreated_byare all handled internally by the system and need not be explicitly specified. See Meta Data for more information.
url = "http://smartapi.bboxx.co.uk/v1/part_type_product_type_linker"
data = json.dumps({
"product_type_id": 1,
"part_type_id": 1,
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.post(url=url, data=data, headers=headers)
r
>>> <Response 201>
r.json()
>>> {
"part_type_product_type_linker_id": 1
"product_type_id": 1,
"part_type_id": 1,
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
> We can retrieve the part_type_product_type_linker created by specifying its part_type_product_type_linker_id in the request url:
url = 'http://smartapi.bboxx.co.uk/v1/part_type_product_type_linker/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"part_type_product_type_linker_id": 1
"product_type_id": 1,
"part_type_id": 1,
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve all
part_type_product_type_linkerby omitting thepart_type_product_type_linker_id:
url = 'http://smartapi.bboxx.co.uk/v1/part_type_product_type_linker'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
u'total_pages': 1,
u'objects': [
{<record>},
{<record>},
{<record>},
{<record>},
{<record>},
],
u'num_results': 10,
u'page': 1
}
We can edit the newly created
part_type_product_type_linkerwith aPUTrequest:
url = 'http://smartapi.bboxx.co.uk/v1/part_type_product_type_linker/1'
data = json.dumps({
"product_type_id": 2,
"part_type_id": 2,
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.put(url=url, data=data, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"part_type_product_type_linker_id": 1
"product_type_id": 2,
"part_type_id": 2,
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": 2016-07-07 12:34:45
}
Note that the
modified_atfield has been updated accordingly.If a user has
SYSTEMpermissions they can delete thepart_type_product_type_linker
url = 'http://smartapi.bboxx.co.uk/v1/part_type_product_type_linker/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.delete(url=url, headers=headers)
r
>>> <Response 204>
r.text
>>>
Note that the response from a 204 request is empty. This means that
r.json()cannot be called and will throw a JSONDecodeError. In fact the response isu''- an empty unicode string.
POST
| value | |
|---|---|
| endpoint | /v1/part_type_product_type_linker |
| method | POST |
| url_params | N/A |
| query params | N/A |
| body | JSON-formatted dictionary with the details of the part_type_product_type_linker that you wish to create |
| permissions | SYSTEM |
| response | 201 |
GET
| value | |
|---|---|
| endpoint | /v1/part_type_product_type_linker or /v1/part_type_product_type_linker/<part_type_product_type_linker_id> |
| method | GET |
| url_params | part_type_product_type_linker_id (int) |
| query params | > See Query Format and Filtering |
| body | N/A |
| permissions | OVERVIEW |
| response | 200 |
PUT
| value | |
|---|---|
| endpoint | /v1/part_type_product_type_linker/<part_type_product_type_linker_id> |
| method | PUT |
| url_params | part_type_product_type_linker_id of the part_type_product_type_linker you wish to edit |
| query params | N/A |
| body | JSON-formatted dictionary of the columns that you wish to alter |
| permissions | SYSTEM |
| response | 200 |
DELETE
| value | |
|---|---|
| endpoint | /v1/part_type_product_type_linker/<part_type_product_type_linker_id> |
| method | DELETE |
| url_params | part_type_product_type_linker_id (int) |
| query params | N/A |
| body | N/A |
| permissions | SYSTEM |
| response | 204 |
Part Type Replacement Linker
Specifies which parts can replace which other parts.This table can be used to generate list of possible parts for each product_type.
The part_type_replacement_linker object
| Field | Description |
|---|---|
| part_type_replacement_linker_id int (primary key) |
A unique integer identifier for each part_type_replacement_linker. |
| product_type_id int (foreign-key) |
|
| existing_part_type_id int (not-null,foreign-key) |
|
| replacement_part_type_id int (not-null,foreign-key) |
|
| default_part_type boolean (not-null) |
|
| critical_part_type boolean (not-null) |
|
| non_transferable boolean (not-null) |
|
| created_at datetime |
timestamp that the record was created at |
| created_by text |
username of the user who created the record |
| modified_at datetime |
timestamp that the record was last modified |
| modified_by text |
user that last modified the record |
| Relationship | Description |
|---|---|
| N/A | There are no relationships for this table. |
An example POST request. Note that
part_type_replacement_linker_id,created_at,modified_atandcreated_byare all handled internally by the system and need not be explicitly specified. See Meta Data for more information.
url = "https://smartapi.bboxx.co.uk/v1/part_type_replacement_linker"
data = json.dumps({
"product_type_id": 1,
"existing_part_type_id": 1,
"replacement_part_type_id": 1,
"default_part_type": True,
"critical_part_type": True,
"non_transferable": True,
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.post(url=url, data=data, headers=headers)
r
>>> <Response 201>
r.json()
>>> {
"part_type_replacement_linker_id": 1
"product_type_id": 1,
"existing_part_type_id": 1,
"replacement_part_type_id": 1,
"default_part_type": True,
"critical_part_type": True,
"non_transferable": True,
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve the
part_type_replacement_linkercreated by specifying itspart_type_replacement_linker_idin the request url:
url = 'https://smartapi.bboxx.co.uk/v1/part_type_replacement_linker/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"part_type_replacement_linker_id": 1
"product_type_id": 1,
"existing_part_type_id": 1,
"replacement_part_type_id": 1,
"default_part_type": True,
"critical_part_type": True,
"non_transferable": True,
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve all
part_type_replacement_linkerby omitting thepart_type_replacement_linker_id:
url = 'https://smartapi.bboxx.co.uk/v1/part_type_replacement_linker'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
u'total_pages': 1,
u'objects': [
{<record>},
{<record>},
{<record>},
{<record>},
{<record>},
],
u'num_results': 10,
u'page': 1
}
We can edit the newly created
part_type_replacement_linkerwith aPUTrequest:
url = 'https://smartapi.bboxx.co.uk/v1/part_type_replacement_linker/1'
data = json.dumps({
"product_type_id": 2,
"existing_part_type_id": 2,
"replacement_part_type_id": 2,
"default_part_type": False,
"critical_part_type": False,
"non_transferable": False,
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.put(url=url, data=data, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"part_type_replacement_linker_id": 1
"product_type_id": 2,
"existing_part_type_id": 2,
"replacement_part_type_id": 2,
"default_part_type": False,
"critical_part_type": False,
"non_transferable": False,
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": 2016-07-07 12:34:45
}
Note that the
modified_atfield has been updated accordingly.If a user has
SYSTEMpermissions they can delete thepart_type_replacement_linker
url = 'https://smartapi.bboxx.co.uk/v1/part_type_replacement_linker/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.delete(url=url, headers=headers)
r
>>> <Response 204>
r.text
>>>
Note that the response from a 204 request is empty. This means that
r.json()cannot be called and will throw a JSONDecodeError. In fact the response isu''- an empty unicode string.
POST
| value | |
|---|---|
| endpoint | /v1/part_type_replacement_linker |
| method | POST |
| url_params | N/A |
| query params | N/A |
| body | JSON-formatted dictionary with the details of the part_type_replacement_linker that you wish to create |
| permissions | SYSTEM |
| response | 201 |
GET
| value | |
|---|---|
| endpoint | /v1/part_type_replacement_linker or /v1/part_type_replacement_linker/<part_type_replacement_linker_id> |
| method | GET |
| url_params | part_type_replacement_linker_id (int) |
| query params | > See Query Format and Filtering |
| body | N/A |
| permissions | OVERVIEW |
| response | 200 |
PUT
| value | |
|---|---|
| endpoint | /v1/part_type_replacement_linker/<part_type_replacement_linker_id> |
| method | PUT |
| url_params | part_type_replacement_linker_id of the part_type_replacement_linker you wish to edit |
| query params | N/A |
| body | JSON-formatted dictionary of the columns that you wish to alter |
| permissions | SYSTEM |
| response | 200 |
DELETE
| value | |
|---|---|
| endpoint | /v1/part_type_replacement_linker/<part_type_replacement_linker_id> |
| method | DELETE |
| url_params | part_type_replacement_linker_id (int) |
| query params | N/A |
| body | N/A |
| permissions | SYSTEM |
| response | 204 |
Part Type
Lists the available part types
The part_type object
| Field | Description |
|---|---|
| part_type_id int (primary key) |
A unique integer identifier for each part_type. |
| name string (not-null,unique) |
|
| description string |
|
| erp_code unknown-type |
|
| part_type_category_id int (not-null,foreign-key) |
|
| serial_number_category string (not-null) |
options: ["known", "hidden", "unknown"] |
| parameter_types array |
|
| part_type_metadata_validator string |
|
| is_sent_by_unit boolean |
|
| created_at datetime |
timestamp that the record was created at |
| created_by text |
username of the user who created the record |
| modified_at datetime |
timestamp that the record was last modified |
| modified_by text |
user that last modified the record |
| Relationship | Description |
|---|---|
| parts | The associated parts |
| old_part_type_linkers | The associated old_part_type_linkers |
| new_part_type_linkers | The associated new_part_type_linkers |
| replacements | The associated replacements |
| existings | The associated existings |
| default_energy_limits | The associated default_energy_limits |
An example POST request. Note that
part_type_id,created_at,modified_atandcreated_byare all handled internally by the system and need not be explicitly specified. See Meta Data for more information.
url = "https://smartapi.bboxx.co.uk/v1/part_types"
data = json.dumps({
"name": "test",
"description": "test",
"erp_code": Unknown column type,
"part_type_category_id": 1,
"serial_number_category": "test",
"parameter_types": [1,2,3],
"part_type_metadata_validator": "test",
"is_sent_by_unit": True,
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.post(url=url, data=data, headers=headers)
r
>>> <Response 201>
r.json()
>>> {
"part_type_id": 1
"name": "test",
"description": "test",
"erp_code": Unknown column type,
"part_type_category_id": 1,
"serial_number_category": "test",
"parameter_types": [1,2,3],
"part_type_metadata_validator": "test",
"is_sent_by_unit": True,
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve the
part_typecreated by specifying itspart_type_idin the request url:
url = 'https://smartapi.bboxx.co.uk/v1/part_types/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"part_type_id": 1
"name": "test",
"description": "test",
"erp_code": Unknown column type,
"part_type_category_id": 1,
"serial_number_category": "test",
"parameter_types": [1,2,3],
"part_type_metadata_validator": "test",
"is_sent_by_unit": True,
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve all
part_typesby omitting thepart_type_id:
url = 'https://smartapi.bboxx.co.uk/v1/part_types'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
u'total_pages': 1,
u'objects': [
{<record>},
{<record>},
{<record>},
{<record>},
{<record>},
],
u'num_results': 10,
u'page': 1
}
We can edit the newly created
part_typewith aPUTrequest:
url = 'https://smartapi.bboxx.co.uk/v1/part_types/1'
data = json.dumps({
"name": "changed",
"description": "changed",
"erp_code": Unknown column type,
"part_type_category_id": 2,
"serial_number_category": "changed",
"parameter_types": [1,2,3,4,5,6],
"part_type_metadata_validator": "changed",
"is_sent_by_unit": False,
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.put(url=url, data=data, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"part_type_id": 1
"name": "changed",
"description": "changed",
"erp_code": Unknown column type,
"part_type_category_id": 2,
"serial_number_category": "changed",
"parameter_types": [1,2,3,4,5,6],
"part_type_metadata_validator": "changed",
"is_sent_by_unit": False,
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": 2016-07-07 12:34:45
}
Note that the
modified_atfield has been updated accordingly.If a user has
SYSTEMpermissions they can delete thepart_type
url = 'https://smartapi.bboxx.co.uk/v1/part_types/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.delete(url=url, headers=headers)
r
>>> <Response 204>
r.text
>>>
Note that the response from a 204 request is empty. This means that
r.json()cannot be called and will throw a JSONDecodeError. In fact the response isu''- an empty unicode string.
POST
| value | |
|---|---|
| endpoint | /v1/part_types |
| method | POST |
| url_params | N/A |
| query params | N/A |
| body | JSON-formatted dictionary with the details of the part_type that you wish to create |
| permissions | SYSTEM |
| response | 201 |
GET
| value | |
|---|---|
| endpoint | /v1/part_types or /v1/part_types/<part_type_id> |
| method | GET |
| url_params | part_type_id (int) |
| query params | > See Query Format and Filtering |
| body | N/A |
| permissions | OVERVIEW |
| response | 200 |
PUT
| value | |
|---|---|
| endpoint | /v1/part_types/<part_type_id> |
| method | PUT |
| url_params | part_type_id of the part_type you wish to edit |
| query params | N/A |
| body | JSON-formatted dictionary of the columns that you wish to alter |
| permissions | SYSTEM |
| response | 200 |
DELETE
| value | |
|---|---|
| endpoint | /v1/part_types/<part_type_id> |
| method | DELETE |
| url_params | part_type_id (int) |
| query params | N/A |
| body | N/A |
| permissions | SYSTEM |
| response | 204 |
Payment Command
PaymentCommands received and then forwarded sent to the unit.
The payment_command object
| Field | Description |
|---|---|
| payment_command_id int (primary key) |
A unique integer identifier for each payment_command. |
| product_imei varchar(15) (not-null,foreign-key) |
|
| value int (not-null) |
|
| category string (not-null) |
options: ["payment", "bad-payment", "zero-command", "force-reset"] |
| void boolean (not-null) |
|
| status string |
|
| transaction_id string (not-null,unique) |
|
| created_at datetime |
timestamp that the record was created at |
| created_by text |
username of the user who created the record |
| modified_at datetime |
timestamp that the record was last modified |
| modified_by text |
user that last modified the record |
| Relationship | Description |
|---|---|
| final_balance | The associated final_balance |
POSTrequests are not allowed at this endpointWe can retrieve the
payment_commandcreated by specifying itspayment_command_idin the request url:
url = 'https://smartapi.bboxx.co.uk/v1/payment_commands/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"payment_command_id": 1
"product_imei": "000000000000000",
"value": 1,
"category": "test",
"void": True,
"status": "test",
"transaction_id": "test",
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve all
payment_commandsby omitting thepayment_command_id:
url = 'https://smartapi.bboxx.co.uk/v1/payment_commands'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
u'total_pages': 1,
u'objects': [
{<record>},
{<record>},
{<record>},
{<record>},
{<record>},
],
u'num_results': 10,
u'page': 1
}
PUTrequests are not allowed at this endpoint
DELETErequests are not allowed at this endpoint
POST
POST requests are not allowed at this endpoint
GET
| value | |
|---|---|
| endpoint | /v1/payment_commands or /v1/payment_commands/<payment_command_id> |
| method | GET |
| url_params | payment_command_id (int) |
| query params | > See Query Format and Filtering |
| body | N/A |
| permissions | OVERVIEW |
| response | 200 |
PUT
PUT requests are not allowed at this endpoint
DELETE
DELETE requests are not allowed at this endpoint
/products/<imei>/balance_and_pending_payments
Description
A
GETrequest to this endpoint will return the balance, expected expiry and pending payment commands associated with that unit.
url = "https://smartapi.bboxx.co.uk/v1/products/000000000000/balance_and_pending_payments"
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=' + A_VALID_TOKEN}
r = requests.get(url=url, headers=headers)
print(r.json())
>>>{
"status": "success",
"message": "Balance and pending credits.",
"data": {
"balance": 432000,
"expected_expiry": "2020-11-06T07:07:45.796359",
"pending_payment_commands": [
{
"category": "force-reset",
"created_at": "2020-11-06T07:07:45.742314",
"modified_at": "2020-11-06T07:07:45.742314",
"value": 0
},
{
"category": "zero-command",
"created_at": "2020-11-06T07:02:44.906775",
"modified_at": "2020-11-06T07:07:45.742314",
"value": 0
},
{
"category": "payment",
"created_at": "2020-10-29T12:40:49.443969",
"modified_at": "2020-11-06T07:07:45.742314",
"value": 2592000
}
]
}
}
A GET request to this endpoint will return:
- The remaining balance (in seconds) present on the unit
- The expected expiry of the balance
- The pending payment commands along with category, value, created_at and modified_at
Endpoint
| value | |
|---|---|
| endpoint | /products/<imei>/balance_and_pending_payments |
| method | GET |
| url_params | product_imei (str) |
| payload | None |
| response | 200 |
| __permissions | OVERVIEW |
Product Note
Table of notes about each product
The product_note object
| Field | Description |
|---|---|
| product_note_id int (primary key) |
A unique integer identifier for each product_note. |
| note_text string (not-null) |
|
| product_imei string (not-null,foreign-key) |
|
| created_at datetime |
timestamp that the record was created at |
| created_by text |
username of the user who created the record |
| modified_at datetime |
timestamp that the record was last modified |
| modified_by text |
user that last modified the record |
| Relationship | Description |
|---|---|
| N/A | There are no relationships for this table. |
An example POST request. Note that
product_note_id,created_at,modified_atandcreated_byare all handled internally by the system and need not be explicitly specified. See Meta Data for more information.
url = "https://smartapi.bboxx.co.uk/v1/product_notes"
data = json.dumps({
"note_text": "test",
"product_imei": "test",
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.post(url=url, data=data, headers=headers)
r
>>> <Response 201>
r.json()
>>> {
"product_note_id": 1
"note_text": "test",
"product_imei": "test",
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve the
product_notecreated by specifying itsproduct_note_idin the request url:
url = 'https://smartapi.bboxx.co.uk/v1/product_notes/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"product_note_id": 1
"note_text": "test",
"product_imei": "test",
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve all
product_notesby omitting theproduct_note_id:
url = 'https://smartapi.bboxx.co.uk/v1/product_notes'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
u'total_pages': 1,
u'objects': [
{<record>},
{<record>},
{<record>},
{<record>},
{<record>},
],
u'num_results': 10,
u'page': 1
}
We can edit the newly created
product_notewith aPUTrequest:
url = 'https://smartapi.bboxx.co.uk/v1/product_notes/1'
data = json.dumps({
"note_text": "changed",
"product_imei": "changed",
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.put(url=url, data=data, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"product_note_id": 1
"note_text": "changed",
"product_imei": "changed",
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": 2016-07-07 12:34:45
}
Note that the
modified_atfield has been updated accordingly.If a user has
SYSTEMpermissions they can delete theproduct_note
url = 'https://smartapi.bboxx.co.uk/v1/product_notes/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.delete(url=url, headers=headers)
r
>>> <Response 204>
r.text
>>>
Note that the response from a 204 request is empty. This means that
r.json()cannot be called and will throw a JSONDecodeError. In fact the response isu''- an empty unicode string.
POST
| value | |
|---|---|
| endpoint | /v1/product_notes |
| method | POST |
| url_params | N/A |
| query params | N/A |
| body | JSON-formatted dictionary with the details of the product_note that you wish to create |
| permissions | SYSTEM |
| response | 201 |
GET
| value | |
|---|---|
| endpoint | /v1/product_notes or /v1/product_notes/<product_note_id> |
| method | GET |
| url_params | product_note_id (int) |
| query params | > See Query Format and Filtering |
| body | N/A |
| permissions | OVERVIEW |
| response | 200 |
PUT
| value | |
|---|---|
| endpoint | /v1/product_notes/<product_note_id> |
| method | PUT |
| url_params | product_note_id of the product_note you wish to edit |
| query params | N/A |
| body | JSON-formatted dictionary of the columns that you wish to alter |
| permissions | SYSTEM |
| response | 200 |
DELETE
| value | |
|---|---|
| endpoint | /v1/product_notes/<product_note_id> |
| method | DELETE |
| url_params | product_note_id (int) |
| query params | N/A |
| body | N/A |
| permissions | SYSTEM |
| response | 204 |
Product Parameter
Contains details of the parameter settings of every product.
The product_parameter object
| Field | Description |
|---|---|
| product_parameter_id int (primary key) |
A unique integer identifier for each product_parameter. |
| product_imei varchar(15) (not-null,foreign-key) |
|
| parameter_type_id int (not-null,foreign-key) |
|
| status string |
options: ["expired", "removed", "active", "pending"] |
| value string (not-null) |
|
| date_added datetime |
|
| date_removed datetime |
|
| created_at datetime |
timestamp that the record was created at |
| created_by text |
username of the user who created the record |
| modified_at datetime |
timestamp that the record was last modified |
| modified_by text |
user that last modified the record |
| Relationship | Description |
|---|---|
| N/A | There are no relationships for this table. |
An example POST request. Note that
product_parameter_id,created_at,modified_atandcreated_byare all handled internally by the system and need not be explicitly specified. See Meta Data for more information.
url = "https://smartapi.bboxx.co.uk/v1/product_parameters"
data = json.dumps({
"product_imei": "000000000000000",
"parameter_type_id": 1,
"status": "test",
"value": "test",
"date_added": "2000-01-01 00:00:00",
"date_removed": "2000-01-01 00:00:00",
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.post(url=url, data=data, headers=headers)
r
>>> <Response 201>
r.json()
>>> {
"product_parameter_id": 1
"product_imei": "000000000000000",
"parameter_type_id": 1,
"status": "test",
"value": "test",
"date_added": "2000-01-01 00:00:00",
"date_removed": "2000-01-01 00:00:00",
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve the
product_parametercreated by specifying itsproduct_parameter_idin the request url:
url = 'https://smartapi.bboxx.co.uk/v1/product_parameters/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"product_parameter_id": 1
"product_imei": "000000000000000",
"parameter_type_id": 1,
"status": "test",
"value": "test",
"date_added": "2000-01-01 00:00:00",
"date_removed": "2000-01-01 00:00:00",
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve all
product_parametersby omitting theproduct_parameter_id:
url = 'https://smartapi.bboxx.co.uk/v1/product_parameters'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
u'total_pages': 1,
u'objects': [
{<record>},
{<record>},
{<record>},
{<record>},
{<record>},
],
u'num_results': 10,
u'page': 1
}
We can edit the newly created
product_parameterwith aPUTrequest:
url = 'https://smartapi.bboxx.co.uk/v1/product_parameters/1'
data = json.dumps({
"product_imei": "999999999999999",
"parameter_type_id": 2,
"status": "changed",
"value": "changed",
"date_added": "2016-07-01 12:34:45",
"date_removed": "2016-07-01 12:34:45",
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.put(url=url, data=data, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"product_parameter_id": 1
"product_imei": "999999999999999",
"parameter_type_id": 2,
"status": "changed",
"value": "changed",
"date_added": "2016-07-01 12:34:45",
"date_removed": "2016-07-01 12:34:45",
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": 2016-07-07 12:34:45
}
Note that the
modified_atfield has been updated accordingly.If a user has
SYSTEMpermissions they can delete theproduct_parameter
url = 'https://smartapi.bboxx.co.uk/v1/product_parameters/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.delete(url=url, headers=headers)
r
>>> <Response 204>
r.text
>>>
Note that the response from a 204 request is empty. This means that
r.json()cannot be called and will throw a JSONDecodeError. In fact the response isu''- an empty unicode string.
POST
| value | |
|---|---|
| endpoint | /v1/product_parameters |
| method | POST |
| url_params | N/A |
| query params | N/A |
| body | JSON-formatted dictionary with the details of the product_parameter that you wish to create |
| permissions | SYSTEM |
| response | 201 |
GET
| value | |
|---|---|
| endpoint | /v1/product_parameters or /v1/product_parameters/<product_parameter_id> |
| method | GET |
| url_params | product_parameter_id (int) |
| query params | > See Query Format and Filtering |
| body | N/A |
| permissions | OVERVIEW |
| response | 200 |
PUT
| value | |
|---|---|
| endpoint | /v1/product_parameters/<product_parameter_id> |
| method | PUT |
| url_params | product_parameter_id of the product_parameter you wish to edit |
| query params | N/A |
| body | JSON-formatted dictionary of the columns that you wish to alter |
| permissions | SYSTEM |
| response | 200 |
DELETE
| value | |
|---|---|
| endpoint | /v1/product_parameters/<product_parameter_id> |
| method | DELETE |
| url_params | product_parameter_id (int) |
| query params | N/A |
| body | N/A |
| permissions | SYSTEM |
| response | 204 |
/products/<imei>/parts
Description
A
GETrequest to this endpoint will return a complete list of parts and related data currently associated with that unit.
url = "https://smartapi.bboxx.co.uk/v1/products/000000000000/parts"
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=' + A_VALID_TOKEN}
r = requests.get(url=url, headers=headers)
print r.json()
>>> {
"message": "Parts found.",
"status": "success",
"data": {
"10737": {
"created_at": "2015-07-02T11:50:23",
"created_by": "d.mclean@bboxx.co.uk",
"modified_at": null,
"part_id": 10737,
"part_product_linker": {
"added_repair_id": null,
"created_at": "2015-07-02T11:50:25",
"created_by": "d.mclean@bboxx.co.uk",
"date_added": "2015-07-02T11:50:24",
"date_removed": null,
"modified_at": null,
"part_id": 10737,
"part_product_linker_id": 10719,
"product_imei": "013950005303699",
"removed_repair_id": null,
"replaced_part_id": null
},
"part_type": {
"created_at": "2015-04-10T10:48:40",
"created_by": "d.mclean@bboxx.co.uk",
"description": "A SIM card provided and activated by Vodafone",
"erp_code": null,
"modified_at": null,
"name": "Vodafone SIM",
"part_type_id": 1,
"serial_number_category": "known"
},
"part_type_id": 1,
"replacement_part_types": [
{
"created_at": "2015-04-10T10:48:40",
"created_by": "d.mclean@bboxx.co.uk",
"description": "A SIM card provided and activated by Vodafone",
"erp_code": null,
"modified_at": null,
"name": "Vodafone SIM",
"part_type_id": 1,
"serial_number_category": "known"
},
{
"created_at": "2015-04-10T10:49:38",
"created_by": "d.mclean@bboxx.co.uk",
"description": "A SIM card provided and activated by Wireless Logic",
"erp_code": null,
"modified_at": null,
"name": "Wireless Logic SIM",
"part_type_id": 2,
"serial_number_category": "known"
}
],
"serial_number": "204043256110756"
},
"308501": {
"created_at": "2016-06-14T09:48:39.622906",
"created_by": "h.he@bboxx.co.uk",
"modified_at": null,
"part_id": 308501,
"part_product_linker": {
"added_repair_id": null,
"created_at": "2016-06-14T09:48:40.486927",
"created_by": "h.he@bboxx.co.uk",
"date_added": "2016-06-14T09:48:40.748124",
"date_removed": null,
"modified_at": null,
"part_id": 308501,
"part_product_linker_id": 307244,
"product_imei": "013950005303699",
"removed_repair_id": null,
"replaced_part_id": null
},
"part_type": {
"created_at": "2016-03-10T15:40:46.578552",
"created_by": "d.mclean@bboxx.co.uk",
"description": "5A fuse",
"erp_code": null,
"modified_at": null,
"name": "5A Fuse",
"part_type_id": 13,
"serial_number_category": "unknown"
},
"part_type_id": 13,
"replacement_part_types": [
{
"created_at": "2016-03-10T15:40:46.578552",
"created_by": "d.mclean@bboxx.co.uk",
"description": "5A fuse",
"erp_code": null,
"modified_at": null,
"name": "5A Fuse",
"part_type_id": 13,
"serial_number_category": "unknown"
}
],
"serial_number": "tCXYvInR0xwCQpzAnJS76dPfHMr1uTMmFRZs7Jj49to0P2wxzCPAfYzie2AvncZF"
},
}
This endpoint is designed to for use during repairs of the Unit. A GET request to this endpoint will return:
- The parts present on the unit
- The parts historically used on the unit
- The date and time that the part was added (or removed)
- The allowed replacements for each part
- Details of the part_type for each part
Endpoint
| value | |
|---|---|
| endpoint | /products/<imei>/parts |
| method | GET |
| url_params | product_imei (str) |
| payload | None |
| response | 200 |
| __permissions | OVERVIEW |
Response
The format of the data returned by this endpoint is a dictionary where the keys are part_ids and the value is another dictionary of the data associated with the part.
part_id: {part_data}
Where {part_data} is a dictionary as follows:
{
"part_id": id
"part_type_id": type_id
"serial_number":serial,
"part_product_linker": linker dict
"part_type": part_type_dict
"replacement_part_types": [list-of-replacement-part_type-objects]
"created_at": timestamp
"created_by": user
"modified_at": timestamp
}
You can see an example of the full object in the code snippet to the right.
The intended use for this endpoint is for implementing repairs to BBOXX Units.
Product Product Group Linker
Specifies which products are associated with which product_groups. Includes a history of which product_group each product is associated with.
The product_product_group_linker object
| Field | Description |
|---|---|
| product_product_group_linker_id int (primary key) |
A unique integer identifier for each product_product_group_linker. |
| product_group_id int (not-null,foreign-key) |
|
| product_imei varchar(15) (not-null,foreign-key) |
|
| date_added datetime |
|
| date_removed datetime |
|
| created_at datetime |
timestamp that the record was created at |
| created_by text |
username of the user who created the record |
| modified_at datetime |
timestamp that the record was last modified |
| modified_by text |
user that last modified the record |
| Relationship | Description |
|---|---|
| N/A | There are no relationships for this table. |
POSTrequests are not allowed at this endpointWe can retrieve the
product_product_group_linkercreated by specifying itsproduct_product_group_linker_idin the request url:
url = 'https://smartapi.bboxx.co.uk/v1/product_product_group_linker/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"product_product_group_linker_id": 1
"product_group_id": 1,
"product_imei": "000000000000000",
"date_added": "2000-01-01 00:00:00",
"date_removed": "2000-01-01 00:00:00",
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve all
product_product_group_linkerby omitting theproduct_product_group_linker_id:
url = 'https://smartapi.bboxx.co.uk/v1/product_product_group_linker'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
u'total_pages': 1,
u'objects': [
{<record>},
{<record>},
{<record>},
{<record>},
{<record>},
],
u'num_results': 10,
u'page': 1
}
PUTrequests are not allowed at this endpoint
DELETErequests are not allowed at this endpoint
POST
POST requests are not allowed at this endpoint
GET
| value | |
|---|---|
| endpoint | /v1/product_product_group_linker or /v1/product_product_group_linker/<product_product_group_linker_id> |
| method | GET |
| url_params | product_product_group_linker_id (int) |
| query params | > See Query Format and Filtering |
| body | N/A |
| permissions | OVERVIEW |
| response | 200 |
PUT
PUT requests are not allowed at this endpoint
DELETE
DELETE requests are not allowed at this endpoint
Product
Lists all the products in the SMARTSolar Backend.
The product object
| Field | Description |
|---|---|
| product_imei varchar(15) (primary key) |
|
| analysis_timestamp datetime |
|
| current_enable_flag boolean (not-null) |
|
| desired_enable_flag boolean (not-null) |
|
| disable_date datetime |
|
| device_key varchar(24) (unique) |
|
| hub_id int (foreign-key) |
|
| imsi varchar(15) (not-null,unique) |
|
| iccid unknown-type (unique) |
|
| latest_connection_id int |
|
| latest_connection_location_id int |
|
| latest_state_id int (foreign-key) |
|
| latest_enable_history_id int (foreign-key) |
|
| product_type_id int (not-null,foreign-key) |
|
| serial_number string (not-null,unique) |
|
| shop_id int (foreign-key) |
|
| software_lock int (foreign-key) |
|
| rtc_network_name string |
options: ["Test-SIM-Provider", "Aeris", "Eseye", "Wireless-Logic"] |
| ip_address varchar(15) |
|
| latest_rtc_connection_history_id int |
|
| latest_rtc_mo_status_report_time datetime |
|
| latest_rtc_mt_status_update_time datetime |
|
| rtc_enabled_flag boolean (not-null) |
|
| dcm_enabled_flag boolean (not-null) |
boolean value that shows whether a device is DCM enabled or not |
| assembler string |
|
| gps_lat float |
|
| gps_lon float |
|
| warranty_start_date date (nullable) |
The date (in YYYY-MM-DD format) indicating the day a product's warranty started |
| is_payg boolean (not-null) |
boolean value that shows if a unit is to be paid for to stay turned ON or not (aka is the unit "Pay As You Go" i.e customer should keep on paying Bboxx in order to use the device) |
| created_at datetime |
timestamp that the record was created at |
| created_by text |
username of the user who created the record |
| modified_at datetime |
timestamp that the record was last modified |
| modified_by text |
user that last modified the record |
| Relationship | Description |
|---|---|
| connections | The associated connections |
| notes | The associated notes |
| part_product_linker | The associated part_product_linker |
| product_product_group_linker | The associated product_product_group_linker |
| product_entity_linker | The associated product_entity_linker |
| product_software_linker | The associated product_software_linker |
| enable_history_rel | The associated enable_history_rel |
| repairs | The associated repairs |
| sms_history | The associated sms_history |
| states | The associated states |
| product_parameter | The associated product_parameter |
| analysis_histories | The associated analysis_histories |
| rtc_message_history | The associated rtc_message_history |
| rtc_connection_history | The associated rtc_connection_history |
| migration_history | The associated migration_history |
| payment_command | The associated payment_command |
| balance | The associated balance |
| final_balance | The associated final_balance |
POSTrequests are not allowed at this endpointWe can retrieve the
productcreated by specifying itsproduct_imeiin the request url:
url = 'https://smartapi.bboxx.co.uk/v1/products/111010101010101'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"product_imei": "111010101010101",
"analysis_timestamp": "2000-01-01 00:00:00",
"current_enable_flag": True,
"desired_enable_flag": True,
"disable_date": "2000-01-01 00:00:00",
"device_key": "awjs875jg7thskr9485984rf",
"hub_id": 1,
"imsi": "000000000000000",
"iccid": Unknown column type,
"latest_connection_id": 1,
"latest_connection_location_id": 1,
"latest_state_id": 1,
"latest_enable_history_id": 1,
"product_type_id": 1,
"serial_number": "test",
"shop_id": 1,
"software_lock": 1,
"rtc_network_name": "test",
"ip_address": "000000000000000",
"latest_rtc_connection_history_id": 1,
"latest_rtc_mo_status_report_time": "2000-01-01 00:00:00",
"latest_rtc_mt_status_update_time": "2000-01-01 00:00:00",
"rtc_enabled_flag": True,
"dcm_enabled_flag": False,
"assembler": "test",
"gps_lat": 1.0,
"gps_lon": 1.0,
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve all
productsby omitting theproduct_imei:
url = 'https://smartapi.bboxx.co.uk/v1/products'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
u'total_pages': 1,
u'objects': [
{<record>},
{<record>},
{<record>},
{<record>},
{<record>},
],
u'num_results': 10,
u'page': 1
}
We can edit the newly created
productwith aPUTrequest:
url = 'https://smartapi.bboxx.co.uk/v1/products/111010101010101'
data = json.dumps({
"analysis_timestamp": "2016-07-01 12:34:45",
"current_enable_flag": False,
"desired_enable_flag": False,
"disable_date": "2016-07-01 12:34:45",
"device_key": "awjs875jg7thskr9485984rf",
"hub_id": 2,
"imsi": "999999999999999",
"iccid": Unknown column type,
"latest_connection_id": 2,
"latest_connection_location_id": 2,
"latest_state_id": 2,
"latest_enable_history_id": 2,
"product_type_id": 2,
"serial_number": "changed",
"shop_id": 2,
"software_lock": 2,
"rtc_network_name": "changed",
"ip_address": "999999999999999",
"latest_rtc_connection_history_id": 2,
"latest_rtc_mo_status_report_time": "2016-07-01 12:34:45",
"latest_rtc_mt_status_update_time": "2016-07-01 12:34:45",
"rtc_enabled_flag": False,
"dcm_enabled_flag": False,
"assembler": "changed",
"gps_lat": 2.0,
"gps_lon": 2.0,
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.put(url=url, data=data, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"product_imei": "111010101010101",
"analysis_timestamp": "2016-07-01 12:34:45",
"current_enable_flag": False,
"desired_enable_flag": False,
"disable_date": "2016-07-01 12:34:45",
"device_key": "awjs875jg7thskr9485984rf",
"hub_id": 2,
"imsi": "999999999999999",
"iccid": Unknown column type,
"latest_connection_id": 2,
"latest_connection_location_id": 2,
"latest_state_id": 2,
"latest_enable_history_id": 2,
"product_type_id": 2,
"serial_number": "changed",
"shop_id": 2,
"software_lock": 2,
"rtc_network_name": "changed",
"ip_address": "999999999999999",
"latest_rtc_connection_history_id": 2,
"latest_rtc_mo_status_report_time": "2016-07-01 12:34:45",
"latest_rtc_mt_status_update_time": "2016-07-01 12:34:45",
"rtc_enabled_flag": False,
"dcm_enabled_flag": False,
"assembler": "changed",
"gps_lat": 2.0,
"gps_lon": 2.0,
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": 2016-07-07 12:34:45
}
Note that the
modified_atfield has been updated accordingly.If a user has
SYSTEMpermissions they can delete theproduct
url = 'https://smartapi.bboxx.co.uk/v1/products/111010101010101'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.delete(url=url, headers=headers)
r
>>> <Response 204>
r.text
>>>
Note that the response from a 204 request is empty. This means that
r.json()cannot be called and will throw a JSONDecodeError. In fact the response isu''- an empty unicode string.
POST
POST requests are not allowed at this endpoint
GET
| value | |
|---|---|
| endpoint | /v1/products or /v1/products/<product_imei> |
| method | GET |
| url_params | product_imei (varchar(15)) |
| query params | > See Query Format and Filtering |
| body | N/A |
| permissions | OVERVIEW |
| response | 200 |
PUT
| value | |
|---|---|
| endpoint | /v1/products/<product_imei> |
| method | PUT |
| url_params | product_imei of the product you wish to edit |
| query params | N/A |
| body | JSON-formatted dictionary of the columns that you wish to alter |
| permissions | SYSTEM |
| response | 200 |
DELETE
| value | |
|---|---|
| endpoint | /v1/products/<product_imei> |
| method | DELETE |
| url_params | product_imei (varchar(15)) |
| query params | N/A |
| body | N/A |
| permissions | SYSTEM |
| response | 204 |
Product Software Linker
Specifies which software-version-type is currently on each product.
The product_software_linker object
| Field | Description |
|---|---|
| product_software_linker_id int (primary key) |
A unique integer identifier for each product_software_linker. |
| product_imei varchar(15) (not-null,foreign-key) |
|
| software_version_type_id int (not-null,foreign-key) |
|
| date_added datetime |
|
| date_removed datetime |
|
| update_attempts int |
|
| created_at datetime |
timestamp that the record was created at |
| created_by text |
username of the user who created the record |
| modified_at datetime |
timestamp that the record was last modified |
| modified_by text |
user that last modified the record |
| Relationship | Description |
|---|---|
| N/A | There are no relationships for this table. |
An example POST request. Note that
product_software_linker_id,created_at,modified_atandcreated_byare all handled internally by the system and need not be explicitly specified. See Meta Data for more information.
url = "https://smartapi.bboxx.co.uk/v1/product_software_linker"
data = json.dumps({
"product_imei": "000000000000000",
"software_version_type_id": 1,
"date_added": "2000-01-01 00:00:00",
"date_removed": "2000-01-01 00:00:00",
"update_attempts": 1,
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.post(url=url, data=data, headers=headers)
r
>>> <Response 201>
r.json()
>>> {
"product_software_linker_id": 1
"product_imei": "000000000000000",
"software_version_type_id": 1,
"date_added": "2000-01-01 00:00:00",
"date_removed": "2000-01-01 00:00:00",
"update_attempts": 1,
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve the
product_software_linkercreated by specifying itsproduct_software_linker_idin the request url:
url = 'https://smartapi.bboxx.co.uk/v1/product_software_linker/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"product_software_linker_id": 1
"product_imei": "000000000000000",
"software_version_type_id": 1,
"date_added": "2000-01-01 00:00:00",
"date_removed": "2000-01-01 00:00:00",
"update_attempts": 1,
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve all
product_software_linkerby omitting theproduct_software_linker_id:
url = 'https://smartapi.bboxx.co.uk/v1/product_software_linker'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
u'total_pages': 1,
u'objects': [
{<record>},
{<record>},
{<record>},
{<record>},
{<record>},
],
u'num_results': 10,
u'page': 1
}
We can edit the newly created
product_software_linkerwith aPUTrequest:
url = 'https://smartapi.bboxx.co.uk/v1/product_software_linker/1'
data = json.dumps({
"product_imei": "999999999999999",
"software_version_type_id": 2,
"date_added": "2016-07-01 12:34:45",
"date_removed": "2016-07-01 12:34:45",
"update_attempts": 2,
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.put(url=url, data=data, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"product_software_linker_id": 1
"product_imei": "999999999999999",
"software_version_type_id": 2,
"date_added": "2016-07-01 12:34:45",
"date_removed": "2016-07-01 12:34:45",
"update_attempts": 2,
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": 2016-07-07 12:34:45
}
Note that the
modified_atfield has been updated accordingly.If a user has
SYSTEMpermissions they can delete theproduct_software_linker
url = 'https://smartapi.bboxx.co.uk/v1/product_software_linker/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.delete(url=url, headers=headers)
r
>>> <Response 204>
r.text
>>>
Note that the response from a 204 request is empty. This means that
r.json()cannot be called and will throw a JSONDecodeError. In fact the response isu''- an empty unicode string.
POST
| value | |
|---|---|
| endpoint | /v1/product_software_linker |
| method | POST |
| url_params | N/A |
| query params | N/A |
| body | JSON-formatted dictionary with the details of the product_software_linker that you wish to create |
| permissions | SYSTEM |
| response | 201 |
GET
| value | |
|---|---|
| endpoint | /v1/product_software_linker or /v1/product_software_linker/<product_software_linker_id> |
| method | GET |
| url_params | product_software_linker_id (int) |
| query params | > See Query Format and Filtering |
| body | N/A |
| permissions | OVERVIEW |
| response | 200 |
PUT
| value | |
|---|---|
| endpoint | /v1/product_software_linker/<product_software_linker_id> |
| method | PUT |
| url_params | product_software_linker_id of the product_software_linker you wish to edit |
| query params | N/A |
| body | JSON-formatted dictionary of the columns that you wish to alter |
| permissions | SYSTEM |
| response | 200 |
DELETE
| value | |
|---|---|
| endpoint | /v1/product_software_linker/<product_software_linker_id> |
| method | DELETE |
| url_params | product_software_linker_id (int) |
| query params | N/A |
| body | N/A |
| permissions | SYSTEM |
| response | 204 |
Product Type
Specifies the different types of product that exist.
The product_type object
| Field | Description |
|---|---|
| product_type_id int (primary key) |
A unique integer identifier for each product_type. |
| name string (not-null,unique) |
|
| erp_code unknown-type |
|
| parameter_types array |
|
| credit_type string |
options: ["gas", "time"] |
| created_at datetime |
timestamp that the record was created at |
| created_by text |
username of the user who created the record |
| modified_at datetime |
timestamp that the record was last modified |
| modified_by text |
user that last modified the record |
| Relationship | Description |
|---|---|
| products | The associated products |
| alert_type_product_type_linker | The associated alert_type_product_type_linker |
| product_type_software_version_type_linker | The associated product_type_software_version_type_linker |
| action_type_product_type_linker | The associated action_type_product_type_linker |
| symptom_types | The associated symptom_types |
| latest_software | The associated latest_software |
| part_type_replacements | The associated part_type_replacements |
An example POST request. Note that
product_type_id,created_at,modified_atandcreated_byare all handled internally by the system and need not be explicitly specified. See Meta Data for more information.
url = "https://smartapi.bboxx.co.uk/v1/product_types"
data = json.dumps({
"name": "test",
"erp_code": Unknown column type,
"parameter_types": [1,2,3],
"credit_type": "test",
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.post(url=url, data=data, headers=headers)
r
>>> <Response 201>
r.json()
>>> {
"product_type_id": 1
"name": "test",
"erp_code": Unknown column type,
"parameter_types": [1,2,3],
"credit_type": "test",
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve the
product_typecreated by specifying itsproduct_type_idin the request url:
url = 'https://smartapi.bboxx.co.uk/v1/product_types/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"product_type_id": 1
"name": "test",
"erp_code": Unknown column type,
"parameter_types": [1,2,3],
"credit_type": "test",
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve all
product_typesby omitting theproduct_type_id:
url = 'https://smartapi.bboxx.co.uk/v1/product_types'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
u'total_pages': 1,
u'objects': [
{<record>},
{<record>},
{<record>},
{<record>},
{<record>},
],
u'num_results': 10,
u'page': 1
}
We can edit the newly created
product_typewith aPUTrequest:
url = 'https://smartapi.bboxx.co.uk/v1/product_types/1'
data = json.dumps({
"name": "changed",
"erp_code": Unknown column type,
"parameter_types": [1,2,3,4,5,6],
"credit_type": "changed",
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.put(url=url, data=data, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"product_type_id": 1
"name": "changed",
"erp_code": Unknown column type,
"parameter_types": [1,2,3,4,5,6],
"credit_type": "changed",
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": 2016-07-07 12:34:45
}
Note that the
modified_atfield has been updated accordingly.If a user has
SYSTEMpermissions they can delete theproduct_type
url = 'https://smartapi.bboxx.co.uk/v1/product_types/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.delete(url=url, headers=headers)
r
>>> <Response 204>
r.text
>>>
Note that the response from a 204 request is empty. This means that
r.json()cannot be called and will throw a JSONDecodeError. In fact the response isu''- an empty unicode string.
POST
| value | |
|---|---|
| endpoint | /v1/product_types |
| method | POST |
| url_params | N/A |
| query params | N/A |
| body | JSON-formatted dictionary with the details of the product_type that you wish to create |
| permissions | SYSTEM |
| response | 201 |
GET
| value | |
|---|---|
| endpoint | /v1/product_types or /v1/product_types/<product_type_id> |
| method | GET |
| url_params | product_type_id (int) |
| query params | > See Query Format and Filtering |
| body | N/A |
| permissions | OVERVIEW |
| response | 200 |
PUT
| value | |
|---|---|
| endpoint | /v1/product_types/<product_type_id> |
| method | PUT |
| url_params | product_type_id of the product_type you wish to edit |
| query params | N/A |
| body | JSON-formatted dictionary of the columns that you wish to alter |
| permissions | SYSTEM |
| response | 200 |
DELETE
| value | |
|---|---|
| endpoint | /v1/product_types/<product_type_id> |
| method | DELETE |
| url_params | product_type_id (int) |
| query params | N/A |
| body | N/A |
| permissions | SYSTEM |
| response | 204 |
Product Type Software Version Type Linker
Specifies which software-version-types can be installed on each product-type.
The product_type_software_version_type_linker object
| Field | Description |
|---|---|
| product_type_software_version_type_linker_id int (primary key) |
A unique integer identifier for each product_type_software_version_type_linker. |
| product_type_id int (not-null,foreign-key) |
|
| software_version_type_id int (not-null,foreign-key) |
|
| created_at datetime |
timestamp that the record was created at |
| created_by text |
username of the user who created the record |
| modified_at datetime |
timestamp that the record was last modified |
| modified_by text |
user that last modified the record |
| Relationship | Description |
|---|---|
| N/A | There are no relationships for this table. |
An example POST request. Note that
product_type_software_version_type_linker_id,created_at,modified_atandcreated_byare all handled internally by the system and need not be explicitly specified. See Meta Data for more information.
url = "https://smartapi.bboxx.co.uk/v1/product_type_software_version_type_linker"
data = json.dumps({
"product_type_id": 1,
"software_version_type_id": 1,
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.post(url=url, data=data, headers=headers)
r
>>> <Response 201>
r.json()
>>> {
"product_type_software_version_type_linker_id": 1
"product_type_id": 1,
"software_version_type_id": 1,
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve the
product_type_software_version_type_linkercreated by specifying itsproduct_type_software_version_type_linker_idin the request url:
url = 'https://smartapi.bboxx.co.uk/v1/product_type_software_version_type_linker/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"product_type_software_version_type_linker_id": 1
"product_type_id": 1,
"software_version_type_id": 1,
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve all
product_type_software_version_type_linkerby omitting theproduct_type_software_version_type_linker_id:
url = 'https://smartapi.bboxx.co.uk/v1/product_type_software_version_type_linker'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
u'total_pages': 1,
u'objects': [
{<record>},
{<record>},
{<record>},
{<record>},
{<record>},
],
u'num_results': 10,
u'page': 1
}
We can edit the newly created
product_type_software_version_type_linkerwith aPUTrequest:
url = 'https://smartapi.bboxx.co.uk/v1/product_type_software_version_type_linker/1'
data = json.dumps({
"product_type_id": 2,
"software_version_type_id": 2,
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.put(url=url, data=data, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"product_type_software_version_type_linker_id": 1
"product_type_id": 2,
"software_version_type_id": 2,
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": 2016-07-07 12:34:45
}
Note that the
modified_atfield has been updated accordingly.If a user has
SYSTEMpermissions they can delete theproduct_type_software_version_type_linker
url = 'https://smartapi.bboxx.co.uk/v1/product_type_software_version_type_linker/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.delete(url=url, headers=headers)
r
>>> <Response 204>
r.text
>>>
Note that the response from a 204 request is empty. This means that
r.json()cannot be called and will throw a JSONDecodeError. In fact the response isu''- an empty unicode string.
POST
| value | |
|---|---|
| endpoint | /v1/product_type_software_version_type_linker |
| method | POST |
| url_params | N/A |
| query params | N/A |
| body | JSON-formatted dictionary with the details of the product_type_software_version_type_linker that you wish to create |
| permissions | SYSTEM |
| response | 201 |
GET
| value | |
|---|---|
| endpoint | /v1/product_type_software_version_type_linker or /v1/product_type_software_version_type_linker/<product_type_software_version_type_linker_id> |
| method | GET |
| url_params | product_type_software_version_type_linker_id (int) |
| query params | > See Query Format and Filtering |
| body | N/A |
| permissions | OVERVIEW |
| response | 200 |
PUT
| value | |
|---|---|
| endpoint | /v1/product_type_software_version_type_linker/<product_type_software_version_type_linker_id> |
| method | PUT |
| url_params | product_type_software_version_type_linker_id of the product_type_software_version_type_linker you wish to edit |
| query params | N/A |
| body | JSON-formatted dictionary of the columns that you wish to alter |
| permissions | SYSTEM |
| response | 200 |
DELETE
| value | |
|---|---|
| endpoint | /v1/product_type_software_version_type_linker/<product_type_software_version_type_linker_id> |
| method | DELETE |
| url_params | product_type_software_version_type_linker_id (int) |
| query params | N/A |
| body | N/A |
| permissions | SYSTEM |
| response | 204 |
Repair Action Type Linker
Specifies which action-types were taken on all repairs.
The repair_action_type_linker object
| Field | Description |
|---|---|
| repair_action_type_linker_id int (primary key) |
A unique integer identifier for each repair_action_type_linker. |
| repair_id int (not-null,foreign-key) |
|
| action_type_id int (not-null,foreign-key) |
|
| created_at datetime |
timestamp that the record was created at |
| created_by text |
username of the user who created the record |
| modified_at datetime |
timestamp that the record was last modified |
| modified_by text |
user that last modified the record |
| Relationship | Description |
|---|---|
| N/A | There are no relationships for this table. |
An example POST request. Note that
repair_action_type_linker_id,created_at,modified_atandcreated_byare all handled internally by the system and need not be explicitly specified. See Meta Data for more information.
url = "https://smartapi.bboxx.co.uk/v1/repair_action_type_linker"
data = json.dumps({
"repair_id": 1,
"action_type_id": 1,
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.post(url=url, data=data, headers=headers)
r
>>> <Response 201>
r.json()
>>> {
"repair_action_type_linker_id": 1
"repair_id": 1,
"action_type_id": 1,
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve the
repair_action_type_linkercreated by specifying itsrepair_action_type_linker_idin the request url:
url = 'https://smartapi.bboxx.co.uk/v1/repair_action_type_linker/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"repair_action_type_linker_id": 1
"repair_id": 1,
"action_type_id": 1,
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve all
repair_action_type_linkerby omitting therepair_action_type_linker_id:
url = 'https://smartapi.bboxx.co.uk/v1/repair_action_type_linker'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
u'total_pages': 1,
u'objects': [
{<record>},
{<record>},
{<record>},
{<record>},
{<record>},
],
u'num_results': 10,
u'page': 1
}
We can edit the newly created
repair_action_type_linkerwith aPUTrequest:
url = 'https://smartapi.bboxx.co.uk/v1/repair_action_type_linker/1'
data = json.dumps({
"repair_id": 2,
"action_type_id": 2,
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.put(url=url, data=data, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"repair_action_type_linker_id": 1
"repair_id": 2,
"action_type_id": 2,
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": 2016-07-07 12:34:45
}
Note that the
modified_atfield has been updated accordingly.If a user has
SYSTEMpermissions they can delete therepair_action_type_linker
url = 'https://smartapi.bboxx.co.uk/v1/repair_action_type_linker/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.delete(url=url, headers=headers)
r
>>> <Response 204>
r.text
>>>
Note that the response from a 204 request is empty. This means that
r.json()cannot be called and will throw a JSONDecodeError. In fact the response isu''- an empty unicode string.
POST
| value | |
|---|---|
| endpoint | /v1/repair_action_type_linker |
| method | POST |
| url_params | N/A |
| query params | N/A |
| body | JSON-formatted dictionary with the details of the repair_action_type_linker that you wish to create |
| permissions | SYSTEM |
| response | 201 |
GET
| value | |
|---|---|
| endpoint | /v1/repair_action_type_linker or /v1/repair_action_type_linker/<repair_action_type_linker_id> |
| method | GET |
| url_params | repair_action_type_linker_id (int) |
| query params | > See Query Format and Filtering |
| body | N/A |
| permissions | OVERVIEW |
| response | 200 |
PUT
| value | |
|---|---|
| endpoint | /v1/repair_action_type_linker/<repair_action_type_linker_id> |
| method | PUT |
| url_params | repair_action_type_linker_id of the repair_action_type_linker you wish to edit |
| query params | N/A |
| body | JSON-formatted dictionary of the columns that you wish to alter |
| permissions | SYSTEM |
| response | 200 |
DELETE
| value | |
|---|---|
| endpoint | /v1/repair_action_type_linker/<repair_action_type_linker_id> |
| method | DELETE |
| url_params | repair_action_type_linker_id (int) |
| query params | N/A |
| body | N/A |
| permissions | SYSTEM |
| response | 204 |
Repair Part Type Linker
Specifies which part_types were replaced in each repair. Also records which parts the technicin had to wait to repair and how long they had to wait.
The repair_part_type_linker object
| Field | Description |
|---|---|
| repair_part_type_linker_id int (primary key) |
A unique integer identifier for each repair_part_type_linker. |
| repair_id int (not-null,foreign-key) |
|
| old_part_type_id int (foreign-key) |
|
| new_part_id int (foreign-key) |
|
| new_part_type_id int (foreign-key) |
|
| requested_date datetime |
|
| replaced_date datetime |
|
| non_transferable boolean (not-null) |
|
| created_at datetime |
timestamp that the record was created at |
| created_by text |
username of the user who created the record |
| modified_at datetime |
timestamp that the record was last modified |
| modified_by text |
user that last modified the record |
| Relationship | Description |
|---|---|
| N/A | There are no relationships for this table. |
An example POST request. Note that
repair_part_type_linker_id,created_at,modified_atandcreated_byare all handled internally by the system and need not be explicitly specified. See Meta Data for more information.
url = "https://smartapi.bboxx.co.uk/v1/repair_part_type_linker"
data = json.dumps({
"repair_id": 1,
"old_part_type_id": 1,
"new_part_id": 1,
"new_part_type_id": 1,
"requested_date": "2000-01-01 00:00:00",
"replaced_date": "2000-01-01 00:00:00",
"non_transferable": True,
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.post(url=url, data=data, headers=headers)
r
>>> <Response 201>
r.json()
>>> {
"repair_part_type_linker_id": 1
"repair_id": 1,
"old_part_type_id": 1,
"new_part_id": 1,
"new_part_type_id": 1,
"requested_date": "2000-01-01 00:00:00",
"replaced_date": "2000-01-01 00:00:00",
"non_transferable": True,
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve the
repair_part_type_linkercreated by specifying itsrepair_part_type_linker_idin the request url:
url = 'https://smartapi.bboxx.co.uk/v1/repair_part_type_linker/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"repair_part_type_linker_id": 1
"repair_id": 1,
"old_part_type_id": 1,
"new_part_id": 1,
"new_part_type_id": 1,
"requested_date": "2000-01-01 00:00:00",
"replaced_date": "2000-01-01 00:00:00",
"non_transferable": True,
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve all
repair_part_type_linkerby omitting therepair_part_type_linker_id:
url = 'https://smartapi.bboxx.co.uk/v1/repair_part_type_linker'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
u'total_pages': 1,
u'objects': [
{<record>},
{<record>},
{<record>},
{<record>},
{<record>},
],
u'num_results': 10,
u'page': 1
}
We can edit the newly created
repair_part_type_linkerwith aPUTrequest:
url = 'https://smartapi.bboxx.co.uk/v1/repair_part_type_linker/1'
data = json.dumps({
"repair_id": 2,
"old_part_type_id": 2,
"new_part_id": 2,
"new_part_type_id": 2,
"requested_date": "2016-07-01 12:34:45",
"replaced_date": "2016-07-01 12:34:45",
"non_transferable": False,
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.put(url=url, data=data, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"repair_part_type_linker_id": 1
"repair_id": 2,
"old_part_type_id": 2,
"new_part_id": 2,
"new_part_type_id": 2,
"requested_date": "2016-07-01 12:34:45",
"replaced_date": "2016-07-01 12:34:45",
"non_transferable": False,
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": 2016-07-07 12:34:45
}
Note that the
modified_atfield has been updated accordingly.If a user has
SYSTEMpermissions they can delete therepair_part_type_linker
url = 'https://smartapi.bboxx.co.uk/v1/repair_part_type_linker/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.delete(url=url, headers=headers)
r
>>> <Response 204>
r.text
>>>
Note that the response from a 204 request is empty. This means that
r.json()cannot be called and will throw a JSONDecodeError. In fact the response isu''- an empty unicode string.
POST
| value | |
|---|---|
| endpoint | /v1/repair_part_type_linker |
| method | POST |
| url_params | N/A |
| query params | N/A |
| body | JSON-formatted dictionary with the details of the repair_part_type_linker that you wish to create |
| permissions | SYSTEM |
| response | 201 |
GET
| value | |
|---|---|
| endpoint | /v1/repair_part_type_linker or /v1/repair_part_type_linker/<repair_part_type_linker_id> |
| method | GET |
| url_params | repair_part_type_linker_id (int) |
| query params | > See Query Format and Filtering |
| body | N/A |
| permissions | OVERVIEW |
| response | 200 |
PUT
| value | |
|---|---|
| endpoint | /v1/repair_part_type_linker/<repair_part_type_linker_id> |
| method | PUT |
| url_params | repair_part_type_linker_id of the repair_part_type_linker you wish to edit |
| query params | N/A |
| body | JSON-formatted dictionary of the columns that you wish to alter |
| permissions | SYSTEM |
| response | 200 |
DELETE
| value | |
|---|---|
| endpoint | /v1/repair_part_type_linker/<repair_part_type_linker_id> |
| method | DELETE |
| url_params | repair_part_type_linker_id (int) |
| query params | N/A |
| body | N/A |
| permissions | SYSTEM |
| response | 204 |
Repair Product Linker
Linked to a repair when a PCB is replaced
The repair_product_linker object
| Field | Description |
|---|---|
| repair_product_linker_id int (primary key) |
A unique integer identifier for each repair_product_linker. |
| repair_id int (not-null,foreign-key) |
|
| product_imei varchar(15) (not-null) |
|
| created_at datetime |
timestamp that the record was created at |
| created_by text |
username of the user who created the record |
| modified_at datetime |
timestamp that the record was last modified |
| modified_by text |
user that last modified the record |
| Relationship | Description |
|---|---|
| N/A | There are no relationships for this table. |
POSTrequests are not allowed at this endpoint
GETrequests are not allowed at this endpoint
PUTrequests are not allowed at this endpoint
DELETErequests are not allowed at this endpoint
POST
POST requests are not allowed at this endpoint
### GET
GET requests are not allowed at this endpoint
PUT
PUT requests are not allowed at this endpoint
DELETE
DELETE requests are not allowed at this endpoint
Repair
Lists all of the repairs that have been carried out on BBOXX control units.
The repair object
| Field | Description |
|---|---|
| repair_id int (primary key) |
A unique integer identifier for each repair. |
| product_imei varchar(15) (not-null,foreign-key) |
|
| arrival_date date |
|
| refurbishment_date date |
|
| measured_battery_capacity float |
|
| process string |
options: ["Repair and Return", "Replaced", "Repossessed", "Broken on Arrival"] |
| pending_status boolean |
|
| workflow_name string |
|
| workflow_state_id string |
|
| context unknown-type |
|
| latest_workflow_event_id int |
|
| outcome string |
|
| created_at datetime |
timestamp that the record was created at |
| created_by text |
username of the user who created the record |
| modified_at datetime |
timestamp that the record was last modified |
| modified_by text |
user that last modified the record |
| Relationship | Description |
|---|---|
| alerts | The associated alerts |
| repair_centre_id | The associated repair_centre_id |
| repair_symptom_type_linker | The associated repair_symptom_type_linker |
| repair_action_type_linker | The associated repair_action_type_linker |
| replacements | The associated replacements |
An example POST request. Note that
repair_id,created_at,modified_atandcreated_byare all handled internally by the system and need not be explicitly specified. See Meta Data for more information.
url = "https://smartapi.bboxx.co.uk/v1/repairs"
data = json.dumps({
"product_imei": "000000000000000",
"arrival_date": "2000-01-01 00:00:00",
"refurbishment_date": "2000-01-01 00:00:00",
"measured_battery_capacity": 1.0,
"process": "test",
"pending_status": True,
"workflow_name": "test",
"workflow_state_id": "test",
"context": Unknown column type,
"latest_workflow_event_id": 1,
"outcome": "test",
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.post(url=url, data=data, headers=headers)
r
>>> <Response 201>
r.json()
>>> {
"repair_id": 1,
"repair_centre_id": 1,
"product_imei": "000000000000000",
"arrival_date": "2000-01-01 00:00:00",
"refurbishment_date": "2000-01-01 00:00:00",
"measured_battery_capacity": 1.0,
"process": "test",
"pending_status": True,
"workflow_name": "test",
"workflow_state_id": "test",
"context": Unknown column type,
"latest_workflow_event_id": 1,
"outcome": "test",
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve the
repaircreated by specifying itsrepair_idin the request url:
url = 'https://smartapi.bboxx.co.uk/v1/repairs/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"repair_id": 1,
"repair_centre_id": 1,
"product_imei": "000000000000000",
"arrival_date": "2000-01-01 00:00:00",
"refurbishment_date": "2000-01-01 00:00:00",
"measured_battery_capacity": 1.0,
"process": "test",
"pending_status": True,
"workflow_name": "test",
"workflow_state_id": "test",
"context": Unknown column type,
"latest_workflow_event_id": 1,
"outcome": "test",
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve all
repairsby omitting therepair_id:
url = 'https://smartapi.bboxx.co.uk/v1/repairs'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
u'total_pages': 1,
u'objects': [
{<record>},
{<record>},
{<record>},
{<record>},
{<record>},
],
u'num_results': 10,
u'page': 1
}
We can edit the newly created
repairwith aPUTrequest:
url = 'https://smartapi.bboxx.co.uk/v1/repairs/1'
data = json.dumps({
"product_imei": "999999999999999",
"arrival_date": "2000-01-01 00:00:00",
"refurbishment_date": "2000-01-01 00:00:00",
"measured_battery_capacity": 2.0,
"process": "changed",
"pending_status": False,
"workflow_name": "changed",
"workflow_state_id": "changed",
"context": Unknown column type,
"latest_workflow_event_id": 2,
"outcome": "changed",
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.put(url=url, data=data, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"repair_id": 1,
"repair_centre_id": 1,
"product_imei": "999999999999999",
"arrival_date": "2000-01-01 00:00:00",
"refurbishment_date": "2000-01-01 00:00:00",
"measured_battery_capacity": 2.0,
"process": "changed",
"pending_status": False,
"workflow_name": "changed",
"workflow_state_id": "changed",
"context": Unknown column type,
"latest_workflow_event_id": 2,
"outcome": "changed",
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": 2016-07-07 12:34:45
}
Note that the
modified_atfield has been updated accordingly.If a user has
SYSTEMpermissions they can delete therepair
url = 'https://smartapi.bboxx.co.uk/v1/repairs/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.delete(url=url, headers=headers)
r
>>> <Response 204>
r.text
>>>
Note that the response from a 204 request is empty. This means that
r.json()cannot be called and will throw a JSONDecodeError. In fact the response isu''- an empty unicode string.
POST
| value | |
|---|---|
| endpoint | /v1/repairs |
| method | POST |
| url_params | N/A |
| query params | N/A |
| body | JSON-formatted dictionary with the details of the repair that you wish to create |
| permissions | SYSTEM |
| response | 201 |
GET
| value | |
|---|---|
| endpoint | /v1/repairs or /v1/repairs/<repair_id> |
| method | GET |
| url_params | repair_id (int) |
| query params | > See Query Format and Filtering |
| body | N/A |
| permissions | OVERVIEW |
| response | 200 |
PUT
| value | |
|---|---|
| endpoint | /v1/repairs/<repair_id> |
| method | PUT |
| url_params | repair_id of the repair you wish to edit |
| query params | N/A |
| body | JSON-formatted dictionary of the columns that you wish to alter |
| permissions | SYSTEM |
| response | 200 |
DELETE
| value | |
|---|---|
| endpoint | /v1/repairs/<repair_id> |
| method | DELETE |
| url_params | repair_id (int) |
| query params | N/A |
| body | N/A |
| permissions | SYSTEM |
| response | 204 |
Repair Symptom Type Linker
Specifies which symptoms were diagnosed on each repair
The repair_symptom_type_linker object
| Field | Description |
|---|---|
| repair_symptom_type_linker_id int (primary key) |
A unique integer identifier for each repair_symptom_type_linker. |
| repair_id int (not-null,foreign-key) |
|
| symptom_type_id int (not-null,foreign-key) |
|
| created_at datetime |
timestamp that the record was created at |
| created_by text |
username of the user who created the record |
| modified_at datetime |
timestamp that the record was last modified |
| modified_by text |
user that last modified the record |
| Relationship | Description |
|---|---|
| N/A | There are no relationships for this table. |
An example POST request. Note that
repair_symptom_type_linker_id,created_at,modified_atandcreated_byare all handled internally by the system and need not be explicitly specified. See Meta Data for more information.
url = "https://smartapi.bboxx.co.uk/v1/repair_symptom_type_linker"
data = json.dumps({
"repair_id": 1,
"symptom_type_id": 1,
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.post(url=url, data=data, headers=headers)
r
>>> <Response 201>
r.json()
>>> {
"repair_symptom_type_linker_id": 1
"repair_id": 1,
"symptom_type_id": 1,
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve the
repair_symptom_type_linkercreated by specifying itsrepair_symptom_type_linker_idin the request url:
url = 'https://smartapi.bboxx.co.uk/v1/repair_symptom_type_linker/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"repair_symptom_type_linker_id": 1
"repair_id": 1,
"symptom_type_id": 1,
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve all
repair_symptom_type_linkerby omitting therepair_symptom_type_linker_id:
url = 'https://smartapi.bboxx.co.uk/v1/repair_symptom_type_linker'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
u'total_pages': 1,
u'objects': [
{<record>},
{<record>},
{<record>},
{<record>},
{<record>},
],
u'num_results': 10,
u'page': 1
}
We can edit the newly created
repair_symptom_type_linkerwith aPUTrequest:
url = 'https://smartapi.bboxx.co.uk/v1/repair_symptom_type_linker/1'
data = json.dumps({
"repair_id": 2,
"symptom_type_id": 2,
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.put(url=url, data=data, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"repair_symptom_type_linker_id": 1
"repair_id": 2,
"symptom_type_id": 2,
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": 2016-07-07 12:34:45
}
Note that the
modified_atfield has been updated accordingly.If a user has
SYSTEMpermissions they can delete therepair_symptom_type_linker
url = 'https://smartapi.bboxx.co.uk/v1/repair_symptom_type_linker/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.delete(url=url, headers=headers)
r
>>> <Response 204>
r.text
>>>
Note that the response from a 204 request is empty. This means that
r.json()cannot be called and will throw a JSONDecodeError. In fact the response isu''- an empty unicode string.
POST
| value | |
|---|---|
| endpoint | /v1/repair_symptom_type_linker |
| method | POST |
| url_params | N/A |
| query params | N/A |
| body | JSON-formatted dictionary with the details of the repair_symptom_type_linker that you wish to create |
| permissions | SYSTEM |
| response | 201 |
GET
| value | |
|---|---|
| endpoint | /v1/repair_symptom_type_linker or /v1/repair_symptom_type_linker/<repair_symptom_type_linker_id> |
| method | GET |
| url_params | repair_symptom_type_linker_id (int) |
| query params | > See Query Format and Filtering |
| body | N/A |
| permissions | OVERVIEW |
| response | 200 |
PUT
| value | |
|---|---|
| endpoint | /v1/repair_symptom_type_linker/<repair_symptom_type_linker_id> |
| method | PUT |
| url_params | repair_symptom_type_linker_id of the repair_symptom_type_linker you wish to edit |
| query params | N/A |
| body | JSON-formatted dictionary of the columns that you wish to alter |
| permissions | SYSTEM |
| response | 200 |
DELETE
| value | |
|---|---|
| endpoint | /v1/repair_symptom_type_linker/<repair_symptom_type_linker_id> |
| method | DELETE |
| url_params | repair_symptom_type_linker_id (int) |
| query params | N/A |
| body | N/A |
| permissions | SYSTEM |
| response | 204 |
Repair Workflow Event
Audit trail of workflow events associated with product repairs
The repair_workflow_event object
| Field | Description |
|---|---|
| repair_workflow_event_id int (primary key) |
A unique integer identifier for each repair_workflow_event. |
| repair_id int (not-null,foreign-key) |
|
| current_state_id string (not-null) |
|
| event_id string (not-null) |
|
| payload unknown-type |
|
| next_state_id string |
|
| created_at datetime |
timestamp that the record was created at |
| created_by text |
username of the user who created the record |
| modified_at datetime |
timestamp that the record was last modified |
| modified_by text |
user that last modified the record |
| Relationship | Description |
|---|---|
| N/A | There are no relationships for this table. |
POSTrequests are not allowed at this endpointWe can retrieve the
repair_workflow_eventcreated by specifying itsrepair_workflow_event_idin the request url:
url = 'https://smartapi.bboxx.co.uk/v1/repair_workflow_events/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"repair_workflow_event_id": 1
"repair_id": 1,
"current_state_id": "test",
"event_id": "test",
"payload": Unknown column type,
"next_state_id": "test",
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve all
repair_workflow_eventsby omitting therepair_workflow_event_id:
url = 'https://smartapi.bboxx.co.uk/v1/repair_workflow_events'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
u'total_pages': 1,
u'objects': [
{<record>},
{<record>},
{<record>},
{<record>},
{<record>},
],
u'num_results': 10,
u'page': 1
}
PUTrequests are not allowed at this endpoint
DELETErequests are not allowed at this endpoint
POST
POST requests are not allowed at this endpoint
GET
| value | |
|---|---|
| endpoint | /v1/repair_workflow_events or /v1/repair_workflow_events/<repair_workflow_event_id> |
| method | GET |
| url_params | repair_workflow_event_id (int) |
| query params | > See Query Format and Filtering |
| body | N/A |
| permissions | OVERVIEW |
| response | 200 |
PUT
PUT requests are not allowed at this endpoint
DELETE
DELETE requests are not allowed at this endpoint
Repair Workflow History
History of actions associated with product repair workflows, to support undo functionality
The repair_workflow_history object
| Field | Description |
|---|---|
| repair_workflow_history_id int (primary key) |
A unique integer identifier for each repair_workflow_history. |
| repair_id int (not-null,foreign-key) |
|
| start_state_id string |
|
| end_state_id string |
|
| update_commands_bin unknown-type |
|
| can_undo boolean |
|
| created_at datetime |
timestamp that the record was created at |
| created_by text |
username of the user who created the record |
| modified_at datetime |
timestamp that the record was last modified |
| modified_by text |
user that last modified the record |
| Relationship | Description |
|---|---|
| N/A | There are no relationships for this table. |
POSTrequests are not allowed at this endpoint
GETrequests are not allowed at this endpoint
PUTrequests are not allowed at this endpoint
DELETErequests are not allowed at this endpoint
POST
POST requests are not allowed at this endpoint
### GET
GET requests are not allowed at this endpoint
PUT
PUT requests are not allowed at this endpoint
DELETE
DELETE requests are not allowed at this endpoint
Repair Workflow Selector
Rules determining the workflow to use when a repair is created
The repair_workflow_selector object
| Field | Description |
|---|---|
| repair_workflow_selector_id int (primary key) |
A unique integer identifier for each repair_workflow_selector. |
| product_type_id int (not-null,foreign-key) |
ProductType identifier |
| workflow_name string |
The name workflow of the workflow to be used. Null indicates that a repair workflow cannot be created by a user matching this rule |
| selector_type string (not-null) |
The rule type. options: ["USER", "ENTITY"] |
| selector_value string (not-null) |
The value to be matched. Email address for a 'USER' rule; GEIC code for an 'ENTITY' rule |
| created_at datetime |
timestamp that the record was created at |
| created_by text |
username of the user who created the record |
| modified_at datetime |
timestamp that the record was last modified |
| modified_by text |
user that last modified the record |
| Relationship | Description |
|---|---|
| N/A | There are no relationships for this table. |
An example POST request. Note that
repair_workflow_selector_id,created_at,modified_atandcreated_byare all handled internally by the system and need not be explicitly specified. See Meta Data for more information.
url = "https://smartapi.bboxx.co.uk/v1/repair_workflow_selectors"
data = json.dumps({
"product_type_id": 1,
"workflow_name": "test",
"selector_type": "test",
"selector_value": "test",
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.post(url=url, data=data, headers=headers)
r
>>> <Response 201>
r.json()
>>> {
"repair_workflow_selector_id": 1
"product_type_id": 1,
"workflow_name": "test",
"selector_type": "test",
"selector_value": "test",
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve the
repair_workflow_selectorcreated by specifying itsrepair_workflow_selector_idin the request url:
url = 'https://smartapi.bboxx.co.uk/v1/repair_workflow_selectors/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"repair_workflow_selector_id": 1
"product_type_id": 1,
"workflow_name": "test",
"selector_type": "test",
"selector_value": "test",
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve all
repair_workflow_selectorsby omitting therepair_workflow_selector_id:
url = 'https://smartapi.bboxx.co.uk/v1/repair_workflow_selectors'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
u'total_pages': 1,
u'objects': [
{<record>},
{<record>},
{<record>},
{<record>},
{<record>},
],
u'num_results': 10,
u'page': 1
}
We can edit the newly created
repair_workflow_selectorwith aPUTrequest:
url = 'https://smartapi.bboxx.co.uk/v1/repair_workflow_selectors/1'
data = json.dumps({
"product_type_id": 2,
"workflow_name": "changed",
"selector_type": "changed",
"selector_value": "changed",
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.put(url=url, data=data, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"repair_workflow_selector_id": 1
"product_type_id": 2,
"workflow_name": "changed",
"selector_type": "changed",
"selector_value": "changed",
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": 2016-07-07 12:34:45
}
Note that the
modified_atfield has been updated accordingly.If a user has
SYSTEMpermissions they can delete therepair_workflow_selector
url = 'https://smartapi.bboxx.co.uk/v1/repair_workflow_selectors/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.delete(url=url, headers=headers)
r
>>> <Response 204>
r.text
>>>
Note that the response from a 204 request is empty. This means that
r.json()cannot be called and will throw a JSONDecodeError. In fact the response isu''- an empty unicode string.
POST
| value | |
|---|---|
| endpoint | /v1/repair_workflow_selectors |
| method | POST |
| url_params | N/A |
| query params | N/A |
| body | JSON-formatted dictionary with the details of the repair_workflow_selector that you wish to create |
| permissions | SYSTEM |
| response | 201 |
GET
| value | |
|---|---|
| endpoint | /v1/repair_workflow_selectors or /v1/repair_workflow_selectors/<repair_workflow_selector_id> |
| method | GET |
| url_params | repair_workflow_selector_id (int) |
| query params | > See Query Format and Filtering |
| body | N/A |
| permissions | OVERVIEW |
| response | 200 |
PUT
| value | |
|---|---|
| endpoint | /v1/repair_workflow_selectors/<repair_workflow_selector_id> |
| method | PUT |
| url_params | repair_workflow_selector_id of the repair_workflow_selector you wish to edit |
| query params | N/A |
| body | JSON-formatted dictionary of the columns that you wish to alter |
| permissions | SYSTEM |
| response | 200 |
DELETE
| value | |
|---|---|
| endpoint | /v1/repair_workflow_selectors/<repair_workflow_selector_id> |
| method | DELETE |
| url_params | repair_workflow_selector_id (int) |
| query params | N/A |
| body | N/A |
| permissions | SYSTEM |
| response | 204 |
Repair Workflow State
Records time spent in product repair workflow states
The repair_workflow_state object
| Field | Description |
|---|---|
| repair_workflow_state_id int (primary key) |
A unique integer identifier for each repair_workflow_state. |
| repair_id int (not-null,foreign-key) |
|
| state_id string |
|
| entry_time datetime |
|
| exit_time datetime |
|
| created_at datetime |
timestamp that the record was created at |
| created_by text |
username of the user who created the record |
| modified_at datetime |
timestamp that the record was last modified |
| modified_by text |
user that last modified the record |
| Relationship | Description |
|---|---|
| N/A | There are no relationships for this table. |
POSTrequests are not allowed at this endpointWe can retrieve the
repair_workflow_statecreated by specifying itsrepair_workflow_state_idin the request url:
url = 'https://smartapi.bboxx.co.uk/v1/repair_workflow_states/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"repair_workflow_state_id": 1
"repair_id": 1,
"state_id": "test",
"entry_time": "2000-01-01 00:00:00",
"exit_time": "2000-01-01 00:00:00",
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve all
repair_workflow_statesby omitting therepair_workflow_state_id:
url = 'https://smartapi.bboxx.co.uk/v1/repair_workflow_states'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
u'total_pages': 1,
u'objects': [
{<record>},
{<record>},
{<record>},
{<record>},
{<record>},
],
u'num_results': 10,
u'page': 1
}
PUTrequests are not allowed at this endpoint
DELETErequests are not allowed at this endpoint
POST
POST requests are not allowed at this endpoint
GET
| value | |
|---|---|
| endpoint | /v1/repair_workflow_states or /v1/repair_workflow_states/<repair_workflow_state_id> |
| method | GET |
| url_params | repair_workflow_state_id (int) |
| query params | > See Query Format and Filtering |
| body | N/A |
| permissions | OVERVIEW |
| response | 200 |
PUT
PUT requests are not allowed at this endpoint
DELETE
DELETE requests are not allowed at this endpoint
Repair Centre
Details of Repair Centres
The repair_centre object
| Field | Description |
|---|---|
| repair_centre_id int (primary key) |
A unique integer identifier for each repair_centre. |
| name string (not-null,unique) |
Repair Centre name |
| entity_id int (not-null,unique,foreign-key) |
Entity identifier |
| created_at datetime |
timestamp that the record was created at |
| created_by text |
username of the user who created the record |
| modified_at datetime |
timestamp that the record was last modified |
| modified_by text |
user that last modified the record |
| Relationship | Description |
|---|---|
| N/A | There are no relationships for this table. |
An example POST request. Note that
repair_centre_id,created_at,modified_atandcreated_byare all handled internally by the system and need not be explicitly specified. See Meta Data for more information.
url = "https://smartapi.bboxx.co.uk/v1/repair_centres"
data = json.dumps({
"name": "test",
"entity_id": 1,
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.post(url=url, data=data, headers=headers)
r
>>> <Response 201>
r.json()
>>> {
"repair_centre_id": 1
"name": "test",
"entity_id": 1,
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve the
repair_centrecreated by specifying itsrepair_centre_idin the request url:
url = 'https://smartapi.bboxx.co.uk/v1/repair_centres/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"repair_centre_id": 1
"name": "test",
"entity_id": 1,
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve all
repair_centresby omitting therepair_centre_id:
url = 'https://smartapi.bboxx.co.uk/v1/repair_centres'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
u'total_pages': 1,
u'objects': [
{<record>},
{<record>},
{<record>},
{<record>},
{<record>},
],
u'num_results': 10,
u'page': 1
}
We can edit the newly created
repair_centrewith aPUTrequest:
url = 'https://smartapi.bboxx.co.uk/v1/repair_centres/1'
data = json.dumps({
"name": "changed",
"entity_id": 2,
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.put(url=url, data=data, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"repair_centre_id": 1
"name": "changed",
"entity_id": 2,
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": 2016-07-07 12:34:45
}
Note that the
modified_atfield has been updated accordingly.If a user has
SYSTEMpermissions they can delete therepair_centre
url = 'https://smartapi.bboxx.co.uk/v1/repair_centres/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.delete(url=url, headers=headers)
r
>>> <Response 204>
r.text
>>>
Note that the response from a 204 request is empty. This means that
r.json()cannot be called and will throw a JSONDecodeError. In fact the response isu''- an empty unicode string.
POST
| value | |
|---|---|
| endpoint | /v1/repair_centres |
| method | POST |
| url_params | N/A |
| query params | N/A |
| body | JSON-formatted dictionary with the details of the repair_centre that you wish to create |
| permissions | SYSTEM |
| response | 201 |
GET
| value | |
|---|---|
| endpoint | /v1/repair_centres or /v1/repair_centres/<repair_centre_id> |
| method | GET |
| url_params | repair_centre_id (int) |
| query params | > See Query Format and Filtering |
| body | N/A |
| permissions | OVERVIEW |
| response | 200 |
PUT
| value | |
|---|---|
| endpoint | /v1/repair_centres/<repair_centre_id> |
| method | PUT |
| url_params | repair_centre_id of the repair_centre you wish to edit |
| query params | N/A |
| body | JSON-formatted dictionary of the columns that you wish to alter |
| permissions | SYSTEM |
| response | 200 |
DELETE
| value | |
|---|---|
| endpoint | /v1/repair_centres/<repair_centre_id> |
| method | DELETE |
| url_params | repair_centre_id (int) |
| query params | N/A |
| body | N/A |
| permissions | SYSTEM |
| response | 204 |
Rtc Connection History
Contains a history of each RTC unit's connection status changes
The rtc_connection_history object
| Field | Description |
|---|---|
| rtc_connection_history_id int (primary key) |
A unique integer identifier for each rtc_connection_history. |
| product_imei varchar(15) (not-null,foreign-key) |
|
| connection_status string (not-null) |
options: ["online", "offline"] |
| connection_status_time datetime (not-null) |
|
| connection_status_reason string (not-null) |
options: ["user-request", "unknown", "low-battery-voltage", "inactivity", "sleep-mode", "message-received"] |
| connection_status_info string |
|
| latest_message_time datetime |
|
| created_at datetime |
timestamp that the record was created at |
| created_by text |
username of the user who created the record |
| modified_at datetime |
timestamp that the record was last modified |
| modified_by text |
user that last modified the record |
| Relationship | Description |
|---|---|
| N/A | There are no relationships for this table. |
POSTrequests are not allowed at this endpointWe can retrieve the
rtc_connection_historycreated by specifying itsrtc_connection_history_idin the request url:
url = 'https://smartapi.bboxx.co.uk/v1/rtc_connection_history/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"rtc_connection_history_id": 1
"product_imei": "000000000000000",
"connection_status": "test",
"connection_status_time": "2000-01-01 00:00:00",
"connection_status_reason": "test",
"connection_status_info": "test",
"latest_message_time": "2000-01-01 00:00:00",
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve all
rtc_connection_historyby omitting thertc_connection_history_id:
url = 'https://smartapi.bboxx.co.uk/v1/rtc_connection_history'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
u'total_pages': 1,
u'objects': [
{<record>},
{<record>},
{<record>},
{<record>},
{<record>},
],
u'num_results': 10,
u'page': 1
}
PUTrequests are not allowed at this endpointIf a user has
SYSTEMpermissions they can delete thertc_connection_history
url = 'https://smartapi.bboxx.co.uk/v1/rtc_connection_history/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.delete(url=url, headers=headers)
r
>>> <Response 204>
r.text
>>>
Note that the response from a 204 request is empty. This means that
r.json()cannot be called and will throw a JSONDecodeError. In fact the response isu''- an empty unicode string.
POST
POST requests are not allowed at this endpoint
GET
| value | |
|---|---|
| endpoint | /v1/rtc_connection_history or /v1/rtc_connection_history/<rtc_connection_history_id> |
| method | GET |
| url_params | rtc_connection_history_id (int) |
| query params | > See Query Format and Filtering |
| body | N/A |
| permissions | OVERVIEW |
| response | 200 |
PUT
PUT requests are not allowed at this endpoint
DELETE
| value | |
|---|---|
| endpoint | /v1/rtc_connection_history/<rtc_connection_history_id> |
| method | DELETE |
| url_params | rtc_connection_history_id (int) |
| query params | N/A |
| body | N/A |
| permissions | SYSTEM |
| response | 204 |
RTCDeadLetter
Lists RTC mobile-orginated (MO) messages that could not be processed by SMART Solar.
The rtc_dead_letter object
| Field | Description |
|---|---|
| rtc_dead_letter_id int (primary key) |
A unique integer identifier for each rtc_dead_letter entry. |
| queue_name text (not-null) |
The name of the queue where the message originated: 'RTC-MO' or 'RTC-MT.Reply' |
| payload text (not-null) |
The message payload as a JSON string |
| status text |
The status of the message: 'replayed', 'discarded', |
| status_time datetime |
Time of the last status change |
| replay_status text |
If the message has been replayed, this will contain the status of the replay attempt: 'success' or 'failure'. Otherwise |
| replay_status_text text |
More detail on the replay status |
| replay_status_time datetime |
Time the replay_status was updated |
| created_at datetime |
timestamp that the record was created at |
| created_by text |
username of the user who created the record |
| modified_at datetime |
timestamp that the record was last modified |
| modified_by text |
user that last modified the record |
| Relationship | Description |
|---|---|
| N/A | There are no relationships for this table. |
POSTrequests are not allowed at this endpoint
> We can retrieve a rtc_dead_letter by specifying its rtc_dead_letter_id in the request url:
url = 'https://smartapi.bboxx.co.uk/v1/rtc_dead_letter/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"rtc_dead_letter": 1,
"queue_name": "RTC-MO",
"payload": "{\"ident\": \"Aeris/10.112.89.62\", \"message\": \"ggSfghpaebuvaUNvbm5lY3RlZP8=\", \"correlation_id\": \"d478ea0eeadc47e8aead97502235ccac\", \"timestamp\": \"2018-02-06T14:29:14.349698\", \"ident_type\": \"IP\"}",
"status": "replayed",
"status_time": "2000-01-01 00:00:00",
"replay_status": "success",
"replay_status_text": None,
"replay_status_time": "2000-01-01 00:00:00",
"created_at": "2000-01-01 00:00:00",
"created_by": "test.user@bboxx.co.uk",
"modified_at": None
}
We can retrieve all
rtc_dead_letterentries by omitting thertc_dead_letter_id:
url = 'https://smartapi.bboxx.co.uk/v1/rtc_dead_letter'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
u'total_pages': 1,
u'objects': [
{<record>},
{<record>},
{<record>},
{<record>},
{<record>},
],
u'num_results': 10,
u'page': 1
}
PUTrequests are not allowed at this endpoint
DELETErequests are not allowed at this endpoint
POST
POST requests are not allowed at this endpoint
GET
| value | |
|---|---|
| endpoint | /v1/rtc_dead_letter or /v1/rtc_dead_letter/<rtc_dead_letter_id> |
| method | GET |
| url_params | rtc_dead_letter (int) |
| query params | > See Query Format and Filtering |
| body | N/A |
| permissions | OVERVIEW |
| response | 200 |
PUT
PUT requests are not allowed at this endpoint
DELETE
DELETE requests are not allowed at this endpoint
Rtc Dead Letter
RTC messages that failed to be delivered.
The rtc_dead_letter object
| Field | Description |
|---|---|
| rtc_dead_letter_id int (primary key) |
A unique integer identifier for each rtc_dead_letter. |
| queue_name unknown-type (not-null) |
|
| payload string (not-null) |
|
| status string |
options: ["discarded", "replayed"] |
| status_time datetime |
|
| replay_status string |
options: ["failure", "success"] |
| replay_status_text string |
|
| replay_status_time datetime |
|
| created_at datetime |
timestamp that the record was created at |
| created_by text |
username of the user who created the record |
| modified_at datetime |
timestamp that the record was last modified |
| modified_by text |
user that last modified the record |
| Relationship | Description |
|---|---|
| N/A | There are no relationships for this table. |
POSTrequests are not allowed at this endpointWe can retrieve the
rtc_dead_lettercreated by specifying itsrtc_dead_letter_idin the request url:
url = 'https://smartapi.bboxx.co.uk/v1/rtc_dead_letters/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"rtc_dead_letter_id": 1
"queue_name": Unknown column type,
"payload": "test",
"status": "test",
"status_time": "2000-01-01 00:00:00",
"replay_status": "test",
"replay_status_text": "test",
"replay_status_time": "2000-01-01 00:00:00",
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve all
rtc_dead_lettersby omitting thertc_dead_letter_id:
url = 'https://smartapi.bboxx.co.uk/v1/rtc_dead_letters'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
u'total_pages': 1,
u'objects': [
{<record>},
{<record>},
{<record>},
{<record>},
{<record>},
],
u'num_results': 10,
u'page': 1
}
PUTrequests are not allowed at this endpoint
DELETErequests are not allowed at this endpoint
POST
POST requests are not allowed at this endpoint
GET
| value | |
|---|---|
| endpoint | /v1/rtc_dead_letters or /v1/rtc_dead_letters/<rtc_dead_letter_id> |
| method | GET |
| url_params | rtc_dead_letter_id (int) |
| query params | > See Query Format and Filtering |
| body | N/A |
| permissions | OVERVIEW |
| response | 200 |
PUT
PUT requests are not allowed at this endpoint
DELETE
DELETE requests are not allowed at this endpoint
Rtc Fallback Message History
Contains a history of occurrences of RTC Status Update messages sent to units by the fallback process
The rtc_fallback_message_history object
| Field | Description |
|---|---|
| rtc_fallback_message_history_id int (primary key) |
A unique integer identifier for each rtc_fallback_message_history. |
| product_imei varchar(15) (not-null,foreign-key) |
|
| message_sent_time datetime (not-null) |
|
| created_at datetime |
timestamp that the record was created at |
| created_by text |
username of the user who created the record |
| modified_at datetime |
timestamp that the record was last modified |
| modified_by text |
user that last modified the record |
| Relationship | Description |
|---|---|
| N/A | There are no relationships for this table. |
POSTrequests are not allowed at this endpoint
GETrequests are not allowed at this endpoint
PUTrequests are not allowed at this endpoint
DELETErequests are not allowed at this endpoint
POST
POST requests are not allowed at this endpoint
### GET
GET requests are not allowed at this endpoint
PUT
PUT requests are not allowed at this endpoint
DELETE
DELETE requests are not allowed at this endpoint
Rtc Message History
Contains a history of RTC messages sent to each unit.
The rtc_message_history object
| Field | Description |
|---|---|
| rtc_message_history_id int (primary key) |
A unique integer identifier for each rtc_message_history. |
| product_imei varchar(15) (not-null,foreign-key) |
|
| message_reference string |
|
| message_bin unknown-type |
|
| message_sent_time datetime (not-null) |
|
| delivery_status string |
options: ["failed", "delivered"] |
| delivery_status_time datetime |
|
| delivery_status_info string |
|
| message_json string |
|
| created_at datetime |
timestamp that the record was created at |
| created_by text |
username of the user who created the record |
| modified_at datetime |
timestamp that the record was last modified |
| modified_by text |
user that last modified the record |
| Relationship | Description |
|---|---|
| N/A | There are no relationships for this table. |
POSTrequests are not allowed at this endpoint
GETrequests are not allowed at this endpoint
PUTrequests are not allowed at this endpoint
DELETErequests are not allowed at this endpoint
POST
POST requests are not allowed at this endpoint
### GET
GET requests are not allowed at this endpoint
PUT
PUT requests are not allowed at this endpoint
DELETE
DELETE requests are not allowed at this endpoint
Rtc Mo Message History
Contains a history of RTC messages received from each unit.
The rtc_mo_message_history object
| Field | Description |
|---|---|
| rtc_mo_message_history_id int (primary key) |
A unique integer identifier for each rtc_mo_message_history. |
| product_imei varchar(15) (not-null,foreign-key) |
|
| message_bin unknown-type |
|
| message_json string |
|
| message_received_time datetime (not-null) |
|
| processing_status string |
options: ["failed", "processed"] |
| processing_status_info string |
|
| created_at datetime |
timestamp that the record was created at |
| created_by text |
username of the user who created the record |
| modified_at datetime |
timestamp that the record was last modified |
| modified_by text |
user that last modified the record |
| Relationship | Description |
|---|---|
| N/A | There are no relationships for this table. |
POSTrequests are not allowed at this endpointWe can retrieve the
rtc_mo_message_historycreated by specifying itsrtc_mo_message_history_idin the request url:
url = 'https://smartapi.bboxx.co.uk/v1/rtc_mo_message_history/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"rtc_mo_message_history_id": 1
"product_imei": "000000000000000",
"message_bin": Unknown column type,
"message_json": "test",
"message_received_time": "2000-01-01 00:00:00",
"processing_status": "test",
"processing_status_info": "test",
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve all
rtc_mo_message_historyby omitting thertc_mo_message_history_id:
url = 'https://smartapi.bboxx.co.uk/v1/rtc_mo_message_history'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
u'total_pages': 1,
u'objects': [
{<record>},
{<record>},
{<record>},
{<record>},
{<record>},
],
u'num_results': 10,
u'page': 1
}
PUTrequests are not allowed at this endpoint
DELETErequests are not allowed at this endpoint
POST
POST requests are not allowed at this endpoint
GET
| value | |
|---|---|
| endpoint | /v1/rtc_mo_message_history or /v1/rtc_mo_message_history/<rtc_mo_message_history_id> |
| method | GET |
| url_params | rtc_mo_message_history_id (int) |
| query params | > See Query Format and Filtering |
| body | N/A |
| permissions | OVERVIEW |
| response | 200 |
PUT
PUT requests are not allowed at this endpoint
DELETE
DELETE requests are not allowed at this endpoint
Serial
Table used to generate new serial_numbers
The serial object
| Field | Description |
|---|---|
| serial_number int (primary key) |
A unique integer identifier for each serial. |
| created_at datetime |
timestamp that the record was created at |
| created_by text |
username of the user who created the record |
| modified_at datetime |
timestamp that the record was last modified |
| modified_by text |
user that last modified the record |
| Relationship | Description |
|---|---|
| N/A | There are no relationships for this table. |
POSTrequests are not allowed at this endpoint
GETrequests are not allowed at this endpoint
PUTrequests are not allowed at this endpoint
DELETErequests are not allowed at this endpoint
POST
POST requests are not allowed at this endpoint
### GET
GET requests are not allowed at this endpoint
PUT
PUT requests are not allowed at this endpoint
DELETE
DELETE requests are not allowed at this endpoint
Shop
Contains details of all the BBOXX shops. (obselete)
The shop object
| Field | Description |
|---|---|
| shop_id int (primary key) |
A unique integer identifier for each shop. |
| name string (not-null,unique) |
|
| guid string (unique) |
|
| hub_id int (not-null,foreign-key) |
|
| latitude varchar(12) |
|
| longitude varchar(12) |
|
| created_at datetime |
timestamp that the record was created at |
| created_by text |
username of the user who created the record |
| modified_at datetime |
timestamp that the record was last modified |
| modified_by text |
user that last modified the record |
| Relationship | Description |
|---|---|
| products | The associated products |
An example POST request. Note that
shop_id,created_at,modified_atandcreated_byare all handled internally by the system and need not be explicitly specified. See Meta Data for more information.
url = "https://smartapi.bboxx.co.uk/v1/shops"
data = json.dumps({
"name": "test",
"guid": "test",
"hub_id": 1,
"latitude": "-1.111111111",
"longitude": "-1.111111111",
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.post(url=url, data=data, headers=headers)
r
>>> <Response 201>
r.json()
>>> {
"shop_id": 1
"name": "test",
"guid": "test",
"hub_id": 1,
"latitude": "-1.111111111",
"longitude": "-1.111111111",
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve the
shopcreated by specifying itsshop_idin the request url:
url = 'https://smartapi.bboxx.co.uk/v1/shops/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"shop_id": 1
"name": "test",
"guid": "test",
"hub_id": 1,
"latitude": "-1.111111111",
"longitude": "-1.111111111",
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve all
shopsby omitting theshop_id:
url = 'https://smartapi.bboxx.co.uk/v1/shops'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
u'total_pages': 1,
u'objects': [
{<record>},
{<record>},
{<record>},
{<record>},
{<record>},
],
u'num_results': 10,
u'page': 1
}
We can edit the newly created
shopwith aPUTrequest:
url = 'https://smartapi.bboxx.co.uk/v1/shops/1'
data = json.dumps({
"name": "changed",
"guid": "changed",
"hub_id": 2,
"latitude": "-9.999999999",
"longitude": "-9.999999999",
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.put(url=url, data=data, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"shop_id": 1
"name": "changed",
"guid": "changed",
"hub_id": 2,
"latitude": "-9.999999999",
"longitude": "-9.999999999",
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": 2016-07-07 12:34:45
}
Note that the
modified_atfield has been updated accordingly.If a user has
SYSTEMpermissions they can delete theshop
url = 'https://smartapi.bboxx.co.uk/v1/shops/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.delete(url=url, headers=headers)
r
>>> <Response 204>
r.text
>>>
Note that the response from a 204 request is empty. This means that
r.json()cannot be called and will throw a JSONDecodeError. In fact the response isu''- an empty unicode string.
POST
| value | |
|---|---|
| endpoint | /v1/shops |
| method | POST |
| url_params | N/A |
| query params | N/A |
| body | JSON-formatted dictionary with the details of the shop that you wish to create |
| permissions | SYSTEM |
| response | 201 |
GET
| value | |
|---|---|
| endpoint | /v1/shops or /v1/shops/<shop_id> |
| method | GET |
| url_params | shop_id (int) |
| query params | > See Query Format and Filtering |
| body | N/A |
| permissions | OVERVIEW |
| response | 200 |
PUT
| value | |
|---|---|
| endpoint | /v1/shops/<shop_id> |
| method | PUT |
| url_params | shop_id of the shop you wish to edit |
| query params | N/A |
| body | JSON-formatted dictionary of the columns that you wish to alter |
| permissions | SYSTEM |
| response | 200 |
DELETE
| value | |
|---|---|
| endpoint | /v1/shops/<shop_id> |
| method | DELETE |
| url_params | shop_id (int) |
| query params | N/A |
| body | N/A |
| permissions | SYSTEM |
| response | 204 |
Sim Part Type Sim Provider Linker
Specifies which SIM types are associated with which provider
The sim_part_type_sim_provider_linker object
| Field | Description |
|---|---|
| sim_part_type_sim_provider_linker_id int (primary key) |
A unique integer identifier for each sim_part_type_sim_provider_linker. |
| sim_part_type_id int (not-null,unique,foreign-key) |
|
| sim_provider_id int (not-null,foreign-key) |
|
| created_at datetime |
timestamp that the record was created at |
| created_by text |
username of the user who created the record |
| modified_at datetime |
timestamp that the record was last modified |
| modified_by text |
user that last modified the record |
| Relationship | Description |
|---|---|
| N/A | There are no relationships for this table. |
An example POST request. Note that
sim_part_type_sim_provider_linker_id,created_at,modified_atandcreated_byare all handled internally by the system and need not be explicitly specified. See Meta Data for more information.
url = "https://smartapi.bboxx.co.uk/v1/sim_part_type_sim_provider_linker"
data = json.dumps({
"sim_part_type_id": 1,
"sim_provider_id": 1,
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.post(url=url, data=data, headers=headers)
r
>>> <Response 201>
r.json()
>>> {
"sim_part_type_sim_provider_linker_id": 1
"sim_part_type_id": 1,
"sim_provider_id": 1,
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve the
sim_part_type_sim_provider_linkercreated by specifying itssim_part_type_sim_provider_linker_idin the request url:
url = 'https://smartapi.bboxx.co.uk/v1/sim_part_type_sim_provider_linker/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"sim_part_type_sim_provider_linker_id": 1
"sim_part_type_id": 1,
"sim_provider_id": 1,
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve all
sim_part_type_sim_provider_linkerby omitting thesim_part_type_sim_provider_linker_id:
url = 'https://smartapi.bboxx.co.uk/v1/sim_part_type_sim_provider_linker'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
u'total_pages': 1,
u'objects': [
{<record>},
{<record>},
{<record>},
{<record>},
{<record>},
],
u'num_results': 10,
u'page': 1
}
We can edit the newly created
sim_part_type_sim_provider_linkerwith aPUTrequest:
url = 'https://smartapi.bboxx.co.uk/v1/sim_part_type_sim_provider_linker/1'
data = json.dumps({
"sim_part_type_id": 2,
"sim_provider_id": 2,
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.put(url=url, data=data, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"sim_part_type_sim_provider_linker_id": 1
"sim_part_type_id": 2,
"sim_provider_id": 2,
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": 2016-07-07 12:34:45
}
Note that the
modified_atfield has been updated accordingly.If a user has
SYSTEMpermissions they can delete thesim_part_type_sim_provider_linker
url = 'https://smartapi.bboxx.co.uk/v1/sim_part_type_sim_provider_linker/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.delete(url=url, headers=headers)
r
>>> <Response 204>
r.text
>>>
Note that the response from a 204 request is empty. This means that
r.json()cannot be called and will throw a JSONDecodeError. In fact the response isu''- an empty unicode string.
POST
| value | |
|---|---|
| endpoint | /v1/sim_part_type_sim_provider_linker |
| method | POST |
| url_params | N/A |
| query params | N/A |
| body | JSON-formatted dictionary with the details of the sim_part_type_sim_provider_linker that you wish to create |
| permissions | SYSTEM |
| response | 201 |
GET
| value | |
|---|---|
| endpoint | /v1/sim_part_type_sim_provider_linker or /v1/sim_part_type_sim_provider_linker/<sim_part_type_sim_provider_linker_id> |
| method | GET |
| url_params | sim_part_type_sim_provider_linker_id (int) |
| query params | > See Query Format and Filtering |
| body | N/A |
| permissions | OVERVIEW |
| response | 200 |
PUT
| value | |
|---|---|
| endpoint | /v1/sim_part_type_sim_provider_linker/<sim_part_type_sim_provider_linker_id> |
| method | PUT |
| url_params | sim_part_type_sim_provider_linker_id of the sim_part_type_sim_provider_linker you wish to edit |
| query params | N/A |
| body | JSON-formatted dictionary of the columns that you wish to alter |
| permissions | SYSTEM |
| response | 200 |
DELETE
| value | |
|---|---|
| endpoint | /v1/sim_part_type_sim_provider_linker/<sim_part_type_sim_provider_linker_id> |
| method | DELETE |
| url_params | sim_part_type_sim_provider_linker_id (int) |
| query params | N/A |
| body | N/A |
| permissions | SYSTEM |
| response | 204 |
Sim Provider Network Linker
Specifies which networks are available to each SIM provider
The sim_provider_network_linker object
| Field | Description |
|---|---|
| sim_provider_network_linker_id int (primary key) |
A unique integer identifier for each sim_provider_network_linker. |
| sim_provider_id int (not-null,foreign-key) |
|
| network_id int (not-null,foreign-key) |
|
| created_at datetime |
timestamp that the record was created at |
| created_by text |
username of the user who created the record |
| modified_at datetime |
timestamp that the record was last modified |
| modified_by text |
user that last modified the record |
| Relationship | Description |
|---|---|
| N/A | There are no relationships for this table. |
An example POST request. Note that
sim_provider_network_linker_id,created_at,modified_atandcreated_byare all handled internally by the system and need not be explicitly specified. See Meta Data for more information.
url = "https://smartapi.bboxx.co.uk/v1/sim_provider_network_linker"
data = json.dumps({
"sim_provider_id": 1,
"network_id": 1,
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.post(url=url, data=data, headers=headers)
r
>>> <Response 201>
r.json()
>>> {
"sim_provider_network_linker_id": 1
"sim_provider_id": 1,
"network_id": 1,
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve the
sim_provider_network_linkercreated by specifying itssim_provider_network_linker_idin the request url:
url = 'https://smartapi.bboxx.co.uk/v1/sim_provider_network_linker/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"sim_provider_network_linker_id": 1
"sim_provider_id": 1,
"network_id": 1,
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve all
sim_provider_network_linkerby omitting thesim_provider_network_linker_id:
url = 'https://smartapi.bboxx.co.uk/v1/sim_provider_network_linker'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
u'total_pages': 1,
u'objects': [
{<record>},
{<record>},
{<record>},
{<record>},
{<record>},
],
u'num_results': 10,
u'page': 1
}
We can edit the newly created
sim_provider_network_linkerwith aPUTrequest:
url = 'https://smartapi.bboxx.co.uk/v1/sim_provider_network_linker/1'
data = json.dumps({
"sim_provider_id": 2,
"network_id": 2,
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.put(url=url, data=data, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"sim_provider_network_linker_id": 1
"sim_provider_id": 2,
"network_id": 2,
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": 2016-07-07 12:34:45
}
Note that the
modified_atfield has been updated accordingly.If a user has
SYSTEMpermissions they can delete thesim_provider_network_linker
url = 'https://smartapi.bboxx.co.uk/v1/sim_provider_network_linker/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.delete(url=url, headers=headers)
r
>>> <Response 204>
r.text
>>>
Note that the response from a 204 request is empty. This means that
r.json()cannot be called and will throw a JSONDecodeError. In fact the response isu''- an empty unicode string.
POST
| value | |
|---|---|
| endpoint | /v1/sim_provider_network_linker |
| method | POST |
| url_params | N/A |
| query params | N/A |
| body | JSON-formatted dictionary with the details of the sim_provider_network_linker that you wish to create |
| permissions | SYSTEM |
| response | 201 |
GET
| value | |
|---|---|
| endpoint | /v1/sim_provider_network_linker or /v1/sim_provider_network_linker/<sim_provider_network_linker_id> |
| method | GET |
| url_params | sim_provider_network_linker_id (int) |
| query params | > See Query Format and Filtering |
| body | N/A |
| permissions | OVERVIEW |
| response | 200 |
PUT
| value | |
|---|---|
| endpoint | /v1/sim_provider_network_linker/<sim_provider_network_linker_id> |
| method | PUT |
| url_params | sim_provider_network_linker_id of the sim_provider_network_linker you wish to edit |
| query params | N/A |
| body | JSON-formatted dictionary of the columns that you wish to alter |
| permissions | SYSTEM |
| response | 200 |
DELETE
| value | |
|---|---|
| endpoint | /v1/sim_provider_network_linker/<sim_provider_network_linker_id> |
| method | DELETE |
| url_params | sim_provider_network_linker_id (int) |
| query params | N/A |
| body | N/A |
| permissions | SYSTEM |
| response | 204 |
Sim Provider
Contains a list of SIM providers
The sim_provider object
| Field | Description |
|---|---|
| sim_provider_id int (primary key) |
A unique integer identifier for each sim_provider. |
| name string (not-null,unique) |
|
| created_at datetime |
timestamp that the record was created at |
| created_by text |
username of the user who created the record |
| modified_at datetime |
timestamp that the record was last modified |
| modified_by text |
user that last modified the record |
| Relationship | Description |
|---|---|
| N/A | There are no relationships for this table. |
An example POST request. Note that
sim_provider_id,created_at,modified_atandcreated_byare all handled internally by the system and need not be explicitly specified. See Meta Data for more information.
url = "https://smartapi.bboxx.co.uk/v1/sim_providers"
data = json.dumps({
"name": "test",
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.post(url=url, data=data, headers=headers)
r
>>> <Response 201>
r.json()
>>> {
"sim_provider_id": 1
"name": "test",
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve the
sim_providercreated by specifying itssim_provider_idin the request url:
url = 'https://smartapi.bboxx.co.uk/v1/sim_providers/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"sim_provider_id": 1
"name": "test",
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve all
sim_providersby omitting thesim_provider_id:
url = 'https://smartapi.bboxx.co.uk/v1/sim_providers'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
u'total_pages': 1,
u'objects': [
{<record>},
{<record>},
{<record>},
{<record>},
{<record>},
],
u'num_results': 10,
u'page': 1
}
We can edit the newly created
sim_providerwith aPUTrequest:
url = 'https://smartapi.bboxx.co.uk/v1/sim_providers/1'
data = json.dumps({
"name": "changed",
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.put(url=url, data=data, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"sim_provider_id": 1
"name": "changed",
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": 2016-07-07 12:34:45
}
Note that the
modified_atfield has been updated accordingly.If a user has
SYSTEMpermissions they can delete thesim_provider
url = 'https://smartapi.bboxx.co.uk/v1/sim_providers/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.delete(url=url, headers=headers)
r
>>> <Response 204>
r.text
>>>
Note that the response from a 204 request is empty. This means that
r.json()cannot be called and will throw a JSONDecodeError. In fact the response isu''- an empty unicode string.
POST
| value | |
|---|---|
| endpoint | /v1/sim_providers |
| method | POST |
| url_params | N/A |
| query params | N/A |
| body | JSON-formatted dictionary with the details of the sim_provider that you wish to create |
| permissions | SYSTEM |
| response | 201 |
GET
| value | |
|---|---|
| endpoint | /v1/sim_providers or /v1/sim_providers/<sim_provider_id> |
| method | GET |
| url_params | sim_provider_id (int) |
| query params | > See Query Format and Filtering |
| body | N/A |
| permissions | OVERVIEW |
| response | 200 |
PUT
| value | |
|---|---|
| endpoint | /v1/sim_providers/<sim_provider_id> |
| method | PUT |
| url_params | sim_provider_id of the sim_provider you wish to edit |
| query params | N/A |
| body | JSON-formatted dictionary of the columns that you wish to alter |
| permissions | SYSTEM |
| response | 200 |
DELETE
| value | |
|---|---|
| endpoint | /v1/sim_providers/<sim_provider_id> |
| method | DELETE |
| url_params | sim_provider_id (int) |
| query params | N/A |
| body | N/A |
| permissions | SYSTEM |
| response | 204 |
Sms History
This description is not yet complete it should be filled in!
The sms_history object
| Field | Description |
|---|---|
| sms_history_id int (primary key) |
A unique integer identifier for each sms_history. |
| attempted_retries int (not-null) |
|
| enable_history_id int (foreign-key) |
|
| message_reference string |
|
| message string |
|
| product_imei varchar(15) (not-null,foreign-key) |
|
| sent_time datetime (not-null) |
|
| sms_timeout datetime (not-null) |
|
| status string |
|
| trigger string |
|
| created_at datetime |
timestamp that the record was created at |
| created_by text |
username of the user who created the record |
| modified_at datetime |
timestamp that the record was last modified |
| Relationship | Description |
|---|
There are no relatioships for this table.
HTTP Requests
An example POST request. Note that sms_history_id, created_at, modified_at and created_by are all handled internally by the system and need not be explicitly specified. See Meta Data for more information.
url = "https://smartapi.bboxx.co.uk/v1/sms_histories"
data = json.dumps({
"attempted_retries": 1,
"enable_history_id": 1,
"message_reference": "test",
"message": "test",
"product_imei": "000000000000000",
"sent_time": "2000-01-01 00:00:00",
"sms_timeout": "2000-01-01 00:00:00",
"status": "test",
"trigger": "test",
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=' + <valid_token>}
r = requests.post(url=url, data=data, headers=headers)
r
>>> <Response 201>
r.json()
>>> {
"sms_history_id": 1
"attempted_retries": 1,
"enable_history_id": 1,
"message_reference": "test",
"message": "test",
"product_imei": "000000000000000",
"sent_time": "2000-01-01 00:00:00",
"sms_timeout": "2000-01-01 00:00:00",
"status": "test",
"trigger": "test",
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve the
sms_historycreated by specifying itssms_history_idin the request url:
url = 'https://smartapi.bboxx.co.uk/v1/sms_histories/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=' + <valid_token>}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"sms_history_id": 1
"attempted_retries": 1,
"enable_history_id": 1,
"message_reference": "test",
"message": "test",
"product_imei": "000000000000000",
"sent_time": "2000-01-01 00:00:00",
"sms_timeout": "2000-01-01 00:00:00",
"status": "test",
"trigger": "test",
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
and we can retrieve all sms_histories by omitted the sms_history_id:
url = 'https://smartapi.bboxx.co.uk/v1/sms_histories'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=' + <valid_token>}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
u'total_pages': 1,
u'objects': [
{<record>},
{<record>},
{<record>},
{<record>},
{<record>},
],
u'num_results': 10,
u'page': 1
}
We can edit the newly created sms_history with a
PUTrequest:
url = 'https://smartapi.bboxx.co.uk/v1/sms_histories'
data = json.dumps({
"attempted_retries": 2,
"enable_history_id": 2,
"message_reference": "changed",
"message": "changed",
"product_imei": "999999999999999",
"sent_time": "2016-07-01 12:34:45",
"sms_timeout": "2016-07-01 12:34:45",
"status": "changed",
"trigger": "changed",
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=' + <valid_token>}
r = requests.post(url=url, data=data, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"sms_history_id": 1
"attempted_retries": 2,
"enable_history_id": 2,
"message_reference": "changed",
"message": "changed",
"product_imei": "999999999999999",
"sent_time": "2016-07-01 12:34:45",
"sms_timeout": "2016-07-01 12:34:45",
"status": "changed",
"trigger": "changed",
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": 2016-07-07 12:34:45
}
Note that the
modified_atfield has been updated accordingly.If a user has
SYSTEMpermissions they can delete the sms_history
url = 'https://smartapi.bboxx.co.uk/v1/sms_histories/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=' + <valid_token>}
r = requests.delete(url=url, headers=headers)
r
>>> <Response 204>
r.text
>>>
Note that the response from a 204 request is empty. This means that
r.json()cannot be called and will throw a JSONDecodeError. In fact the response isu''- an empty unicode string.
POST
| value | |
|---|---|
| endpoint | /v1/sms_histories |
| method | POST |
| url_params | N/A |
| query params | N/A |
| body | JSON-formatted dictionary with the details of the sms_history that you wish to create |
| permissions | SYSTEM |
| response | 201 |
GET
| value | |
|---|---|
| endpoint | /v1/sms_histories or /v1/sms_histories/<sms_history_id> |
| method | GET |
| url_params | sms_history_id (int) |
| query params | > See Query Format and Filtering |
| body | N/A |
| permissions | OVERVIEW |
| response | 200 |
PUT
| value | |
|---|---|
| endpoint | /v1/sms_histories/<sms_history_id> |
| method | PUT |
| url_params | sms_history_id of the sms_history you wish to edit |
| query params | N/A |
| body | JSON-formatted dictionary of the columns that you wish to alter |
| permissions | SYSTEM |
| response | 200 |
DELETE
| value | |
|---|---|
| endpoint | /v1/sms_histories/<sms_history_id> |
| method | DELETE |
| url_params | sms_history_id (pk_type) |
| query params | N/A |
| body | N/A |
| permissions | SYSTEM |
| response | 204 |
Software Version Type
Contains the details of the possible software-version-types that a unit can have running.
The software_version_type object
| Field | Description |
|---|---|
| software_version_type_id int (primary key) |
A unique integer identifier for each software_version_type. |
| name string (not-null,unique) |
|
| description string |
|
| link string |
|
| checksum varchar(8) |
|
| release_date datetime (not-null) |
|
| parameter_types array |
|
| status unknown-type |
options: ["outdated", "stable", "beta", "bad"] |
| created_at datetime |
timestamp that the record was created at |
| created_by text |
username of the user who created the record |
| modified_at datetime |
timestamp that the record was last modified |
| modified_by text |
user that last modified the record |
| Relationship | Description |
|---|---|
| product_type_software_version_type_linker | The associated product_type_software_version_type_linker |
| product_software_linker | The associated product_software_linker |
| latest_software | The associated latest_software |
An example POST request. Note that
software_version_type_id,created_at,modified_atandcreated_byare all handled internally by the system and need not be explicitly specified. See Meta Data for more information.
url = "https://smartapi.bboxx.co.uk/v1/software_version_types"
data = json.dumps({
"name": "test",
"description": "test",
"link": "test",
"checksum": "checksum",
"release_date": "2000-01-01 00:00:00",
"parameter_types": [1,2,3],
"status": Unknown column type,
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.post(url=url, data=data, headers=headers)
r
>>> <Response 201>
r.json()
>>> {
"software_version_type_id": 1
"name": "test",
"description": "test",
"link": "test",
"checksum": "checksum",
"release_date": "2000-01-01 00:00:00",
"parameter_types": [1,2,3],
"status": Unknown column type,
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve the
software_version_typecreated by specifying itssoftware_version_type_idin the request url:
url = 'https://smartapi.bboxx.co.uk/v1/software_version_types/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"software_version_type_id": 1
"name": "test",
"description": "test",
"link": "test",
"checksum": "checksum",
"release_date": "2000-01-01 00:00:00",
"parameter_types": [1,2,3],
"status": Unknown column type,
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve all
software_version_typesby omitting thesoftware_version_type_id:
url = 'https://smartapi.bboxx.co.uk/v1/software_version_types'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
u'total_pages': 1,
u'objects': [
{<record>},
{<record>},
{<record>},
{<record>},
{<record>},
],
u'num_results': 10,
u'page': 1
}
We can edit the newly created
software_version_typewith aPUTrequest:
url = 'https://smartapi.bboxx.co.uk/v1/software_version_types/1'
data = json.dumps({
"name": "changed",
"description": "changed",
"link": "changed",
"checksum": "csedited",
"release_date": "2016-07-01 12:34:45",
"parameter_types": [1,2,3,4,5,6],
"status": Unknown column type,
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.put(url=url, data=data, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"software_version_type_id": 1
"name": "changed",
"description": "changed",
"link": "changed",
"checksum": "csedited",
"release_date": "2016-07-01 12:34:45",
"parameter_types": [1,2,3,4,5,6],
"status": Unknown column type,
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": 2016-07-07 12:34:45
}
Note that the
modified_atfield has been updated accordingly.If a user has
SYSTEMpermissions they can delete thesoftware_version_type
url = 'https://smartapi.bboxx.co.uk/v1/software_version_types/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.delete(url=url, headers=headers)
r
>>> <Response 204>
r.text
>>>
Note that the response from a 204 request is empty. This means that
r.json()cannot be called and will throw a JSONDecodeError. In fact the response isu''- an empty unicode string.
POST
| value | |
|---|---|
| endpoint | /v1/software_version_types |
| method | POST |
| url_params | N/A |
| query params | N/A |
| body | JSON-formatted dictionary with the details of the software_version_type that you wish to create |
| permissions | SYSTEM |
| response | 201 |
GET
| value | |
|---|---|
| endpoint | /v1/software_version_types or /v1/software_version_types/<software_version_type_id> |
| method | GET |
| url_params | software_version_type_id (int) |
| query params | > See Query Format and Filtering |
| body | N/A |
| permissions | OVERVIEW |
| response | 200 |
PUT
| value | |
|---|---|
| endpoint | /v1/software_version_types/<software_version_type_id> |
| method | PUT |
| url_params | software_version_type_id of the software_version_type you wish to edit |
| query params | N/A |
| body | JSON-formatted dictionary of the columns that you wish to alter |
| permissions | SYSTEM |
| response | 200 |
DELETE
| value | |
|---|---|
| endpoint | /v1/software_version_types/<software_version_type_id> |
| method | DELETE |
| url_params | software_version_type_id (int) |
| query params | N/A |
| body | N/A |
| permissions | SYSTEM |
| response | 204 |
State
Contains the current and historical state of every unit
The state object
| Field | Description |
|---|---|
| state_id int (primary key) |
A unique integer identifier for each state. |
| product_imei varchar(15) (not-null,foreign-key) |
|
| prev_state_type int (not-null,foreign-key) |
|
| current_state_type int (not-null,foreign-key) |
|
| created_at datetime |
timestamp that the record was created at |
| created_by text |
username of the user who created the record |
| modified_at datetime |
timestamp that the record was last modified |
| modified_by text |
user that last modified the record |
| Relationship | Description |
|---|---|
| N/A | There are no relationships for this table. |
POSTrequests are not allowed at this endpointWe can retrieve the
statecreated by specifying itsstate_idin the request url:
url = 'https://smartapi.bboxx.co.uk/v1/states/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"state_id": 1
"product_imei": "000000000000000",
"prev_state_type": 1,
"current_state_type": 1,
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve all
statesby omitting thestate_id:
url = 'https://smartapi.bboxx.co.uk/v1/states'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
u'total_pages': 1,
u'objects': [
{<record>},
{<record>},
{<record>},
{<record>},
{<record>},
],
u'num_results': 10,
u'page': 1
}
PUTrequests are not allowed at this endpoint
DELETErequests are not allowed at this endpoint
POST
POST requests are not allowed at this endpoint
GET
| value | |
|---|---|
| endpoint | /v1/states or /v1/states/<state_id> |
| method | GET |
| url_params | state_id (int) |
| query params | > See Query Format and Filtering |
| body | N/A |
| permissions | OVERVIEW |
| response | 200 |
PUT
PUT requests are not allowed at this endpoint
DELETE
DELETE requests are not allowed at this endpoint
State Type
Contains details of the possible types of state that a product can be in
The state_type object
| Field | Description |
|---|---|
| state_type_id int (primary key) |
A unique integer identifier for each state_type. |
| name string (not-null,unique) |
|
| description string |
|
| created_at datetime |
timestamp that the record was created at |
| created_by text |
username of the user who created the record |
| modified_at datetime |
timestamp that the record was last modified |
| modified_by text |
user that last modified the record |
| Relationship | Description |
|---|---|
| states | The associated states |
| energy_limit_states | The associated energy_limit_states |
An example POST request. Note that
state_type_id,created_at,modified_atandcreated_byare all handled internally by the system and need not be explicitly specified. See Meta Data for more information.
url = "https://smartapi.bboxx.co.uk/v1/state_types"
data = json.dumps({
"name": "test",
"description": "test",
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.post(url=url, data=data, headers=headers)
r
>>> <Response 201>
r.json()
>>> {
"state_type_id": 1
"name": "test",
"description": "test",
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve the
state_typecreated by specifying itsstate_type_idin the request url:
url = 'https://smartapi.bboxx.co.uk/v1/state_types/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"state_type_id": 1
"name": "test",
"description": "test",
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve all
state_typesby omitting thestate_type_id:
url = 'https://smartapi.bboxx.co.uk/v1/state_types'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
u'total_pages': 1,
u'objects': [
{<record>},
{<record>},
{<record>},
{<record>},
{<record>},
],
u'num_results': 10,
u'page': 1
}
We can edit the newly created
state_typewith aPUTrequest:
url = 'https://smartapi.bboxx.co.uk/v1/state_types/1'
data = json.dumps({
"name": "changed",
"description": "changed",
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.put(url=url, data=data, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"state_type_id": 1
"name": "changed",
"description": "changed",
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": 2016-07-07 12:34:45
}
Note that the
modified_atfield has been updated accordingly.If a user has
SYSTEMpermissions they can delete thestate_type
url = 'https://smartapi.bboxx.co.uk/v1/state_types/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.delete(url=url, headers=headers)
r
>>> <Response 204>
r.text
>>>
Note that the response from a 204 request is empty. This means that
r.json()cannot be called and will throw a JSONDecodeError. In fact the response isu''- an empty unicode string.
POST
| value | |
|---|---|
| endpoint | /v1/state_types |
| method | POST |
| url_params | N/A |
| query params | N/A |
| body | JSON-formatted dictionary with the details of the state_type that you wish to create |
| permissions | SYSTEM |
| response | 201 |
GET
| value | |
|---|---|
| endpoint | /v1/state_types or /v1/state_types/<state_type_id> |
| method | GET |
| url_params | state_type_id (int) |
| query params | > See Query Format and Filtering |
| body | N/A |
| permissions | OVERVIEW |
| response | 200 |
PUT
| value | |
|---|---|
| endpoint | /v1/state_types/<state_type_id> |
| method | PUT |
| url_params | state_type_id of the state_type you wish to edit |
| query params | N/A |
| body | JSON-formatted dictionary of the columns that you wish to alter |
| permissions | SYSTEM |
| response | 200 |
DELETE
| value | |
|---|---|
| endpoint | /v1/state_types/<state_type_id> |
| method | DELETE |
| url_params | state_type_id (int) |
| query params | N/A |
| body | N/A |
| permissions | SYSTEM |
| response | 204 |
Subscriber
A table containing subscribers to our API service
The subscriber object
| Field | Description |
|---|---|
| subscriber_id int (primary key) |
A unique integer identifier for each subscriber. |
| url string (not-null) |
|
| channel_name string (not-null,foreign-key) |
|
| entity_id int (foreign-key) |
|
| key varchar(24) (not-null) |
|
| created_at datetime |
timestamp that the record was created at |
| created_by text |
username of the user who created the record |
| modified_at datetime |
timestamp that the record was last modified |
| modified_by text |
user that last modified the record |
| Relationship | Description |
|---|---|
| N/A | There are no relationships for this table. |
POSTrequests are not allowed at this endpointWe can retrieve the
subscribercreated by specifying itssubscriber_idin the request url:
url = 'https://smartapi.bboxx.co.uk/v1/subscribers/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"subscriber_id": 1
"url": "test",
"channel_name": "test",
"entity_id": 1,
"key": "awjs875jg7thskr9485984rf",
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve all
subscribersby omitting thesubscriber_id:
url = 'https://smartapi.bboxx.co.uk/v1/subscribers'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
u'total_pages': 1,
u'objects': [
{<record>},
{<record>},
{<record>},
{<record>},
{<record>},
],
u'num_results': 10,
u'page': 1
}
PUTrequests are not allowed at this endpoint
DELETErequests are not allowed at this endpoint
POST
POST requests are not allowed at this endpoint
GET
| value | |
|---|---|
| endpoint | /v1/subscribers or /v1/subscribers/<subscriber_id> |
| method | GET |
| url_params | subscriber_id (int) |
| query params | > See Query Format and Filtering |
| body | N/A |
| permissions | OVERVIEW |
| response | 200 |
PUT
PUT requests are not allowed at this endpoint
DELETE
DELETE requests are not allowed at this endpoint
Symptom Type Product Type Linker
Specifies which symptom_types are valid for which product_types
The symptom_type_product_type_linker object
| Field | Description |
|---|---|
| symptom_type_product_type_linker_id int (primary key) |
A unique integer identifier for each symptom_type_product_type_linker. |
| product_type_id int (not-null,foreign-key) |
|
| symptom_type_id int (not-null,foreign-key) |
|
| created_at datetime |
timestamp that the record was created at |
| created_by text |
username of the user who created the record |
| modified_at datetime |
timestamp that the record was last modified |
| modified_by text |
user that last modified the record |
| Relationship | Description |
|---|---|
| N/A | There are no relationships for this table. |
An example POST request. Note that
symptom_type_product_type_linker_id,created_at,modified_atandcreated_byare all handled internally by the system and need not be explicitly specified. See Meta Data for more information.
url = "https://smartapi.bboxx.co.uk/v1/symptom_type_product_type_linker"
data = json.dumps({
"product_type_id": 1,
"symptom_type_id": 1,
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.post(url=url, data=data, headers=headers)
r
>>> <Response 201>
r.json()
>>> {
"symptom_type_product_type_linker_id": 1
"product_type_id": 1,
"symptom_type_id": 1,
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve the
symptom_type_product_type_linkercreated by specifying itssymptom_type_product_type_linker_idin the request url:
url = 'https://smartapi.bboxx.co.uk/v1/symptom_type_product_type_linker/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"symptom_type_product_type_linker_id": 1
"product_type_id": 1,
"symptom_type_id": 1,
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve all
symptom_type_product_type_linkerby omitting thesymptom_type_product_type_linker_id:
url = 'https://smartapi.bboxx.co.uk/v1/symptom_type_product_type_linker'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
u'total_pages': 1,
u'objects': [
{<record>},
{<record>},
{<record>},
{<record>},
{<record>},
],
u'num_results': 10,
u'page': 1
}
We can edit the newly created
symptom_type_product_type_linkerwith aPUTrequest:
url = 'https://smartapi.bboxx.co.uk/v1/symptom_type_product_type_linker/1'
data = json.dumps({
"product_type_id": 2,
"symptom_type_id": 2,
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.put(url=url, data=data, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"symptom_type_product_type_linker_id": 1
"product_type_id": 2,
"symptom_type_id": 2,
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": 2016-07-07 12:34:45
}
Note that the
modified_atfield has been updated accordingly.If a user has
SYSTEMpermissions they can delete thesymptom_type_product_type_linker
url = 'https://smartapi.bboxx.co.uk/v1/symptom_type_product_type_linker/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.delete(url=url, headers=headers)
r
>>> <Response 204>
r.text
>>>
Note that the response from a 204 request is empty. This means that
r.json()cannot be called and will throw a JSONDecodeError. In fact the response isu''- an empty unicode string.
POST
| value | |
|---|---|
| endpoint | /v1/symptom_type_product_type_linker |
| method | POST |
| url_params | N/A |
| query params | N/A |
| body | JSON-formatted dictionary with the details of the symptom_type_product_type_linker that you wish to create |
| permissions | SYSTEM |
| response | 201 |
GET
| value | |
|---|---|
| endpoint | /v1/symptom_type_product_type_linker or /v1/symptom_type_product_type_linker/<symptom_type_product_type_linker_id> |
| method | GET |
| url_params | symptom_type_product_type_linker_id (int) |
| query params | > See Query Format and Filtering |
| body | N/A |
| permissions | OVERVIEW |
| response | 200 |
PUT
| value | |
|---|---|
| endpoint | /v1/symptom_type_product_type_linker/<symptom_type_product_type_linker_id> |
| method | PUT |
| url_params | symptom_type_product_type_linker_id of the symptom_type_product_type_linker you wish to edit |
| query params | N/A |
| body | JSON-formatted dictionary of the columns that you wish to alter |
| permissions | SYSTEM |
| response | 200 |
DELETE
| value | |
|---|---|
| endpoint | /v1/symptom_type_product_type_linker/<symptom_type_product_type_linker_id> |
| method | DELETE |
| url_params | symptom_type_product_type_linker_id (int) |
| query params | N/A |
| body | N/A |
| permissions | SYSTEM |
| response | 204 |
Symptom Type
Lists various symptoms that a product can present when coming in for repair.
The symptom_type object
| Field | Description |
|---|---|
| symptom_type_id int (primary key) |
A unique integer identifier for each symptom_type. |
| name string (not-null,unique) |
|
| description string |
|
| label string (not-null,unique) |
|
| created_at datetime |
timestamp that the record was created at |
| created_by text |
username of the user who created the record |
| modified_at datetime |
timestamp that the record was last modified |
| modified_by text |
user that last modified the record |
| Relationship | Description |
|---|---|
| symptom_type_product_type_linker | The associated symptom_type_product_type_linker |
| repair_symptom_type_linker | The associated repair_symptom_type_linker |
An example POST request. Note that
symptom_type_id,created_at,modified_atandcreated_byare all handled internally by the system and need not be explicitly specified. See Meta Data for more information.
url = "https://smartapi.bboxx.co.uk/v1/symptom_types"
data = json.dumps({
"name": "test",
"description": "test",
"label": "test",
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.post(url=url, data=data, headers=headers)
r
>>> <Response 201>
r.json()
>>> {
"symptom_type_id": 1
"name": "test",
"description": "test",
"label": "test",
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve the
symptom_typecreated by specifying itssymptom_type_idin the request url:
url = 'https://smartapi.bboxx.co.uk/v1/symptom_types/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"symptom_type_id": 1
"name": "test",
"description": "test",
"label": "test",
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve all
symptom_typesby omitting thesymptom_type_id:
url = 'https://smartapi.bboxx.co.uk/v1/symptom_types'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
u'total_pages': 1,
u'objects': [
{<record>},
{<record>},
{<record>},
{<record>},
{<record>},
],
u'num_results': 10,
u'page': 1
}
We can edit the newly created
symptom_typewith aPUTrequest:
url = 'https://smartapi.bboxx.co.uk/v1/symptom_types/1'
data = json.dumps({
"name": "changed",
"description": "changed",
"label": "changed",
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.put(url=url, data=data, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"symptom_type_id": 1
"name": "changed",
"description": "changed",
"label": "changed",
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": 2016-07-07 12:34:45
}
Note that the
modified_atfield has been updated accordingly.If a user has
SYSTEMpermissions they can delete thesymptom_type
url = 'https://smartapi.bboxx.co.uk/v1/symptom_types/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.delete(url=url, headers=headers)
r
>>> <Response 204>
r.text
>>>
Note that the response from a 204 request is empty. This means that
r.json()cannot be called and will throw a JSONDecodeError. In fact the response isu''- an empty unicode string.
POST
| value | |
|---|---|
| endpoint | /v1/symptom_types |
| method | POST |
| url_params | N/A |
| query params | N/A |
| body | JSON-formatted dictionary with the details of the symptom_type that you wish to create |
| permissions | SYSTEM |
| response | 201 |
GET
| value | |
|---|---|
| endpoint | /v1/symptom_types or /v1/symptom_types/<symptom_type_id> |
| method | GET |
| url_params | symptom_type_id (int) |
| query params | > See Query Format and Filtering |
| body | N/A |
| permissions | OVERVIEW |
| response | 200 |
PUT
| value | |
|---|---|
| endpoint | /v1/symptom_types/<symptom_type_id> |
| method | PUT |
| url_params | symptom_type_id of the symptom_type you wish to edit |
| query params | N/A |
| body | JSON-formatted dictionary of the columns that you wish to alter |
| permissions | SYSTEM |
| response | 200 |
DELETE
| value | |
|---|---|
| endpoint | /v1/symptom_types/<symptom_type_id> |
| method | DELETE |
| url_params | symptom_type_id (int) |
| query params | N/A |
| body | N/A |
| permissions | SYSTEM |
| response | 204 |
Test Jig Test Result
Test results from the BBOXX test jig
The test_jig_test_result object
| Field | Description |
|---|---|
| test_jig_test_result_id int (primary key) |
A unique integer identifier for each test_jig_test_result. |
| jig_id unknown-type |
|
| machine_id unknown-type |
|
| product_imei varchar(15) (not-null,foreign-key) |
|
| jig_software_version unknown-type |
|
| user string (not-null) |
|
| passed boolean (not-null) |
|
| results unknown-type |
|
| created_at datetime |
timestamp that the record was created at |
| created_by text |
username of the user who created the record |
| modified_at datetime |
timestamp that the record was last modified |
| modified_by text |
user that last modified the record |
| Relationship | Description |
|---|---|
| N/A | There are no relationships for this table. |
An example POST request. Note that
test_jig_test_result_id,created_at,modified_atandcreated_byare all handled internally by the system and need not be explicitly specified. See Meta Data for more information.
url = "https://smartapi.bboxx.co.uk/v1/test_jig_test_results"
data = json.dumps({
"jig_id": Unknown column type,
"machine_id": Unknown column type,
"product_imei": "000000000000000",
"jig_software_version": Unknown column type,
"user": "test",
"passed": True,
"results": Unknown column type,
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.post(url=url, data=data, headers=headers)
r
>>> <Response 201>
r.json()
>>> {
"test_jig_test_result_id": 1
"jig_id": Unknown column type,
"machine_id": Unknown column type,
"product_imei": "000000000000000",
"jig_software_version": Unknown column type,
"user": "test",
"passed": True,
"results": Unknown column type,
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve the
test_jig_test_resultcreated by specifying itstest_jig_test_result_idin the request url:
url = 'https://smartapi.bboxx.co.uk/v1/test_jig_test_results/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"test_jig_test_result_id": 1
"jig_id": Unknown column type,
"machine_id": Unknown column type,
"product_imei": "000000000000000",
"jig_software_version": Unknown column type,
"user": "test",
"passed": True,
"results": Unknown column type,
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve all
test_jig_test_resultsby omitting thetest_jig_test_result_id:
url = 'https://smartapi.bboxx.co.uk/v1/test_jig_test_results'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
u'total_pages': 1,
u'objects': [
{<record>},
{<record>},
{<record>},
{<record>},
{<record>},
],
u'num_results': 10,
u'page': 1
}
We can edit the newly created
test_jig_test_resultwith aPUTrequest:
url = 'https://smartapi.bboxx.co.uk/v1/test_jig_test_results/1'
data = json.dumps({
"jig_id": Unknown column type,
"machine_id": Unknown column type,
"product_imei": "999999999999999",
"jig_software_version": Unknown column type,
"user": "changed",
"passed": False,
"results": Unknown column type,
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.put(url=url, data=data, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"test_jig_test_result_id": 1
"jig_id": Unknown column type,
"machine_id": Unknown column type,
"product_imei": "999999999999999",
"jig_software_version": Unknown column type,
"user": "changed",
"passed": False,
"results": Unknown column type,
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": 2016-07-07 12:34:45
}
Note that the
modified_atfield has been updated accordingly.If a user has
SYSTEMpermissions they can delete thetest_jig_test_result
url = 'https://smartapi.bboxx.co.uk/v1/test_jig_test_results/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.delete(url=url, headers=headers)
r
>>> <Response 204>
r.text
>>>
Note that the response from a 204 request is empty. This means that
r.json()cannot be called and will throw a JSONDecodeError. In fact the response isu''- an empty unicode string.
POST
| value | |
|---|---|
| endpoint | /v1/test_jig_test_results |
| method | POST |
| url_params | N/A |
| query params | N/A |
| body | JSON-formatted dictionary with the details of the test_jig_test_result that you wish to create |
| permissions | SYSTEM |
| response | 201 |
GET
| value | |
|---|---|
| endpoint | /v1/test_jig_test_results or /v1/test_jig_test_results/<test_jig_test_result_id> |
| method | GET |
| url_params | test_jig_test_result_id (int) |
| query params | > See Query Format and Filtering |
| body | N/A |
| permissions | OVERVIEW |
| response | 200 |
PUT
| value | |
|---|---|
| endpoint | /v1/test_jig_test_results/<test_jig_test_result_id> |
| method | PUT |
| url_params | test_jig_test_result_id of the test_jig_test_result you wish to edit |
| query params | N/A |
| body | JSON-formatted dictionary of the columns that you wish to alter |
| permissions | SYSTEM |
| response | 200 |
DELETE
| value | |
|---|---|
| endpoint | /v1/test_jig_test_results/<test_jig_test_result_id> |
| method | DELETE |
| url_params | test_jig_test_result_id (int) |
| query params | N/A |
| body | N/A |
| permissions | SYSTEM |
| response | 204 |
User Repair Centre Link
Associates Smart Solar users with Repair Centres
The user_repair_centre_link object
| Field | Description |
|---|---|
| user_repair_centre_link_id int (primary key) |
A unique integer identifier for each user_repair_centre_link. |
| username string (not-null,unique) |
Email address of the user |
| repair_centre_id int (not-null,unique,foreign-key) |
Repair Centre identifier |
| created_at datetime |
timestamp that the record was created at |
| created_by text |
username of the user who created the record |
| modified_at datetime |
timestamp that the record was last modified |
| modified_by text |
user that last modified the record |
| Relationship | Description |
|---|---|
| N/A | There are no relationships for this table. |
An example POST request. Note that
user_repair_centre_link_id,created_at,modified_atandcreated_byare all handled internally by the system and need not be explicitly specified. See Meta Data for more information.
url = "https://smartapi.bboxx.co.uk/v1/user_repair_centre_links"
data = json.dumps({
"username": "test",
"repair_centre_id": 1,
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.post(url=url, data=data, headers=headers)
r
>>> <Response 201>
r.json()
>>> {
"user_repair_centre_link_id": 1
"username": "test",
"repair_centre_id": 1,
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve the
user_repair_centre_linkcreated by specifying itsuser_repair_centre_link_idin the request url:
url = 'https://smartapi.bboxx.co.uk/v1/user_repair_centre_links/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"user_repair_centre_link_id": 1
"username": "test",
"repair_centre_id": 1,
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve all
user_repair_centre_linksby omitting theuser_repair_centre_link_id:
url = 'https://smartapi.bboxx.co.uk/v1/user_repair_centre_links'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
u'total_pages': 1,
u'objects': [
{<record>},
{<record>},
{<record>},
{<record>},
{<record>},
],
u'num_results': 10,
u'page': 1
}
We can edit the newly created
user_repair_centre_linkwith aPUTrequest:
url = 'https://smartapi.bboxx.co.uk/v1/user_repair_centre_links/1'
data = json.dumps({
"username": "changed",
"repair_centre_id": 2,
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.put(url=url, data=data, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"user_repair_centre_link_id": 1
"username": "changed",
"repair_centre_id": 2,
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": 2016-07-07 12:34:45
}
Note that the
modified_atfield has been updated accordingly.If a user has
SYSTEMpermissions they can delete theuser_repair_centre_link
url = 'https://smartapi.bboxx.co.uk/v1/user_repair_centre_links/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.delete(url=url, headers=headers)
r
>>> <Response 204>
r.text
>>>
Note that the response from a 204 request is empty. This means that
r.json()cannot be called and will throw a JSONDecodeError. In fact the response isu''- an empty unicode string.
POST
| value | |
|---|---|
| endpoint | /v1/user_repair_centre_links |
| method | POST |
| url_params | N/A |
| query params | N/A |
| body | JSON-formatted dictionary with the details of the user_repair_centre_link that you wish to create |
| permissions | SYSTEM |
| response | 201 |
GET
| value | |
|---|---|
| endpoint | /v1/user_repair_centre_links or /v1/user_repair_centre_links/<user_repair_centre_link_id> |
| method | GET |
| url_params | user_repair_centre_link_id (int) |
| query params | > See Query Format and Filtering |
| body | N/A |
| permissions | OVERVIEW |
| response | 200 |
PUT
| value | |
|---|---|
| endpoint | /v1/user_repair_centre_links/<user_repair_centre_link_id> |
| method | PUT |
| url_params | user_repair_centre_link_id of the user_repair_centre_link you wish to edit |
| query params | N/A |
| body | JSON-formatted dictionary of the columns that you wish to alter |
| permissions | SYSTEM |
| response | 200 |
DELETE
| value | |
|---|---|
| endpoint | /v1/user_repair_centre_links/<user_repair_centre_link_id> |
| method | DELETE |
| url_params | user_repair_centre_link_id (int) |
| query params | N/A |
| body | N/A |
| permissions | SYSTEM |
| response | 204 |
Product Actions
This sections lists endpoints which can be used to perform specific actions on a product or query specific data quickly and simply.
/products/create_hub2
A POST request to this endpoint will create a new hub 2 product on the system
url = "https://smartapi.bboxx.co.uk/v1/products/create_hub2"
data = json.dumps({"imsi": "213514135171353",
"imei": "010101234560005",
"device_key": "4ab1ab3ab1ab7ab9ab1ab4ab",
"product": {"assembler": "Assembly House 1"}})
headers = {"Content-Type": "application/json", "Authorization": "Token token=" + A_VALID_TOKEN}
r = requests.post(url=url, data=data, headers=headers)
print r.json()
>>> {
"status": "success"
"data": {"pcb": {"part_id": 1651798,
"part_type_id": 77,
"serial": "010101234560005"},
"product": {"device_key": "4ab1ab3ab1ab7ab9ab1ab4ab",
"imsi": "213514135171353",
"product_imei": "010101234560005",
"product_type_id": 7,
"serial_number": "HB000501-084031-B",
"assembler": "Assembly House 1"},
"sim": {"imsi": "213514135171353",
"part_id": 1651797,
"part_type_id": 43}},
"message": "Hub2Product: HB000501-084031-B - (010101234560005) created.",
}
This endpoint will create a new hub 2 product on the system
This is a convenience endpoint which is equivalent to calling /parts/create_hyena_pcb followed by calling /products/create_product/hub2
| value | |
|---|---|
| endpoint | /products/create_hub2 |
| method | POST |
| url_params | None |
| payload | {"imei": <imei>,"imsi": <imsi>,"device_key": <device_key>,"pcb_part_type_id": <part_type_id> (optional, default=77),"sim_part_type_id": <part_id> (optional, default=43),"iccid": <iccid> (optional, if given then sim part will be created with this as serial_number, otherwise will be the imsi} |
| response | 200 |
| permissions | FACTORY |
/products/create_enterprise
A POST request to this endpoint will create a new enterprise product on the system
url = "https://smartapi.bboxx.co.uk/v1/products/create_enterprise"
data = json.dumps({"imsi": "213514135171353",
"imei": "010101234560005",
"device_key": "4ab1ab3ab1ab7ab9ab1ab4ab",
"battery": {
"part_type_id": 72,
"serial_number": "BC4pDRSReEFnMHzHARHI7Gr9",
},
"solar_panel_wattage": 100,
"product": {"assembler": "Assembly House 1"}
})
headers = {"Content-Type": "application/json", "Authorization": "Token token=" + A_VALID_TOKEN}
r = requests.post(url=url, data=data, headers=headers)
print r.json()
>>> {"status": "success"
"data": {"battery": {"part_id": 1693186,
"part_type_id": 72,
"serial": u'BC4pDRSReEFnMHzHARHI7Gr9'},
"pcb": {"part_id": 1651800,
"part_type_id": 77,
"serial": "010101234560005"},
"product": {"device_key": "4ab1ab3ab1ab7ab9ab1ab4ab",
"imsi": "213514135171353",
"product_imei": "010101234560005",
"product_type_id": 4,
"serial_number": "HB000501-084032-G",
"assembler": "Assembly House 1"},
"sim": {"imsi": "213514135171353",
"part_id": 1651799,
"part_type_id": 43}},
"message": "EnterpriseProduct: HB000501-084032-G - (010101234560005) created.",
}
This endpoint will create a new enterprise product on the system
This is a convenience endpoint which is equivalent to calling /parts/create_hyena_pcb followed by calling /products/create_product/enterprise
| value | |
|---|---|
| endpoint | /products/create_enterprise |
| method | POST |
| url_params | None |
| payload | {"imei": <imei>,"imsi": <imsi>,"device_key": <device_key>,"pcb_part_type_id": <part_type_id> (optional, default=77),"sim_part_type_id": <part_id> (optional, default=43),"iccid": <iccid> (optional, if given then sim part will be created with this as serial_number, otherwise will be the imsi} |
| response | 200 |
| permissions | FACTORY |
/products/create_product/home2
A POST request to this endpoint will create a new home 2 product on the system using an existing pcb
url = "https://smartapi.bboxx.co.uk/v1/products/create_product/home2"
data = json.dumps({"pcb_imei": "010101234560005",
"battery": {
"part_type_id": 45,
"serial_number": "BC4pDRSReEFnMHzHARHI7Gr9",
},
"product": {"assembler": "Assembly House 1"}
})
headers = {"Content-Type": "application/json", "Authorization": "Token token=" + A_VALID_TOKEN}
r = requests.post(url=url, data=data, headers=headers)
print r.json()
>>> {"status": "success"
"data": {"battery": {"part_id": 1693186,
"part_type_id": 45,
"serial": u'BC4pDRSReEFnMHzHARHI7Gr9'},
"pcb": {"part_id": 1651800,
"part_type_id": 44,
"serial": "010101234560005"},
"product": {"device_key": "4ab1ab3ab1ab7ab9ab1ab4ab",
"imsi": "213514135171353",
"product_imei": "010101234560005",
"product_type_id": 6,
"serial_number": "HB000501-084032-G",
"assembler": "Assembly House 1"},
"sim": {"imsi": "213514135171353",
"part_id": 1651799,
"part_type_id": 43}},
"message": "Home2Product: HB000501-084032-G - (010101234560005) created.",
}
This endpoint will create a new home 2 product on the system using an existing pcb
| value | |
|---|---|
| endpoint | /products/create_product/home2 |
| method | POST |
| url_params | None |
| payload | {"pcb_imei": <imei>,"battery": {"part_type_id": <part_type_id>,"serial_number": <serial_number>}} |
| response | 200 |
| permissions | FACTORY |
/products/create_product/home3
A POST request to this endpoint will create a new home 3 product on the system using an existing pcb (jackal pcb)
url = "https://smartapi.bboxx.co.uk/v1/products/create_product/home3"
data = json.dumps({
'pcb_imei': '110932356179789',
'battery': {
'part_type_id': 18004,
'serial_number': 'BC4pDRSReEFnMHzHARHI7Gr9'
}
})
headers = {"Content-Type": "application/json", "Authorization": "Token token=" + A_VALID_TOKEN}
r = requests.post(url=url, data=data, headers=headers)
print r.json()
>>> {
"data":{
"battery":{
"part_id":18024,
"part_type_id":18004,
"serial_number":"BC4pDRSReEFnMHzHARHI7Gr9"
},
"pcb":{
"part_id":18023,
"part_type_id":158,
"properties":{
"device_key":"000000000000000000000004",
"erp_code_override":"PA04010102",
"iccid":"66685607592181745482",
"imei":"110932356179789",
"imsi":"748655857675019",
"serial_number":"PA040000-018002-9"
},
"serial_number":"110932356179789"
},
"product":{
"device_key":"000000000000000000000004",
"iccid":"66685607592181745482",
"imei":"110932356179789",
"imsi":"748655857675019",
"product_imei":"110932356179789",
"product_type_id":10,
"serial_number":"PA040000-018002-9"
},
"sim":{
"part_id":18022,
"part_type_id":43,
"serial_number":"66685607592181745482"
}
},
"message":"new Home3 product successfully created.",
"status":"success"
}
This endpoint will create a new home 3 product on the system using an existing pcb
| value | |
|---|---|
| endpoint | /products/create_product/home3 |
| method | POST |
| url_params | None |
| payload | {"pcb_imei": <imei>,"battery": {"part_type_id": <part_type_id>,"serial_number": <serial_number>}} |
| response | 200 |
| permissions | FACTORY |
/products/create_product/hub2
A POST request to this endpoint will create a new hub 2 product on the system using an existing pcb
url = "https://smartapi.bboxx.co.uk/v1/products/create_product/hub2"
data = json.dumps({"pcb_imei": "010101234560005", "product": {"assembler": "Assembly House 1"}})
headers = {"Content-Type": "application/json", "Authorization": "Token token=" + A_VALID_TOKEN}
r = requests.post(url=url, data=data, headers=headers)
print r.json()
>>> {"status": "success"
"data": {"pcb": {"part_id": 1651800,
"part_type_id": 77,
"serial": "010101234560005"},
"product": {"device_key": "4ab1ab3ab1ab7ab9ab1ab4ab",
"imsi": "213514135171353",
"product_imei": "010101234560005",
"product_type_id": 7,
"serial_number": "HB000501-084032-G",
"assembler": "Assembly House 1"},
"sim": {"imsi": "213514135171353",
"part_id": 1651799,
"part_type_id": 43}},
"message": "Hub2Product: HB000501-084032-G - (010101234560005) created.",
}
This endpoint will create a new hub 2 product on the system using an existing pcb
| value | |
|---|---|
| endpoint | /products/create_product/hub2 |
| method | POST |
| url_params | None |
| payload | {"pcb_imei": <imei>} |
| response | 200 |
| permissions | FACTORY |
/products/create_product/enterprise
A POST request to this endpoint will create a new enterprise product on the system using an existing pcb
url = "https://smartapi.bboxx.co.uk/v1/products/create_product/enterprise"
data = json.dumps({"pcb_imei": "010101234560005",
"battery": {
"part_type_id": 72,
"serial_number": "BC4pDRSReEFnMHzHARHI7Gr9",
},
"solar_panel_wattage": 100,
"product": {"assembler": "Assembly House 1"}
})
headers = {"Content-Type": "application/json", "Authorization": "Token token=" + A_VALID_TOKEN}
r = requests.post(url=url, data=data, headers=headers)
print r.json()
>>> {"status": "success"
"data": {"battery": {"part_id": 1693186,
"part_type_id": 72,
"serial": u'BC4pDRSReEFnMHzHARHI7Gr9'},
"pcb": {"part_id": 1651800,
"part_type_id": 77,
"serial": "010101234560005"},
"product": {"device_key": "4ab1ab3ab1ab7ab9ab1ab4ab",
"imsi": "213514135171353",
"product_imei": "010101234560005",
"product_type_id": 4,
"serial_number": "HB000501-084032-G",
"assembler": "Assembly House 1"},
"sim": {"imsi": "213514135171353",
"part_id": 1651799,
"part_type_id": 43}},
"message": "EnterpriseProduct: HB000501-084032-G - (010101234560005) created.",
}
This endpoint will create a new enterprise product on the system using an existing pcb
| value | |
|---|---|
| endpoint | /products/create_product/enterprise |
| method | POST |
| url_params | None |
| payload | {"pcb_imei": <imei>,"battery": {"part_type_id": <part_type_id>,"serial_number": <serial_number>}"solar_panel_wattage": 100} |
| response | 200 |
| permissions | FACTORY |
/products/<imei>/enable
A
PUTrequest to this endpoint enables the unit.
url = "https://smartapi.bboxx.co.uk/v1/products/000000000000/enable"
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=' + A_VALID_TOKEN}
r = requests.put(url=url, headers=headers)
print r.json()
>>> {
"status": "success",
"message": "Product enabled",
"data": None
}
This endpoint is used to enable (switch-on) a unit. The imei of the unit to be enabled is specified in the url.
| value | |
|---|---|
| endpoint | /products/<imei>/enable |
| method | PUT |
| url_params | product_imei (str) |
| payload | None |
| response | 200 |
Pending Status and Enable History
A unit's status will only change once it makes an RC-GET connection the SMARTSolar API and retrieves it's new status before then its actual status is unchanged. To reflect this the unit is placed in a "pending" state. The pending state therefore means that the unit has been enabled (or disabled) but has not yet connected to the system to update its status.
For example:
- A unit is OFF (disabled).
- A technician chooses to enable the unit, the unit then moves to "pending enabled" and is still off.
- The unit remains in "pending enabled" until a connection is made.
- A connection is made - the unit receives its new status and is moved to enabled, it is now ON
The enable_history table
The changes above are tracked in the enable_history table. Each time an unit has a change of state this is recorded in the
enable_history table, along with the user who caused the change.
WakeUp
Current WAKEUP ENABLED software:
WAKEUP_ENABLED_SOFTWARE = [
"2.15",
"2.16",
"3.2",
"3.3",
"3.4",
"3.5",
"3.6",
"3.6a",
"hub-stc-1",
"hub-stc-2",
"hub-stc-3",
"hub-stc-4",
"hub-stc-5",
"hub-stc-6",
]
Waiting for a unit to make an RC-GET connection can take a long time - up to 4hrs! To avoid such slow response times when enabling or disabling a unit, the unit is automatically sent a WAKEUP SMS message. This message, if received correctly, causes the unit to "wakeup" and make an RC-GET connection immediately. This usually results in a response time of ~ 2mins for enable and disable operations. The WAKEUP will only be sent to units with compatible software (see right). Each sent SMS will be stored in the sms_history table where you can check the status of the SMS and confirm it's delivery (or lack-of!). For more details of SMS and WAKEUP see "SMS and WAKEUP".
/products/<imei>/disable
A
PUTrequest to this endpoint disables the unit.
url = "https://smartapi.bboxx.co.uk/v1/products/000000000000/disable"
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=' + A_VALID_TOKEN}
r = requests.put(url=url, headers=headers)
print r.json()
>>> {
"status": "success",
"message': "Product disabled",
"data": None
}
This endpoint is used to disable (switch-off) a unit. The imei of the unit to be disabled is specified in the url.
| value | |
|---|---|
| endpoint | /products/<imei>/disable |
| method | PUT |
| url_params | product_imei (str) |
| payload | None |
| response | 200 |
Note that if a unit is already disabled the API will return "success" anyway.
Pending Status and Enable History
A unit's status will only change once it makes an RC-GET connection the SMARTSolar API and retrieves it's new status before then its actual status is unchanged. To reflect this the unit is placed in a "pending" state. The pending state therefore means that the unit has been enabled (or disabled) but has not yet connected to the system to update its status.
For example:
- A unit is OFF (disabled).
- A technician chooses to enable the unit, the unit then moves to "pending enabled" and is still off.
- The unit remains in "pending enabled" until a connection is made.
- A connection is made - the unit receives its new status and is moved to enabled, it is now ON
The enable_history table
The changes above are tracked in the enable_history table. Each time an unit has a change of state this is recorded in the
enable_history table, along with the user who caused the change.
WakeUp
Current WAKEUP ENABLED software:
WAKEUP_ENABLED_SOFTWARE = [
"2.15",
"2.16",
"3.2",
"3.3",
"3.4",
"3.5",
"3.6",
"3.6a",
"hub-stc-1",
"hub-stc-2",
"hub-stc-3",
"hub-stc-4",
"hub-stc-5",
"hub-stc-6",
]
Waiting for a unit to make an RC-GET connection can take a long time - up to 4hrs! To avoid such slow response times when enabling or disabling a unit, the unit is automatically sent a WAKEUP SMS message. This message, if received correctly, causes the unit to "wakeup" and make an RC-GET connection immediately. This usually results in a response time of ~ 2mins for enable and disable operations. The WAKEUP will only be sent to units with compatible software (see right). Each sent SMS will be stored in the sms_history table where you can check the status of the SMS and confirm it's delivery (or lack-of!). For more details of SMS and WAKEUP see "SMS and WAKEUP".
/products/<imei>/update_software
A
PUTrequest to this endpoint with set the unit to upgrade to the specified software when it next connects to the system.
url = "https://smartapi.bboxx.co.uk/v1/products/000000000000/update_software"
data = json.dumps({"software": <software_id> or <software_name>})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=' + A_VALID_TOKEN}
r = requests.put(url=url, data=data, headers=headers)
print r.json()
>>> {
"status": "success",
"message": "#866771029490827 updated to software_version <version_name>",
"data": None
}
This endpoint is used to update the software a unit. The imei of the unit to be enbaled is specified in the url.
| value | |
|---|---|
| endpoint | /products/<imei>/update_software |
| method | PUT |
| url_params | product_imei (str) |
| payload | {"software": |
| response | 200 |
| permissions | SYSTEM |
The endpoint accepts both software_version_type_id or name. A complete list of the available software versions types can retreived from the /software_version_type_id endpoint.
A unit can have its software "locked" to a certain version. If the software is locked then it cannot be updated. See Software and Locking for more information.
/products/<imei>/lock_software
A
PUTrequest to this endpoint will lock the software on the unit to the specified software.
url = "https://smartapi.bboxx.co.uk/v1/products/000000000000/lock_software"
data = json.dumps({"software": <software_id> or <software_name>})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=' + A_VALID_TOKEN}
r = requests.put(url=url, data=data, headers=headers)
print r.json()
>>> {
"status": "success",
"message": "#866771029490827 updated and locked to software_version <version_name>",
"data": {
"software_lock_id": <id>,
"software_lock_name": <name>,
}
A
PUTrequest with blank payload will remove the software lock.
url = "https://smartapi.bboxx.co.uk/v1/products/000000000000/lock_software"
data = json.dumps({"software": None})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=' + A_VALID_TOKEN}
r = requests.put(url=url, data=data, headers=headers)
print r.json()
>>> {
"status": "success",
"message": "#866771029490827 software_lock is now removed",
"data": {
"software_lock_id": None,
"software_lock_name": None,
}
}
This endpoint is used to update the software a unit. The imei of the unit to be enbaled is specified in the url.
A lock is removed by making a PUT request to this endpoint with a blank payload.
| value | |
|---|---|
| endpoint | /products/<imei>/lock_software |
| method | PUT |
| url_params | product_imei (str) |
| payload | {"software": |
| response | 200 |
| permissions | SYSTEM |
The endpoint accepts both software_version_type_id or name. A complete list of the available software versions types can retreived from the /software_version_type_id endpoint.
A unit can have its software "locked" to a certain version. If the software is locked then it cannot be updated. See Software and Locking for more information.
/products/<imei>/expire_software_updates
A
PUTrequest to this endpoint expires all pending software updates.
url = "https://smartapi.bboxx.co.uk/v1/products/000000000000/expire_software_updates"
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=' + A_VALID_TOKEN}
r = requests.put(url=url, headers=headers)
print r.json()
>>> {
"status": "success",
"message": "Product 013950003928166 had 1 software update(s) expired",
"data": None,
}
If there are no pending updates to expire, the response would instead be:
>>> {
"status": "success",
"message": "Product 013950003928166 had no pending updates to expire",
"data": None,
}
This endpoint is used to remove a pending software update.
| value | |
|---|---|
| endpoint | /products/<imei>/expire_software_updates |
| method | PUT |
| url_params | product_imei (str) |
| payload | None |
| response | 200 |
| permissions | SYSTEM |
Please see the Software section of the docs for a comprehensive explanation of the way that the software on the unit is handled.
/products/<imei>/assign_entity
A
PUTrequest to this endpoint assigns an entity to the specified entity.
url = "https://smartapi.bboxx.co.uk/v1/products/000000000000/assign_entity"
data = json.dumps({"entity_id": 5})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=' + A_VALID_TOKEN}
r = requests.put(url=url, data=data headers=headers)
print r.json()
>>> {
"status": "success",
"message": "Product #866771029508370 assigned to entity: 5",
"data": {
"866771029508370": ["Test Entity"]
}
}
This endpoint is used to assign an entity to a unit. A succesful request will generate a 200 response and return a list of all entites that this unit is assigned to.
| value | |
|---|---|
| endpoint | /products/<imei>/assign_entity |
| method | PUT |
| url_params | product_imei (str) |
| payload | {"entity_id": <id>} |
| response | 200 |
Entity Id
The body of the PUT should be a valid entity_id. You can see a list of entities by querying the /entities endpoint.
Unknown Entity
All units with no entity are assigned to entity #1 - Unknown Entity. This entity is removed as soon as a new entity is assigned to the unit. If all entities are removed the unit is re-assigned to Unknown Entity.
Multiple Entities
A unit can be assigned to many entities.
To add a new entity to the existing list simply use /products/<imei>/assign_entity.
To change the entity rather than adding a new entity see /products/<imei>/change_entity
To remove an entity see `/products/
/products/<imei>/change_entity
Since a Product can be assigned to multiple entities a specific endpoint is required to change the entity that a product belongs to.
A
PUTrequest to this endpoint changes the specified entity to an another entity.
url = "https://smartapi.bboxx.co.uk/v1/products/000000000000/change_entity"
data = json.dumps({
"old_entity_id": 5,
"new_entity_id": 6
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=' + A_VALID_TOKEN}
r = requests.put(url=url, data=data headers=headers)
print r.json()
>>>{
"status": "success"
"message": "Product #000000000000000 assigned to entity: 4",
"data": {
"000000000000000": ["BBOXX Capital Kenya"]
},
}
This endpoint is used to change the entity to which a unit is. A succesful request will generate a 200 response and return a list of all entites that this unit is assigned to.
| value | |
|---|---|
| endpoint | /products/<imei>/change_entity |
| method | PUT |
| url_params | product_imei (int) |
| payload | {"old_entity_id": <id>, "new_entity_id": <id>} |
| response | 200 |
Entity Id
The body of the PUT should be a valid entity_id. You can see a list of entities by querying the /entities endpoint.
Unknown Entity
All units with no entity are assigned to entity #1 - Unknown Entity. This entity is removed as soon as a new entity is assigned to the unit. If all entities are removed the unit is re-assigned to Unknown Entity.
Multiple Entities
A unit can be assigned to many entities.
To add a new entity to the existing list simply use /products/<imei>/assign_entity.
To change the entity rather than adding a new entity see /products/<imei>/change_entity
To remove an entity see `/products/
/products/<imei>/remove_entity
Use this endpoint to remove an entity from the product.
A
PUTrequest to this endpoint removes the specified entity.
url = "https://smartapi.bboxx.co.uk/v1/products/000000000000/remove_entity"
data = json.dumps({
"entity_id": 4,
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=' + A_VALID_TOKEN}
r = requests.put(url=url, data=data headers=headers)
print r.json()
>>>{
"status": "success"
"message": "Entity #4 removed from Product #000000000000000",
"data": {
"000000000000000": ["BBOXX Capital Kenya"]
},
}
This endpoint is used to change the entity to which a unit is. A succesful request will generate a 200 response and return a list of all entites that this unit is assigned to.
| value | |
|---|---|
| endpoint | /products/<imei>/remove |
| method | PUT |
| url_params | product_imei (str) |
| payload | {"entity_id": <id>} |
| response | 200 |
Entity Id
The body of the PUT should be a valid entity_id. You can see a list of all entities by querying the /entities endpoint and a list of the entites with a particular product by querying the Product Entity Linker.
Unknown Entity
All units with no entity are assigned to entity #1 - Unknown Entity. This entity is removed as soon as a new entity is assigned to the unit. If all entities are removed the unit is re-assigned to Unknown Entity.
Multiple Entities
A unit can be assigned to many entities.
To add a new entity to the existing list simply use /products/<imei>/assign_entity.
To change the entity rather than adding a new entity see /products/<imei>/change_entity
To remove an entity see `/products/
/products/<imei>/enable_tamper_switch
Description
Each unit is fitted with a "tamper_switch" which will raise alerts if a customer is tampering with a unit. This switch can be enabled/disabled remotely, particularly useful for periods of time where the switch could be accidentally trigger raising a false alert. This is common in, for example, transportation or installation.
Endpoint
A
PUTrequest to this endpoint enables the tamper switch on the unit.
url = "https://smartapi.bboxx.co.uk/v1/products/000000000000/enable_tamper_switch"
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=' + A_VALID_TOKEN}
r = requests.put(url=url, headers=headers)
print r.json()
>>> {
"status": "success",
"message': "Product #000000000000000 tamper_switch_enabled",
"data": None
}
This endpoint is used to enable the tamper switch on a unit. The imei of the unit to be enabled is specified in the url.
| value | |
|---|---|
| endpoint | /products/<imei>/enable_tamper_switch |
| method | PUT |
| url_params | product_imei (str) |
| payload | None |
| response | 200 |
Note that if a unit is already enabled the API will return "success" anyway.
Pending Status and Enable History
A unit's tamper_switch status will only change once it makes an RC-GET connection to the SMARTSolar API and retrieves it's new status. Until the RC-GET is complete the unit's actual status is unchanged. To reflect this the unit is placed in a "pending" state. The pending state therefore means that the tamper switch has been enabled (or disabled) but has not yet connected to the system to update its status.
For example:
- A unit has its tamper switch OFF (disabled).
- A technician chooses to enable the tamper_swtich, the unit then moves to "pending enabled" and the switch is still off.
- The unit remains in "pending enabled" until a connection is made.
- A connection is made - the unit receives its new status and is moved to enabled, the tamper_switch is now ON
The tamper_enable_history table
The changes above are tracked in the tamper_enable_history table. Each time a unit has a change of state this is recorded in the
tamper_enable_history table, along with the user who caused the change.
/products/<imei>/disable_tamper_switch
Description
Each unit is fitted with a "tamper_switch" which will raise alerts if a customer is tampering with a unit. This switch can be enabled/disabled remotely, particularly useful for periods of time where the switch could be accidentally trigger raising a false alert. This is common in, for example, transportation or installation.
Endpoint
A
PUTrequest to this endpoint disables the tamper switch on the unit.
url = "https://smartapi.bboxx.co.uk/v1/products/000000000000/disable_tamper_switch"
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=' + A_VALID_TOKEN}
r = requests.put(url=url, headers=headers)
print r.json()
>>> {
"status": "success",
"message': "Product #000000000000000 tamper_switch_disabled",
"data": None
}
This endpoint is used to disable the tamper switch on a unit. The imei of the unit to be disabled is specified in the url.
| value | |
|---|---|
| endpoint | /products/<imei>/disable_tamper_switch |
| method | PUT |
| url_params | product_imei (str) |
| payload | None |
| response | 200 |
Note that if a unit is already disabled the API will return "success" anyway.
Pending Status and Enable History
A unit's tamper_switch status will only change once it makes an RC-GET connection to the SMARTSolar API and retrieves it's new status. Until the RC-GET is complete the unit's actual status is unchanged. To reflect this the unit is placed in a "pending" state. The pending state therefore means that the tamper switch has been enabled (or disabled) but has not yet connected to the system to update its status.
For example:
- A unit has its tamper switch OFF (disabled).
- A technician chooses to enable the tamper_swtich, the unit then moves to "pending enabled" and the switch is still off.
- The unit remains in "pending enabled" until a connection is made.
- A connection is made - the unit receives its new status and is moved to enabled, the tamper_switch is now ON
The tamper_enable_history table
The changes above are tracked in the tamper_enable_history table. Each time a unit has a change of state this is recorded in the
tamper_enable_history table, along with the user who caused the change.
/products/<imei>/send_wakeup
Description
It is possible to force the unit to connect, download new status information and upload its telemetry data to the system.
This is done by sending a WAKEUP sms. For more information about unit connectivity and why this might be desirable please see this section of the docs
Endpoint
A
POSTrequest to this endpoint will send a wakeup-sms to the unit and force it to connect to the system. The response will include the sms_history record that us created as a result of the request.
url = "https://smartapi.bboxx.co.uk/v1/products/000000000000/send_wakeup"
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=' + A_VALID_TOKEN}
r = requests.post(url=url, headers=headers)
print r.json()
>>> {
"data": {
"sms_history_id": 37571,
"product_imei": "013950005303699",
"attempted_retries": 0,
"enable_history_id": null,
"sent_time": "2016-08-08T16:34:56.860081",
"sms_timeout": 3600.0,
"status": null,
"trigger": "wakeup"
"message": null,
"message_reference": "/41a8b4b06a019949/12882393256110756",
"created_at": "2016-08-08T16:34:56.886694",
"modified_at": null,
"created_by": "u.celery@bboxx.co.uk",
},
"message": "sms successfully sent",
"status": "success"
}
This endpoint is used to send a wakeup-sms to a unit and force it to connect to the system. The response will include the sms_history record that us created as a result of the request.
| value | |
|---|---|
| endpoint | /products/<imei>/send_wakeup |
| method | POST |
| url_params | product_imei (str) |
| payload | None |
| response | 200 |
| permissions | ADMIN |
Delivery Notifications
A record of each sms is kept in the sms_history_table. This includes a status column which can be read as follows:
NULL- sms sent but not received. The time of sending will be thecreated_atfield.Delivered- sms delivered. The time of delivery will by themodified_attime.Expired- sms not delivered within the timeout, which for wakeups is 3600 seconds. The sms has expired and will not affect the unit.
/products/<imei>/balance_and_pending_payments
Description
A
GETrequest to this endpoint will return the balance, expected expiry and pending payment commands associated with that unit.
url = "https://smartapi.bboxx.co.uk/v1/products/000000000000/balance_and_pending_payments"
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=' + A_VALID_TOKEN}
r = requests.get(url=url, headers=headers)
print(r.json())
>>>{
"status": "success",
"message": "Balance and pending credits.",
"data": {
"balance": 432000,
"expected_expiry": "2020-11-06T07:07:45.796359",
"pending_payment_commands": [
{
"category": "force-reset",
"created_at": "2020-11-06T07:07:45.742314",
"modified_at": "2020-11-06T07:07:45.742314",
"value": 0
},
{
"category": "zero-command",
"created_at": "2020-11-06T07:02:44.906775",
"modified_at": "2020-11-06T07:07:45.742314",
"value": 0
},
{
"category": "payment",
"created_at": "2020-10-29T12:40:49.443969",
"modified_at": "2020-11-06T07:07:45.742314",
"value": 2592000
}
]
}
}
A GET request to this endpoint will return:
- The remaining balance (in seconds) present on the unit
- The expected expiry of the balance
- The pending payment commands along with category, value, created_at and modified_at
Endpoint
| value | |
|---|---|
| endpoint | /products/<imei>/balance_and_pending_payments |
| method | GET |
| url_params | product_imei (str) |
| payload | None |
| response | 200 |
| __permissions | OVERVIEW |
/products/<imei>/parts
Description
A
GETrequest to this endpoint will return a complete list of parts and related data currently associated with that unit.
url = "https://smartapi.bboxx.co.uk/v1/products/000000000000/parts"
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=' + A_VALID_TOKEN}
r = requests.get(url=url, headers=headers)
print r.json()
>>> {
"message": "Parts found.",
"status": "success",
"data": {
"10737": {
"created_at": "2015-07-02T11:50:23",
"created_by": "d.mclean@bboxx.co.uk",
"modified_at": null,
"part_id": 10737,
"part_product_linker": {
"added_repair_id": null,
"created_at": "2015-07-02T11:50:25",
"created_by": "d.mclean@bboxx.co.uk",
"date_added": "2015-07-02T11:50:24",
"date_removed": null,
"modified_at": null,
"part_id": 10737,
"part_product_linker_id": 10719,
"product_imei": "013950005303699",
"removed_repair_id": null,
"replaced_part_id": null
},
"part_type": {
"created_at": "2015-04-10T10:48:40",
"created_by": "d.mclean@bboxx.co.uk",
"description": "A SIM card provided and activated by Vodafone",
"erp_code": null,
"modified_at": null,
"name": "Vodafone SIM",
"part_type_id": 1,
"serial_number_category": "known"
},
"part_type_id": 1,
"replacement_part_types": [
{
"created_at": "2015-04-10T10:48:40",
"created_by": "d.mclean@bboxx.co.uk",
"description": "A SIM card provided and activated by Vodafone",
"erp_code": null,
"modified_at": null,
"name": "Vodafone SIM",
"part_type_id": 1,
"serial_number_category": "known"
},
{
"created_at": "2015-04-10T10:49:38",
"created_by": "d.mclean@bboxx.co.uk",
"description": "A SIM card provided and activated by Wireless Logic",
"erp_code": null,
"modified_at": null,
"name": "Wireless Logic SIM",
"part_type_id": 2,
"serial_number_category": "known"
}
],
"serial_number": "204043256110756"
},
"308501": {
"created_at": "2016-06-14T09:48:39.622906",
"created_by": "h.he@bboxx.co.uk",
"modified_at": null,
"part_id": 308501,
"part_product_linker": {
"added_repair_id": null,
"created_at": "2016-06-14T09:48:40.486927",
"created_by": "h.he@bboxx.co.uk",
"date_added": "2016-06-14T09:48:40.748124",
"date_removed": null,
"modified_at": null,
"part_id": 308501,
"part_product_linker_id": 307244,
"product_imei": "013950005303699",
"removed_repair_id": null,
"replaced_part_id": null
},
"part_type": {
"created_at": "2016-03-10T15:40:46.578552",
"created_by": "d.mclean@bboxx.co.uk",
"description": "5A fuse",
"erp_code": null,
"modified_at": null,
"name": "5A Fuse",
"part_type_id": 13,
"serial_number_category": "unknown"
},
"part_type_id": 13,
"replacement_part_types": [
{
"created_at": "2016-03-10T15:40:46.578552",
"created_by": "d.mclean@bboxx.co.uk",
"description": "5A fuse",
"erp_code": null,
"modified_at": null,
"name": "5A Fuse",
"part_type_id": 13,
"serial_number_category": "unknown"
}
],
"serial_number": "tCXYvInR0xwCQpzAnJS76dPfHMr1uTMmFRZs7Jj49to0P2wxzCPAfYzie2AvncZF"
},
}
This endpoint is designed to for use during repairs of the Unit. A GET request to this endpoint will return:
- The parts present on the unit
- The parts historically used on the unit
- The date and time that the part was added (or removed)
- The allowed replacements for each part
- Details of the part_type for each part
Endpoint
| value | |
|---|---|
| endpoint | /products/<imei>/parts |
| method | GET |
| url_params | product_imei (str) |
| payload | None |
| response | 200 |
| __permissions | OVERVIEW |
Response
The format of the data returned by this endpoint is a dictionary where the keys are part_ids and the value is another dictionary of the data associated with the part.
part_id: {part_data}
Where {part_data} is a dictionary as follows:
{
"part_id": id
"part_type_id": type_id
"serial_number":serial,
"part_product_linker": linker dict
"part_type": part_type_dict
"replacement_part_types": [list-of-replacement-part_type-objects]
"created_at": timestamp
"created_by": user
"modified_at": timestamp
}
You can see an example of the full object in the code snippet to the right.
The intended use for this endpoint is for implementing repairs to BBOXX Units.
/products/<imei>/change_state
Description
Each unit is represented by a State Type which provides an overview of the unit within its lifecycle. There are currently 9 allowed State Types on units, each of which correspond with an integer state_type_id.
| State Type | state_type_id |
|---|---|
| NON_EXISTANT | 1 |
| STORED | 2 |
| SHIPPED | 3 |
| ACTIVATING | 4 |
| ACTIVATED | 5 |
| MONITORED | 6 |
| UNMONITORED | 7 |
| IN_REPAIR_SYSTEM | 8 |
| TERMINATED | 9 |
Transition between State Types are strictly enforced and operate in the following way:
| Original State Type | Allowed Transitions |
|---|---|
| NON_EXISTANT | STORED |
| STORED | SHIPPED, TERMINATED |
| SHIPPED | ACTIVATING, ACTIVATED, IN_REPAIR_SYSTEM, TERMINATED |
| ACTIVATING | ACTIVATED, IN_REPAIR_SYSTEM, TERMINATED |
| ACTIVATED | MONITORED, UNMONITORED, IN_REPAIR_SYSTEM, TERMINATED |
| MONITORED | UNMONITORED, IN_REPAIR_SYSTEM, TERMINATED |
| UNMONITORED | MONITORED, IN_REPAIR_SYSTEM, TERMINATED |
| IN_REPAIR_SYSTEM | ACTIVATED, TERMINATED |
| TERMINATED |
For example, a unit in IN_REPAIR_SYSTEM can only be moved into ACTIVATED or TERMINATED, all other transitions are disallowed.
State Type transitions are recorded in State with each State record containing product_imei, prev_state_type, current_state_type along with associated meta-data. For a full explanation of States see States
A
PUTrequest to this endpoint changes the currentStateof the unit. A validstate_type_idneed to be included in the data package. The following example shows demonstrates a unit transitioning fromACTIVATED(5) toIN_REPAIR_SYSTEM(8) successfully:
url = "https://smartapi.bboxx.co.uk/v1/products/000000000000/change_state"
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=' + A_VALID_TOKEN}
data = {
"new_state": 8
}
r = requests.put(url=url, headers=headers, data=json.dumps(data))
print r.json()
>>> {
u'status': u'success',
u'message': u'Product state changed'
}
Here another
PUTrequest is submitted to the endpoint, the unit is currentlyACTIVATED(5) and an attempt to change it toSTOREDwill result in failure:
url = "https://smartapi.bboxx.co.uk/v1/products/000000000000/change_state"
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=' + A_VALID_TOKEN}
data = {
"new_state": 2
}
r = requests.put(url=url, headers=headers, data=json.dumps(data))
print r.json()
>>> {
u'status': u'validation-error',
u'validation_errors':
{
u'state_transition': u" A unit may not transition from state '5' to state '2'"
},
u'message': u"Your request contained invalid data. See 'data' or 'validation_errors' for exact details",
u'data':
{
u'state_transition': u" A unit may not transition from state '5' to state '2'"
}
}
Endpoint
| value | |
|---|---|
| endpoint | /products/<imei>/change_state |
| method | PUT |
| url_params | product_imei (str) |
| payload | {"entity_id": <state_type_id>} |
| response | 200 |
| permissions | ADMIN |
/products/locations
Description
A
GETrequest to this endpoint, by default, will return up to 1000 of latest recorded locations for your products. If you want more locations for a product, you can specify this in the parameters of theGETrequest under the valueresults_per_page(you will also need to pass the number of pages you want to display. If you just want the list, then just set page to the value of1).
url = "https://smartapi.bboxx.co.uk/v1/products/locations"
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=' + A_VALID_TOKEN}
params = {page: 1, results_per_page: 100000000}
r = requests.get(url=url, headers=headers)
print r.json()
>>> {
u'data': [
{
u'error_radius': 2952,
u'latitude': u'-2.354956',
u'longitude': u'29.740627',
u'product_imei': u'861508031138712'
},
{
u'error_radius': 3560,
u'latitude': u'4.395848',
u'longitude': u'9.439759',
u'product_imei': u'862117022347339'
},
{
u'error_radius': 1936,
u'latitude': u'-1.591342',
u'longitude': u'30.071951',
u'product_imei': u'861508033164062'
},
{
u'error_radius': 1243,
u'latitude': u'-1.509023',
u'longitude': u'29.510557',
u'product_imei': u'866771029560751'
},
.
.
.
]
}
This endpoint will return a complete list of products and their latest recorded locations.
Endpoint
| value | |
|---|---|
| endpoint | /products/locations |
| method | GET |
| url_params | None |
| payload | None |
| response | 200 |
| __permissions | OVERVIEW |
Response
The format of the data returned by this endpoint is a dictionary containing a single key: 'data'. The value is an array of dictionaries. Each dictionary contains the location info for a single product:
{
"product_imei": { imei },
"latitude": { latitude },
"longitude": { longitude },
"error_radius": { error_radius },
}
Parameter
A table containing the values of all parameters set on all unit. Each parameter is of a particular parameter type
The parameter object
| Field | Description |
|---|---|
| parameter_id int (primary key) |
A unique integer identifier for each parameter. |
| parameter_type_id int (not-null,foreign-key) |
|
| product_imei varchar(15) (not-null,foreign-key) |
|
| value string (not-null) |
|
| date_added datetime |
|
| date_removed datetime |
|
| status string |
options: ["active", "removed", "expired", "pending"] |
| created_at datetime |
timestamp that the record was created at |
| created_by text |
username of the user who created the record |
| modified_at datetime |
timestamp that the record was last modified |
| modified_by text |
user that last modified the record |
| Relationship | Description |
|---|---|
| N/A | There are no relationships for this table. |
An example POST request. Note that
parameter_id,created_at,modified_atandcreated_byare all handled internally by the system and need not be explicitly specified. See Meta Data for more information.
url = "http://smartapi.bboxx.co.uk/v1/parameters"
data = json.dumps({
"parameter_type_id": 1,
"product_imei": "000000000000000",
"value": "test",
"date_added": "2000-01-01 00:00:00",
"date_removed": "2000-01-01 00:00:00",
"status": "test",
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.post(url=url, data=data, headers=headers)
r
>>> <Response 201>
r.json()
>>> {
"parameter_id": 1
"parameter_type_id": 1,
"product_imei": "000000000000000",
"value": "test",
"date_added": "2000-01-01 00:00:00",
"date_removed": "2000-01-01 00:00:00",
"status": "test",
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
> We can retrieve the parameter created by specifying its parameter_id in the request url:
url = 'http://smartapi.bboxx.co.uk/v1/parameters/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"parameter_id": 1
"parameter_type_id": 1,
"product_imei": "000000000000000",
"value": "test",
"date_added": "2000-01-01 00:00:00",
"date_removed": "2000-01-01 00:00:00",
"status": "test",
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": None
}
We can retrieve all
parametersby omitting theparameter_id:
url = 'http://smartapi.bboxx.co.uk/v1/parameters'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.get(url=url, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
u'total_pages': 1,
u'objects': [
{<record>},
{<record>},
{<record>},
{<record>},
{<record>},
],
u'num_results': 10,
u'page': 1
}
We can edit the newly created
parameterwith aPUTrequest:
url = 'http://smartapi.bboxx.co.uk/v1/parameters/1'
data = json.dumps({
"parameter_type_id": 2,
"product_imei": "999999999999999",
"value": "changed",
"date_added": "2016-07-01 12:34:45",
"date_removed": "2016-07-01 12:34:45",
"status": "changed",
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.put(url=url, data=data, headers=headers)
r
>>> <Response 200>
r.json()
>>> {
"parameter_id": 1
"parameter_type_id": 2,
"product_imei": "999999999999999",
"value": "changed",
"date_added": "2016-07-01 12:34:45",
"date_removed": "2016-07-01 12:34:45",
"status": "changed",
"created_at": "2000-01-01 00:00:00"
"created_by": "test.user@bboxx.co.uk"
"modified_at": 2016-07-07 12:34:45
}
Note that the
modified_atfield has been updated accordingly.If a user has
SYSTEMpermissions they can delete theparameter
url = 'http://smartapi.bboxx.co.uk/v1/parameters/1'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.delete(url=url, headers=headers)
r
>>> <Response 204>
r.text
>>>
Note that the response from a 204 request is empty. This means that
r.json()cannot be called and will throw a JSONDecodeError. In fact the response isu''- an empty unicode string.
POST
| value | |
|---|---|
| endpoint | /v1/parameters |
| method | POST |
| url_params | N/A |
| query params | N/A |
| body | JSON-formatted dictionary with the details of the parameter that you wish to create |
| permissions | SYSTEM |
| response | 201 |
GET
| value | |
|---|---|
| endpoint | /v1/parameters or /v1/parameters/<parameter_id> |
| method | GET |
| url_params | parameter_id (int) |
| query params | > See Query Format and Filtering |
| body | N/A |
| permissions | OVERVIEW |
| response | 200 |
PUT
| value | |
|---|---|
| endpoint | /v1/parameters/<parameter_id> |
| method | PUT |
| url_params | parameter_id of the parameter you wish to edit |
| query params | N/A |
| body | JSON-formatted dictionary of the columns that you wish to alter |
| permissions | SYSTEM |
| response | 200 |
DELETE
| value | |
|---|---|
| endpoint | /v1/parameters/<parameter_id> |
| method | DELETE |
| url_params | parameter_id (int) |
| query params | N/A |
| body | N/A |
| permissions | SYSTEM |
| response | 204 |
/products/<imei>/parameters/history
Description
It is desirable to be able to see both the current configuration of a product and it's parts and the historical configuration of the product.
For this reason, all parameters (both product_parameters and part_parameters) are stored in the systems with the dates that they are added and removed and the user who assigned them.
The /parameters/history endpoint can either return:
- The full parameter history of the product if no date is specified in the request.
- The
activeparameter set on a product at a given date and time if a date is specified in the request.
Full Parameter History
If the user does not include a date in the request the API will return a complete history of all parameters for that unit for all time. This will include:
activeparameters currently set on the unitpendingparametersremovedparameters which used to be active but have been subsquently removedexpiredparameters - those which were schedule to update but a new parameter was set before the change could take effect
The date_added field indicates the time at which that parameter moved from pending -> active.
The date_removed field indicates the time at which that parameter moved from active -> removed.
pending parameters have neither date_added nor date_removed set.
expired parameters have date_added and date_removed immediately after each other.
Active parameter set on a given date
If a user includes a date with the GET request then the API will return the active parameter set at the specified date/time.
This means it will return the list of parameters as the unit would have "seen them". It will adjust the states of the returned parameters to be current "as it was". It is therefore the case that a parameter which is listed as removed in the system should be returned as active if it was active at the time specified.
Endpoints
url = "https://smartapi.bboxx.co.uk/v1/products/111010101010101/parameters/history"
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=' + A_VALID_TOKEN}
r = requests.get(url=url, headers=headers)
print r.json()
>>> {
"status": "success",
"message": "Full parameter history for #111010101010101 returned successfully",
"data":
{
"part_parameters":
{
'616479':
[
{
'status': 'expired',
'modified_by': 'ci.system@bboxx.co.uk',
'part_parameter_id': 98,
'date_removed': '2016-10-21T11:38:16.961100',
'created_at': '2016-10-21T11:38:16.884380',
'modified_at': '2016-10-21T11:38:16.961501',
'created_by': 'ci.system@bboxx.co.uk',
'parameter_type_id': 52,
'value': '5',
'part_id': 616479,
'date_added':
'2016-10-21T11:38:16.960878'
},
{
'status': 'removed',
'modified_by': 'ci.system@bboxx.co.uk',
'part_parameter_id': 99,
'date_removed': '2016-10-21T11:38:18.285516',
'created_at': '2016-10-21T11:38:16.967994',
'modified_at': '2016-10-21T11:38:18.286111',
'created_by': 'ci.system@bboxx.co.uk',
'parameter_type_id': 52,
'value': '6',
'part_id': 616479,
'date_added': '2016-10-21T11:38:17.888303'
},
{
'status': 'active',
'modified_by': 'ci.system@bboxx.co.uk',
'part_parameter_id': 100,
'date_removed': None,
'created_at': '2016-10-21T11:38:18.087947',
'modified_at': '2016-10-21T11:38:18.287348',
'created_by': 'ci.system@bboxx.co.uk',
'parameter_type_id': 52,
'value': '7',
'part_id': 616479,
'date_added': '2016-10-21T11:38:18.285744'
}
],
'616484': [],
'616483': [],
'616482': [],
'616481': [],
'616480': []
},
'product_parameters':
[
{
'product_imei': '111010101010101',
'status': 'active',
'modified_by': 'ci.system@bboxx.co.uk',
'date_removed': None,
'created_at': '2016-10-21T11:36:55.397643',
'modified_at': '2016-10-21T11:38:17.590436',
'created_by': 'ci.system@bboxx.co.uk',
'parameter_type_id': 1,
'value': 'True',
'date_added': '2016-10-21T11:38:17.589958',
'product_parameter_id': 76796
},
{
'product_imei': '111010101010101',
'status': 'active',
'modified_by': 'ci.system@bboxx.co.uk',
'date_removed': None, 'created_at':
'2016-10-21T11:36:55.530771',
'modified_at': '2016-10-21T11:38:17.636904',
'created_by': 'ci.system@bboxx.co.uk',
'parameter_type_id': 2,
'value': 'False',
'date_added': '2016-10-21T11:38:17.636484',
'product_parameter_id': 76797
},
{
'product_imei': '111010101010101',
'status': 'expired',
'modified_by': 'ci.system@bboxx.co.uk',
'date_removed': '2016-10-21T11:38:16.995178',
'created_at': '2016-10-21T11:38:16.920406',
'modified_at': '2016-10-21T11:38:16.995607',
'created_by': 'ci.system@bboxx.co.uk',
'parameter_type_id': 52,
'value': '5',
'date_added': '2016-10-21T11:38:16.994943',
'product_parameter_id': 76864
},
{
'product_imei': '111010101010101',
'status': 'removed',
'modified_by': 'ci.system@bboxx.co.uk',
'date_removed': '2016-10-21T11:38:18.248536',
'created_at': '2016-10-21T11:38:17.004684',
'modified_at': '2016-10-21T11:38:18.249128',
'created_by': 'ci.system@bboxx.co.uk',
'parameter_type_id': 52,
'value': '6',
'date_added': '2016-10-21T11:38:17.680470',
'product_parameter_id': 76865
},
{
'product_imei': '111010101010101',
'status': 'active',
'modified_by': 'ci.system@bboxx.co.uk',
'date_removed': None,
'created_at': '2016-10-21T11:38:18.132115',
'modified_at': '2016-10-21T11:38:18.250434',
'created_by': 'ci.system@bboxx.co.uk',
'parameter_type_id': 52,
'value': '7',
'date_added':
'2016-10-21T11:38:18.248753',
'product_parameter_id': 76866
}
]
}
}
}
Endpoint
To view the parameter history of a Product with a given imei make a GET request to /products/<imei>/parameters/history.
You may optionally include a date(ISO 8601 format) filter in the payload:
data = json.dumps({"date": "Some date"})
| value | |
|---|---|
| endpoint | /products/<imei>/parameters/history |
| method | GET |
| url_params | product_imei (str) |
| response | 200 |
| payload | date (optional) |
| permissions | OVERVIEW |
Response
The format of the data returned by this endpoint is a dictionary where the keys are part_parameters and product_parameters.
The part_parameter dictionary contains integer keys which represent the part_id of a part which belongs to the product. The values linked to the key is a list of dictionaries, each of which represents a single parameter for the product.
The product_parameter dictionary consists of a single list of dictionaries which contains the parameters assigned to the product.
/products/<imei>/connectivity_reliability_rate
Description
For diagnosis of connectivity issues it is desirable to see the connectivity_reliability_rate of a unit
defined as:
connectivity_rate = actual-number-of-connections / expected-number-of-connections
This endpoint calculates the connectivity rate of a unit between the times start and end.
startdefaults to 7 days agoenddefaults to now()startandendmay be specified in the request. If unspecified the default values will be used.endmust not be in the futureendmust not be beforestartstartandendmust both be either isoformatted timestamps or inyyyy-mm-dd HH:MM:SSformat
The endpoint assumes that a unit will connect once every four hours and will be pessimistic in it's calculations: ie: it will assume that in a 7 hour period a unit will connect only once.
It is possible (especially due to wake-ups) that a unit will connect more than once every four hours in this case the rate is "capped" at 1.00
Get the reliability rate for the default time range (previous 7 days)
url = "https://smartapi.bboxx.co.uk/v1/products/111010101010101/connectivity_reliability_rate"
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=' + A_VALID_TOKEN}
r = requests.get(url=url, headers=headers)
print r.json()
>>> {
"status": "success",
"message": "Successfully computed product connectivity reliability rate",
"data": {
"connectivity_reliability_rate": 0.85
}
}
Get the reliability rate for the last month
url = "https://smartapi.bboxx.co.uk/v1/products/111010101010101/connectivity_reliability_rate"
data = json.dumps({
"start": (dt.datetime.utcnow() - dt.timedelta(days=30)).isoformat()
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=' + A_VALID_TOKEN}
r = requests.get(url=url, data=data, headers=headers)
print r.json()
>>> {
"status": "success",
"message": "Successfully computed product connectivity reliability rate",
"data": {
"connectivity_reliability_rate": 0.70
}
}
Get the reliability rate for the month before last
url = "https://smartapi.bboxx.co.uk/v1/products/111010101010101/connectivity_reliability_rate"
data = json.dumps({
"start": "2017-01-01 00:00:00"
"end": "2017-06-01 00:00:00"
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=' + A_VALID_TOKEN}
r = requests.get(url=url, data=data, headers=headers)
print r.json()
>>> {
"status": "success",
"message": "Successfully computed product connectivity reliability rate",
"data": {
"connectivity_reliability_rate": 1.00
}
}
Endpoint
To view the connectivity_reliability_rate of a Product with a given imei make a GET request to /products/<imei>/connectivit_reliability_rate.
You may optionally include a date(ISO 8601 format) time-range in the payload:
data = json.dumps({"start": "start-date", "end": "end-date"})
| value | |
|---|---|
| endpoint | /products/<imei>/connectivity_reliability_rate |
| method | GET |
| url_params | product_imei (str) |
| response | 200 |
| payload | start, end (optional) |
| permissions | OVERVIEW |
Response
The format of the data returned by this endpoint is a dictionary with keys status, message, data.
The data key contains a dictionary with connectivity_reliability_rate:
If there are any formatting errors in requests the API will return error_code 400 and indicate the error in question in the message section of the response
/products/<imei>/available_networks
Description
For diagnosis of connectivity issues it is helpful to be able to see the networks that a unit could connect to, given its SIM type and the country it is in.
This endpoint returns the list of networks a unit could connect to in its current location.
Get the available networks for the unit in Rwanda (country code 635)
url = "https://smartapi.bboxx.co.uk/v1/products/111010101010101/available_networks?mcc=635"
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=' + A_VALID_TOKEN}
r = requests.get(url=url, headers=headers)
print r.json()
>>> {
"status": "success",
"data": {
'networks': [
{
'created_at': '2016-08-16T13:41:14.431241',
'created_by': 'user@bboxx.co.uk',
'mcc': 635,
'mccmnc': 63514,
'mnc': 14,
'modified_at': None,
'modified_by': None,
'name': 'Rwanda Airtel'
},
{
'created_at': '2016-08-16T13:41:14.431241',
'created_by': 'user@bboxx.co.uk',
'mcc': 635,
'mccmnc': 63510,
'mnc': 10,
'modified_at': None,
'modified_by': None,
'name': 'Rwanda MTN'
}
]
}
}
Endpoint
To view the available_networks for a Product with a given imei make a GET request to /products/<imei>/available_networks, passing a mobile country code (MCC) value as a query argument.
| value | |
|---|---|
| endpoint | /products/<imei>/available_networks?mcc=<mcc> |
| method | GET |
| url_params | product_imei (str) |
| response | 200 |
| payload | None |
| permissions | OVERVIEW |
Response
The format of the data returned by this endpoint is a dictionary with keys status, data, and (optionally) message.
The data key contains an array of Network objects
If there are any formatting errors in requests the API will return error_code 400 and indicate the error in question in the message section of the response
/products/<imei>/command_request
A
POSTrequest to this endpoint sends a debug/diagnostic command to an RTC-enabled unit.
url = "https://smartapi.bboxx.co.uk/v1/products/000000000000/command_request"
data = json.dumps({"command": "atc 60 AT+CPOL=?;+COPS=?"})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=' + A_VALID_TOKEN}
r = requests.post(url=url, headers=headers)
print r.json()
>>> {
"status": "success",
"message": "command successfully sent",
"data": {}
}
This endpoint sends a debug/diagnostic command to an RTC-enabled unit. The imei of the unit is specified in the url.
| value | |
|---|---|
| endpoint | /products/<imei>/command_request |
| method | POST |
| url_params | product_imei (str) |
| payload | {"command": <command>} |
| response | 200 |
Command
The body of the POST should be a valid debug/diagnostic command.
/products/<imei>/sync
A
POSTrequest to this endpoint instructs an RTC-enabled unit to reply with up to date status and telemetry data.
url = "https://smartapi.bboxx.co.uk/v1/products/000000000000/sync"
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=' + A_VALID_TOKEN}
r = requests.post(url=url, headers=headers)
print r.json()
>>> {
"status": "success",
"message": "sync request successfully sent",
"data": {}
}
This endpoint instructs an RTC-enabled unit to reply with up to date status and telemetry data. The imei of the unit is specified in the url.
| value | |
|---|---|
| endpoint | /products/<imei>/sync |
| method | POST |
| url_params | product_imei (str) |
| payload | None |
| response | 200 |
/products/<imei>/status_update
A
POSTrequest to this endpoint sends the latest parameter values to an RTC-enabled unit.
url = "https://smartapi.bboxx.co.uk/v1/products/000000000000/status_update"
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=' + A_VALID_TOKEN}
r = requests.post(url=url, headers=headers)
print r.json()
>>> {
"status": "success",
"message": "status update successfully sent",
"data": {}
}
This endpoint sends the latest parameter values to an RTC-enabled unit. The imei of the unit is specified in the url.
| value | |
|---|---|
| endpoint | /products/<imei>/status_update |
| method | POST |
| url_params | product_imei (str) |
| payload | None |
| response | 200 |
/products/<imei>/rtc_online_status
A
POSTrequest to this endpoint sets the online status of an RTC-enabled unit.
url = "https://smartapi.bboxx.co.uk/v1/products/000000000000/rtc_online_status"
data = json.dumps({"status": "online"})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=' + A_VALID_TOKEN}
r = requests.post(url=url, headers=headers)
print r.json()
>>> {
"status": "success",
"message": "RTC online status set",
"data": {}
}
This endpoint sets the online status of an RTC-enabled unit. The imei of the unit is specified in the url.
| value | |
|---|---|
| endpoint | /products/<imei>/rtc_online_status |
| method | POST |
| url_params | product_imei (str) |
| payload | {"status": <status>} |
| response | 200 |
Status
The body of the POST should be a valid status value: 'online' or 'offline'.
/products/<imei>/force_connection
A
POSTrequest to this endpoint tells a unit to connect. For an RTC-enabled unit we will send async, for others we willsend_wakeup.
url = "https://smartapi.bboxx.co.uk/v1/products/000000000000/force_connection"
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=' + A_VALID_TOKEN}
r = requests.post(url=url, headers=headers)
print r.json()
>>> {
"status": "success",
"message": "Force connection request sent",
"data": {}
}
This endpoint tells a unit to connect. For an RTC-enabled unit we will send a sync, for others we will send_wakeup. The imei of the unit is specified in the url.
| value | |
|---|---|
| endpoint | /products/<imei>/force_connection |
| method | POST |
| url_params | product_imei (str) |
| payload | None |
| response | 200 |
/products/<imei>/get_repair
A
GETrequest to this endpoint attempts to retrieve the current repair workflow for the given unit.
url = "https://smartapi.bboxx.co.uk/v1/products/000000000000/get_repair"
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=' + A_VALID_TOKEN}
r = requests.get(url=url, headers=headers)
print r.json()
>>> {
"status": "success",
"message": "Repair found",
"data": {
'repair_id': 1,
'config': {
'12v_load_current': 1.0,
'usb_load_current': 1.7,
'connectivity_timeout': 120,
'discharge_voltage': 6.0,
'final_state_of_charge': 50,
'pass_capacity_mah': 8000
}
}
}
This endpoint attempts to retrieve the current repair workflow for the given unit. If the unit is in IN_REPAIR state, but not currently associated with a repair workflow, a new workflow will be created and its identifier returned.
If the unit is not currently in IN_REPAIR state, an error response (status code 400) will be returned.
| value | |
|---|---|
| endpoint | /products/<imei>/get_repair |
| method | GET |
| url_params | product_imei (str) |
| payload | None |
| response | 200 |
The format of the data returned by this endpoint is a dictionary with key status, data, and (optionally) message.
The data key contains a dictionary with key repair_id and (optionally) config. The value associated with the repair_id key is the identifier of the repair workflow. If present, the value of the config key is a dictionary containing configuration values to be used by
the client application when communicating with the product under repair (the actual keys and values will vary by product type - the values
shown above are just for illustrative purposes).
If there are any formatting errors in requests the API will return error_code 400 and indicate the error in question in the message section of the response
/products/<imei>/suggest_energy_limit
Description
The energy_limit is restricted by the energy_limit_cap, if it is set. Requests will be accepted and the energy_limit truncated if the requested limit is higher than the cap. The endpoint will inform the user of the requested and applied limit, the energy_limit_cap and explicitly state whether the requested limit has been truncated.
If a product has total_accessory_energy set, the endpoint will prevent the energy_limit being altered.
The unit must also be in either: ACTIVATED, MONITORED or IN_REPAIR_SYSTEM.
Endpoint
To suggest an energy limit on a Product with a given imei make a PUT request to /products/<imei>/suggest_energy_limit.
Energy limits are passed in as strings.
data = json.dumps({"energy_limit": "<suggested_energy_limit>"})
| value | |
|---|---|
| endpoint | /products/<imei>/suggest_energy_limit |
| method | PUT |
| url_params | product_imei (str) |
| response | 200 |
| payload | date (optional) |
| permissions | TECHNICAL |
data = {"energy_limit": "<energy_limit>"}
endpoint = "/products/{}/suggest_energy_limit".format(imei)
r = self.put(endpoint, data=data, user=user, expected_response=expected_response)
print(r.json())
>>>{
"status": "success",
"message": message,
"data": {
"requested": requested_limit,
"applied": applied_limit,
"max_energy_limit": max_energy_limit,
"min_energy_limit": min_energy_limit,
"bounded": bounded
} 200
}
/products/<imei>/set_dcm_enabled_flag
A
PUTrequest to this endpoint setsdcm_enabled_flagof a product.
data = {"enabled": True}
endpoint = "/products/{}/set_dcm_enabled_flag".format(imei)
r = self.put(endpoint, data=data, user=user, expected_response=expected_response)
print(r.json())
>>>{
"status": "success",
"message": "Product 866771029508370. DCM Enabled Flag set to True",
"data": None
}
This endpoint sets dcm_enabled_flag of products. The imei of the unit is specified in the url.
BP20 devices are DCM enabled by default and cannot be modified using this endpoint. This endpoint is for making other products (e.g. BP50) DCM enabled.
| value | |
|---|---|
| endpoint | /products/<imei>/set_dcm_enabled_flag |
| method | PUT |
| url_params | product_imei (str) |
| response | 200 |
| payload | {"enabled": <enabled>} |
| permissions | TECHNICAL |
Enabled
The body of the PUT can either be {"enabled": True} or {"enabled": False}.
/products/<imei>/set_is_payg
A
PUTrequest to this endpoint setsis_paygof a product.
imei = 'XXYYZZXXYYZZ'
data = {"is_payg": True}
endpoint = "/products/{}/set_is_payg".format(imei)
r = self.put(endpoint, data=data, user=user, expected_response=expected_response)
print(r.json())
>>>{
"status": "success",
"message": "is_payg for the Product XXYYZZXXYYZZ, has been set to=True",
"data": None
}
This endpoint sets is_payg of products. The imei of the unit is specified in the url.
A Product that has been completely paid off by the customer will have is_payg=False and S.S should not try to disable this unit even if it has used up all of its credits.
| value | |
|---|---|
| endpoint | /products/<imei>/set_is_payg |
| method | PUT |
| url_params | product_imei (str) |
| response | 200 |
| payload | {"is_payg": <bool: is the unit Pay As you Go>} |
| permissions | TECHNICAL |
Is Pay_As_You_Go?
The body of the PUT can either be {"is_payg": true} or {"is_payg": false}.
/upload_tool_log
A
POSTrequest to this endpoint is used to upload a log message from a manufacturing or repair tool to Influx.
url = "https://smartapi.bboxx.co.uk/v1/upload_tool_log"
data = json.dumps({
"time": "2020-11-05T10:25:30Z",
"message": "{\"serials\": {\"pcb\": \"BX0020-417157-M\", \"battery\": \"BT01090101-012042-0G9-3\", \"product\": \"BX0020-417157-M\"}, \"input_pv\": {\"value\": \"5.150\", \"pass\": true}, \"output_usb\": {\"value\": \"1.183\", \"pass\": true}, \"output_12v\": {\"value\": \"3.285\", \"pass\": true}}",
"toolname": "bpower20_registration_production",
"hostname": "CN-REG03",
"machine_id": "593bfa0c",
"passed": True,
"product_imei": "866557056339858",
"serial_number": "",
"software_version": "0.3.0",
"user": "mfg.sunworth@bboxx.co.uk",
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
r = requests.post(url=url, data=data, headers=headers)
r
>>> <Response 201>
r.json()
>>> {
"data": None
"status": "success",
"message": "Log uploaded successfully",
}
This endpoint uploads a log message from a manufacturing or repair tool to Influx.
The "time", "message" and "toolname" fields must be supplied with every request to this endpoint. The value of "toolname" determines which other fields are allowed
| toolname | permitted fields |
|---|---|
| tiger_test_jig_production | jig_id, machine_id, user, time, software_version, passed, serial_number |
| tiger_test_jig_repair | jig_id, machine_id, user, software_version, passed, serial_number, product_imei, count |
| koala_test_jig_production | jig_id, machine_id, user, software_version, passed, serial_number, product_imei, hostname, control_board_revision |
| bpower20_registration_production | machine_id, hostname, user, software_version, passed, serial_number, product_imei |
| bpower50_registration_production | machine_id, hostname, user, software_version, passed, serial_number, product_imei |
POST
| value | |
|---|---|
| endpoint | /v1/upload_tool_log |
| method | POST |
| url_params | N/A |
| query params | N/A |
| body | JSON-formatted dictionary with the details of the log entry |
| permissions | SYSTEM |
| response | 201 |
If there are any formatting errors in requests the API will return error_code 400 and indicate the error in question in the message section of the response
Product Data
Along with the technical data described in the Schema , BBOXX collects telemetry data such as Current, Voltage and Temperature (amongst a range of others) from each unit. This time-series data is held in a separate time-series database.
BBOXX uses InfluxDB as it's time-series database.
Schema
InfluxDB uses measurements, fields and tags to uniquely identify data.
All measurements are stored inside retention policies.
A measurement is a logical grouping of streams of incoming data.
A field describes a single stream like current, voltage or temperature.
The tags identify the unit that the data is generated from.
All data recorded from a unit is held in the relevant field.
Some measurements, and some fields are currently only used by certain products.
There are several rentention policies and measurements inside the Bboxx instance of InfluxDB. Below is an overview of some of the fields inside the core measurements.
The telemetry measurement from the telemetry_rp retention policy contains the following fields:
| field | data-type |
|---|---|
ac_current |
float |
ac_voltage |
float |
active_power |
float |
apparent_power |
float |
charge_current |
float |
current |
float |
current_in |
float |
current_out |
float |
dc_load_current |
float |
energy |
float |
pack_current |
float |
panel_voltage |
float |
product_imei |
integer |
pulse_count |
integer |
state_of_charge_percent |
integer |
state_of_charge_wh |
float |
temperature |
float |
usb_current |
float |
voltage |
float |
voltage_cell_1 |
float |
voltage_cell_2 |
float |
voltage_cell_3 |
float |
voltage_cell_4 |
float |
The analysis measurement from the analysis_rp contains the following fields:
| field | data-type |
|---|---|
discharge_ah |
float |
discharge_end |
integer |
discharge_imax |
float |
discharge_vmax |
float |
discharge_vmin |
float |
discharge_wh |
float |
energy_in |
float |
energy_out |
float |
gap_end |
float |
lvd |
float |
state_of_charge |
float |
All products use the telemetry measurement to record data, so we'll be using that in our examples.
Inside telemetry datapoint is tagged with the product_imei. However some measurements
have different tags.
Example 1
InfluxDB schema for a single unit storing I, V, T
name: telemetry fld fld fld tag
-----------------------------------------------------------------
time current voltage temperature product_imei
2016-09-02T08:30:42.645Z 1 2 3 013777946874001
2016-09-02T08:40:53.327Z 1 2 3 013777946874001
2016-09-02T08:41:56.348Z 1 2 3 013777946874001
2016-09-02T08:42:35.505Z 1 2 3 013777946874001
For example - a unit has product_imei: 013777946874001 This unit has 3 things being recorded:
- current (I)
- voltage (V)
- temperature (T)
The data would therefore be recorded in Influx as follows (see right):
Example 2
New schema for the 'telemetry' measurement with a second unit adding data.
name: telemetry fld fld fld fld fld tag
-------------------------------------------------------------------------------
time current voltage temperature c_in c_out product_imei
2016-09-02T08:30:42.645Z 1 2 3 013777946874001
2016-09-02T08:40:53.327Z 1 2 3 013777946874001
2016-09-02T08:41:56.348Z 1 2 3 013777946874001
2016-09-02T08:42:35.505Z 1 2 3 013777946874001
2016-08-30T10:05:36.873Z 4 5 6 7 8 013950004127933
2016-08-30T10:06:00.734Z 4 5 6 7 8 013950004127933
2016-08-30T16:43:11.984Z 4 5 6 7 8 013950004127933
2016-08-30T16:43:22.646Z 4 5 6 7 8 013950004127933
A second unit has product_imei: 866771029491460 This unit has 5 things being recorded:
- current (I)
- current_in (I_in)
- current_out (I_out)
- voltage (V)
- temperature (T)
The influx data would therefore be now look like this (see right):
Note that two new fields have been added current_in, and current_out (abbreviated for readability), which are null for unit 4001 but filled for unit 7933. The telemetry measurement can support arbitrary new fields from a unit.
Users can query data relating to each product, specifying fields and tags as desired. See Reading Data for a Product for more information.
Writing Data to Influx
Data should be supplied in the following JSON data structure:
data = {
"measurement": <measurement_name>,
"tags": { "tag_name": <value> },
"fields": {
"field_name": [ [time, value], [time, value], [time, value] ]
"field_name": [ [time, value], [time, value], [time, value] ]
"field_name": [ [time, value], [time, value], [time, value] ]
},
}
Below is a specific example for storing current, voltage and temperature:
data = {
"measurement": "telemetry",
"tags": { "some_tag": "tag_value" },
"fields": {
"current": [
['2016-09-01', 1.0],
['2016-09-02', 2.0],
['2016-09-03', 3.0]
],
"voltage": [
['2016-09-01', 10],
['2016-09-02', 20],
['2016-09-03', 30]
],
"temperature": [
['2016-09-01', 0.1],
['2016-09-02', 0.2],
['2016-09-03', 0.3]
]
}
}
Data is written to influx as a list of timestamp/value pairs. The measurement, field and tags are defined in a data structure as shown on the right.
Measurements
A measurement is a logical container for different series. Examples of sensible measurement names could be:
- telemetry -(for Current, Voltage, Temperature, Power)
- logging - (for storing logs if required)
- analysis - (for storing time-series that are not measured directly)
Fields
Each measurement may have many fields. Each field represents a single stream of incoming data. Example of sensible fields could be:
- current
- voltage
- temperature
- product_logs
Tags
Values inside a field are differentiated by the tags on each point. Sensible tags could be:
- product_imei
- product_type_id
- entity_id
Tags may only contain Uppercase, Lowercase, '_' and '-' characters.
The combination of Measurement/Field/Tag therefore defines a time-series for a single unit.
For example if we wish to see Current and Voltage data for the unit 013777894567 we would look inside:
Measurement: "telemetry"Fields: "current, voltage"Tags: {"product_imei": "013777894567"}
Writing Data for a Product
Data can be written to a specific product like this - note that the
product_imeiis automatically written into the tags and does not need to be specified by the user:
url = "https://smartapi.bboxx.co.uk/v1/products/<imei>/data"
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=' + A_VALID_TOKEN}
data = json.dumps({
"measurement": "telemetry",
"tags": {"some_tag": "tag_value"},
"fields": {
"current": [
[1472688000000, 1.0],
[1472774400000, 2.0],
[1472860800000, 3.0]
],
"voltage": [
['2016-09-01T00:00:00Z', 10.0],
['2016-09-02 00:00:00', 20.0],
['2016-09-03', 30.0]
],
"temperature": [
['Thu, September 1st 2016', 0.1],
['Fri, September 2nd 2016', 0.2],
['Sat, September 3rd 2016', 0.3]
]
}
})
r = requests.post(url=url, data=data, headers=headers)
print r.text
>>> {
"staus": "success"
"message": "9 data-point(s) successfully written to influx",
"data": null,
}
Data for a single product data is written using the /v1/products/<imei>/data endpoint.
This endpoint will write data into the database tagged with the product_imei supplied in the endpoint.
Users can also specify other tags to be applied to every point in the supplied data by including them in the tags sections of the POST request.
Data is supplied as a dictionary with the measurement, tags and fields specified in the format as shown on the right.
The actual data is supplied as a list of [<timestamp>, <value>] pairs.
The <timestamp> can be any of the following:
- milliseconds since epoch eg:
1475685693839 - isoformatted date-time object eg:
'yyyy-mm-ddTHH:MM:SS.nnnnnnnnnZ' - sensibly formatted datetime string eg:
'yyyy-mm-dd HH:MM:SS.nnnnnnnnn' - most sensibly formatted string eg:
'Tue, October 4th 2016'
POST
| value | |
|---|---|
| endpoint | /v1/products/<imei>/data |
| method | POST |
| url_params | product_imei (varchar(15)) |
| query params | None |
| body | dictionary with data-structure and a list of valid datapoints. |
| permissions | TECHNICAL |
| response | 200 |
Writing General Data
More general data can be written like this:
url = "https://smartapi.bboxx.co.uk/v1/products/<imei>/data"
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=' + A_VALID_TOKEN}
data = json.dumps({
"measurement": "analysis",
"fields": {
"curve-data": [
["2016-01-01T00:01:20", 1],
["2016-01-01T00:01:21", 2],
["2016-01-01T00:01:22", 3],
["2016-01-01T00:01:23", 4],
],
},
"tags": {
"analysis-type": "state-of-health",
"product_imei": "000000000000000"
}
})
r = requests.post(url=url, data=data, headers=headers)
print r.text
>>> {
"staus": "success"
"message": "4 data-point(s) successfully written to influx",
"data": null,
}
POST
| value | |
|---|---|
| endpoint | /v1/products/<imei>/data |
| method | POST |
| url_params | None |
| query params | None |
| body | Correctly formatted set of datapoints (see right) |
| permissions | TECHNICAL |
| response | 200 |
Reading data for a Product
Here's an example dataset for a product with imei = 000000000000000
time current product_imei voltage temperature
------------------------------------------------------------------
2016-01-01 00:00:00 1.234 000000000000000 14.243 21.345
2016-01-01 04:00:00 2.234 000000000000000 14.723
2016-01-01 08:00:00 3.234 000000000000000 14.826 21.345
2016-01-01 12:00:00 1.234 000000000000000 13.284
2016-01-01 16:00:00 2.345 000000000000000 12.345 21.345
2016-01-01 20:00:00 2.678 000000000000000 12.678
2016-01-02 00:00:00 2.910 000000000000000 12.910 21.910
2016-01-02 04:00:00 2.345 000000000000000 12.345
2016-01-02 08:00:00 2.678 000000000000000 12.678 21.678
2016-01-02 12:00:00 2.910 000000000000000 12.910
2016-01-02 16:00:00 2.345 000000000000000 12.345 21.345
2016-01-02 20:00:00 2.678 000000000000000 12.678
2016-01-03 00:00:00 2.910 000000000000000 12.910 21.910
A
GETrequest with no parameters will return the default query for the product.
url = "https://smartapi.bboxx.co.uk/v1/products/000000000000000/data"
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=' + A_VALID_TOKEN}
r = requests.get(url=url, headers=headers)
print r.json()
>>> {
u'status': u'success',
u'message': u'data retrieved successfully',
u'data': {
u'measurement': u'telemetry'},
u'tags': {u'product_imei': u'000000000000000'},
u'current': [
[1.234, u'2016-01-01T00:00:00Z'], [2.234, u'2016-01-01T04:00:00Z'], [3.234, u'2016-01-01T08:00:00Z'], [1.234, u'2016-01-01T12:00:00Z'], [2.345, u'2016-01-01T16:00:00Z'], [2.678, u'2016-01-01T20:00:00Z'], [2.91, u'2016-01-02T00:00:00Z'], [2.345, u'2016-01-02T04:00:00Z'], [2.678, u'2016-01-02T08:00:00Z'], [2.91, u'2016-01-02T12:00:00Z'], [2.345, u'2016-01-02T16:00:00Z'], [2.678, u'2016-01-02T20:00:00Z'], [2.91, u'2016-01-03T00:00:00Z']
],
u'current_in': [
[0, u'2016-01-01T00:00:00Z'], [0, u'2016-01-01T04:00:00Z'], [0, u'2016-01-01T08:00:00Z'], [0, u'2016-01-01T12:00:00Z'], [0, u'2016-01-01T16:00:00Z'], [0, u'2016-01-01T20:00:00Z'], [0, u'2016-01-02T00:00:00Z'], [0, u'2016-01-02T04:00:00Z'], [0, u'2016-01-02T08:00:00Z'], [0, u'2016-01-02T12:00:00Z'], [0, u'2016-01-02T16:00:00Z'], [0, u'2016-01-02T20:00:00Z'], [0, u'2016-01-03T00:00:00Z']
],
u'current_out': [
[1.234, u'2016-01-01T00:00:00Z'], [2.234, u'2016-01-01T04:00:00Z'], [3.234, u'2016-01-01T08:00:00Z'], [1.234, u'2016-01-01T12:00:00Z'], [2.345, u'2016-01-01T16:00:00Z'], [2.678, u'2016-01-01T20:00:00Z'], [2.91, u'2016-01-02T00:00:00Z'], [2.345, u'2016-01-02T04:00:00Z'], [2.678, u'2016-01-02T08:00:00Z'], [2.91, u'2016-01-02T12:00:00Z'], [2.345, u'2016-01-02T16:00:00Z'], [2.678, u'2016-01-02T20:00:00Z'], [2.91, u'2016-01-03T00:00:00Z']
],
u'voltage': [
[14.243, u'2016-01-01T00:00:00Z'], [14.723, u'2016-01-01T04:00:00Z'], [14.826, u'2016-01-01T08:00:00Z'], [13.284, u'2016-01-01T12:00:00Z'], [12.345, u'2016-01-01T16:00:00Z'], [12.678, u'2016-01-01T20:00:00Z'], [12.91, u'2016-01-02T00:00:00Z'], [12.345, u'2016-01-02T04:00:00Z'], [12.678, u'2016-01-02T08:00:00Z'], [12.91, u'2016-01-02T12:00:00Z'], [12.345, u'2016-01-02T16:00:00Z'], [12.678, u'2016-01-02T20:00:00Z'], [12.91, u'2016-01-03T00:00:00Z']
],
u'temperature': [
[21.345, u'2016-01-01T00:00:00Z'], [None, u'2016-01-01T04:00:00Z'], [21.345, u'2016-01-01T08:00:00Z'], [None, u'2016-01-01T12:00:00Z'], [21.345, u'2016-01-01T16:00:00Z'], [None, u'2016-01-01T20:00:00Z'], [21.91, u'2016-01-02T00:00:00Z'], [None, u'2016-01-02T04:00:00Z'], [21.678, u'2016-01-02T08:00:00Z'], [None, u'2016-01-02T12:00:00Z'], [21.345, u'2016-01-02T16:00:00Z'], [None, u'2016-01-02T20:00:00Z'], [21.91, u'2016-01-03T00:00:00Z']
],
}
Any number of parameters can be explicitly specified, the other parameters will be filled with the default options.
url = "https://smartapi.bboxx.co.uk/v1/products/000000000000000/data"
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=' + A_VALID_TOKEN}
params = {
"start": "2016-01-02 23:00:00"
}
r = requests.get(url=url, params=params, headers=headers)
r.json()
>>> {
u'status': u'success',
u'message': u'data retrieved successfully',
u'data': {
u'tags': {u'product_imei': u'000000000000000'},
u'measurement': u'telemetry'}
u'current': [[2.91, u'2016-01-03T00:00:00Z']],
u'current_in': [[2.91, u'2016-01-03T00:00:00Z']],
u'current_out': [[2.91, u'2016-01-03T00:00:00Z']],
u'voltage': [[12.91, u'2016-01-03T00:00:00Z']],
u'temperature': [[21.91, u'2016-01-03T00:00:00Z']],
}
Complex queries can be built using the
whereclause parameters
url = "https://smartapi.bboxx.co.uk/v1/products/000000000000000/data"
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=' + A_VALID_TOKEN}
params = {
"start": '2016-01-01',
"end": '2016-01-02',
"limit": 100,
"where": "voltage > 14.0"
"fields": ["current", "temperature"]
}
r = requests.get(url=url, params=params, headers=headers)
r.json()
>>> {
u'status': u'success',
u'message': u'data retrieved successfully',
u'data': {
u'measurement': u'telemetry'}
u'tags': {u'product_imei': u'000000000000000'},
u'current': [[2.234, u'2016-01-01T04:00:00Z'], [3.234, u'2016-01-01T08:00:00Z']],
u'temperature': [[None, u'2016-01-01T04:00:00Z'], [21.345, u'2016-01-01T08:00:00Z']],
}
Note that the query above has return datapoints in "current" and "temperature", where the corresponding voltage values were > 14.0V.
Users can GET data for a particular product using the same rm_data endpoint /v1/products/<imei>/data
As expected a GET request to this endpoint returns data relating to that product.
Data Structure
Provided no errors occured with the request the response will be structured as follows:
{
"status": "success",
"message": "data returned successfully",
"data": <influx data structure>
}
Where <influx data structure> is as follows:
{
"measurement": <measurement name>,
"tags": {
<tagName1>: <tagValue1>,
<tagName2>: <tagValue2>,
<tagName3>: <tagValue3>,
etc..
},
<fieldName1>: [[<value>, <timestamp>],[<value>, <timestamp>],[<value>, <timestamp>]],
<fieldName2>: [[<value>, <timestamp>],[<value>, <timestamp>],[<value>, <timestamp>]],
<fieldName3>: [[<value>, <timestamp>],[<value>, <timestamp>],[<value>, <timestamp>]],
}
NOTE if the get request is asking for device disaggregation data, then the json response will look more like this:
{
"data": [
{
"AC0122":0,
"AC0122_qty":0,
"LI0011":1.3,
"LI0011_qty":1,
"LI0131":0,
"LI0131_qty": 0,
"product_imei": "866710037088082",
"time":"2018-10-18T00:00:12.9Z",
"unexplained":0.29035031155349844,
"unexplained_qty":1
}
],
"message": "data retrieved successfully",
"status": "success"
}
Parameters
Users can filter the data they received by providing filters in the parameters of the GET request. Each parameter is optional and if not provided will be filled by the default option.
Defaults will be defined separately for each product_type so different product types will return different data structures.
| name | description | default |
|---|---|---|
start |
start-time | 7 days ago |
end |
end-time | now() |
fields |
fields to query | "*" (all fields) |
measurement |
measurement to query | "telemetry" |
limit |
number of data-points to return | No limit |
where |
an optional WHERE-clause |
None |
tags |
JSON dictionary of tags to query | "{}" _(an empty JSON dictionary) |
ds_interval |
A downsampling interval to apply to the query | None |
ds_function |
The downsampling function to apply with ds_interval |
mean() |
Full Query Examples
If a user queries /v1/products/<imei>/data and includes the following parameters:
{start: "2016-01-01"}
Then they can expect to receive all available data from telemetry before 2016-01-01 and now(). Since now() is the default endtime.
A second query with parameters:
{
start: "2016-01-01",
end: "2016-02-01",
limit: 100,
where: "'voltage' > 14.0",
fields: ["current", "temperature"]
}
Would return the first 100 datapoints in January where voltage > 14.0V for the unit. Note that since fields is specified as only current and temperature here the data returned are the values of current and temperature where the corresponding voltage was > 14.0,
Tags
Users can filter by specific tags by supplying a JSON formatted dictionary in the parameters like this:
{
start: "2016-01-01",
end: "2016-02-01",
tags: "{tagKey: tagValue, tagKey: tagValue}"
}
Downsampling
Users can downsample data by using the ds_interval and ds_function parameters. These parameters are used to implement the GROUP BY functionality listed HERE in the influxDB documentation.
Users can specifiy a time-range using ds_interval and a function using ds_function and the API will return data which been downsampled into 'ds_interval'' chunks by applying the 'ds_interval' function to datapoints with-in each chunk.
When choosing a function users only need to name the function - do NOT include brackets ().
Available Downsampling Functions
You can find a full list of available functions here
The default downsampling function is mean
Available Time Intervals
Time intervals are specifed as a string in the format: "[number][unit]".
Five minutes would be specified as "5m"
The following units are available:
{
u (microseconds)
ms (milliseconds)
s (seconds)
m (minutes)
h (hours)
d (days)
w (weeks)
}
Time Interval Examples
Specifying 1 minute intervals
{ds_interval: "1m"}
Specifying 10 d intervals
{ds_interval: "10d"}
Specifying half-second intervals in microseconds
{ds_interval: "500000u"}
Downsample Examples
To compute the 5 minute average of a series:
{
"ds_interval": "5m"
"ds_fucntion": "mean"
}
To compute the daily sum of a series:
{
"ds_interval": "1d"
"ds_fucntion": "sum"
}
To compute the hourly maximum of a series:
{
"ds_interval": "1h"
"ds_fucntion": "max"
}
Part Actions
This sections lists endpoints which can be used to create a new part, perform specific actions on a part or query specific data quickly and simply.
/parts/create_tiger_pcb
A POST request to this endpoint will create a new tiger pcb part on the system
url = "https://smartapi.bboxx.co.uk/v1/parts/create_tiger_pcb"
data = json.dumps({"imsi": "213514135171353",
"imei": "010101234560005",
"device_key": "4ab1ab3ab1ab7ab9ab1ab4ab",
"manufacturer": "A Factory"})
headers = {"Content-Type": "application/json", "Authorization": "Token token=" + A_VALID_TOKEN}
r = requests.post(url=url, data=data, headers=headers)
print r.json()
>>> {"status": "success"
"message": "new pcb part and sim successfully created",
"data": {"pcb": {"part_type_id": 44,
"properties": {"device_key": "4ab1ab3ab1ab7ab9ab1ab4ab",
"imei": "010101234560005",
"imsi": "213514135171353",
"serial_number": "HB000501-084032-G"},
"serial_number": "010101234560005",
"manufacturer": "A Factory"},
"sim": {"part_type_id": 43,
"serial_number": "213514135171353"}},
}
This endpoint will create a new tiger pcb part on the system
| value | |
|---|---|
| endpoint | /parts/create_tiger_pcb |
| method | POST |
| url_params | None |
| payload | {"imei": <imei>,"imsi": <imsi>,"device_key": <device_key>,"pcb_part_type_id": <part_type_id> (optional, default=44),"sim_part_type_id": <part_id> (optional, default=43),"iccid": <iccid> (optional, if given then sim part will be created with this as serial_number, otherwise will be the imsi} |
| response | 200 |
| permissions | FACTORY |
/parts/create_hyena_pcb
A POST request to this endpoint will create a new hyena pcb part on the system
url = "https://smartapi.bboxx.co.uk/v1/parts/create_hyena_pcb"
data = json.dumps({"imsi": "213514135171353",
"imei": "010101234560005",
"device_key": "4ab1ab3ab1ab7ab9ab1ab4ab",
"manufacturer": "A Factory"})
headers = {"Content-Type": "application/json", "Authorization": "Token token=" + A_VALID_TOKEN}
r = requests.post(url=url, data=data, headers=headers)
print r.json()
>>> {"status": "success"
"message": "new pcb part and sim successfully created",
"data": {"pcb": {"part_type_id": 77,
"properties": {"device_key": "4ab1ab3ab1ab7ab9ab1ab4ab",
"imei": "010101234560005",
"imsi": "213514135171353",
"serial_number": "HB000501-084032-G"},
"serial_number": "010101234560005",
"manufacturer": "A Factory"},
"sim": {"part_type_id": 43,
"serial_number": "213514135171353"}},
}
This endpoint will create a new hyena pcb part on the system
| value | |
|---|---|
| endpoint | /parts/create_hyena_pcb |
| method | POST |
| url_params | None |
| payload | {"imei": <imei>,"imsi": <imsi>,"device_key": <device_key>,"pcb_part_type_id": <part_type_id> (optional, default=77),"sim_part_type_id": <part_id> (optional, default=43),"iccid": <iccid> (optional, if given then sim part will be created with this as serial_number, otherwise will be the imsi} |
| response | 200 |
| permissions | FACTORY |
/parts/create_koala_pcb
A POST request to this endpoint will create a new koala pcb part on the system
url = "https://smartapi.bboxx.co.uk/v1/parts/create_koala_pcb"
data = json.dumps({"imsi": "213514135171353",
"imei": "010101234560005",
"device_key": "4ab1ab3ab1ab7ab9ab1ab4ab",
"manufacturer": "A Factory"})
headers = {"Content-Type": "application/json", "Authorization": "Token token=" + A_VALID_TOKEN}
r = requests.post(url=url, data=data, headers=headers)
print r.json()
>>> {
"data":{
"pcb":{
"manufacturer":"A Factory",
"part_type_id":122,
"properties":{
"device_key":"4ab1ab3ab1ab7ab9ab1ab4ab",
"erp_code_override":"PA01040102",
"iccid":"66685607592181745482",
"imei":"010101234560005",
"imsi":"213514135171353",
"serial_number":"BX0020-013002-R"
},
"serial_number":"110932356179789"
},
"sim":{
"part_type_id":43,
"serial_number":"66685607592181745482"
}
},
"message":"new koala pcb successfully created.",
"status":"success"
}
This endpoint will create a new koala pcb part on the system
| value | |
|---|---|
| endpoint | /parts/create_koala_pcb |
| method | POST |
| url_params | None |
| payload | {"imei": <imei>,"imsi": <imsi>,"device_key": <device_key>,"pcb_part_type_id": <part_type_id> (optional, default=44),"sim_part_type_id": <part_id> (optional, default=43),"iccid": <iccid> (optional, if given then sim part will be created with this as serial_number, otherwise will be the imsi} |
| response | 201 |
| permissions | FACTORY |
/parts/create_jackal_pcb
A POST request to this endpoint will create a new jackal pcb part on the system
url = "https://smartapi.bboxx.co.uk/v1/parts/create_jackal_pcb"
data = json.dumps({"imsi": "213514135171353",
"imei": "010101234560005",
"device_key": "4ab1ab3ab1ab7ab9ab1ab4ab",
"manufacturer": "A Factory"})
headers = {"Content-Type": "application/json", "Authorization": "Token token=" + A_VALID_TOKEN}
r = requests.post(url=url, data=data, headers=headers)
print r.json()
>>> {
'data': {
'pcb': {
'manufacturer': '"A Factory',
'part_type_id': 158,
'properties': {
'device_key': '4ab1ab3ab1ab7ab9ab1ab4ab',
'erp_code_override': 'PA04010102',
'iccid': '66685607592181745482',
'imei': '010101234560005',
'imsi': '748655857675019'}},
'sim': {
'part_type_id': 43,
'serial_number': '66685607592181745482'}},
'message': 'new jackal pcb successfully created.',
'status': 'success'}
This endpoint will create a new jackal pcb part on the system
| value | |
|---|---|
| endpoint | /parts/create_jackal_pcb |
| method | POST |
| url_params | None |
| payload | {"imei": <imei>,"imsi": <imsi>,"device_key": <device_key>,"pcb_part_type_id": <part_type_id> (optional, default=44),"sim_part_type_id": <part_id> (optional, default=43),"iccid": <iccid> (optional, if given then sim part will be created with this as serial_number, otherwise will be the imsi} |
| response | 200 |
| permissions | FACTORY |
Repair Actions
This sections lists endpoints which can be used to perform specific actions on a product repair workflow.
/repairs/<repair_id>/current_state
A
GETrequest to this endpoint retrieves information about the current state of the given workflow.
url = "https://smartapi.bboxx.co.uk/v1/repairs/000000000000/current_state"
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=' + A_VALID_TOKEN}
r = requests.get(url=url, headers=headers)
print r.json()
>>> {
"status": "success",
"message": "Repair found",
"data": {
"description": "The test jig indicates that this unit has a faulty PCB. Replace the PCB. Click the button below when this has been done",
"events": [],
"ident": "replace_pcb",
"inputs": [
{
"data_type": "selection",
"ident": "replacement_part_type",
"label": "Choose one of these replacement PCB's",
"options": [
{
"label": "BBOXX Home 2 PCB (Tiger 7)",
"value": 61
},
{
"label": "BBOXX Home 2 PCB (Tiger 2)",
"value": 44
},
{
"label": "BBOXX Home 2 PCB (Tiger 6)",
"value": 48
}
],
"selection_type": "single"}],
"name": "Replace PCB"
},
}
This endpoint retrieves information about the current state of the given workflow.
| value | |
|---|---|
| endpoint | /repairs/<repair_id>/current_state |
| method | GET |
| url_params | repair_id (int) |
| payload | None |
| response | 200 |
The format of the data returned by this endpoint is a dictionary with key status, data, and (optionally) message.
The data key contains a dictionary with the following keys:
- "ident" - a unique identifier for the state within the workflow
- "name" - the name of the state which can be displayed to the user
- "description" - description of the purpose of the state and any actions the user is required to take
- "inputs" - a list of IRT Input Specifications (may be empty)
- "events" - a list of IRT Event Specifications (may be empty)
If there are any formatting errors in requests the API will return error_code 400 and indicate the error in question in the message section of the response
/repairs/<repair_id>/send_inputs
A
PUTrequest to this endpoint is used to submit user input for the current repair workflow state
url = "https://smartapi.bboxx.co.uk/v1/repairs/000000000000/send_inputs"
data = json.dumps({
[
"voltage": 4.8,
"serial": "MC0211-999002-1"
]
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=' + A_VALID_TOKEN}
r = requests.put(url=url, data=data, headers=headers)
print r.json()
>>> {
"status": "success",
"message": "Repair updated",
"data": {},
}
This endpoint submits user input for the current repair workflow state.
| value | |
|---|---|
| endpoint | /repairs/<repair_id>/send_inputs |
| method | PUT |
| url_params | None |
| payload | JSON-formatted dictionary with the details of the user's input (see IRT Input Specifications) |
| response | 200 |
If there are any formatting errors in requests the API will return error_code 400 and indicate the error in question in the message section of the response
/repairs/<repair_id>/send_events
A
PUTrequest to this endpoint is used to submit a user event notification for the current repair workflow state
url = "https://smartapi.bboxx.co.uk/v1/repairs/000000000000/send_events"
data = json.dumps({
[
"event": "battery.charged"
]
})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=' + A_VALID_TOKEN}
r = requests.put(url=url, data=data, headers=headers)
print r.json()
>>> {
"status": "success",
"message": "Repair updated",
"data": {},
}
This endpoint submits user input for the current repair workflow state.
| value | |
|---|---|
| endpoint | /repairs/<repair_id>/send_events |
| method | PUT |
| url_params | None |
| payload | JSON-formatted dictionary with a single key identifying the user's event notification (see IRT Event Specifications) |
| response | 200 |
If there are any formatting errors in requests the API will return error_code 400 and indicate the error in question in the message section of the response
/repairs/<repair_id>/history
A
GETrequest to this endpoint is used to retrieve the repair workflow history state
url = "https://smartapi.bboxx.co.uk/v1/repairs/000000000000/history"
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=' + A_VALID_TOKEN}
r = requests.get(url=url, headers=headers)
print r.json()
>>> {
"status": "success",
"message": "Repair state found",
"data": [
{'ident': 'ss_state_check', 'name': 'SMART SOLAR State Check'},
{'ident': 'usb_diag_test', 'name': 'USB Diagnostic Test'},
{'ident': 'explain_skip_btb', 'name': 'Skip the Battery Test'},
{'ident': 'charge_2', 'name': 'Charge'},
{'ident': 'clean', 'name': 'Clean'},
{'ident': 'visual_inspection', 'name': 'Visual Inspection'},
{'ident': 'select_damaged_casing', 'name': 'Select Damaged Casing'}
],
}
This endpoint retrieves the repair workflow history state.
| value | |
|---|---|
| endpoint | /repairs/<repair_id>/history |
| method | GET |
| url_params | repair_id (int) |
| payload | None |
| response | 200 |
If there are any formatting errors in requests the API will return error_code 400 and indicate the error in question in the message section of the response
/repairs/list_current_states
A
GETrequest to this endpoint is used to retrieve a list of current repairs and their workflow states
url = "https://smartapi.bboxx.co.uk/v1/repairs/list_current_states"
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=' + A_VALID_TOKEN}
r = requests.get(url=url, headers=headers)
print r.json()
>>> {
"status": "success",
"message": "Repair states found",
"data": [
{
'created_by': 'test.user@bboxx.co.uk',
'product_imei': '864811031004067',
'repair_id': 46141,
'repair_state_id': 'select_damaged_casing',
'repair_state_name': 'Select Damaged Casing'
},
{
'created_by': 'test.user@bboxx.co.uk',
'product_imei': '864811034773775',
'repair_id': 46137,
'repair_state_id': 'visual_inspection',
'repair_state_name': 'Visual Inspection'
}
],
}
This endpoint retrieves a list of current repairs and their workflow states.
| value | |
|---|---|
| endpoint | /repairs/list_current_states |
| method | GET |
| url_params | None |
| query_params | entity_id=entity-id (optional - filter the list by entity) |
username=username (optional - filter the list by user) |
|
repair_state=repair-state-id (optional - filter the list by repair state) |
|
| payload | None |
| response | 200 |
If there are any formatting errors in requests the API will return error_code 400 and indicate the error in question in the message section of the response
IRT Input Specifications
Each input specification contains three mandatory fields:
"ident" - unique identifier for the input value
"label" - short description of the input value, to be displayed to the user
"data_type" - the input value's type. Currently, the following are supported:
"int" "float" "string" "text" "datetime" "selection"
Each definition may also contain an optional validation rules field:
"validation_rules"
"int" Data Type
Indicates that the required value must be an integer
Validation Rules
The following validation rules may be specified for integers:
- "min" :
<min-value> - "max" :
<max-value> - "step" :
<step-value> - "options" :
[<int1>, <int2>....](i.e. the submitted value must be one of the values in the list)
Example
{
"ident": "voltage",
"label": "Battery Voltage",
"data_type": "int",
"validation_rules": {"min": 3, "max": 7}
}
The value entered by the user would be submitted to the send_inputs endpoint like this:
{
"voltage": 4
}
"float" Data Type
Indicates that the required value must be a floating point number
Validation Rules
The following validation rules may be specified for floats:
- "min" :
<min-value> - "max" :
<max-value> - "step" :
<step-value> - "options" :
[<float1>, <float2>....](i.e. the submitted value must be one of the values in the list)
Example
{
"ident": "voltage",
"label": "Battery Voltage",
"data_type": "float",
"validation_rules": {"min": 3.5, "max": 7.5}
}
The value entered by the user would be submitted to the send_inputs endpoint like this:
{
"voltage": 4.8
}
"string" Data Type
Indicates that the required value must be a string (intended for use with short strings, probably input via a single line text field)
Validation Rules
The following validation rules may be specified for strings:
- "minlength" :
<min-length-value> - "maxlength" :
<max-length-value> - "options" :
<option1>,<option2>....
Example
{
"ident": "serial",
"label": "Serial Number",
"data_type": "string",
"validation_rules": {"minlength": 10, "maxlength": 15}
}
The value entered by the user would be submitted to the send_inputs endpoint like this:
{
"serial": "MC0211-999002-1"
}
"text" Data Type
Indicates that the required value must be text (intended for use with long strings, probably input via a multi-line text area field)
Validation Rules
The following validation rules may be specified for text:
- "minlength" :
<min-length-value> - "maxlength" :
<max-length-value>
Example
{
"ident": "termination_reason",
"label": "Termination Reason",
"data_type": "text",
"validation_rules": {"minlength": 10}
}
The value entered by the user would be submitted to the send_inputs endpoint like this:
{
"termination_reason": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
}
"datetime" Data Type
Indicates that the required value must be a date/time string
Validation Rules
There are no validation rules for date/times. The acceptable formats are %H:%M:%S, %Y-%m-%d and %Y-%m-%dT%H:%M:%SZ
Example
{
"ident": "refurb_date",
"label": "Refurbishment Date",
"data_type": "datetime"
}
The value entered by the user would be submitted to the send_inputs endpoint like this:
{
"refurb_date": "2018-03-30"
}
"selection" Data Type
Indicates that the required value must be selected from a list. This data type is specified by 2 further fields:
"selection_type": Either "single" (indicating that the user can only select one value from the list) or "multi" (indicating that multiple values can be selected).
"options": An array of dictionary objects. Each dictionary object has 2 members:
- "value" - the value to be submitted if this option is selected
- "label" - short description of this value, to be displayed to the user
Validation Rules
There are no validation rules for selection data types.
Example
Selection type "single"
{
"ident": "replacement_part_type",
"label": "Choose one of these replacement PCB's",
"data_type": "selection",
"selection_type": "single",
"options": [
{
"label": "BBOXX Home 2 PCB (Tiger 7)",
"value": 61
},
{
"label": "BBOXX Home 2 PCB (Tiger 2)",
"value": 44
},
{
"label": "BBOXX Home 2 PCB (Tiger 6)",
"value": 48
}
]
}
The value selected by the user would be submitted to the send_inputs endpoint like this:
{
"replacement_part_type": 44
}
Selection type "multi"
{
"ident": "u'internal_inspection_result",
"label": "Internal Inspection Result",
"data_type": "selection",
"selection_type": "multi",
"options": [
{
"label": "Home 2 Button Cap",
"value": 69
},
{
"label": "Light Pipes",
"value": 12
},
{
"label": "Battery PCB Cable",
"value": 15
},
{
"label": "BBOXX Home 2 (Tiger) Battery Cable",
"value": 62
}
]
}
The value(s) selected by the user would be submitted to the send_inputs endpoint like this:
{
"internal_inspection_result": [12, 62]
}
IRT Event Specifications
Each event specification contains two mandatory fields:
"ident" - unique identifier for the event
"label" - short description of the event, to be displayed to the user
Example
{
"ident": "battery.charged",
"label": "Battery Charged",
}
The value entered by the user would be submitted to the send_event endpoint like this:
{
"event": "battery.charged"
}
RTC Dead Letter Actions
This sections lists endpoints that can be used to perform actions on RTC Dead Letter messages.
/rtc_import_mo_dead_letters
A
POSTrequest to this endpoint instructs SMART Solar to copy any RTC dead letter messages from the RTC-MO.Dead-Letter queue to the database to enable examination and further processing.
url = "https://smartapi.bboxx.co.uk/v1/rtc_import_mo_dead_letters"
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=' + A_VALID_TOKEN}
r = requests.post(url=url, headers=headers)
print r.json()
>>> {
"status": "success",
"message": "MO dead letters imported",
"data": {}
}
This endpoint instructs SMART Solar to copy any RTC dead letter messages from the RTC-MO.Dead-Letter queue to the database to enable examination and further processing.
| value | |
|---|---|
| endpoint | /rtc_import_mo_dead_letters |
| method | POST |
| url_params | None |
| payload | None |
| response | 200 |
/rtc_import_mt_reply_dead_letters
A
POSTrequest to this endpoint instructs SMART Solar to copy any RTC dead letter messages from the RTC-MT.Reply.Dead-Letter queue to the database to enable examination and further processing.
url = "https://smartapi.bboxx.co.uk/v1/rtc_import_mt_reply_dead_letters"
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=' + A_VALID_TOKEN}
r = requests.post(url=url, headers=headers)
print r.json()
>>> {
"status": "success",
"message": "MT Reply dead letters imported",
"data": {}
}
This endpoint instructs SMART Solar to copy any RTC dead letter messages from the RTC-MT.Reply.Dead-Letter queue to the database to enable examination and further processing.
| value | |
|---|---|
| endpoint | /rtc_import_mt_reply_dead_letters |
| method | POST |
| url_params | None |
| payload | None |
| response | 200 |
/rtc_dead_letters/<rtc_dead_letter_id>/replay
A
PUTrequest to this endpoint replays an RTC dead letter message.
url = "https://smartapi.bboxx.co.uk/v1/rtc_dead_letters/1/replay"
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=' + A_VALID_TOKEN}
r = requests.put(url=url, headers=headers)
print r.json()
>>> {
"status": "success",
"message": "Dead letter message replayed",
"data": None
}
This endpoint replays an RTC dead letter message. The id of the message to be replayed is specified in the url.
| value | |
|---|---|
| endpoint | /rtc_dead_letters/<rtc_dead_letter_id>/replay |
| method | PUT |
| url_params | rtc_dead_letter_id (int) |
| payload | None |
| response | 200 |
/rtc_dead_letters/<rtc_dead_letter_id>/discard
A
PUTrequest to this endpoint marks an RTC dead letter message as discarded, indicating that it is not to be processed further.
url = "https://smartapi.bboxx.co.uk/v1/rtc_dead_letters/1/discard"
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=' + A_VALID_TOKEN}
r = requests.put(url=url, headers=headers)
print r.json()
>>> {
"status": "success",
"message": "Dead letter message discarded",
"data": None
}
This endpoint marks an RTC dead letter message as discarded, indicating that it is not to be processed further. The id of the message to be replayed is specified in the url.
| value | |
|---|---|
| endpoint | /rtc_dead_letters/<rtc_dead_letter_id>/discard |
| method | PUT |
| url_params | rtc_dead_letter_id (int) |
| payload | None |
| response | 200 |
/rtc_dead_letters/<rtc_dead_letter_id>/decode
A
GETrequest to this endpoint returns the contents of a RTC dead letter message ready for display to a user.
url = "https://smartapi.bboxx.co.uk/v1/rtc_dead_letters/1/decode"
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=' + A_VALID_TOKEN}
r = requests.put(url=url, headers=headers)
print r.json()
>>> {
"status": "success",
"message": "Dead letter message decoded",
"data": "Decoded message: [4L, [[1518543688L, u'Charger sn=HQ17048RPII pid=a04c'], [1518543691L, u'Above RV']]]"
}
This endpoint returns the contents of a RTC dead letter message ready for display to a user.
| value | |
|---|---|
| endpoint | /rtc_dead_letters/<rtc_dead_letter_id>/decode |
| method | GET |
| url_params | rtc_dead_letter_id (int) |
| payload | None |
| response | 200 |
Custom Endpoints
This section lists custom endpoints available to users for returning information from the API and performing actions that are not specific to a Product.
/home
url = "https://smartapi.bboxx.co.uk/v1/home"
r = requests.get(url)
print r
>>> <Response 200>
print r.text
>>> "Welcome to the SMARTSolar API: 2016-08-09T10:14:48.318496"
Description
The /home endpoint provides a quick way to confirm that the endpoint is up and running. A simple GET or POST request will generate a 200 response if the API is running.
The endpoint does not require authentication and can also be access from a standard web-browser:
https://smartapi.bboxx.co.uk/v1/home
The response will also return (in plain text) Welcome to the SMARTSolar API: <timestamp>.
/auth/login
A simple
POSTrequest with correct details yields the following response:
url = 'https://smartapi.bboxx.co.uk/v1/auth/login'
fields = {
"username": <username>,
"password": <password>
}
r = requests.post(url, data=fields)
r.json()
>>> {
"status": "success",
"message": {
"login_successful": {
"username": "test.user@bboxx.co.uk",
"entity_id": 1,
"display_name": "T User",
"name": "",
"user_product_visibility": "GLOBAL",
"hub_id": None,
"shop_id": None,
"API_token": "sRtBFThPFIpgKY2sYkaSHFbo1hosg2NvCP4PmBIxfGQ62VS6zrjFT6dr1qDLQGz",
"token_expiry": "Mon, 01 Aug 2016 17:05:11 GMT",
"permissions": "SYSTEM"
}
}
}
This is the endpoint used to generate a token. For a full explanation see Authentication and Permissions.
| value | |
|---|---|
| endpoint | /auth/login |
| method(s) | POST |
| permissions | N/A |
| params | N/A |
| payload | username and password (unformatted) |
| response | 200 |
/auth/validate_user
A simple
GETrequest with a valid username yields the following response:
url = 'https://smartapi.bboxx.co.uk/v1/auth/validate_user?username=a-valid-user@bboxx.co.uk'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=' + A_VALID_TOKEN}
r = requests.get(url=url, headers=headers)
r.json()
>>> {
"status": "success",
"message": "Successfully checked the username a-valid-user@bboxx.co.uk",
"data": "True"
}
}
A
GETrequest with an invalid username yields the following response
url = 'https://smartapi.bboxx.co.uk/v1/auth/validate_user?username=not_a_real_user@bboxx.co.uk'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=' + A_VALID_TOKEN}
r = requests.get(url=url, headers=headers)
r.json()
>>> {
"status": "success",
"message": "Successfully checked the username not_a_real_user@bboxx.co.uk",
"data": "False"
}
}
paramsmay also be used:
url = 'https://smartapi.bboxx.co.uk/v1/auth/validate_user'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=' + A_VALID_TOKEN}
params = {
"username": "not_a_real_user@bboxx.co.uk"
}
r = requests.get(url=url, params=params, headers=headers)
r.json()
>>> {
"status": "success",
"message": "Successfully checked the username not_a_real_user@bboxx.co.uk",
"data": "False"
}
}
This endpoint can be called by users with SYSTEM privileges to validate whether a username is valid.
If a username is valid the response_code will be 200 and the payload in r.json()["data"] will be True.
If a username is invalid the response_code will still be 200 but the payload in r.json()["data"] will be False
| value | |
|---|---|
| endpoint | /auth/validate_user |
| method(s) | GET |
| permissions | SYSTEM |
| params | username (str) |
| payload | N/A |
| response | 200 |
/v1/current_enable_status
A GET request to this endpoint will return the enable status of all units so that the ERP can sync the unit status
url = "https://smartapi.bboxx.co.uk/v1/current_enable_status?page=5&results_per_page=3"
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=A_VALID_TOKEN'}
response = requests.get(url=url, headers=headers)
print(response.json())
>>> {
"data": [
{
"current_enable_state": "enabled",
"current_state_type": 5,
"date": "2015-06-04T10:59:30",
"dcm_enabled_flag": False,
"entity": "BBOXX Capital Kenya",
"entity_id": 4,
"hardware_type": "BB17SMART_v1",
"prev_enable_state": "disabled",
"product_imei": "test-77006985814",
"product_type_id": 1,
"serial_number": "BB17SMART-2014_MAY21-test",
"total_accessory_energy": None,
"user": "test@bboxx.co.uk",
},
{
"current_enable_state": "enabled",
"current_state_type": 5,
"date": "2015-06-04T10:59:31",
"dcm_enabled_flag": False,
"entity": "BBOXX Capital Kenya",
"entity_id": 4,
"hardware_type": "BB17SMART_v2",
"prev_enable_state": "disabled",
"product_imei": "test-49004970581",
"product_type_id": 2,
"serial_number": "BB17SMART-140710-test",
"total_accessory_energy": None,
"user": "test@bboxx.co.uk",
},
{
"current_enable_state": "enabled",
"current_state_type": 5,
"date": "2015-06-04T10:59:48",
"dcm_enabled_flag": False,
"entity": "BBOXX Capital Kenya",
"entity_id": 4,
"hardware_type": "BB17SMART_v2",
"prev_enable_state": "disabled",
"product_imei": "test-50004183746",
"product_type_id": 2,
"serial_number": "BB17SMART-150127-test",
"total_accessory_energy": None,
"user": "test@bboxx.co.uk",
},
],
"message": "enable_histories retrieved",
"status": "success",
}
This endpoint will return the enable status of all units so that the ERP can sync the unit status
The ERP is concerned about units getting out of sync with SMARTSolar so once
every two hours they try to sync all unit statuses. Initially this endpoint only
returned the enable_state but it's functionality has expanded over time.
| value | |
|---|---|
| endpoint | /v1/current_enable_status |
| method | GET |
| url_params | page , results_per_page |
| response | 200 |
| permissions | FACTORY |
/auth/validate_user_password
A simple
GETrequest with a valid username/password combination yields the following response:
url = 'https://smartapi.bboxx.co.uk/v1/auth/validate_user_and_password?username=a-valid-user@bboxx.co.uk&password=a-valid-password'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=' + A_VALID_TOKEN}
r = requests.get(url=url, headers=headers)
r.json()
>>> {
"status": "success",
"message": "Successfully checked the username a-valid-user@bboxx.co.uk with it's password",
"data": "True"
}
}
A
GETrequest with an invalid username/password combination yields the following response
url = 'https://smartapi.bboxx.co.uk/v1/auth/validate_user?username=not_a_real_user@bboxx.co.uk&password=not-a-valid-password'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=' + A_VALID_TOKEN}
r = requests.get(url=url, headers=headers)
r.json()
>>> {
"status": "success",
"message": "Successfully checked the username not_a_real_user@bboxx.co.uk with it's password",
"data": "False"
}
}
paramsmay also be used:
url = 'https://smartapi.bboxx.co.uk/v1/auth/validate_user_and_password'
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=' + A_VALID_TOKEN}
params = {
"username": "not_a_real_user@bboxx.co.uk",
"password": "not_a_real_pass",
}
r = requests.get(url=url, params=params, headers=headers)
r.json()
>>> {
"status": "success",
"message": "Successfully checked the username not_a_real_user@bboxx.co.uk with it's password",
"data": "False"
}
}
This endpoint can be called by users with SYSTEM privileges to validate whether a username is valid.
If the username/password combination is valid the response_code will be 200 and the payload in "data" will be "True"
If the username/password combination is invalid the response_code will still be 200 but the payload in "data" will be False
| value | |
|---|---|
| endpoint | /auth/validate_user_and_password |
| method(s) | GET |
| permissions | SYSTEM |
| params | username (str) password (str) |
| payload | N/A |
| response | 200 |
/dashboard2
A plain
GETrequest returns a json structure as follows:
url = "https://smartapi.bboxx.co.uk/v1/dashboard2"
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=' + A_VALID_TOKEN}
r = requests.get(url=url, headers=header)
r.json()
>>> {
"data": [
{
"product_imei": "000000000000000",
"serial_number": "BB17SMART-150127-0608",
"imsi": "204040000000000",
"hardware_type": "BB17SMART_v2",
"entities": [{
"entity_id": 1,
"name": "A Test Entity",
"bboxx_company_flag": True,
"financier": None,
"tariff": "A Test Tariff"
"created_at": "2015-02-11 12:24:29.993914",
"created_by": "test.user@bboxx.co.uk",
"modified_at": "2015-04-13 10:42:29",
}],
"hub_id": 2,
"shop_id": None,
"location_date": "2016-08-02T19:38:56",
"alerts": [None],
"software_lock": None,
"pending_software_created_at": None,
"state": "activated",
"state_date": "2015-08-18T14:05:08",
"recent_connection": "2016-08-02T19:38:56",
"latitude": "-0.400234",
"longitude": "34.599241",
"error_radius": 69583,
"capacity_limit": "7",
"current_enable_flag": True,
"desired_enable_flag": True,
"current_tamper_flag": False,
"desired_tamper_flag": False,
"notes": [None],
"software": "2.16"
"pending_software": None,
"created_at": "2015-04-16T02:09:55",
"created_by": "test.user@bboxx.co.uk",
},
{
"product_imei": "222222222222222",
"serial_number": "BB17SMART-150127-0608",
"imsi": "204042222222222",
"hardware_type": "BB17SMART_v2",
"entities": [{
"entity_id": 1,
"name": "A Test Entity",
"bboxx_company_flag": True,
"financier": None,
"tariff": "A Test Tariff"
"created_at": "2015-02-11 12:24:29.993914",
"created_by": "test.user@bboxx.co.uk",
"modified_at": "2015-04-13 10:42:29",
}],
"hub_id": 2,
"shop_id": None,
"location_date": "2016-08-02T19:38:56",
"alerts": [None],
"software_lock": None,
"pending_software_created_at": None,
"state": "activated",
"state_date": "2015-08-18T14:05:08",
"recent_connection": "2016-08-02T19:38:56",
"latitude": "-0.400234",
"longitude": "34.599241",
"error_radius": 69583,
"capacity_limit": "7",
"current_enable_flag": True,
"desired_enable_flag": True,
"current_tamper_flag": False,
"desired_tamper_flag": False,
"notes": [None],
"software": "2.16"
"pending_software": None,
"created_at": "2015-04-16T02:09:55",
"created_by": "test.user@bboxx.co.uk",
},
]
"num_results": 2
"num_results_filtered": 2
}
/dashboard2supports standard Flask-Restless filtering, for example:
This endpoint is used to return a collection of useful data about a product (or products) in a format that is helpful.
| value | |
|---|---|
| endpoint | /dashboard2 |
| method | GET |
| params | See Query Format and Filtering |
| payload | N/A |
| response | 200 |
Querying and Filtering
A single product can be queried as follows:
url = "https://smartapi.bboxx.co.uk/v1/dashboard2"
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=' + A_VALID_TOKEN}
params = {
"q": json.dumps({
"filters": [
{"name": "product_imei", "op": "eq", "val": "866771029513065"}
]
})
}
r = requests.get(url=url, params=params, headers=get_headers())
print r
>>> <Response 200>
print r.json()
>>> {
"num_results": 1,
"num_results_filtered": 1
"data": [
{
"product_imei": "866771029513065",
"imsi": "214074203094552",
"hardware_type": "Hub",
"serial_number": "HUB-10",
"capacity_limit": "0.0",
"current_enable_flag": True,
"desired_enable_flag": True,
"current_tamper_flag": True,
"desired_tamper_flag": True,
"entities": [{
"entity_id": 31,
"name": "Angaza Design",
"bboxx_company_flag": False,
"financier": None,
"tariff": "WV-695 - Vodafone Global- ROWT3 1MB"
"created_at": "2015-09-22T09:01:58.170953",
"created_by": "d.mclean@bboxx.co.uk",
}],
"shop_id": None,
"hub_id": None,
"recent_connection": "2016-08-03T14:15:49",
"location_date": "2016-08-03T14:15:49",
"latitude": "37.783256",
"longitude": "-122.404417",
"error_radius": 1251,
"alerts": [None],
"state": "activated",
"state_date": "2016-07-14T22:03:09",
"software": "hub-stc-4"
"software_lock": None,
"pending_software": None,
"pending_software_created_at": None,
"notes": [None],
"created_at": "2016-06-30T16:17:56",
"created_by": "r.software@bboxx.co.uk",
"modified_at": None,
}
],
}
The /dashboard2 endpoint follows the Flask-Restless query format but with a few caveats.
Querying a single product follows the expected pattern.
"filters": [{"name": "entities", "op": "eq", "val": "A Test Entity"}]
Entities
url = "https://smartapi.bboxx.co.uk/v1/dashboard2"
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=' + A_VALID_TOKEN}
params = {
"q": json.dumps({
"filters": [
{"name": "entities", "op": "=", "val": "BBOXX Engineering"}
]
})
}
r = requests.get(url=url, params=params, headers=headers)
Querying entities deviates from the expected pattern slightly.
Rather than "name": "entity" you must instead specify "name": "entities"
In addition the value must be the name of an entity rather than an entity_id.
For example:
"filters": [{"name": "entities", "op": "eq", "val": "A Test Entity"}]
/alerts/<alert_id>/dismiss
A
PUTrequest to this endpoint dismisses an alert.
url = 'https://smartapi.bboxx.co.uk/v1/alerts/<alert_id>/dismiss'
data = json.dumps({
"dismissal_reason":"reason for dismissal",
"extra_info": "extra information about dismissal",
"repair_id":<repair_id>})
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=' + A_VALID_TOKEN}
r = requests.put(url=url, data=data headers=headers)
print r.json()
>>> {
"status": "success",
"message": "Alert #{alert_id} has been dismissed",
"data": None
}
This endpoint is used to dismiss an alert.
| value | |
|---|---|
| endpoint | /alerts/<alert_id>/dismiss |
| method | PUT |
| url_params | alert_id (int) |
| payload | {"dismissal_reason":"reason for dismissal", (optional)"extra_info": "extra information about dismissal," (optional)"repair_id":<repair_id> (optional)} |
| response | 200 |
Notifications (Web Hooks)
Receiving Notifications from the API
It's often desirable to receive notifcations about changes in the system rather than repeatedly polling the API to check for changes.
BBOXX supports this functionality in the form of Notifications or "Webhooks". Users can opt to receive an HTTP POST request containing any updated data at the point at which any change is detected in the system.
Users can subscribe to different channels after which new data published into that channel will be sent, via HTTP, to the endpoint that the user specified in the subscription stage. The user can then handle the incoming data as they wish.
BBOXX supports HTTP and HTTPS endpoints and includes a signature in each POST request that a user can use to confirm the authenticity of the request and its data.
Channels
To view a list of available channels, send a
GETrequest to/v1/channels.
url = "https://smartapi.bboxx.co.uk/v1/channels"
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=' + A_VALID_TOKEN}
r = requests.get(url=url, headers=headers)
print r
>>> <Response [200]>
print r.text
>>> {
'total_pages': 1,
'objects': [{
'name': 'product-status',
'created_at': '2016-11-25T10:51:30.077685',
'created_by': 'd.mclean@bboxx.co.uk'
'modified_at': None,
'modified_by': None,
}],
'num_results': 1,
'page': 1
}
Data is separated into Channels so that users can receive only the data that they are interested in.
The current list of possible channels is:
| Name | data published into this channel |
|---|---|
| product-status | enabled status, product state (ACTIVATED/MONITORED etc.), user (making the change) |
| product-alert | updates to SMART Solar alert data |
Users can view a list of available channels by sending a GET request to /v1/channels
Users can view the possible contents and format of the data sent in the channel below:
Subscribing to a Channel
An example of how to subscribe to the
product-statuschannel.
url = "https://smartapi.bboxx.co.uk/v1/channels/product-status/subscribe"
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=' + A_VALID_TOKEN}
data = json.dumps({
"url": "http://example_domain/example_endpoint",
})
r = requests.post(url=url, data=data, headers=headers)
print r
>>> <Response [201]>
print r.text
>>> {
'status': 'success',
'message': "You have subscribed to the 'product-status' channel with the url: 'test_url'",
'data': {
'url': 'http://example_domain/example_endpoint',
'channel_name': 'product-status',
'key': 'n9QgxA1GO0bzBVontkWkWg=='
}
}
key = r.json()["data"]["key"]
print "THIS IS MY SECRET KEY: {} ".format(key)
print "I SHOULD STORE IT SAFELY SINCE I CANNOT RETRIEVE IT LATER"
Note the secret key that is returned inside the payload of the response - this key is required in order to verify the signature that BBOXX sends with each request. You should store it in a secure place as it will not be resent after the first subscription request.
To receive messages from a channel, users must first setup a suitable endpoint that can receive and process the POST request and then subscribe that endpoint to the desired channel.
To subscribe, send a POST request to /v1/channels/<channel_name>/subscribe with a JSON formated dictionary containing the endpoint url sent in the payload of the request - see right for an example subscription request.
You may only subscribe one url to each channel.
Unsubscribing from a Channel
An example of how to un-subscribe from the
product-statuschannel.
url = "https://smartapi.bboxx.co.uk/v1/channels/product-status/unsubscribe"
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=' + A_VALID_TOKEN}
data = json.dumps({
"url": "http://example_domain/example_endpoint",
})
r = requests.post(url=url, data=data, headers=headers)
print r
>>> <Response [200]>
print r.text
>>> {
'status': 'success',
'message': "You have unsubscribed from the 'product-status' channel with the url: 'http://example_domain/example_endpoint'",
'data': None
}
If a user no longer wishes to receive notifications from a particular channel they can unsubscribe from that channel by sending a POST request to /v1/channels/<channel_name>/unsubscribe with a JSON-formatted dictionary in the payload, containing the url that they wish to remove..
POST
| value | |
|---|---|
| endpoint | /v1/channels/<channel_name>/unsubscribe |
| method | POST |
| url_params | channel_name (str) |
| query params | N/A |
| body | url (str) - The endpoint that you wish to unsubscribe |
| permissions | ADMIN |
| response_code | 200 |
A successful request will result in a 200 response code. In addition the response will confirm the channel that the user unsubscribed from.
Receiving Notifications
Having successfully subscribed to a channel, the subscribed endpoint will receive HTTP POST requests whenever data relevant to that channel is changed.
The format of the request will be as follows:
Headers
{
'Content-Type': 'application/json',
'X-BBOXX-Signature': <signature>,
}
Payload
{
'channel': <channel>,
'timestamp': <timestamp>,
'data': <data>,
}
Channel: confirms the name of the channel.
Timestamp: gives the time that the message is created, it is theoretically possible for messages to arrive out of order so this can be used to reject messages that are received in the incorrect order.
Data: A dictionary containing the updated information in the channel.
Channel Data
The possible contents of data in the notification for each channel is listed here:
The time that the change occured is held in the timestamp that is sent with the request.
product-status
| key | value type | options |
|---|---|---|
state |
int | [1-9] |
enabled_status |
str | "enabled", "pending_enabled", "pending_disabled", "disabled" |
user |
str | <username> - user that made the change |
product-alert
| key | value type | options |
|---|---|---|
alert_id |
int | unique identifier for this alert (any subsequent updates to this alert will have the same value here) |
product_imei |
str | the IMEI of the product associated with the alert |
| alert_type_id | int | identifies the type of the alert |
start_time |
datetime-str | "2016-01-01 00:00:00" - when the alert was raised |
dismissed_at |
datetime-str | "2016-01-01 00:00:00" - when the alert was dismissed (will be null if the alert is still active) |
dismissed_by |
str | <username> - user that made the change (will be null if the alert is still active) |
dismissal_reason |
str | the reason for the alert dismissal (will be null if the alert is still active) |
| repair_id | int | identifies the repair assicated with the alert (may be null) |
extra_info |
str | extra details about the alert (may be null) |
customer_called_date |
datetime-str | when the customer was called to discuss the alert (may be null) |
Authenticating BBOXX Notifications
An example of how to authenticate a request using the secret-key (supplied when a user subscribes to a channel)
import hmac
import json
from hashlib import sha1
# Payload is a json string
payload = request.data
# Url is known
url = "http://example_domain/example_endpoint"
# The string is the json-dumped payload with the url appended
raw = payload + url
# The key is returned to the user when they subscribe to the channel.
key = "VERY-SECRET-KEY"
# Get the hash using HMAC-SHA1
hashed = hmac.new(key, raw, sha1)
# Get the signature
signature = hashed.digest().encode("base64").rstrip('\n')
print signature
>>> ypX0AaZT1FOnbHI5hLxQVK+sE+w=
# Compare to the signature in the request headers
if signature != request.headers["X-BBOXX-Signature"]:
print "THIS REQUEST IS NOT AUTHENTIC"
return
The notifications system supports both HTTP and HTTPS endpoints.
In addition users can use the secret key - supplied when a new subscription is successfully made - to verify that an incoming notification is genuine.
BBOXX notifications are signed with a signature in the header: X-BBOXX-Signature.
The signature is generated using HMAC-SHA1 in the following manner.
- Take the payload (a JSON string)
- Append to the payload the exact URL that the request is being sent to
- Create a binary hash of this using HMAC-SHA1, the payload and the secret.
- Encode the binary hash using
Base64 Encoding
Users can therefore verify that a request is genuine by taking the received request, performing the same proceedure and matching the result again the X-BBOXX-Signature in the headers of the request.
Please note that the exact url supplied to the API is used to generate the hash and any deviations, such as spaces, trailing slashes etc... will return an incorrect signature.
DCM - Device Credit Management
The section lists information about the SMARTSolar DCM (Device Credit Management) Service. Including how DCM works and details of the various API endpoints and tables that are provided to interact with DCM Enabled Units.
What is DCM?
DCM is a new way for SMARTSolar to control when a unit is enabled or disabled.
Historically, all BBOXX units operated in "Server Credit Mode". When a customer pays, BBOXX servers /enable the unit and when a customer rus out of credit BBOXX Servers disable the unit again.
This system was simple but has a significant flaw: if the unit is placed in an area of bad signal, messages cannot reach the unit and the state of the unit cannot be changed. This is a particular problem for units that are currently enabled and cannot be disabled since they provide free energy to our customers.
The new DCM service allows BBOXX to add "credit" to a unit. The unit will keep a record of the remaining Balance and when the Balance reaches 0 the unit will disable itself automatically, regardless of connectivity.
Credit can be added and removed from the unit and the unit can be "zero'd" meaning that the unit sets it's own balance to 0 and returns the final_balance back to SMARTSolar.
The Balance on a unit can never go below 0. If a user attempts to remove more credit than the unit has remaining in the Balance then the unit will accept this request but set the balance the 0.
The unit will periodically update SMARTSolar with it's current Balance and the expected_expiry of that Balance.
How does DCM Work?
The DCM API can be used to add credit, remove credit or zero a unit. SMARTSolar will receive these payment_commands and update the unit each time a new payment_command is received. SMARTSolar will receive confirmation from the unit that it has received each payment_command. If confirmation is not received SMARTSolar will periodically retry to update the unit eventually falling back to SMS messages if GSM communication is not available.
SMARTSolar will retain a history of all of the payment-commands added to each unit.
PaymentCommands
Credit is managed using the payment_command table and the dedicated /products/<imei>/add_payment_command endpoint.
A payment_command has:
value: an integer number of seconds of credit to add or remove from the unitstatus: whether the unit has received and accepted that payment_commandcategory: the category of the payment_commandtransaction_id: a unique id used to reject duplicate payment_commands
There are 3 possible categories:
payment(for adding credit)bad-payment(for removing credit)zero-command(for zero-ing a unit)
Additionally if a unit does not respond to a zero-command it is possible to force-reset a unit using the dedicated /force_reset endpoint.
Users can add as many payment_commands as they like with the following restrictions:
- You may not remove more credit than has ever been added to the unit
- You may not add
payment_commandswhilst there is an unacknowledgedzero-command - Transaction_id must be
unique payment_commandswith categorypaymentmust havevalue>0payment_commandswith categorybad-paymentmust havevalue<0payment_commandswith categoryzero-commandmust havevalue==0
Balance
The unit will keep a record of it's own Balance in memory. Periodically the unit will update SMARTSolar with it's Balance. SMARTSolar will keep the most recent Balance in the Balance table and log a history of Balances in Influx. Whenever a Balance is uploaded from a unit, SMARTSolar will calculate and store the expected_expiry of that Balance which is the date and time that we expect that unit to swtich-off (assuming no further payment-commands are added).
The Balance Balance table in SMARTSolar is updated whenever a unit receives a new payment_command. Additionally the unit will regularly update SMARTSolar with it's current Balance if it has a good GSM connection.
Note that the purpose of DCM is to overcome issues of poor connectivity which means that, by nature, we expect many DCM units to have poor connectivity and therefore have out-of-date Balance values!
Zeroing a Unit
Sometimes it's necessary to return all the remaining credit on a unit and set the Balance to 0.
This is acheived using a specific payment_command called a zero-command.
A zero-command is a payment_command with:
* category: zero-command
* value:0
When a zero-command is added SMARTSolar forwards the zero-command along with all outstanding payment-commands to the unit. When the unit receives the zero-command it will update it's Balance with the outstanding payment-commands then immediately set it's Balance to 0 and return the FinalBalance to SMARTSolar.
When SMARTSolar receives the FinalBalance it will store the result in the FinalBalance table and then VOID all previous payment_commands.
Zero-ing is an asynchronous process. The initial response to the zero-command is immediate but the FinalBalance is updated in a separate message at a later time often much later.
Voiding Commands
After a zero-command (or force-reset) all previous payment-commands for the unit have VOID set to True. This allows SMARTSolar to ignore these commands and treat the unit as though it has been completely reset without losing the history of the payment_commands that have been supplied. You can see which commands are VOID by accessing the
"void" column (boolean) of the payment_command table.
Final Balance
After receiving a zero-command the unit will return it's FinalBalance to SMARTSolar. SMARTSolar will store the FinalBalance of the unit along with the payment_command_id of the associated zero-command. SMARTSolar will Publish the FinalBalance into the 'dcm' pubsub channel where any external serivce who has subscribed to the dcm channel can receive the FinalBalance and return it to the customer's account.
Force-Reset
In order to receive and process a zero-command the unit must be working correctly. If a unit is damaged or cannot receive messages from SMARTSolar it will not process the zero-command. In the event that a unit cannot process a zero-command but we still need to zero the unit it is possible to Force-Reset the unit. This action attempts to remove as much credit as possible from a unit without connecting to it based on known information in SMARTSolar.
A user can force-reset a unit using the dedicated /force_reset endpoint.
When a unit is Force-Reset SMARTSolar will synchronously remove credit from the device and return it in the response to the /force_reset API request.
SMARTSolar will return two values in response to a /force_reset:
{
"status": "success",
"data": {
"outstanding_payments": <int> # (sum of all payment not yet acknowledged by the unit)
"last_known_balance": <int> # (the last balance recorded by the unit (can be None)
},
"message": "Product #111222333444555 has been Force-Reset"
}
A /force_reset request will VOID all previously payment_commands and zero the Balance in SMARTSolar for that unit.
DCM API Examples
Adding Credit
To add credit to a unit, send a payment_command with category: payment and value > 0.
Here is an example request to add 10 credit to a device:
url = "https://smartapi.bboxx.co.uk/v1/products/000000000000/add_payment_command"
data = {
"value": 10,
"transaction_id": 'eda4997b-8efa-4ec7-8496-8c6f38ddb579',
"category": 'payment'
}
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=' + A_VALID_TOKEN}
r = requests.post(url=url, json=data, headers=headers)
print r.json()
>>> {
"status": "success",
"message": "new payment_command added to product #000000000000",
"data": None,
}
| value | |
|---|---|
| endpoint | /products/<imei>/add_payment_command |
| method | POST |
| url_params | product_imei (str) |
| payload | {"value": 10,"category": 'payment',"transaction_id": <tx_id>} |
| response | 201 |
Removing Credit
To remove credit from the device you must add a new payment_command with category: bad_payment and value < 0.
A unit's Balance can never be negative.
Requests which attempt to remove more credit than has ever been added to a device will be rejected.
Requests which remove more credit than there is Balance remaining will be accepted but the Balance will be floored at 0.
For example:
payment: +10 | Balance: +10
< 7 credit used > | Balance: +3
bad_payment: -20 | Rejected! (-20 is more than has ever been added (+10))
bad_payment: -5 | Balance: 0 (request accepted but Balance cant be < 0)
Here is an example request to remove 10 credit from a unit:
url = "https://smartapi.bboxx.co.uk/v1/products/000000000000/add_payment_command"
data = {
"value": -10,
"transaction_id": 'eda4997b-8efa-4ec7-8496-8c6f38ddb579',
"category": 'bad-payment'
}
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=' + A_VALID_TOKEN}
r = requests.post(url=url, json=data, headers=headers)
print r.json()
>>> {
"status": "success",
"message": "new payment_command added to product #000000000000",
"data": None,
}
| value | |
|---|---|
| endpoint | /products/<imei>/add_payment_command |
| method | POST |
| url_params | product_imei (str) |
| payload | {"value": -10,"category": "bad-payment","transaction_id": <tx_id>} |
| response | 201 |
Zero-ing a unit
To zero a unit you must add a new payment_command with category: zero-command and value: 0.
Here is an example request to zero and unit:
url = "https://smartapi.bboxx.co.uk/v1/products/000000000000/add_payment_command"
data = {
"value": 0,
"transaction_id": 'eda4997b-8efa-4ec7-8496-8c6f38ddb579',
"category": 'zero-command'
}
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=' + A_VALID_TOKEN}
r = requests.post(url=url, json=data, headers=headers)
print r.json()
>>> {
"status": "success",
"message": "new payment_command added to product #000000000000",
"data": None,
}
| value | |
|---|---|
| endpoint | /products/<imei>/add_payment_command |
| method | POST |
| url_params | product_imei (str) |
| payload | {"value": 0,"category": "zero-command","transaction_id": <tx_id>} |
| response | 201 |
Force-Reseting a unit.
To force-reset a unit you must use the dedicated /force_reset endpoint. This endpoint still requires a transaction_id to prevent duplicate force-reset messages.
Here is an example request to force-reset a unit:
url = "https://smartapi.bboxx.co.uk/v1/products/000000000000/force_reset"
data = {"transaction_id": 'eda4997b-8efa-4ec7-8496-8c6f38ddb579'}
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=' + A_VALID_TOKEN}
r = requests.post(url=url, json=data, headers=headers)
print r.json()
>>> {
"status": "success",
"message": "Product #111222333444555 has been Force-Reset",
"data": {
"outstanding_payments": 250
"last_known_balance": 58
}
}
| value | |
|---|---|
| endpoint | /products/<imei>/force_reset |
| method | POST |
| url_params | product_imei (str) |
| payload | {"transaction_id": <tx_id>} |
| response | 201 |
Querying PaymentCommands
See the PaymentCommand table.
Querying Balances and expected_expiry
See the Balance table.
Querying FinalBalances
See the FinalBalance table.
Using The API
This section contains general information about using the API including authentication, query formats and error codes as well as more general information about the BBOXX Units and the information that is accessible from the API.
Authentication and Permissions
Authentication for any request is made by added a valid token to the headers as follows:
{'Content-Type': 'application/json', 'Authorization': 'Token token=' + <TOKEN-GOES-HERE>}
The token is a random 64-char string.
Generating a Valid Token (Logging in)
url = 'https://smartapi.bboxx.co.uk/v1/auth/login'
fields = {
"username": <username>,
"password": <password>
}
r = requests.post(url, data=fields)
token = r.json()["message"]["login_successful"]["API_token"]
print token
>>> "sRtBFThPFIpgKY2sYkaSHFbo1hosg2NvCP4PmBIxfGQ62VS6zrjFT6dr1qDLQGz"
To generate a valid token a user should send a POST reqest to /auth/login with their username and password.
A valid token will be sent in response if the username and passworod are correct.
The Full /auth/login Response
url = 'https://smartapi.bboxx.co.uk/v1/auth/login'
fields = {
"username": <username>,
"password": <password>
}
r = requests.post(url, data=fields)
r.json()
>>> {
"status": "success",
"message": {
"login_successful": {
"username": "test.user@bboxx.co.uk",
"entity_id": 1,
"display_name": "T User",
"name": "",
"user_product_visibility": "GLOBAL",
"hub_id": None,
"shop_id": None,
"API_token": "sRtBFThPFIpgKY2sYkaSHFbo1hosg2NvCP4PmBIxfGQ62VS6zrjFT6dr1qDLQGz",
"token_expiry": "Mon, 01 Aug 2016 17:05:11 GMT",
"permissions": "SYSTEM"
}
}
}
A succcesful call to /auth/login will return general information about the user as well as the token including amongst
other things expiry of the token and the permissions and scope that the user has.
You can view r.json() to see the full response object.
Token Expiry
The token will expire after 3 hours.
After each successful request made using the token, the expiry time will be extended, thus a token will only expire after 3 hours without use.
If the token expires the user should simply login again as above to generate a new valid token.
A basic authentication routine
def login():
url = 'https://smartapi.bboxx.co.uk/v1/auth/login'
fields = {
"username": <username>,
"password": <password>
}
r = requests.post(url, data=fields)
token = r.json()["message"]["login_successful"]["API_token"]
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=' + token}
return headers
A basic authentication routine would therefore do the following:
POSTrequest to/auth/login- extract the token from the response
- insert the token into a
headersvariable - include the headers in the request
This strategy is effective but inefficient as a new token would be generated for each and every request and the login process can be slow.
This is particularly bad if multiple requests are being made such as enabling/disabling a full portfolio products or applying a mass-update.
An Efficient authentication routine
The following three functions could be used to generate a valid token without repeatedly called
/auth/login
def login():
url = 'https://smartapi.bboxx.co.uk/v1/auth/login'
fields = {
"username": <username>,
"password": <password>
}
r = requests.post(url, data=fields)
token = r.json()["message"]["login_successful"]["API_token"]
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=' + token}
write_token_to_file(r.json(), headers)
return headers
def write_token_to_file(data, headers):
expiry = data["message"]["login_successful"]["token_expiry"]
with open('token.json', 'w') as token_file:
json.dump({'headers': headers, 'expiry': expiry}, token_file)
def get_headers():
if os.path.exists('token.json'):
with open('token.json') as token_file:
data = json.load(token_file)
expiry = dateutil.parser.parse(data['expiry']).replace(tzinfo=None)
# If it's expired, make a new one.
if expiry < (dt.datetime.utcnow() - dt.timedelta(minutes=10)):
return login()
else: # Else return the one in the file.
return data['headers']
else:
return login()
Usage would then be as follows:
url = "https://smartapi.bboxx.co.uk/v1/endpoint"
data = json.dumps(data)
headers = get_headers()
r = requests.get(url=url, data=data, headers=headers)
To avoid the inefficiencies described above a more complex routine should be developed:
- For each request look-up the token/expiry from a local file
- If the token is expired (or non-existant) then...
- Login to the database
- Extract the token and token_expiry
- Store these in a local file
- Otherwise...
- Extract the token from the local file
- Insert the token into the headers
- Include the headers in the request
This strategy is much preferable.
Code snippets demonstrating this routine are shown to the right.
There are of course a number of other possible strategies for avoiding repeated calls to /auth/login this is simply
a suggestion.
Permissions and Scope
The SMARTSolarAPI restricts access to data and products in two orthogonal "layers". These layers define:
- WHAT information a user can see and what actions they can take (
PERMISSIONS) - WHICH units the user is allowed to interact with (
SCOPE)
Thus a user may be given read-only access to every product in a portfolio or full permissions but only on a subset of units.
We name these two layers PERMISSIONS and SCOPE.
Permissions
There are 5 levels of permission that a user can have. These permissions are "heirachical" - each successive permissions level can do everything the lower level can do plus some extra functionality.
These permissions in ascending order are:
OVERVIEW- read-only. The user can see data but not alter it.TECHNICAL- can enable/disable a unit, create notes on a product and create and edit repairsADMIN- can send sms to units and alter data in some tablesFACTORY- can create new unitsSYSTEM- full access, can read, edit and delete data, can create new entries in otherwise restricted tables (eg: Product Type, SoftwareVersionType etc.)
Scope
Users can have either GLOBAL or ENTITY scope, that is, they can either see ALL units or see only units assigned to the entity that they belong.
What each user can do to the units visible to them is defined by PERMISSIONS above.
Units connecting to the System
A Unit will connect to the system in 3 ways.
POSTrequest to /rm_dataGETrequest to /rc_dataPOSTrequest to /rc_data
RM_DATA
The /rm_data endpoint handles telemetry data (voltage, current, temperature and others).
The unit will only ever POST to this endpoint, this is the unit uploading its stored metric data to the influx database.
The unit will attempt to POST metric data once every four hours. If the POST is successful the uploaded data is no longer stored on the unit. If the POST fails then the unit will continue to store its data until a successful POST is made.
RC_DATA
The /rc_data endpoint handles all other unit information (location, software, enable_status, tamper_status etc.).
A unit will GET from rc_data in order to download new settings and statuses. A unit will POST to rc_data to inform the system of its current status, software, location etc...
The unit will always perform a POST immediately followed by a GET once every 4 hours.
POST
The unit sends its current status up to the system which then updates the status of the unit. This request causes the change from pending_enabled to enabled etc. This request will also inform the system of the current firmware on the unit.
GET
The unit receives any instructions from the system which could include instructions to update the software, change the power settings (capacity limit) or enabled_status.
Pending Changes
In order for any change made in the system to take effect on the unit the unit must first make the GET connection listed above.
Since these connections happen once every four hours (or more if signal is bad) there can be a significant time delay between setting the change via the API or web interface and that change coming into effect on the unit.
To reflect this most changes will be listed in the system as pending immediately after they are set and remain pending until the unit makes a connection.
Units can be forced to connect early by using the WakeUp-SMS feature. See those docs for more details.
Meta Data
All records in the SMARTSolar Database have "meta-data" associated with them. This data includes:
- <table_name>_id
- created_at
- modified_at
- created_by
These fields are always set by the system and should not be set by the user. They can be queried as usual using the normal query syntax.
A request like this:
url = 'https://smartapi.bboxx.co.uk/v1/product_types'
data = {
"name": "Test Product Type",
"erp_code": "XX0005",
}
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=' + A_VALID_TOKEN}
r = requests.post(url=url, data=data, headers=headers)
Would therefore give a response like this:
>>> {
u'product_type_id': 19
u'name': u'Test Product Type',
u'erp_code': u'XX0005',
u'created_at': u'2016-07-28T08:43:09.501636',
u'created_by': u'u.celery@bboxx.co.uk',
u'modified_at': None,
}
Note that
product_type_idand all of the rest of the meta-data have been set correctly
<table_name>_id
Every record has an integer identifier. This is the primary key for that record and is therefore unique.
The identifier for any given table is <table_name>_id for example:
| Table | Primary Key |
|---|---|
| amomaly | anomaly_id |
| software_version_type | software_version_type_id |
The id is assigned by the system automatically during any POST request and should not be specified by the user.
There is one exception to this. The Product table uses imei (a 15 char string) as the primary key. It does not have a product_id field.
created_at
Every record has a created_at column which is a millisecond-precision timestamp in ISO8601 format (YYYY-MM-DD HH:MM:SS.mmmm).
created_at specifies the time at which the record is inserted into the database and is set by the system. If created_at is specified by the user it is ignored.
All times are UTC with no timezone information.
created_by
Every record has a created_by column which is the username of the user responsible for creating the record. created_by is set by the system, if created_at is specified by the user it is ignored and replaced with the username associated which the token provided in the headers.
modified_at
Every record has a modified_at column which is a millisecond-precision timestamp in ISO8601 format (YYYY-MM-DD HH:MM:SS.mmmm).
modified_at specifies the last time that an column in that record was altered and is set by the system. If modified_at is specified by the user it is ignored.
Query Format and Filtering
The filters can be applied using the
qquery parameter as follows:
url = "https://smartapi.bboxx.co.uk/v1/products"
params = {
"q": json.dumps({
"filters": filters,
"limit": limit,
"offset": offset,
"group_by": group_by,
"order_by": order_by,
"single": True
})
}
headers = {'Content-Type': 'application/json', 'Authorization': 'Token token=' + token}
r = requests.get(url, params, headers)
Where each mapping is optional. A brief example of each mapping is shown here, full details can be seen below:
filters = [
{"name": "product_imei", "op": "eq", "val": "013777894687"},
{"name": "product_type_id", "op": "lt", "val": 3}
]
limit = 100
offset = 10
group_by = [
{"field": "product_type_id"},
{"field": "hub_id"},
{"field": "shop_id"},
]
order_by = [
{"field": "created_at", "direction": "asc"},
{"field": "capacity_limit", "direction": "desc"}
]
single = True/False
Filtering of requests is made via the query parameter. The query parameter q must be a JSON string. It can have the following mappings, all of which are optional:
- filters
- limit
- group_by
- order_by
- offset
- single
Filters
Filters are a list of objects of one of the following forms:
{"name": <fieldname>, "op": <operatorname>, "val": <argument>}
or:
{"name": <fieldname>, "op": <operatorname>, "field": <fieldname>}
Some examples of each operator used inside the filters dictionary
# EQUALS
{"name": "product_imei", "op": "==", "val": "013777894687"}
{"name": "product_imei", "op": "eq", "val": "013777894687"}
{"name": "product_imei", "op": "equals", "val": "013777894687"}
{"name": "product_imei", "op": "equals_to", "fieldname": "current_tamper_flag"}
# NOT EQUALS
{"name": "enabled_flag", "op": "!=", "val": "013777894687"}
{"name": "enabled_flag", "op": "neq", "val": "013777894687"}
{"name": "enabled_flag", "op": "does_not_equal", "val": "013777894687"}
{"name": "enabled_flag", "op": "not_equal_to", "val": "013777894687"}
# GREATER THAN
{"name": "capacity_limit", "op": ">", "val": 15}
{"name": "capacity_limit", "op": "gt", "val": 15}
# GREATHER THAN OR EQUAL TO
{"name": "capacity_limit", "op": ">=", "val": 15}
{"name": "capacity_limit", "op": "ge", "val": 15}
{"name": "capacity_limit", "op": "gte", "val": 15}
{"name": "capacity_limit", "op": "geq", "val": 15}
# LESS THAN
{"name": "capacity_limit", "op": "<", "val": 15}
{"name": "capacity_limit", "op": "lt", "val": 15}
# IN
{"name": "product_imei", "op": "in", "val": [1,2,5]}
# IS NULL
{"name": "software_lock", "op": "is_null", "val": ""}
# IS NOT NULL
{"name": "software_lock", "op": "is_not_null", "val": ""}
Operators
The operator strings recognized by the API incude:
| Operator | Alternative string | Meaning |
|---|---|---|
| == | eq, equals, equals_to | equals |
| != | neq, does_not_equal, not_equal_to | does not equal |
| > | gt | strictly greater than |
| < | lt | strictly less than |
| >= | ge, gte, geq | greater than or equal to |
| <= | le, lte, leq | less than or equal to |
| in | contained with-in the list supplied. val can be specified or a filter |
|
| not_in | not contained with-in the list supplied. val can be specified or a filter |
|
| is_null | is NULL | |
| is_not_null | is not NULL | |
| like | case-sensitive string matching | |
| ilike | case-insensitive string matching | |
| has | True if a single related field matches a value in the supplied list. val can be specified or a query. |
|
| any | True if any related field matches a value in the supplied list. val can be specified or a query. |
In the first form, <operatorname> is one of the strings described in the Operators section, the first <fieldname> is the name of the field of the model to which to apply the operator, <argument> is a value to be used as the second argument to the given operator. In the second form, the second <fieldname> is the field of the model that should be used as the second argument to the operator.
<fieldname> may alternately specify a field on a related model, if it is a string of the form <relationname>__<fieldname>.
If the field name is the name of a relation and the operator is "has" or "any", the "val" argument can be a dictionary with the arguments representing another filter to be applied as the argument for "has" or "any".
The returned list of matching instances will include only those instances that satisfy all of the given filters.
Filter objects can also be arbitrary Boolean formulas. For example:
{"or": [<filterobject>, {"and": [<filterobject>, ...]}, ...]}
If a filter is poorly formatted (for example, op is set to '==' but val is not set), the server responds with 400 Bad Request.
Limit
params = {
"q": json.dumps({
"limit": 5
})
}
A positive integer which specifies the maximum number of objects to return.
Offset
params = {
"q": json.dumps({
"offset": 10
})
}
A positive integer which specifies the offset into the result set of the returned list of instances.
Order By
params = {
"q": json.dumps({
"order_by": [{"field": "created_at", "direction": "asc"}]
})
}
A list of objects of the form:
{"field": <fieldname>, "direction": <directionname>}
Where <fieldname> is a string corresponding to the name of a field of the requested model and <directionname> is either "asc" or "desc".
<fieldname> may alternately specify a field on a related model, if it is a string of the form <relationname>__<fieldname>.
Group By
params = {
"q": json.dumps({
"group_by": [
{"field": product_imei},
{"field": product_entity_linker__anomaly_id}
]
})
}
A list of objects of the form:
{"field": <fieldname>}
Where <fieldname> is a string corresponding to the name of a field of the requested model.
<fieldname> may alternately specify a field on a related model, if it is a string of the form <relationname>__<fieldname>.
Single
params = {
"q": json.dumps({
"single": True
})
}
A Boolean representing whether a single result is expected as a result of the search. If this is true and either no results or multiple results meet the criteria of the search, the server responds with an error message.
Errors
The SMARTSolar API uses the following response codes:
| Error Code | Meaning |
|---|---|
| 400 | Bad Request -- Please check your request for errors |
| 401 | Unauthorized -- Your token is invalid or not present |
| 403 | Forbidden -- Your user is not allowed to access this resource. If you believe you should have permission please contact support@bboxx.co.uk |
| 404 | Not Found -- The specified resource could not be found |
| 405 | Method Not Allowed -- The method is not allowed at this endpoint |
| 500 | Internal Server Error -- We had a problem with our server. Please contact d.mclean@bboxx.co.uk with exact details of your request. |
| 503 | Service Unavailable -- We're temporarially offline for maintanance. Please try again later. |
Internationalization
url = "https://smartapi.bboxx.co.uk/v1/repairs/000000000000/current_state"
headers = {'Content-Type': 'application/json', 'Accept-Language': 'fr', 'Authorization': 'Token token=' + A_VALID_TOKEN}
r = requests.get(url=url, headers=headers)
print r.json()
>>> {
"status": "success",
"message": "Repair found",
"data": {
"description": "Le gabarit de test indique que cette unité a une carte de circuit imprimé défectueuse. Remplacer le PCB. Cliquez sur le bouton ci-dessous lorsque cela a été fait",
"events": [],
"ident": "replace_pcb",
"inputs": [
{
"data_type": "selection",
"ident": "replacement_part_type",
"label": "Choisissez l'un de ces PCB de remplacement",
"options": [
{
"label": "BBOXX Home 2 PCB (Tiger 7)",
"value": 61
},
{
"label": "BBOXX Home 2 PCB (Tiger 2)",
"value": 44
},
{
"label": "BBOXX Home 2 PCB (Tiger 6)",
"value": 48
}
],
"selection_type": "single"}],
"name": "Remplacer le PCB"
},
}
Some parts of SMART Solar now support multiple languages. The API client can specify its preferred language using the Accept-Language request HTTP header. Currently the only languages supported are English (language code 'en') and French (language code 'fr').
The default language is English, used when the Accept-Language header is omitted. The example on the right demonstrates the use of the Accept-Language header when French is the desired response language: