API - Data
==========
## Contents
- [Notes](#notes)
- [Common error codes](#errcode)
- [Roles](#roles)
- [Service APIs](#service)
- [`GET /version` Get service version](#get_version)
- [Application data APIs](#application)
- [`GET /data/api/v1/application-uldata/count` Application uplink data count](#get_application_uldata_count)
- [`GET /data/api/v1/application-uldata/list` Application uplink data list](#get_application_uldata_list)
- [`GET /data/api/v1/application-dldata/count` Application downlink data count](#get_application_dldata_count)
- [`GET /data/api/v1/application-dldata/list` Application downlink data list](#get_application_dldata_list)
- [Network data APIs](#network)
- [`GET /data/api/v1/network-uldata/count` Network uplink data count](#get_network_uldata_count)
- [`GET /data/api/v1/network-uldata/list` Network uplink data list](#get_network_uldata_list)
- [`GET /data/api/v1/network-dldata/count` Network downlink data count](#get_network_dldata_count)
- [`GET /data/api/v1/network-dldata/list` Network downlink data list](#get_network_dldata_list)
- [Coremgr data APIs](#coremgr)
- [`GET /data/api/v1/coremgr-opdata/count` Coremgr operation data count](#get_coremgr_opdata_count)
- [`GET /data/api/v1/coremgr-opdata/list` Coremgr operation data list](#get_coremgr_opdata_list)
## Notes
All API requests (except `GET /version`) must have a **Authorization** header with a **Bearer** token.
- **Example**
```http
GET /data/api/v1/network/uldata HTTP/1.1
Host: localhost
Authorization: Bearer 766f29fa8691c81b749c0f316a7af4b7d303e45bf4000fe5829365d37caec2a4
```
All APIs may respond one of the following status codes:
- **200 OK**: The request is success with body.
- **204 No Content**: The request is success without body.
- **400 Bad Request**: The API request has something wrong.
- **401 Unauthorized**: The access token is invalid or expired.
- **403 Forbidden**: The user does not have the permission to operate APIs.
- **404 Not Found**: The resource (in path) does not exist.
- **500 Internal Server Error**: The server is crash or get an unknown error. You should respond to the system administrators to solve the problem.
- **503 Service Unavailable**: The server has something wrong. Please try again later.
All error responses have the following parameters in JSON format string:
- *string* `code`: The error code.
- *string* `message`: (**optional**) The error message.
- **Example**
```http
HTTP/1.1 401 Unauthorized
Access-Control-Allow-Origin: *
Content-Type: application/json
Content-Length: 70
ETag: W/"43-Npr+dy47IJFtraEIw6D8mYLw7Ws"
Date: Thu, 13 Jan 2022 07:46:09 GMT
Connection: keep-alive
{"code":"err_auth","message":"Invalid token: access token is invalid"}
```
## Common error codes
The following are common error codes. The API specific error codes are listed in each API response documents.
- **401** `err_auth`: Authorization code error. Please refresh a new token.
- **503** `err_db`: Database operation error. Please try again later.
- **503** `err_intmsg`: Inter-service communication error. Please try again later.
- **404** `err_not_found`: The request resource (normally in path) not found.
- **400** `err_param`: Request input format error. Please check request parameters.
- **403** `err_perm`: Permission fail. This usually means that API requests with an invalid user role.
- **503** `err_rsc`: Resource allocation error. Please try again later.
- **500** `err_unknown`: Unknown error. This usually means that the server causes bugs or unexpected errors.
## Roles
This system supports the following roles:
- `admin`: The system administrator.
- `manager`: The system manager who acts as admin to view all data.
- `service`: The web service.
**Normal user** means users without any roles.
# Service APIs
## Get service version
Get service name and version information.
GET /version?
q={query}
- *string* `q`: (**optional**) To query the specific information **in plain text**. You can use:
- `name`: To query the service name.
- `version`: To query current version.
#### Response
- **200 OK**: Version information. Parameters are:
- *object* `data`:
- *string* `name`: The service name.
- *string* `version`: Current version.
- **Example**
```json
{
"data": {
"name": "sylvia-iot-auth",
"version": "1.0.0"
}
}
```
- **Example** when `q=name`:
```
sylvia-iot-auth
```
- **Example** when `q=version`:
```
1.0.0
```
# Application data APIs
## Application uplink data count
Get application uplink data list count.
GET /data/api/v1/application-uldata/count?
unit={specifiedUnitId}&
device={deviceId}&
network={networkCode}&
addr={networkAddr}&
profile={deviceProfile}&
tfield={timeFieldFilter}&
tstart={startTimeMs}&
tend={endTimeMs}
- *string* `unit`: (**required for normal user**) To search data of the specified unit ID.
- *string* `device`: (**optional**) To search data of the specified device ID.
- *string* `network`: (**optional**) To search data of the specified device network code.
- *string* `addr`: (**optional**) To search data of the specified device network address.
- *string* `profile`: (**optional**) To search data of the specified device/data profile.
- *string* `tfield`: (**required for tstart and tend**) Time field to filter data. **proc**, **pub**, **time** are available.
- *number* `tstart`: (**optional**) The start time in milliseconds to filter data.
- *number* `tend`: (**optional**) The end time in milliseconds to filter data.
#### Response
- **200 OK**: Application uplink data list count. Parameters are:
- *object* `data`:
- *number* `count`: Application uplink data list count.
- **Example**
```json
{
"data": {
"count": 2
}
}
```
- **400 Bad Request**: the special error codes are:
- `err_data_unit_not_exist`: The unit does not exist.
- **401, 403, 500, 503**: See [Notes](#notes).
## Application uplink data list
Get application uplink data list.
GET /data/api/v1/application-uldata/list?
unit={specifiedUnitId}&
device={deviceId}&
network={networkCode}&
addr={networkAddr}&
profile={deviceProfile}&
tfield={timeFieldFilter}&
tstart={startTimeMs}&
tend={endTimeMs}&
offset={offset}&
limit={limit}&
sort={sortKeysAndOrders}&
format={responseFormat}
- *string* `unit`: (**required for normal user**) To search data of the specified unit ID.
- *string* `device`: (**optional**) To search data of the specified device ID.
- *string* `network`: (**optional**) To search data of the specified device network code.
- *string* `addr`: (**optional**) To search data of the specified device network address.
- *string* `profile`: (**optional**) To search data of the specified device/data profile.
- *string* `tfield`: (**required for tstart and tend**) Time field to filter data. **proc**, **pub**, **time** are available.
- *number* `tstart`: (**optional**) The start time in milliseconds to filter data.
- *number* `tend`: (**optional**) The end time in milliseconds to filter data.
- *number* `offset`: (**optional**) Data offset. Default is **0**.
- *number* `limit`: (**optional**) Number of items to list. **0** to list all data. Default is **100**.
- *string* `sort`: (**optional**) To sort the result. Format is `key:[asc|desc]`. The key can be **proc**, **pub**, **time**, **network**, **addr**. Default is **proc:desc**.
- *string* `format`: (**optional**) Response body format. Default is array in the **data** field.
- **array**: The response body is JSON array, not an object.
- **csv**: The response body is CSV.
#### Response
- **200 OK**: An array that contains all application uplink data information. Parameters are:
- *object[]* `data`:
- *string* `dataId`: Data ID.
- *string* `proc`: Received time in RFC 3339 format when the broker receive this data.
- *string* `pub`: Publish time in RFC 3339 format to queue.
- *string | null* `unitCode`: Network's unit code.
- *string* `networkCode`: Network code.
- *string* `networkAddr`: Device network address.
- *string* `unitId`: Device's unit ID.
- *string* `deviceId`: Device ID.
- *string* `time`: Device time in RFC 3339 format.
- *string* `profile`: Device/data profile.
- *string* `data`: Data in hexadecimal format.
- *object* `extension`: (**optional**) Extensions from the network to application(s).
- **Example**
```json
{
"data": [
{
"dataId": "1665486661848-DTAjZX6JsTSH",
"proc": "2022-10-11T11:11:01.848Z",
"pub": "2022-10-11T11:11:02.043Z",
"unitCode": "sylvia",
"networkCode": "lora",
"networkAddr": "800012ae",
"unitId": "1640923958516-qvdFNpOV",
"deviceId": "1640924274329-yESwHhKO",
"time": "2022-10-11T11:10:48.768Z",
"profile": "tracker",
"data": "74657374",
"extension": {
"latitude": "24.38349800818775",
"longitude": "121.22999674970842"
}
}
]
}
```
- **400 Bad Request**: the special error codes are:
- `err_data_unit_not_exist`: The unit does not exist.
- **401, 403, 500, 503**: See [Notes](#notes).
## Application downlink data count
Get application downlink data list count.
GET /data/api/v1/application-dldata/count?
unit={specifiedUnitId}&
device={deviceId}&
network={networkCode}&
addr={networkAddr}&
profile={deviceProfile}&
tfield={timeFieldFilter}&
tstart={startTimeMs}&
tend={endTimeMs}
- *string* `unit`: (**required for normal user**) To search data of the specified unit ID.
- *string* `device`: (**optional**) To search data of the specified device ID.
- *string* `network`: (**optional**) To search data of the specified device network code.
- *string* `addr`: (**optional**) To search data of the specified device network address.
- *string* `profile`: (**optional**) To search data of the specified device/data profile.
- *string* `tfield`: (**required for tstart and tend**) Time field to filter data. **proc**, **resp** are available.
- *number* `tstart`: (**optional**) The start time in milliseconds to filter data.
- *number* `tend`: (**optional**) The end time in milliseconds to filter data.
#### Response
- **200 OK**: Application downlink data list count. Parameters are:
- *object* `data`:
- *number* `count`: Application downlink data list count.
- **Example**
```json
{
"data": {
"count": 2
}
}
```
- **400 Bad Request**: the special error codes are:
- `err_data_unit_not_exist`: The unit does not exist.
- **401, 403, 500, 503**: See [Notes](#notes).
## Application downlink data list
Get application downlink data list.
GET /data/api/v1/application-dldata/list?
unit={specifiedUnitId}&
device={deviceId}&
network={networkCode}&
addr={networkAddr}&
profile={deviceProfile}&
tfield={timeFieldFilter}&
tstart={startTimeMs}&
tend={endTimeMs}&
offset={offset}&
limit={limit}&
sort={sortKeysAndOrders}&
format={responseFormat}
- *string* `unit`: (**required for normal user**) To search data of the specified unit ID.
- *string* `device`: (**optional**) To search data of the specified device ID.
- *string* `network`: (**optional**) To search data of the specified device network code.
- *string* `addr`: (**optional**) To search data of the specified device network address.
- *string* `profile`: (**optional**) To search data of the specified device/data profile.
- *string* `tfield`: (**required for tstart and tend**) Time field to filter data. **proc**, **resp** are available.
- *number* `tstart`: (**optional**) The start time in milliseconds to filter data.
- *number* `tend`: (**optional**) The end time in milliseconds to filter data.
- *number* `offset`: (**optional**) Data offset. Default is **0**.
- *number* `limit`: (**optional**) Number of items to list. **0** to list all data. Default is **100**.
- *string* `sort`: (**optional**) To sort the result. Format is `key:[asc|desc]`. The key can be **proc**, **resp**, **network**, **addr**. Default is **proc:desc**.
- *string* `format`: (**optional**) Response body format. Default is array in the **data** field.
- **array**: The response body is JSON array, not an object.
- **csv**: The response body is CSV.
#### Response
- **200 OK**: An array that contains all application downlink data information. Parameters are:
- *object[]* `data`:
- *string* `dataId`: Data ID.
- *string* `proc`: Received time in RFC 3339 format when the broker receive this data.
- *string* `resp`: (**optional**) The last response time in RFC 3339 format.
- *number* `status`: 0 for success, negative for processing, positive for error.
- *string* `unitId`: Device's unit ID.
- *string* `deviceId`: (**optional**) Device ID from the source data of the application.
- *string* `networkCode`: (**optional**) Device network code from the source data of the application.
- *string* `networkAddr`: (**optional**) Device network address from the source data of the application.
- *string* `profile`: Device/data profile.
- *string* `data`: Data in hexadecimal format.
- *object* `extension`: (**optional**) Extensions from the application to the network.
- **Example**
```json
{
"data": [
{
"dataId": "1665486663768-jK6EnD3pcGDC",
"proc": "2022-10-11T11:11:03.768Z",
"resp": "2022-10-11T11:11:24.154Z",
"status": 1,
"unitId": "1640923958516-qvdFNpOV",
"deviceId": "1640924274329-yESwHhKO",
"networkCode": "lora",
"networkAddr": "800012ae",
"profile": "tracker",
"data": "74657374",
"extension": {
"schedule": "2022-10-12T00:00:00Z"
}
}
]
}
```
- **400 Bad Request**: the special error codes are:
- `err_data_unit_not_exist`: The unit does not exist.
- **401, 403, 500, 503**: See [Notes](#notes).
# Network data APIs
## Network uplink data count
Get network uplink data list count.
GET /data/api/v1/network-uldata/count?
unit={specifiedUnitId}&
device={deviceId}&
network={networkCode}&
addr={networkAddr}&
profile={deviceProfile}&
tfield={timeFieldFilter}&
tstart={startTimeMs}&
tend={endTimeMs}
- *string* `unit`: (**required for normal user**) To search data of the specified unit ID.
- *string* `device`: (**optional**) To search data of the specified device ID.
- *string* `network`: (**optional**) To search data of the specified device network code.
- *string* `addr`: (**optional**) To search data of the specified device network address.
- *string* `profile`: (**optional**) To search data of the specified device/data profile.
- *string* `tfield`: (**required for tstart and tend**) Time field to filter data. **proc**, **time** are available.
- *number* `tstart`: (**optional**) The start time in milliseconds to filter data.
- *number* `tend`: (**optional**) The end time in milliseconds to filter data.
#### Response
- **200 OK**: Network uplink data list count. Parameters are:
- *object* `data`:
- *number* `count`: Network uplink data list count.
- **Example**
```json
{
"data": {
"count": 2
}
}
```
- **400 Bad Request**: the special error codes are:
- `err_data_unit_not_exist`: The unit does not exist.
- **401, 403, 500, 503**: See [Notes](#notes).
## Network uplink data list
Get network uplink data list.
GET /data/api/v1/network-uldata/list?
unit={specifiedUnitId}&
device={deviceId}&
network={networkCode}&
addr={networkAddr}&
profile={deviceProfile}&
tfield={timeFieldFilter}&
tstart={startTimeMs}&
tend={endTimeMs}&
offset={offset}&
limit={limit}&
sort={sortKeysAndOrders}&
format={responseFormat}
- *string* `unit`: (**required for normal user**) To search data of the specified unit ID.
- *string* `device`: (**optional**) To search data of the specified device ID.
- *string* `network`: (**optional**) To search data of the specified device network code.
- *string* `addr`: (**optional**) To search data of the specified device network address.
- *string* `profile`: (**optional**) To search data of the specified device/data profile.
- *string* `tfield`: (**required for tstart and tend**) Time field to filter data. **proc**, **time** are available.
- *number* `tstart`: (**optional**) The start time in milliseconds to filter data.
- *number* `tend`: (**optional**) The end time in milliseconds to filter data.
- *number* `offset`: (**optional**) Data offset. Default is **0**.
- *number* `limit`: (**optional**) Number of items to list. **0** to list all data. Default is **100**.
- *string* `sort`: (**optional**) To sort the result. Format is `key:[asc|desc]`. The key can be **proc**, **time**, **network**, **addr**. Default is **proc:desc**.
- *string* `format`: (**optional**) Response body format. Default is array in the **data** field.
- **array**: The response body is JSON array, not an object.
- **csv**: The response body is CSV.
#### Response
- **200 OK**: An array that contains all network uplink data information. Parameters are:
- *object[]* `data`:
- *string* `dataId`: Data ID.
- *string* `proc`: Received time in RFC 3339 format when the broker receive this data.
- *string | null* `unitCode`: Network's unit code.
- *string* `networkCode`: Network code.
- *string* `networkAddr`: Device network address.
- *string* `unitId`: (**optional**) Network's unit ID.
- *string* `deviceId`: (**optional**) Device ID.
- *string* `time`: Device time in RFC 3339 format.
- *string* `profile`: Device/data profile.
- *string* `data`: Data in hexadecimal format.
- *object* `extension`: (**optional**) Extensions from the network to network(s).
- **Example**
```json
{
"data": [
{
"dataId": "1665486661848-93r1JITdLaSw",
"proc": "2022-10-11T11:11:01.848Z",
"unitCode": "sylvia",
"networkCode": "lora",
"networkAddr": "800012ae",
"unitId": "1640923958516-qvdFNpOV",
"deviceId": "1640924274329-yESwHhKO",
"time": "2022-10-11T11:10:48.768Z",
"profile": "tracker",
"data": "74657374",
"extension": {
"latitude": "24.38349800818775",
"longitude": "121.22999674970842"
}
}
]
}
```
- **400 Bad Request**: the special error codes are:
- `err_data_unit_not_exist`: The unit does not exist.
- **401, 403, 500, 503**: See [Notes](#notes).
## Network downlink data count
Get network downlink data list count.
GET /data/api/v1/network-dldata/count?
unit={specifiedUnitId}&
device={deviceId}&
network={networkCode}&
addr={networkAddr}&
profile={deviceProfile}&
tfield={timeFieldFilter}&
tstart={startTimeMs}&
tend={endTimeMs}
- *string* `unit`: (**required for normal user**) To search data of the specified unit ID.
- *string* `device`: (**optional**) To search data of the specified device ID.
- *string* `network`: (**optional**) To search data of the specified device network code.
- *string* `addr`: (**optional**) To search data of the specified device network address.
- *string* `profile`: (**optional**) To search data of the specified device/data profile.
- *string* `tfield`: (**required for tstart and tend**) Time field to filter data. **proc**, **pub**, **resp** are available.
- *number* `tstart`: (**optional**) The start time in milliseconds to filter data.
- *number* `tend`: (**optional**) The end time in milliseconds to filter data.
#### Response
- **200 OK**: Network downlink data list count. Parameters are:
- *object* `data`:
- *number* `count`: Network downlink data list count.
- **Example**
```json
{
"data": {
"count": 2
}
}
```
- **400 Bad Request**: the special error codes are:
- `err_data_unit_not_exist`: The unit does not exist.
- **401, 403, 500, 503**: See [Notes](#notes).
## Network downlink data list
Get network downlink data list.
GET /data/api/v1/network-dldata/list?
unit={specifiedUnitId}&
device={deviceId}&
network={networkCode}&
addr={networkAddr}&
profile={deviceProfile}&
tfield={timeFieldFilter}&
tstart={startTimeMs}&
tend={endTimeMs}&
offset={offset}&
limit={limit}&
sort={sortKeysAndOrders}&
format={responseFormat}
- *string* `unit`: (**required for normal user**) To search data of the specified unit ID.
- *string* `device`: (**optional**) To search data of the specified device ID.
- *string* `network`: (**optional**) To search data of the specified device network code.
- *string* `addr`: (**optional**) To search data of the specified device network address.
- *string* `profile`: (**optional**) To search data of the specified device/data profile.
- *string* `tfield`: (**required for tstart and tend**) Time field to filter data. **proc**, **pub**, **resp** are available.
- *number* `tstart`: (**optional**) The start time in milliseconds to filter data.
- *number* `tend`: (**optional**) The end time in milliseconds to filter data.
- *number* `offset`: (**optional**) Data offset. Default is **0**.
- *number* `limit`: (**optional**) Number of items to list. **0** to list all data. Default is **100**.
- *string* `sort`: (**optional**) To sort the result. Format is `key:[asc|desc]`. The key can be **proc**, **pub**, **resp**, **network**, **addr**. Default is **proc:desc**.
- *string* `format`: (**optional**) Response body format. Default is array in the **data** field.
- **array**: The response body is JSON array, not an object.
- **csv**: The response body is CSV.
#### Response
- **200 OK**: An array that contains all network downlink data information. Parameters are:
- *object[]* `data`:
- *string* `dataId`: Data ID.
- *string* `proc`: Received time in RFC 3339 format when the broker receive this data.
- *string* `pub`: Publish time in RFC 3339 format to queue.
- *string* `resp`: (**optional**) The last response time in RFC 3339 format.
- *number* `status`: 0 for success, negative for processing, positive for error.
- *string* `unitId`: Device's unit ID.
- *string* `deviceId`: Device ID.
- *string* `networkCode`: Device network code.
- *string* `networkAddr`: Device network address.
- *string* `profile`: Device/data profile.
- *string* `data`: Data in hexadecimal format.
- *object* `extension`: (**optional**) Extensions from the network to the network.
- **Example**
```json
{
"data": [
{
"dataId": "1665486663768-JFlZbm7Od0Je",
"proc": "2022-10-11T11:11:03.768Z",
"pub": "2022-10-11T11:11:03.898Z",
"resp": "2022-10-11T11:11:24.154Z",
"status": 1,
"unitId": "1640923958516-qvdFNpOV",
"deviceId": "1640924274329-yESwHhKO",
"networkCode": "lora",
"networkAddr": "800012ae",
"profile": "tracker",
"data": "74657374",
"extension": {
"schedule": "2022-10-12T00:00:00Z"
}
}
]
}
```
- **400 Bad Request**: the special error codes are:
- `err_data_unit_not_exist`: The unit does not exist.
- **401, 403, 500, 503**: See [Notes](#notes).
# Coremgr operation data APIs
## Coremgr operation data count
Get coremgr operation data list count.
GET /data/api/v1/coremgr-opdata/count?
user={specifiedUserId}&
tfield={timeFieldFilter}&
tstart={startTimeMs}&
tend={endTimeMs}
- *string* `user`: (**optional for admin and manager**) To search data of the specified user ID.
- *string* `tfield`: (**required for tstart and tend**) Time field to filter data. **proc**, **pub**, **resp** are available.
- *number* `tstart`: (**optional**) The start time in milliseconds to filter data.
- *number* `tend`: (**optional**) The end time in milliseconds to filter data.
#### Response
- **200 OK**: Coremgr operation data list count. Parameters are:
- *object* `data`:
- *number* `count`: Coremgr operation data list count.
- **Example**
```json
{
"data": {
"count": 2
}
}
```
- **400 Bad Request**: the special error codes are:
- `err_data_user_not_exist`: The user does not exist.
- **401, 403, 500, 503**: See [Notes](#notes).
## Coremgr operation data list
Get coremgr operation data list.
GET /data/api/v1/coremgr-opdata/list?
user={specifiedUserId}&
tfield={timeFieldFilter}&
tstart={startTimeMs}&
tend={endTimeMs}&
offset={offset}&
limit={limit}&
sort={sortKeysAndOrders}&
format={responseFormat}
- *string* `user`: (**optional for admin and manager**) To search data of the specified user ID.
- *string* `tfield`: (**required for tstart and tend**) Time field to filter data. **req**, **res** are available.
- *number* `tstart`: (**optional**) The start time in milliseconds to filter data.
- *number* `tend`: (**optional**) The end time in milliseconds to filter data.
- *number* `offset`: (**optional**) Data offset. Default is **0**.
- *number* `limit`: (**optional**) Number of items to list. **0** to list all data. Default is **100**.
- *string* `sort`: (**optional**) To sort the result. Format is `key:[asc|desc]`. The key can be **req**, **res**, **latency**. Default is **req:desc**.
- *string* `format`: (**optional**) Response body format. Default is array in the **data** field.
- **array**: The response body is JSON array, not an object.
- **csv**: The response body is CSV.
#### Response
- **200 OK**: An array that contains all Coremgr operation data information. Parameters are:
- *object[]* `data`:
- *string* `dataId`: Data ID.
- *string* `reqTime`: Request time in RFC 3339 format.
- *string* `resTime`: Response time in RFC 3339 format.
- *number* `latencyMs`: Latency in milliseconds.
- *number* `status`: Response status code.
- *string* `sourceIp`: Client source IP address
- *string* `method`: Request HTTP method. Now we record **DELETE**, **PATCH**, **POST**, **PUT** operations.
- *string* `path`: Request HTTP path.
- *object* `body`: (**optional**) Request body. `data.password` contents are removed before recoding.
- *string* `userId`: Request user ID.
- *string* `clientId`: Request client ID.
- *string* `errCode`: (**optional for error status**) Error code.
- *string* `errMessage`: (**optional for error status**) Error message.
- **Example**
```json
{
"data": [
{
"dataId": "1665493184163-uplOitvHEc2u",
"reqTime": "2022-10-11T12:59:44.163Z",
"resTime": "2022-10-11T12:59:44.402Z",
"latencyMs": 239,
"status": 400,
"sourceIp": "192.168.1.1",
"method": "POST",
"path": "/coremgr/api/v1/user",
"body": {"account": ""},
"userId": "1641003827053-c2e84RJO",
"clientId": "1641040728318-zyAnDK9I",
"errCode": "err_param",
"errMessage": "empty `account`"
}
]
}
```
- **400 Bad Request**: the special error codes are:
- `err_data_user_not_exist`: The user does not exist.
- **401, 403, 500, 503**: See [Notes](#notes).