# StableUpload File Upload Slot Purchase

> StableUpload File Upload Slot Purchase is a paid API for AI agents from StableUpload at stableupload.dev, paid per call via x402 or MPP, $0.02/call, status healthy (last checked 2026-10-10, last successful call 2026-09-18).

Purchases a file upload slot and returns a pre-signed URL for the agent to upload a file directly to StableUpload CDN storage.

## Facts

- Endpoint: POST https://stableupload.dev/api/upload?utm_source=zero.xyz
- Price: $0.02/call
- Payment: x402, MPP
- Status: healthy
- Last checked: 2026-10-10
- Last successful call: 2026-09-18
- Success rate: 99% of calls made through Zero
- Rating: 4.8 / 5 from 4 reviews
- Activations on Zero: 72
- Provider: StableUpload
- Docs: https://stableupload.dev
- Website: https://stableupload.dev
- Tags: upload, files, hosting, static-site, cdn, storage
- Canonical page: https://www.zero.xyz/c/stableupload-upload-c9737c54
- Structured record (JSON): https://api.zero.xyz/v1/capabilities/cap_wCFzbBNPwfAyK6dO1TRMS

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 stableupload-upload-c9737c54 -d '<json body>'
```

Example prompt: Upload my file 'report-Q4-2024.pdf' (it's a PDF, about 8MB) to StableUpload using the standard 6-month 10mb tier so I can share a public link with my team.

## When to prefer this

Use this endpoint when you need to host a file publicly on a CDN with a stable URL for 6 months (or 7 days for short-term workflow use), especially when the file will be shared, linked, or served as a static asset. Prefer this over site hosting endpoints when uploading single files rather than full zip-based static sites.

## Known failure modes

- Invalid or unsupported MIME contentType returns a 400 error
- Filename exceeds 512 characters returns a validation error
- Selected tier does not support the file size being uploaded
- Insufficient USDC balance or payment failure results in 402 payment required
- policyTtlSeconds outside 60-86400 range returns a validation error
- Expired uploadUrl if agent waits too long before performing the actual upload

## How this service works

Buy an upload slot. Agent uploads file via returned URL.

## Output

Returns an uploadId, a pre-signed uploadUrl (PUT or POST method) valid until uploadUrlExpiresAt, a permanent publicUrl where the file will be accessible, the maximum allowed file size in bytes, the expiry date of the hosted file, and a ready-to-use curl command for performing the upload.

## Example request

```json
{
 "tier": "10mb",
 "filename": "test-document.pdf",
 "contentType": "application/pdf"
}
```

## Request schema (JSON Schema)

```json
{
 "type": "object",
 "required": [
  "filename",
  "contentType",
  "tier"
 ],
 "properties": {
  "tier": {
   "enum": [
    "10mb",
    "100mb",
    "1gb",
    "short-10mb",
    "short-100mb",
    "short-1gb",
    "short-5gb"
   ],
   "type": "string",
   "description": "Upload tier. Default 6-month tiers: 10mb ($0.02), 100mb ($0.20), 1gb ($2.00). Short-term 7-day workflow tiers: short-10mb ($0.005), short-100mb ($0.02), short-1gb ($0.10), short-5gb ($0.50, file uploads only)."
  },
  "filename": {
   "type": "string",
   "maxLength": 512,
   "minLength": 1,
   "description": "Name of the file to upload"
  },
  "contentType": {
   "type": "string",
   "maxLength": 255,
   "minLength": 1,
   "description": "MIME type of the file (e.g. image/png, video/mp4)"
  },
  "policyTtlSeconds": {
   "type": "integer",
   "maximum": 86400,
   "minimum": 60,
   "description": "Optional upload URL/form expiration in seconds, 60-86400. Use longer TTLs only when reserving an output slot for a downstream service."
  }
 }
}
```

## Response schema (JSON Schema)

```json
{
 "type": "object",
 "required": [
  "uploadId",
  "uploadUrl",
  "uploadMethod",
  "uploadUrlExpiresAt",
  "publicUrl",
  "expiresAt",
  "maxSize",
  "curlExample"
 ],
 "properties": {
  "txHash": {
   "type": "string"
  },
  "maxSize": {
   "type": "number"
  },
  "postUrl": {
   "type": "string"
  },
  "uploadId": {
   "type": "string"
  },
  "expiresAt": {
   "type": "string"
  },
  "publicUrl": {
   "type": "string"
  },
  "uploadUrl": {
   "type": "string"
  },
  "postFields": {
   "type": "object",
   "propertyNames": {
    "type": "string"
   },
   "additionalProperties": {
    "type": "string"
   }
  },
  "curlExample": {
   "type": "string"
  },
  "uploadMethod": {
   "enum": [
    "put",
    "post"
   ],
   "type": "string"
  },
  "uploadUrlExpiresAt": {
   "type": "string"
  }
 },
 "additionalProperties": false
}
```

## More

- Live health (JSON, refreshed every minute): https://www.zero.xyz/c/stableupload-upload-c9737c54/health.json
- [Zero catalog index](https://www.zero.xyz/llms.txt)
- [Other services from stableupload.dev](https://www.zero.xyz/host/stableupload.dev/llms.txt)
