Skip to main content

TagoTiP over HTTP

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​

RegionHostIPPorts
US-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.

Use HTTPS in production

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

Why HTTP?​

  • Universal - every language and platform has an HTTP client
  • Firewall-friendly - passes through proxies and load balancers
  • Familiar - standard methods, headers, and status codes
  • Quick integration - one curl command gets you started

HTTP method mapping​

HTTP MethodTagoTiP ActionPurpose
POSTPUSHSend data
GETPULLRetrieve last values
HEADPINGKeepalive / 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/plain
BodyTagoTiP PUSH body
Success200 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 Content
Pending command200 OK + X-TagoTiP-CMD header

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

Content-Typeapplication/octet-stream
BodyBinary 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 StatusMeaningBody
200 OKSuccessPUSH: count. PULL: variables.
204 No ContentPING ok-
400 Bad RequestMalformed bodyinvalid_payload
401 UnauthorizedInvalid authinvalid_token
404 Not FoundUnknown device/variabledevice_not_found
413 Payload Too LargeBody exceeds max payload sizepayload_too_large
429 Too Many RequestsRate limitedrate_limited
500 Internal Server ErrorServer errorserver_error

Limits​

Protocol limits​

LimitValue
Max request body (wire)16,384 bytes
Max variables per request100
Max metadata pairs32
Variable name length100 chars
Unit length25 chars
Serial length100 chars

RPM = requests per minute.

Per-profile rate limits​

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

Per-device limits​

ResourceDefault
Max 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.