sms-server 3.4.9

SMS server for GSM modem hardware with HTTP/WebSocket APIs, encrypted message storage, delivery tracking, and GNSS location support. Designed for Raspberry Pi + GSM HAT setup.
1
{"openapi":"3.1.0","info":{"title":"SMS Server","description":"SMS server for GSM modem hardware with HTTP/WebSocket APIs, encrypted message storage, delivery tracking, and GNSS location support. Designed for Raspberry Pi + GSM HAT setup.","contact":{"name":"morgverd <morgverd@gmail.com>","url":"https://github.com/morgverd/sms-server"},"license":{"name":"AGPL-3.0-only","url":"https://spdx.org/licenses/AGPL-3.0-only.html"},"version":"3.4.7"},"paths":{"/db/delivery-reports":{"post":{"tags":["Database"],"summary":"Get delivery reports","description":"Retrieves delivery status reports for a specific sent message by its message ID. Returns information about whether the message was delivered, pending, or failed. There may be multiple delivery reports for delivery retries.","operationId":"db_delivery_reports","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageIdFetchRequest"},"example":{"limit":1,"message_id":10,"reverse":true}}},"required":true},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object","required":["success","response"],"properties":{"response":{"type":"array","items":{"type":"object","description":"A received or stored delivery report.","required":["status","is_final"],"properties":{"created_at":{"type":["integer","null"],"format":"int32","description":"Unix timestamp when this report was created.","minimum":0},"is_final":{"type":"boolean","description":"Whether this is the final delivery report for the message."},"report_id":{"type":["integer","null"],"format":"int64","description":"Unique identifier for this delivery report."},"status":{"type":"integer","format":"int32","description":"Delivery status code from the network.","minimum":0}}}},"success":{"type":"boolean"}}}}}},"400":{"description":"Bad request","content":{"application/json":{"example":{"error":"Bad request","success":false}}}},"401":{"description":"Unauthorized","content":{"application/json":{"example":{"error":"Unauthorized","success":false}}}},"500":{"description":"Internal server error","content":{"application/json":{"example":{"error":"Internal server error","success":false}}}}},"security":[{"bearer_auth":[]}]}},"/db/friendly-names/get":{"post":{"tags":["Database"],"summary":"Get friendly name","description":"Retrieves the friendly name (contact name) associated with a phone number, if one has been set.","operationId":"db_friendly_names_get","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetFriendlyNameRequest"},"example":{"phone_number":"+1234567890"}}},"required":true},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object","required":["success","response"],"properties":{"response":{"oneOf":[{"type":"null"},{"type":"string"}]},"success":{"type":"boolean"}}},"example":{"data":"Cool guy!","success":true}}}},"400":{"description":"Bad request","content":{"application/json":{"example":{"error":"Bad request","success":false}}}},"401":{"description":"Unauthorized","content":{"application/json":{"example":{"error":"Unauthorized","success":false}}}},"500":{"description":"Internal server error","content":{"application/json":{"example":{"error":"Internal server error","success":false}}}}},"security":[{"bearer_auth":[]}]}},"/db/friendly-names/set":{"post":{"tags":["Database"],"summary":"Set friendly name","description":"Associates a friendly name (contact name) with a phone number. This name will be returned alongside the phone number in other API responses.","operationId":"db_friendly_names_set","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetFriendlyNameRequest"},"example":{"friendly_name":"Cool guy!","phone_number":"+1234567890"}}},"required":true},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object","required":["success","response"],"properties":{"response":{"type":"boolean"},"success":{"type":"boolean"}}},"example":{"data":true,"success":true}}}},"400":{"description":"Bad request","content":{"application/json":{"example":{"error":"Bad request","success":false}}}},"401":{"description":"Unauthorized","content":{"application/json":{"example":{"error":"Unauthorized","success":false}}}},"500":{"description":"Internal server error","content":{"application/json":{"example":{"error":"Internal server error","success":false}}}}},"security":[{"bearer_auth":[]}]}},"/db/latest-numbers":{"post":{"tags":["Database"],"summary":"Get latest phone numbers","description":"Retrieves a list of phone numbers that have recently sent or received messages, along with their friendly names if set. Useful for populating a conversation list. Supports optional pagination.","operationId":"db_latest_numbers","requestBody":{"content":{"application/json":{"schema":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/GlobalFetchRequest"}]},"example":{"limit":50}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object","required":["success","response"],"properties":{"response":{"type":"array","items":{"type":"object","description":"Used in latest-numbers return value, as a number and friendly name.","required":["number"],"properties":{"friendly_name":{"type":["string","null"],"description":"Optional friendly name for display purposes."},"number":{"type":"string","description":"Phone number in international format."}}}},"success":{"type":"boolean"}}}}}},"400":{"description":"Bad request","content":{"application/json":{"example":{"error":"Bad request","success":false}}}},"401":{"description":"Unauthorized","content":{"application/json":{"example":{"error":"Unauthorized","success":false}}}},"500":{"description":"Internal server error","content":{"application/json":{"example":{"error":"Internal server error","success":false}}}}},"security":[{"bearer_auth":[]}]}},"/db/messages":{"post":{"tags":["Database"],"summary":"Fetch SMS messages","description":"Retrieves SMS messages for a specific phone number from the database. Supports optional pagination.","operationId":"db_messages","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PhoneNumberFetchRequest"},"example":{"limit":50,"offset":0,"phone_number":"+1234567890","reverse":false}}},"required":true},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object","required":["success","response"],"properties":{"response":{"type":"array","items":{"type":"object","description":"Represents a stored SMS message from the database.","required":["phone_number","message_content","is_outgoing"],"properties":{"completed_at":{"type":["integer","null"],"format":"int32","description":"Optional Unix timestamp when the message was completed/delivered.","minimum":0},"created_at":{"type":["integer","null"],"format":"int32","description":"Unix timestamp when the message was created.","minimum":0},"is_outgoing":{"type":"boolean","description":"Whether this message was sent (true) or received (false)."},"message_content":{"type":"string","description":"The actual text content of the message."},"message_id":{"type":["integer","null"],"format":"int64","description":"Unique identifier for the message."},"message_reference":{"type":["integer","null"],"format":"int32","description":"Optional reference number for message tracking.\nThis is assigned by the modem and is only present for outgoing messages.","minimum":0},"phone_number":{"type":"string","description":"The phone number associated with this message."},"status":{"type":["integer","null"],"format":"int32","description":"Service message center delivery status.","minimum":0}}}},"success":{"type":"boolean"}}}}}},"400":{"description":"Bad request","content":{"application/json":{"example":{"error":"Bad request","success":false}}}},"401":{"description":"Unauthorized","content":{"application/json":{"example":{"error":"Unauthorized","success":false}}}},"500":{"description":"Internal server error","content":{"application/json":{"example":{"error":"Internal server error","success":false}}}}},"security":[{"bearer_auth":[]}]}},"/gnss/location":{"get":{"tags":["GNSS"],"summary":"Get GNSS location","description":"Returns the current GNSS position report. Requires a valid GNSS fix.","operationId":"gnss_get_location","responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object","required":["success","response"],"properties":{"response":{"type":"object","description":"Represents a GNSS position report with optional fields for satellite info.","required":["run_status","fix_status","utc_time","fix_mode"],"properties":{"fix_mode":{"$ref":"#/components/schemas/FixStatus","description":"Fix mode indicating 2D/3D fix or unknown."},"fix_status":{"type":"boolean","description":"Whether a valid fix has been obtained."},"glonass_in_view":{"type":["integer","null"],"format":"int32","description":"Number of GLONASS satellites in view.","minimum":0},"gnss_used":{"type":["integer","null"],"format":"int32","description":"Number of GNSS satellites used in the fix.","minimum":0},"gps_in_view":{"type":["integer","null"],"format":"int32","description":"Number of GPS satellites in view.","minimum":0},"ground_course":{"type":["number","null"],"format":"float","description":"Ground course in degrees."},"ground_speed":{"type":["number","null"],"format":"float","description":"Ground speed in meters per second."},"hdop":{"type":["number","null"],"format":"float","description":"Horizontal Dilution of Precision."},"latitude":{"type":["number","null"],"format":"double","description":"Latitude in decimal degrees."},"longitude":{"type":["number","null"],"format":"double","description":"Longitude in decimal degrees."},"msl_altitude":{"type":["number","null"],"format":"double","description":"Mean sea level altitude in meters."},"pdop":{"type":["number","null"],"format":"float","description":"Position Dilution of Precision."},"run_status":{"type":"boolean","description":"Indicates whether the GNSS receiver is currently running."},"utc_time":{"type":"string","description":"UTC time of the position report in ISO 8601 format."},"vdop":{"type":["number","null"],"format":"float","description":"Vertical Dilution of Precision."}}},"success":{"type":"boolean"}}}}}},"400":{"description":"Bad request","content":{"application/json":{"example":{"error":"Bad request","success":false}}}},"401":{"description":"Unauthorized","content":{"application/json":{"example":{"error":"Unauthorized","success":false}}}},"500":{"description":"Internal server error","content":{"application/json":{"example":{"error":"Internal server error","success":false}}}}},"security":[{"bearer_auth":[]}]}},"/gnss/status":{"get":{"tags":["GNSS"],"summary":"Get GNSS fix status","description":"Returns the current GNSS fix status, indicating whether a position fix has been acquired and the type of fix (e.g., no fix, 2D fix, 3D fix).","operationId":"gnss_get_status","responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object","required":["success","response"],"properties":{"response":{"type":"string","description":"GNSS (Global Navigation Satellite System) fix status.","enum":["Unknown","NotFix","Fix2D","Fix3D"]},"success":{"type":"boolean"}}}}}},"400":{"description":"Bad request","content":{"application/json":{"example":{"error":"Bad request","success":false}}}},"401":{"description":"Unauthorized","content":{"application/json":{"example":{"error":"Unauthorized","success":false}}}},"500":{"description":"Internal server error","content":{"application/json":{"example":{"error":"Internal server error","success":false}}}}},"security":[{"bearer_auth":[]}]}},"/sms/battery-level":{"get":{"tags":["SMS"],"summary":"Get battery level","description":"Returns the current battery status, charge percentage, and voltage of the modem device. Only applicable for battery-powered modems, usually for GNSS warm starts.","operationId":"sms_get_battery_level","responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object","required":["success","response"],"properties":{"response":{"type":"object","description":"Battery status information from the modem.","required":["status","charge","voltage"],"properties":{"charge":{"type":"integer","format":"int32","description":"Battery charge level percentage (0-100).","minimum":0},"status":{"type":"integer","format":"int32","description":"Battery status (0=not charging, 1=charging, 2=no battery).","minimum":0},"voltage":{"type":"number","format":"float","description":"Battery voltage in volts."}}},"success":{"type":"boolean"}}},"example":{"data":{"charge":71,"status":0,"voltage":3.972},"success":true}}}},"400":{"description":"Bad request","content":{"application/json":{"example":{"error":"Bad request","success":false}}}},"401":{"description":"Unauthorized","content":{"application/json":{"example":{"error":"Unauthorized","success":false}}}},"500":{"description":"Internal server error","content":{"application/json":{"example":{"error":"Internal server error","success":false}}}}},"security":[{"bearer_auth":[]}]}},"/sms/device-info":{"get":{"tags":["SMS"],"summary":"Get device information","description":"Returns all modem information, this is more efficient than requesting each individually.","operationId":"sms_get_device_info","responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object","required":["success","response"],"properties":{"response":{"type":"object","description":"Formatted device info response, with each value packed into a proper optional response.","required":["version"],"properties":{"battery":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/HttpModemBatteryLevelResponse","description":"Battery level, charging state, and power metrics"}]},"network_operator":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/HttpModemNetworkOperatorResponse","description":"Detailed network operator information and capabilities"}]},"network_status":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/HttpModemNetworkStatusResponse","description":"Current network connection status and diagnostics"}]},"phone_number":{"type":["string","null"],"description":"The phone number associated with the SMS device"},"service_provider":{"type":["string","null"],"description":"The name of the cellular service provider"},"signal":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/HttpModemSignalStrengthResponse","description":"Signal strength measurements and quality indicators"}]},"version":{"type":"string","description":"SMS API version string, including features."}}},"success":{"type":"boolean"}}}}}},"400":{"description":"Bad request","content":{"application/json":{"example":{"error":"Bad request","success":false}}}},"401":{"description":"Unauthorized","content":{"application/json":{"example":{"error":"Unauthorized","success":false}}}},"500":{"description":"Internal server error","content":{"application/json":{"example":{"error":"Internal server error","success":false}}}}},"security":[{"bearer_auth":[]}]}},"/sms/network-operator":{"get":{"tags":["SMS"],"summary":"Get network operator","description":"Returns information about the currently connected network operator, including the operator name and connection status.","operationId":"sms_get_network_operator","responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object","required":["success","response"],"properties":{"response":{"type":"object","description":"Network operator information from the modem.","required":["status","format","operator"],"properties":{"format":{"type":"integer","format":"int32","description":"Format of the operator name (0=long alphanumeric, 1=short alphanumeric, 2=numeric).","minimum":0},"operator":{"type":"string","description":"Name or code of the network operator."},"status":{"type":"integer","format":"int32","description":"Operator selection status (0=automatic, 1=manual).","minimum":0}}},"success":{"type":"boolean"}}},"example":{"data":{"format":0,"operator":"vodafone","status":0},"success":true}}}},"400":{"description":"Bad request","content":{"application/json":{"example":{"error":"Bad request","success":false}}}},"401":{"description":"Unauthorized","content":{"application/json":{"example":{"error":"Unauthorized","success":false}}}},"500":{"description":"Internal server error","content":{"application/json":{"example":{"error":"Internal server error","success":false}}}}},"security":[{"bearer_auth":[]}]}},"/sms/network-status":{"get":{"tags":["SMS"],"summary":"Get network registration status","description":"Returns the current network registration status and technology type (e.g., 2G, 3G, 4G) for the modem.","operationId":"sms_get_network_status","responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object","required":["success","response"],"properties":{"response":{"type":"object","description":"Network registration status of the modem.","required":["registration","technology"],"properties":{"registration":{"type":"integer","format":"int32","description":"Registration status code (0=not registered, 1=registered home, 5=registered roaming).","minimum":0},"technology":{"type":"integer","format":"int32","description":"Network technology in use (e.g., 2G, 3G, 4G).","minimum":0}}},"success":{"type":"boolean"}}},"example":{"data":{"registration":0,"technology":1},"success":true}}}},"400":{"description":"Bad request","content":{"application/json":{"example":{"error":"Bad request","success":false}}}},"401":{"description":"Unauthorized","content":{"application/json":{"example":{"error":"Unauthorized","success":false}}}},"500":{"description":"Internal server error","content":{"application/json":{"example":{"error":"Internal server error","success":false}}}}},"security":[{"bearer_auth":[]}]}},"/sms/send":{"post":{"tags":["SMS"],"summary":"Send SMS message","description":"Sends an SMS message to the specified phone number. Supports flash messages (displayed immediately on the recipient's screen), custom validity periods, and configurable timeout. Returns the message ID and network reference ID on success.","operationId":"sms_send","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendSmsRequest"},"example":{"content":"Hello! This is a test message.","flash":true,"timeout":10,"to":"+1234567890"}}},"required":true},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object","required":["success","response"],"properties":{"response":{"type":"object","description":"Response returned after sending an SMS message.","required":["message_id","reference_id"],"properties":{"message_id":{"type":"integer","format":"int64","description":"The unique ID assigned to the already sent message."},"reference_id":{"type":"integer","format":"int32","description":"Reference ID for tracking the message.","minimum":0}}},"success":{"type":"boolean"}}}}}},"400":{"description":"Bad request","content":{"application/json":{"example":{"error":"Bad request","success":false}}}},"401":{"description":"Unauthorized","content":{"application/json":{"example":{"error":"Unauthorized","success":false}}}},"500":{"description":"Internal server error","content":{"application/json":{"example":{"error":"Internal server error","success":false}}}}},"security":[{"bearer_auth":[]}]}},"/sms/service-provider":{"get":{"tags":["SMS"],"summary":"Get service provider","description":"Returns the name of the SIM card's service provider (e.g., the mobile carrier name stored on the SIM).","operationId":"sms_get_service_provider","responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object","required":["success","response"],"properties":{"response":{"type":"string"},"success":{"type":"boolean"}}},"example":{"data":"ASDA Mobile","success":true}}}},"400":{"description":"Bad request","content":{"application/json":{"example":{"error":"Bad request","success":false}}}},"401":{"description":"Unauthorized","content":{"application/json":{"example":{"error":"Unauthorized","success":false}}}},"500":{"description":"Internal server error","content":{"application/json":{"example":{"error":"Internal server error","success":false}}}}},"security":[{"bearer_auth":[]}]}},"/sms/signal-strength":{"get":{"tags":["SMS"],"summary":"Get signal strength","description":"Returns the current signal strength (RSSI) and bit error rate (BER) from the modem. RSSI values typically range from 0-31, with higher values indicating stronger signal.","operationId":"sms_get_signal_strength","responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object","required":["success","response"],"properties":{"response":{"type":"object","description":"Signal strength information from the modem.","required":["rssi","ber"],"properties":{"ber":{"type":"integer","format":"int32","description":"Bit Error Rate (0-7, 99=unknown)."},"rssi":{"type":"integer","format":"int32","description":"Received Signal Strength Indicator (0-31, 99=unknown)."}}},"success":{"type":"boolean"}}},"example":{"data":{"ber":0,"rssi":17},"success":true}}}},"400":{"description":"Bad request","content":{"application/json":{"example":{"error":"Bad request","success":false}}}},"401":{"description":"Unauthorized","content":{"application/json":{"example":{"error":"Unauthorized","success":false}}}},"500":{"description":"Internal server error","content":{"application/json":{"example":{"error":"Internal server error","success":false}}}}},"security":[{"bearer_auth":[]}]}},"/sys/phone-number":{"get":{"tags":["System"],"summary":"Get configured phone number","description":"Returns the phone number configured for this SMS server, if one has been set in the configuration.","operationId":"sys_phone_number","responses":{"200":{"description":"System phone number retrieved successfully","content":{"application/json":{"schema":{"type":"object","required":["success","response"],"properties":{"response":{"oneOf":[{"type":"null"},{"type":"string"}]},"success":{"type":"boolean"}}},"example":{"data":"+1234567890","success":true}}}},"400":{"description":"Bad request","content":{"application/json":{"example":{"error":"Bad request","success":false}}}},"401":{"description":"Unauthorized","content":{"application/json":{"example":{"error":"Unauthorized","success":false}}}},"500":{"description":"Internal server error","content":{"application/json":{"example":{"error":"Internal server error","success":false}}}}},"security":[{"bearer_auth":[]}]}},"/sys/set-log-level":{"post":{"tags":["System"],"summary":"Set log level","description":"Change the server's logging level at runtime. This can be useful for live debugging via journalctl etc.","operationId":"sys_set_log_level","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetLogLevelRequest"},"example":{"level":"debug"}}},"required":true},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object","required":["success","response"],"properties":{"response":{"type":"boolean"},"success":{"type":"boolean"}}},"example":{"data":true,"success":true}}}},"400":{"description":"Bad request","content":{"application/json":{"example":{"error":"Bad request","success":false}}}},"401":{"description":"Unauthorized","content":{"application/json":{"example":{"error":"Unauthorized","success":false}}}},"500":{"description":"Internal server error","content":{"application/json":{"example":{"error":"Internal server error","success":false}}}}},"security":[{"bearer_auth":[]}]}},"/sys/version":{"get":{"tags":["System"],"summary":"Get server version","description":"Returns the current version string of the SMS server.","operationId":"sys_version","responses":{"200":{"description":"Version retrieved successfully","content":{"application/json":{"schema":{"type":"object","required":["success","response"],"properties":{"response":{"type":"string"},"success":{"type":"boolean"}}},"example":{"data":"1.0.0","success":true}}}},"400":{"description":"Bad request","content":{"application/json":{"example":{"error":"Bad request","success":false}}}},"401":{"description":"Unauthorized","content":{"application/json":{"example":{"error":"Unauthorized","success":false}}}},"500":{"description":"Internal server error","content":{"application/json":{"example":{"error":"Internal server error","success":false}}}}},"security":[{"bearer_auth":[]}]}},"/ws":{"get":{"tags":["WebSocket"],"summary":"WebSocket connection","description":"Establishes a WebSocket connection for receiving real-time events.","operationId":"websocket_upgrade","parameters":[{"name":"events","in":"query","required":false,"schema":{"type":["string","null"]}}],"responses":{"101":{"description":"WebSocket connection established"},"400":{"description":"Bad request","content":{"application/json":{"example":{"error":"Bad request","success":false}}}},"401":{"description":"Unauthorized","content":{"application/json":{"example":{"error":"Unauthorized","success":false}}}},"404":{"description":"WebSocket functionality is disabled"},"500":{"description":"Internal server error","content":{"application/json":{"example":{"error":"Internal server error","success":false}}}}}}}},"components":{"schemas":{"FixStatus":{"type":"string","description":"GNSS (Global Navigation Satellite System) fix status.","enum":["Unknown","NotFix","Fix2D","Fix3D"]},"GetFriendlyNameRequest":{"type":"object","required":["phone_number"],"properties":{"phone_number":{"type":"string"}}},"GlobalFetchRequest":{"type":"object","properties":{"limit":{"type":["integer","null"],"format":"int64","minimum":0},"offset":{"type":["integer","null"],"format":"int64","minimum":0},"reverse":{"type":"boolean"}}},"HttpModemBatteryLevelResponse":{"type":"object","description":"Battery status information from the modem.","required":["status","charge","voltage"],"properties":{"charge":{"type":"integer","format":"int32","description":"Battery charge level percentage (0-100).","minimum":0},"status":{"type":"integer","format":"int32","description":"Battery status (0=not charging, 1=charging, 2=no battery).","minimum":0},"voltage":{"type":"number","format":"float","description":"Battery voltage in volts."}}},"HttpModemNetworkOperatorResponse":{"type":"object","description":"Network operator information from the modem.","required":["status","format","operator"],"properties":{"format":{"type":"integer","format":"int32","description":"Format of the operator name (0=long alphanumeric, 1=short alphanumeric, 2=numeric).","minimum":0},"operator":{"type":"string","description":"Name or code of the network operator."},"status":{"type":"integer","format":"int32","description":"Operator selection status (0=automatic, 1=manual).","minimum":0}}},"HttpModemNetworkStatusResponse":{"type":"object","description":"Network registration status of the modem.","required":["registration","technology"],"properties":{"registration":{"type":"integer","format":"int32","description":"Registration status code (0=not registered, 1=registered home, 5=registered roaming).","minimum":0},"technology":{"type":"integer","format":"int32","description":"Network technology in use (e.g., 2G, 3G, 4G).","minimum":0}}},"HttpModemSignalStrengthResponse":{"type":"object","description":"Signal strength information from the modem.","required":["rssi","ber"],"properties":{"ber":{"type":"integer","format":"int32","description":"Bit Error Rate (0-7, 99=unknown)."},"rssi":{"type":"integer","format":"int32","description":"Received Signal Strength Indicator (0-31, 99=unknown)."}}},"MessageIdFetchRequest":{"type":"object","required":["message_id"],"properties":{"limit":{"type":["integer","null"],"format":"int64","minimum":0},"message_id":{"type":"integer","format":"int64"},"offset":{"type":["integer","null"],"format":"int64","minimum":0},"reverse":{"type":"boolean"}}},"PhoneNumberFetchRequest":{"type":"object","required":["phone_number"],"properties":{"limit":{"type":["integer","null"],"format":"int64","minimum":0},"offset":{"type":["integer","null"],"format":"int64","minimum":0},"phone_number":{"type":"string"},"reverse":{"type":"boolean"}}},"SendSmsRequest":{"type":"object","required":["to","content"],"properties":{"content":{"type":"string"},"flash":{"type":["boolean","null"]},"timeout":{"type":["integer","null"],"format":"int32","minimum":0},"to":{"type":"string"},"validity_period":{"type":["integer","null"],"format":"int32","minimum":0}}},"SetFriendlyNameRequest":{"type":"object","required":["phone_number"],"properties":{"friendly_name":{"type":["string","null"]},"phone_number":{"type":"string"}}},"SetLogLevelRequest":{"type":"object","required":["level"],"properties":{"level":{"type":"string"}}}},"securitySchemes":{"bearer_auth":{"type":"http","scheme":"bearer"}}},"tags":[{"name":"Database","description":"Database routes"},{"name":"SMS","description":"SMS sending and device information"},{"name":"GNSS","description":"GNSS position data"},{"name":"System","description":"System configuration and status"}]}