# objekt.sh File Upload — Store File by ENS Name and Type

> objekt.sh File Upload — Store File by ENS Name and Type is a paid API for AI agents from api.objekt.sh, paid per call via x402, $0.25/call, status unknown (last checked 2026-10-10).

Upload and permanently store a file (image, document, etc.) associated with an ENS name and file type, returning a URI on Arweave, IPFS, or CDN with a content hash.

## Facts

- Endpoint: PUT https://api.objekt.sh/%7Bname%7D/%7Btype%7D?utm_source=zero.xyz
- Price: $0.25/call
- Payment: x402
- Status: unknown
- Last checked: 2026-10-10
- Activations on Zero: 0
- Tags: x402
- Canonical page: https://www.zero.xyz/c/objekt-sh-file-upload-store-file-by-ens-name-and-type-423d8e6a
- Structured record (JSON): https://api.zero.xyz/v1/capabilities/cap__wZ-EKlvoyqZFFrZiNbXz

Status and success rate cover calls made through Zero and Zero's own probes. Third-party monitors may report differently.

## How to call it through Zero

Zero handles the 402 payment challenge and records the run. With the Zero CLI installed (`npm i -g @zeroxyz/cli`):

```sh
zero fetch --capability objekt-sh-file-upload-store-file-by-ens-name-and-type-423d8e6a -d '<json body>'
```

Example prompt: Upload this PNG image to objekt.sh and store it permanently on Arweave under the ENS name vitalik.eth as type image/png — give me back the Arweave URI and the content hash.

## When to prefer this

Choose this endpoint when you need to permanently store a file on Arweave or IPFS and associate it with an ENS name — especially when the resulting content hash will be used to update an ENS contenthash record. It is the right choice for AI agents that produce files (images, documents, JSON metadata) and need decentralized, permanent, CDN-accessible storage with ENS identity linking. Prefer it over generic S3/cloud storage when permanence, decentralization, and ENS integration matter.

## Known failure modes

- Invalid or unresolvable ENS name — 400 or 422 error
- Unsupported file type provided in {type} path parameter
- Payment not received or insufficient USDC — x402 payment required error
- File too large for the selected storage tier
- Arweave or IPFS backend temporarily unavailable — 503 error
- Malformed binary body or missing Content-Type header

## How this service works

File storage for AI agents and ENS names. Upload via MCP, REST, or CLI. Free CDN tier. Permanent Arweave and IPFS options.

## Output

Returns a JSON object containing: the Arweave or IPFS URI (ar://... or ipfs://...), the MIME type (kind), the ENS name the file is associated with, the file size in bytes, a human-readable permalink URL (e.g. https://ar.objekt.sh/...), and the EIP-1577 contenthash hex string suitable for setting on an ENS record.

## Request schema (JSON Schema)

```json
{
 "type": "object",
 "$schema": "https://json-schema.org/draft/2020-12/schema",
 "required": [
  "input"
 ],
 "properties": {
  "input": {
   "type": "object",
   "required": [
    "type",
    "bodyType",
    "body"
   ],
   "properties": {
    "body": {
     "required": [
      "expiry",
      "dataURL",
      "sig",
      "unverifiedAddress"
     ],
     "properties": {
      "sig": {
       "type": "string",
       "pattern": "^0x[0-9a-fA-F]+$",
       "description": "EIP-712 signature over { upload, expiry, name, hash }"
      },
      "expiry": {
       "type": "string",
       "description": "Unix ms timestamp, 1 minute from signing time"
      },
      "dataURL": {
       "type": "string",
       "description": "data:<mime>;base64,<payload> encoded file"
      },
      "unverifiedAddress": {
       "type": "string",
       "pattern": "^0x[0-9a-fA-F]{40}$",
       "description": "Signer address — verified server-side via recoverTypedDataAddress"
      }
     }
    },
    "type": {
     "type": "string",
     "const": "http"
    },
    "method": {
     "enum": [
      "POST",
      "PUT",
      "PATCH"
     ],
     "type": "string"
    },
    "bodyType": {
     "enum": [
      "json",
      "form-data",
      "text"
     ],
     "type": "string"
    },
    "pathParams": {
     "type": "object",
     "required": [
      "name",
      "type"
     ],
     "properties": {
      "name": {
       "type": "string",
       "description": "ENS name, e.g. vitalik.eth"
      },
      "type": {
       "enum": [
        "avatar",
        "header",
        "h"
       ],
       "type": "string",
       "description": "Media slot — avatar or header (h alias)"
      }
     }
    }
   },
   "additionalProperties": false
  },
  "output": {
   "type": "object",
   "required": [
    "type"
   ],
   "properties": {
    "type": {
     "type": "string"
    },
    "example": {
     "type": "object"
    }
   }
  }
 }
}
```

## Response schema (JSON Schema)

```json
{
 "type": "json",
 "example": {
  "uri": "ar://abc123…",
  "kind": "image/png",
  "name": "vitalik.eth",
  "bytes": 48213,
  "permalink": "https://ar.objekt.sh/abc123…",
  "contenthash": "0xe3010170…"
 }
}
```

## More

- Live health (JSON, refreshed every minute): https://www.zero.xyz/c/objekt-sh-file-upload-store-file-by-ens-name-and-type-423d8e6a/health.json
- [Zero catalog index](https://www.zero.xyz/llms.txt)
- [Other services from api.objekt.sh](https://www.zero.xyz/host/api.objekt.sh/llms.txt)
