This guide shows how to send data from any service that supports HTTPS forwarding or webhooks to TagoIO using the Generic HTTPS Endpoint. You can use it with gateways, LNS, or any system that can post JSON or query parameters over HTTPS.
Use this when:
- Your network server or gateway isn’t natively supported by TagoIO.
- You need a simple HTTPS endpoint to receive uplinks.
- You want to map your service’s fields to TagoIO device variables with minimal setup.
- You need to send multiple uplinks in a single request (batch).
This integration handles uplinks only. It does not support downlinks natively. If you need downlinks, use an Analysis to call your network server’s API following their documentation.
Overview of the flow
- Create an Authorization Key in TagoIO with optional “Additional Parameters” that tell TagoIO which fields in your payload correspond to serial, payload, and port.
- Configure your external service to POST data to the TagoIO Generic HTTPS endpoint with your Authorization (header or query).
- (Optional) Adjust your outgoing JSON so it matches the simplest format. The body can be a single object or an array of objects.
- Create the device in TagoIO and pick the right connector (Generic Endpoint + Generic Sensor or a decoder-enabled connector).
1) Create an Authorization Key
Create a key at: Devices → Authorization
You’ll see a field called Additional Parameter. For this integration, you can map the fields your service sends to TagoIO’s expected names:
- serial: device EUI or serial number
- payload: payload, ideally in hex
- port: sensor or LoRaWAN FPort
Example: If your service sends JSON like:
{ "devaddr": "12BAB34B54", "payload_raw": "0011AA", "fport": 10 }
Set Additional Parameter to:
serial=devaddr;payload=payload_raw;port=fport
How it works:
- TagoIO searches both the JSON body and query string for the mapped keys.
- If you don’t set Additional Parameter, TagoIO tries to auto-detect common keys. This may not always match your payload—explicit mapping is safer.
- Any extra fields in your JSON become variables on your TagoIO device automatically.
- When the request body is an array of objects, the same mapping is applied to each item independently.
Nested JSON paths are supported for “serial.”
Example: If your ID lives under {"deviceInfo": {"serial": "AA-BB"}}, set:
serial=deviceInfo.serial
2) Point your service to the TagoIO Generic HTTPS Endpoint
Your service must send HTTPS POSTs to the TagoIO Generic Middleware endpoint for your region.
-
Base URL format:
https://generic.middleware.REGION.tago.io/uplink
Replace REGION with your deployment region (e.g.,us-e1,eu-w1).
See available regions: TagoIO Network Integration regions -
Example:
https://generic.middleware.us-e1.tago.io/uplink
You can provide your Authorization in one of two ways:
Option A: Authorization header
- Header key:
Authorization - Header value: Your Authorization Key from step 1
Option B: Authorization in the query string
- URL:
https://generic.middleware.REGION.tago.io/uplink?authorization=YOUR-AUTHORIZATION-HERE
Do not expose Authorization keys in client apps or public code. Keep them on the server or in your network server’s secure configuration.
3) (Optional) Standardize your outgoing JSON
If your service lets you format the outgoing JSON, use this clean schema to minimize mapping:
{
"serial": "{device_eui}",
"payload": "{payload}", // hex preferred
"port": {port},
"latitude": {latitude},
"longitude": {longitude}
}
Details:
- Only
serialis required, plus the Authorization configured in step 2. - Include any other fields your device reports (e.g., RSSI, SNR, battery). TagoIO stores them as variables.
- If you’re using Additional Parameter mappings from step 1, you can keep your original field names and map them there instead.
Sending multiple uplinks in one request
The endpoint also accepts an array of objects in the body. Each item is processed independently using the same Authorization and the same Additional Parameter mapping you configured in step 1.
Example body:
[
{ "serial": "AA-BB-01", "payload": "0011AA", "port": 10 },
{ "serial": "AA-BB-02", "payload": "0022BB", "port": 10 }
]
How array uplinks behave:
- Every item must resolve a
serial(after applying Additional Parameter rules). If any item is missing it, the entire request fails with400. - Items can target different devices. TagoIO resolves the device per
serialand caches the lookup within the request, so multiple items for the same device don’t pay the resolution cost twice. - All items in a single request share the same
group, so they’re grouped together when stored in TagoIO.
The array body uses the same rules as a single object. There’s nothing extra to enable—just send a JSON array instead of a single JSON object.
4) Create the device in TagoIO
In TagoIO, go to Devices → Generic Endpoint and create a device using your EUI/serial.
Pick the right connector:
- If your external service already decodes the payload into final variables, use the Generic Sensor connector.
- If you want TagoIO to decode using built-in decoders, make sure your Additional Parameter mapping is correct so the decoder receives
serial,payload, andport.
Alternatively, implement your own decoding in a Payload Parser:
Troubleshooting
Use the Device’s Live Inspector to confirm uplinks are reaching TagoIO. If not, check:
- HTTP status codes from your service:
- 401/403: Invalid or missing Authorization. Check header/query value and region.
- 415: Content-Type not set to
application/jsonfor JSON bodies. - 400: Missing required
serialafter mapping. Verify Additional Parameter keys match your payload. When sending an array body, this also fires if any single item is missing itsserial.
- Incorrect region in the endpoint URL. Match your account’s deployment region.
- Wrong Additional Parameter mapping. Typos or wrong nesting cause TagoIO to miss the fields.
- Payload encoding. If your decoder expects hex, send hex. If you send base64, adjust your parser.
- Service-side errors. Confirm the service logs show successful POSTs to TagoIO.
- Array body rejected: an empty array (
[]) is treated the same as an empty body and returns400 "Missing body information". Make sure each item is a JSON object, not a nested array or a primitive.