API (Application Programming Interface)
- API
Weather data upload
| Field |
Type |
Description |
Example values |
temperature |
float |
Temperature in degree celsius |
20 |
humidity |
float |
Humidity in percent |
60 |
pressure |
float |
Pressure in pascal |
101300 |
callsign |
string |
Callsign |
NOCALL |
wind_dir |
int |
Wind direction in degree |
220 |
wind_avg |
float |
Wind average in m/s |
2.5 |
wind_max |
float |
Wind maximal in m/s |
2.5 |
rain_mm |
<int |
Rain in mm |
100 |
Example :
http://api.wettersonde.net/weather.php?temperature=20&humidity=60&callsign=NOCALL&pressure=101300
Telemetry upload
Domain:
POST http://api.wettersonde.net/telemetrie.php
Headers:
Content-Type: application/json
Supported payload formats
The telemetry endpoint accepts the previous single-frame JSON format and the new batch format. Internally both formats are processed as a list of frames.
| Format | Description |
| Single frame | One JSON object containing one telemetry frame. Existing clients can continue to use this format. |
| Batch object | A JSON object with a frames array containing multiple telemetry frames, including frames from different sondes. |
| Direct array | A JSON array containing multiple telemetry frame objects. |
Required fields per frame
| Field |
Type |
Description |
timestamp |
string |
UTC time in format HHMMSS, for example 134501 = 13:45:01 UTC |
frame | int | Frame number or uptime counter when available |
latitude | float | Latitude |
longitude | float | Longitude |
altitude | float | Altitude in meters |
speed | float | Speed in km/h |
direction | int | Direction in degrees, 0–360 |
frequency | float | Frequency in MHz, 400–406 |
type | string | Sonde type, for example RS41, DFM17, M10, M20 or iMET |
serial | string | Serial number of the sonde |
callsign | string | Receiver or station callsign |
climb | float | Climb rate in m/s |
Optional fields per frame
| Field |
Type |
Description |
temperature | float | Temperature in degree Celsius |
pressure | float | Pressure value from the sonde |
humidity | float | Humidity in percent |
voltage | float | Battery voltage |
rssi | float | Receiver signal strength |
burstkilltimer | int | Seconds until or since burst-kill timer; stored as formatted duration in the database |
killtimer | int | Seconds until transmitter shutdown; stored as formatted duration in the database |
sat | int | Number of satellites |
xdata | string | Extended data string. |
xdata1 | string | Extended data string. |
xdata2 | string | Extended data string. |
xdata3 | string | Extended data string. |
Validation rules
timestamp must be in format HHMMSS and must represent UTC time.
direction must be between 0 and 360.
speed must be greater than or equal to 0.
frequency must be between 400 and 406 MHz.
serial must match [A-Za-z0-9-].
- A maximum of 500 frames can be sent in one request.
Example request: single frame
{
"timestamp": "134501",
"frame": 1234,
"latitude": 52.5200,
"longitude": 13.4050,
"altitude": 12000,
"speed": 50,
"direction": 180,
"frequency": 403.5,
"type": "RS41",
"serial": "ABC-123",
"callsign": "DL1XYZ",
"climb": 5.2,
"temperature": -40,
"pressure": 300,
"humidity": 20,
"voltage": 3.3,
"rssi": -91
}
Example request: batch object
{
"frames": [
{
"timestamp": "134501",
"frame": 1234,
"latitude": 52.5200,
"longitude": 13.4050,
"altitude": 12000,
"speed": 50,
"direction": 180,
"frequency": 403.5,
"type": "RS41",
"serial": "ABC-123",
"callsign": "DL1XYZ",
"climb": 5.2
},
{
"timestamp": "134502",
"frame": 889,
"latitude": 48.1372,
"longitude": 11.5756,
"altitude": 8500,
"speed": 42,
"direction": 220,
"frequency": 404.2,
"type": "DFM17",
"serial": "D21065622",
"callsign": "DL1XYZ",
"climb": -3.1,
"xdata": "122..."
}
]
}
Example request: direct array
[
{
"timestamp": "134501",
"frame": 1234,
"latitude": 52.5200,
"longitude": 13.4050,
"altitude": 12000,
"speed": 50,
"direction": 180,
"frequency": 403.5,
"type": "RS41",
"serial": "ABC-123",
"callsign": "DL1XYZ",
"climb": 5.2
},
{
"timestamp": "134502",
"frame": 1235,
"latitude": 52.5300,
"longitude": 13.4150,
"altitude": 12040,
"speed": 51,
"direction": 181,
"frequency": 403.5,
"type": "RS41",
"serial": "ABC-123",
"callsign": "DL1XYZ",
"climb": 5.1
}
]
Responses
✅ Success (200)
{
"status": "ok",
"mode": "batch",
"message": "DB batch insert ok",
"received": 100,
"inserted": 94,
"ignored": 6,
"cleanup_deleted": 12,
"xdata_written": 3
}
✅ Success without new database rows (200)
{
"status": "ok",
"mode": "single",
"message": "No new frames to insert",
"received": 1,
"inserted": 0,
"ignored": 1,
"cleanup_deleted": 0,
"xdata_written": 0
}
❌ Error
{
"error": "Missing field: latitude",
"frame_index": 0
}
Status codes
| Code | Description |
| 200 | Success |
| 400 | Bad request or invalid frame data |
| 405 | Method not allowed |
| 413 | Too many frames in one request |
| 500 | Server error |
Position upload
Domain:
POST http://api.wettersonde.net/position.php
Headers:
Content-Type: application/json
Required Fields
| Field |
Type |
Description |
| latitude | float | Latitude |
| longitude | float | Longitude |
| callsign | string | Receiver callsign |
| software | string | Software name |
| version | string | Software version |
Example Request
{
"latitude": 52.5200,
"longitude": 13.4050,
"callsign": "DL1XYZ",
"software": "dxlAPRS",
"version": "1.37b"
}
Responses
✅ Success (200)
{
"status": "ok",
"message": "DB insert ok"
}
❌ Error
{
"error": "Missing field: latitude"
}
Status Codes
| Code | Description |
| 200 | Success |
| 400 | Bad request |
| 405 | Method not allowed |
| 500 | Server error |
© wettersonde.net - Jean-Michael (DO2JMG) 2026