Skip to main content

TagoTiP - Transport IoT Protocol

Send IoT data to TagoIO in 130 bytes instead of 487. No JSON, no HTTP headers - just a single human-readable line your microcontroller can build with sprintf.

PUSH|4deedd7bab8817ec|sensor-01|[temperature:=32.5#C;humidity:=65#%]

Why TagoTiP?

HTTP/JSONTagoTiPTagoTiP(s) (encrypted)
Payload size~487 bytes~130 bytes~119 bytes
vs. HTTP/JSON-3.7x smaller4.1x smaller
TLS required?YesRecommendedNo - AEAD encryption built-in
Parse complexityJSON parserLinear scan, no backtrackingEnvelope + linear scan

Built for constrained devices

  • Human-readable - debug frames in a terminal, compose them by hand
  • Type-safe - explicit operators for numbers (:=), strings (=), booleans (?=), and locations (@=)
  • C-friendly - predictable buffer sizes, no dynamic allocation, linear parsing
  • Compact - variable, value, unit, timestamp, group, location, and metadata in a single frame
  • Transport-agnostic - works over UDP, TCP, HTTP(S), MQTT, or any byte-capable channel

Encryption without TLS

Need security on raw UDP or constrained links where TLS is too expensive? TagoTiP(s) wraps frames in an AEAD authenticated encryption envelope - as little as 29 bytes of overhead, with built-in replay protection and integrity verification.

Cipher SuiteKeyTagEnvelope Overhead
AES-128-CCM128-bit8 B29 bytes
AES-128-GCM128-bit16 B37 bytes
AES-256-CCM256-bit8 B29 bytes
AES-256-GCM256-bit16 B37 bytes
ChaCha20-Poly1305256-bit16 B37 bytes

Learn more in the Encryption guide.

How it compares

TagoTiP vs. other IoT data formats

TagoTiPHTTP + JSONMQTT + JSONProtobuf
Typical payload~130 bytes~487 bytes~210 bytes~80 bytes
Human-readableYesPartiallyPartiallyNo
Schema requiredNoNoNoYes
Debug in a terminalYesVerboseBinary framingNo
Build with sprintfYesComplexNeeds MQTT libraryNeeds code generator
IoT type systemBuilt-in (number, string, bool, location)Application-definedApplication-definedSchema-defined
Metadata, unit, group, timestampNative syntaxApplication-definedApplication-definedSchema-defined

TagoTiP(s) vs. other IoT security

TagoTiP(s)TLS 1.3DTLS 1.2
HandshakeNone - 0 bytes~2-4 KB~2-5 KB
Round trips before first data01-22-3
Per-message overhead29-37 bytes~29 bytes + TCP~29 bytes
Session stateStatelessPer-connectionPer-connection
Certificate managementNoneRequiredRequired or PSK
Works over raw UDPYesNoUDP only
Works without TCPYesNoUDP only

Quick example

Push a temperature reading with unit, timestamp, and metadata - all in one frame:

PUSH|4deedd7bab8817ec|sensor-01|@1694567890000^batch_42{firmware=2.1}[temperature:=32.5#C;position@=39.74,-104.99]

Pull the last value back:

PULL|4deedd7bab8817ec|sensor-01|[temperature]
<- ACK|OK|[temperature:=32.5#C@1694567890000]

SDKs

All language SDKs share a single Rust core (tagotip-codec, no_std), so parsing and frame building behave identically everywhere.

PackageLanguageInstall
@tagoio/tagotipTypeScript / Node.jsnpm install @tagoio/tagotip
tagotipGogo get github.com/tago-io/tagotip-sdk/tagotip-go
tagotipPythonpip install tagotip
TagoTiPC / ArduinoArduino Library Manager
tagotip-codecRustcargo add tagotip-codec

Browse the full SDK source at github.com/tago-io/tagotip-sdk.

Open source

TagoTiP is open source under the Apache License 2.0. Implement clients, servers, libraries, or gateways - for any purpose, including commercial use.