Claim-check for agent handoffs.

kubbi holds the payload. Your channel carries the URL.

Pair kubbi with your queue, webhook, MCP tool result, or A2A message. Every payload is encrypted with TTL. Burn-after-read and manifest preview are server-enforced when you ask for them.

const client = new KubbiClient({ apiKey })
const { claimUrl } = await client.sendFiles({
  files: [
    { name: "config.json", content, contentType: "application/json" },
    { name: "data.csv",    content, contentType: "text/csv" },
    { name: "report.md",   content, contentType: "text/markdown" },
  ],
  ttlSeconds: 3600,
  maxRetrievals: 1,
})

Pair it with your channel

Your agents already pass messages. Through a queue, a webhook, an MCP tool result, an A2A message. Those channels are great for control flow. They're awkward for payloads: size limits, sensitive data sitting in logs, multi-file bundles that don't fit inline.

kubbi takes the payload off the channel. The producer stores it once and gets back a claim URL. The channel carries the URL. The consumer claims the payload when ready.

Produceryour codeclaim URLqueue · webhook · MCP · A2AConsumeryour codesendclaimkubbiencrypted · TTL · burn-after-read · manifest previewYour channel carries the URL. kubbi carries the payload.

Capabilities tailored to agentic use cases

Four behaviors built for how agents actually pass payloads. All server-enforced, no setup or background plumbing on your side.

Burn-after-read
Every kubbi has a retrieval limit. Hit it and the payload is gone. Server-enforced, not a flag you remember to set.
Short TTL
Payloads expire on a clock. Set it to seconds, minutes, or hours. Defaults are short so stale data doesn't linger.
Encrypted at rest
AES-256-GCM with per-payload IV and auth tag. No setup, no Lambda, no IAM policy you maintain.
Manifest preview
Consumers see what's in a kubbi before claiming it. File names, sizes, types. Useful for verifying without burning the retrieval count.

Three calls

Send a payload, share the URL, claim it. The producer authenticates with an API key. The consumer claims with the URL alone.

first kubbi
// Producer
const { claimUrl } = await kubbi.send({
  content: payload,
  ttlSeconds: 3600,
  maxRetrievals: 1,
});
// Pass claimUrl through your queue, webhook, or MCP tool result

// Consumer
const payload = await kubbi.claim(claimUrl);

Anatomy of a handoff

From send to terminal state. The kubbi sits encrypted and awaiting claim. Consumers can inspect without retrieving. The row is wiped server-side when the kubbi ends.

CREATEDencryptedawaiting claimINSPECTEDmanifest readbytes still sealedCLAIMEDbytes deliveredrow deletedEXPIREDTTL elapsedrow deletedinspect()claim()claim()ttl elapsed

Three terminal states wipe the row: expired (TTL elapsed), burned (max_retrievals reached), and deleted (producer wiped early). Ciphertext is overwritten on the storage layer before the status is updated. The encryption key is removed alongside.

How kubbi compares to other solutions

How kubbi stacks up against the most common alternatives teams reach for when they need to pass payloads between agents: S3 with presigned URLs, raw webhooks, inline queue messages, and rolling your own claim-check service.

Compared toWhat kubbi adds
S3 + presigned URLsServer-enforced burn-after-read. Multi-file bundling. Agent-shaped SDK. Defaults on.
Raw webhook with inline payloadThe payload doesn't sit in your webhook logs. No size limit.
Queue with inline payloadNo 256 KB cap. No sensitive data lingering in SQS.
Building it yourselfKMS, expiry enforcement, audit, manifest preview, all handled.

A team comfortable with cloud primitives could build a claim-check service in a weekend. We did it for you and added defaults that match how agents actually pass payloads.

Get Started

Free tier covers most agent workflows. Pricing tiers up when you need more.