Skip to main content

TagoTiP over HTTP

:::tip Tutorial Follow our step-by-step tutorial to connect your first device over HTTP: TagoTiP HTTP — Quick Start :::

Standard HTTP you already know - POST to send, GET to retrieve, HEAD to ping. A single Authorization header and a clean REST-style API. Works through every firewall and proxy.

Endpoint

RegionHostIPPortsUS-East-1http.tip.us-e1.tago.io52.223.14.18980 (HTTP) / 443 (HTTPS)EU-West-1http.tip.eu-w1.tago.io166.117.2.14080 (HTTP) / 443 (HTTPS)

Both ports accept TagoTiP and TagoTiP(s) via URL path.

:::info Use HTTPS in production Port 443 (HTTPS) for production. Port 80 (HTTP) for development or when TLS is handled externally. :::

Why HTTP?

HTTP method mapping

HTTP MethodTagoTiP ActionPurposePOSTPUSHSend dataGETPULLRetrieve last valuesHEADPINGKeepalive / poll commands

Arduino example (ESP32)

#include <WiFi.h>
#include <HTTPClient.h>

const char* SSID = "your-wifi";
const char* PASSWORD = "your-password";
const char* TIP_URL = "http://http.tip.us-e1.tago.io/v1/tip/sensor-01"; // replace serial
const char* TOKEN_HASH = "4deedd7bab8817ec"; // replace with yours

void setup() {
Serial.begin(115200);
WiFi.begin(SSID, PASSWORD);
while (WiFi.status() != WL_CONNECTED) delay(500);
Serial.println("WiFi connected");
}

void loop() {
if (WiFi.status() != WL_CONNECTED) return;

float temperature = analogRead(34) * 0.1; // example reading

char body[128];
snprintf(body, sizeof(body), "[temperature:=%.1f#C]", temperature);

char auth[64];
snprintf(auth, sizeof(auth), "TagoTiP %s", TOKEN_HASH);

HTTPClient http;
http.begin(TIP_URL);
http.addHeader("Authorization", auth);
http.addHeader("Content-Type", "text/plain");

int code = http.POST(body);
if (code == 200) {
Serial.print("Stored: ");
Serial.println(http.getString()); // "1"
} else {
Serial.print("Error: ");
Serial.println(code);
}

http.end();
delay(10000); // send every 10 seconds
}

Quick test with curl

Replace 4deedd7bab8817ec with your token hash and sensor-01 with your serial.

Push a temperature reading

curl -X POST https://http.tip.us-e1.tago.io/v1/tip/sensor-01 \
-H "Authorization: TagoTiP 4deedd7bab8817ec" \
-H "Content-Type: text/plain" \
-d '[temperature:=25.5#C]'
1

Push multiple variables

curl -X POST https://http.tip.us-e1.tago.io/v1/tip/sensor-01 \
-H "Authorization: TagoTiP 4deedd7bab8817ec" \
-H "Content-Type: text/plain" \
-d '[temperature:=25.5#C;humidity:=60#%;active?=true]'
3

Push with body-level defaults

curl -X POST https://http.tip.us-e1.tago.io/v1/tip/sensor-01 \
-H "Authorization: TagoTiP 4deedd7bab8817ec" \
-H "Content-Type: text/plain" \
-d '@=39.74,-104.99@1694567890000^batch_01{firmware=2.1}[temperature:=25.5#C;humidity:=60#%]'

Push location data

curl -X POST https://http.tip.us-e1.tago.io/v1/tip/tracker-01 \
-H "Authorization: TagoTiP 4deedd7bab8817ec" \
-H "Content-Type: text/plain" \
-d '[position@=39.74,-104.99,1609;speed:=45.2#km/h@=39.74,-104.99]'

Push raw payload (passthrough)

curl -X POST https://http.tip.us-e1.tago.io/v1/tip/sensor-01 \
-H "Authorization: TagoTiP 4deedd7bab8817ec" \
-H "Content-Type: text/plain" \
-d '>xDEADBEEF01020304'

Raw bytes are delivered to your device's Payload Parser.

Pull the last stored values

curl https://http.tip.us-e1.tago.io/v1/tip/sensor-01?variables=temperature,humidity \
-H "Authorization: TagoTiP 4deedd7bab8817ec"
[temperature:=25.5#C@1694567890000;humidity:=60#%@1694567890000]

Ping (connectivity check + command polling)

curl -I https://http.tip.us-e1.tago.io/v1/tip/sensor-01 \
-H "Authorization: TagoTiP 4deedd7bab8817ec"

No command: 204 No Content

When a command is pending:

HTTP/1.1 200 OK
X-TagoTiP-CMD: reboot

Endpoints

POST /v1/tip/{serial} - Send Data

HeaderAuthorization: TagoTiP <token-hash>Content-Typetext/plainBodyTagoTiP PUSH bodySuccess200 OK - body is data point count

GET /v1/tip/{serial}?variables=... - Retrieve Data

HeaderAuthorization: TagoTiP <token-hash>Queryvariables=var1,var2,...Success200 OK - body is variable list

HEAD /v1/tip/{serial} - Keepalive / Commands

HeaderAuthorization: TagoTiP <token-hash>No command204 No ContentPending command200 OK + X-TagoTiP-CMD header

POST /v1/tips - TagoTiP(s) (Encrypted)

Content-Typeapplication/octet-streamBodyBinary TagoTiP(s) envelope

No Authorization header. See Encryption.

Operators

OperatorTypeExample:=Numbertemperature:=25.5=Stringstatus=online?=Booleanactive?=true@=Location (lat,lng or lat,lng,alt)position@=39.74,-104.99

Response codes

HTTP StatusMeaningBody200 OKSuccessPUSH: count. PULL: variables.204 No ContentPING ok-400 Bad RequestMalformed bodyinvalid_payload401 UnauthorizedInvalid authinvalid_token404 Not FoundUnknown device/variabledevice_not_found413 Payload Too LargeBody exceeds max payload sizepayload_too_large429 Too Many RequestsRate limitedrate_limited500 Internal Server ErrorServer errorserver_error

Limits

Protocol limits

LimitValueMax request body (wire)16,384 bytesMax variables per request100Max metadata pairs32Variable name length100 charsUnit length25 charsSerial length100 chars

RPM = requests per minute.

Per-profile rate limits

ResourceScaleStarterFreeUplink RPM (POST, HEAD)1,00050060Downlink RPM (GET)1,00050060Connections per IP20103

Per-device limits

ResourceDefaultMax payload size100 KB

Unlike TCP/UDP, HEAD (PING) counts toward the uplink RPM on HTTP.

Specification

For the complete protocol grammar, parsing rules, and ABNF, see the TagoTiP Specification.