---
title: Protocol overview
description: How the wire protocol, SDKs, and ingest endpoint fit together.
section: SDK
order: 7
updatedAt: 2026-04-27
slug: sdk/protocol
---
# Protocol overview

The SDK is a convenience layer. Everything underneath is a single HTTP endpoint accepting a batch of typed events.

```
                     ┌───────────────────┐
   Application ───►  │   @cuitty/sdk     │  ─── HMAC-signed POST ───►  Portal
                     │  (or curl, etc.)   │
                     └───────────────────┘
```

## Three things the SDK gives you

1. **Batching.** Events accumulate in memory and flush every 5 seconds, or on buffer fill, or on `shutdown()`.
2. **Signing.** HMAC-SHA256 over the body using your API key — no need to hand-roll OpenSSL.
3. **Plugins.** Tap into framework middleware, Pino, or your CI pipeline without rewriting your app.

## Three things the SDK does *not* do

- Poll Cuitty for data — the SDK is push-only.
- Retry indefinitely — failed batches drop after `maxRetries` and are logged locally.
- Throw exceptions on transport errors — fail-silent is a deliberate design choice; SDK errors must never crash the host process.

## The contract

The contract between SDK and portal is documented in full at [Wire protocol](/docs/reference/wire-protocol). Anything that conforms to the contract works — implement your own client in any language.