# Objekt.sh > File storage and static site hosting for ENS names. Upload files via CLI (wallet signing) or MCP server (API key). Free CDN tier. Paid Arweave and IPFS tiers via USDC on Base. ## API Endpoints - ens.objekt.sh — ENS-specific media (avatars, headers) - api.objekt.sh — General uploads, static site deployment, pricing - ipfs.objekt.sh/{cid} — IPFS content gateway - ar.objekt.sh/{txId} — Arweave content gateway ## Authentication All uploads use EIP-712 typed data signatures. No API keys or accounts. The wallet signature is the only auth mechanism. Server verifies ENS name ownership on-chain. ## Storage Tiers - `cached`: Free, 90-day edge cache - `arweave`: ~$0.09/MB, permanent, paid in USDC on Base via x402 - `ipfs`: $0.20/MB, 12-month pin, paid in USDC on Base via x402 ## ENS Media Upload ``` PUT https://ens.objekt.sh/{name.eth}/{type} Content-Type: multipart/form-data file: sig: "0x..." expiry: "1711843200000" unverifiedAddress: "0x..." ``` Where `{type}` is the media type: `avatar`, `header`, or any future type. The `file` part contains raw binary with its Content-Type set to the file's MIME type. `sig` is an EIP-712 typed data signature. `expiry` is a Unix timestamp in ms (valid for 60s). `unverifiedAddress` is the signer's Ethereum address. Optional query: `?storage=arweave` or `?storage=ipfs` (requires x402 payment header). JSON bodies with `dataURL` (base64-encoded) are also accepted for backward compatibility. ## General File Upload ``` PUT https://api.objekt.sh/{name} ``` Same multipart format. Does not require ENS ownership. ## Static Site Deployment ``` POST https://api.objekt.sh/deploy Content-Type: application/json { "files": [ { "path": "index.html", "dataURL": "data:text/html;base64,..." }, { "path": "style.css", "dataURL": "data:text/css;base64,..." } ], "hash": "0x...", "sig": "0x...", "expiry": "1711843200000", "unverifiedAddress": "0x..." } ``` `hash` is SHA-256 of all file bytes concatenated (sorted by path). Returns a temporary preview URL (7 days) and optionally an IPFS CID + contenthash if `?storage=ipfs`. ## Pricing ``` GET https://api.objekt.sh/pricing ``` Returns current storage tier pricing, media type limits, and rate limits. ## Media Types | Type | Formats | Max Size | |------|---------|----------| | avatar | JPEG, PNG, WEBP | 512KB | | header | JPEG, PNG, WEBP | 1MB | | general | JPEG, PNG, WEBP, GIF, SVG, PDF | 5MB | ## Links - Documentation: https://objekt.sh - GitHub: https://github.com/0xLighthouse/objekt.sh - CLI: @objekt.sh/cli on npm