HTTP 402 + EIP-3009. Your agent signs a transferWithAuthorization once — a facilitator settles it on whichever chain it already holds USDC. No gas needed.
LIVE
·
Taiko
·
Base
·
Tempo
Storage for agents.
Your agent uploads a file and pays a fraction of a cent in USDC. Tack hands back an address any other agent can read. No signup, no API keys, no platform to live inside.
Min per pin
$0.001
First pin
~30s
Signups
0
→ Works with any agent
Claude Code
Codex
OpenClaw
Hermes
+ any HTTP client
§ 01/Problem
Pin-for-humans doesn’t work for agents.
| Pinata · NFT.Storage · Storacha | Tack | |
|---|---|---|
| Identity | Email + API key | Wallet address |
| Payment | Credit card, monthly plan | On-chain USDC, per pin |
| Minimum | $20 / month | $0.001 / pin |
| Machine-native | — | HTTP 402 + A2A agent card |
§ 02/What to keep
Everything they make.
- 01 Long-term memory State, embeddings, context. Recall across runs by CID.
- 02 Generated artifacts Images, PDFs, code bundles, video. The run’s outputs, pinned.
- 03 RAG corpora Shared knowledge across an agent fleet. Replace by pinning a new CID.
- 04 Task receipts On-chain payment, off-chain content. Verifiable provenance per job.
- 05 Inter-agent handoffs CIDs as pointers. One agent pins, another retrieves.
- 06 Replayable outputs Cache deterministic tool calls. Skip the work if the CID resolves.
§ 03/The loop
Three round-trips. One signature.
-
STEP 01
Agent POSTs
/pins. Tack returns402with the price. - STEP 02 Agent signs one on-chain payment. x402 on Taiko or Base, MPP on Tempo.
-
STEP 03
202 Accepted. Pinned. Wallet owns it.
§ 04/Integrate
One endpoint. Point your agent.
import { wrapFetchWithPaymentFromConfig } from "@x402/fetch";
import { ExactEvmScheme, toClientEvmSigner } from "@x402/evm";
import { privateKeyToAccount } from "viem/accounts";
import { createPublicClient, http } from "viem";
import { taiko, base } from "viem/chains";
const account = privateKeyToAccount("0x..."); // holds USDC on Taiko or Base
const taikoSig = toClientEvmSigner(account, createPublicClient({ chain: taiko, transport: http() }));
const baseSig = toClientEvmSigner(account, createPublicClient({ chain: base, transport: http() }));
const pay = wrapFetchWithPaymentFromConfig(fetch, {
schemes: [
{ network: "eip155:167000", client: new ExactEvmScheme(taikoSig) }, // Taiko
{ network: "eip155:8453", client: new ExactEvmScheme(baseSig) }, // Base
],
});
// Pin a CID for 6 months. USDC on whichever chain your wallet holds.
const res = await pay("https://tack.taiko.xyz/pins", {
method: "POST",
headers: { "X-Pin-Duration-Months": "6" },
body: JSON.stringify({ cid: "Qm..." }),
});
import { Mppx, tempo } from "mppx/client";
import { privateKeyToAccount } from "viem/accounts";
const account = privateKeyToAccount("0x..."); // holds USDC.e on Tempo
const mppx = Mppx.create({
methods: [tempo({ account })], // Tempo 4217
});
// Same endpoint. USDC.e on Tempo.
const res = await mppx.fetch("https://tack.taiko.xyz/pins", {
method: "POST",
headers: { "X-Pin-Duration-Months": "6" },
body: JSON.stringify({ cid: "Qm..." }),
});
# Ask for the quote. Tack returns a machine-readable 402.
curl -i -X POST https://tack.taiko.xyz/pins \
-H "X-Pin-Duration-Months: 6" \
-d '{"cid":"Qm..."}'
# → HTTP/1.1 402 Payment Required
# → payment-required: accepts=[
# → {network:"eip155:167000", asset:"USDC", amount:"0.10"}, # Taiko
# → {network:"eip155:8453", asset:"USDC", amount:"0.10"}, # Base
# → ]
# → WWW-Authenticate: Payment method="tempo", chainId=4217 # Tempo (MPP)
# Pick any chain your wallet holds. Sign, retry. Tack pins, returns 202.
§ 05/Rails
Two protocols. Three chains. Same endpoints.
your agent picks whichever its wallet already holds
x402.
Taiko
Base
AssetUSDC
Chains167000 · Taiko · 8453 · Base
SchemeExactEvm
Headerpayment-signature
MPP.
Tempo
Machine Payment Protocol + TIP-20. Tack re-reads the on-chain Transfer event to bind the pin to the EOA that signed — not the relay.
AssetUSDC.e
Chain4217 · Tempo
SchemeTIP-20 Transfer
HeaderAuthorization: Payment
§ 06/Pricing
Pay per pin.
No plans. No minimums. The slider below is the real formula — try it.
→ Live quote
$0.293
500 MB · 6 months
· settled on-chain
vs · Pinata’s x402 offer
Pay for 1 month, not 12.
12× cheaper*
for a short pin on Tack vs Pinata’s 12‑month lock-in.
| Pinata x402open-source demo | Tacklive in production | |
|---|---|---|
| Price · 1 GB · 1 mo | $1.20 | $0.1012× cheaper |
| Duration | Fixed 12 months | 1–24 months (you pick) |
| Chains | Base | Taiko · Base · Tempo |
| Payment protocols | x402 | x402 · MPP |
| IPFS Pinning Service API | — | ✓ |
| A2A agent card | — | ✓ |
* Same $0.10 / GB·month rate. Pinata’s demo locks every pin to 12 months; Tack lets you pick 1–24. At 3 mo it’s 4× cheaper, 6 mo 2×, 12 mo the same.
Built-in
-
Settled in
USDCon Taiko or Base, orUSDC.eon Tempo. - Retrieval is free. Paywalls are opt-in, per CID.
- Pins auto-expire. No recurring charges.
- Owner ops — list, replace, delete — don’t re-charge.
How it’s calculated
price = clamp(sizeGB × $0.10 × months, $0.001, $50)
Size is binary (1 GB = 1,073,741,824 bytes). Duration is 1–24 months, set with
X-Pin-Duration-Months. Settlement rounds up to the next asset unit.
§ 07/API
Standard spec.
IPFS Pinning Service API spec, plus /upload, a gateway with optional paywalls, and an A2A agent card.
POST
/pins
Pin a CID. 402 with price → sign → retry.
x402 · MPP
POST
/upload
Upload bytes (up to 100 MB) and pin in one request.
x402 · MPP
GET
/pins
List pins your wallet owns.
bearer
GET
/pins/:requestid
Status for a specific pin request.
bearer
POST
/pins/:requestid
Replace a pin, keep the request id.
bearer
DELETE
/pins/:requestid
Unpin content your wallet owns.
bearer
GET
/ipfs/:cid
Retrieve content. Ranges, ETags, optional paywall.
public
GET
/.well-known/agent.json
A2A agent card. Machines discover, verify, pay.
public
Give your agent a place to keep things.
One endpoint away.
Taiko 167000
Base 8453
Tempo 4217
IPFS Kubo
A2A agent card