> ## Documentation Index
> Fetch the complete documentation index at: https://docs.openinary.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# What differs on Cloud

> The bucket prefix, the endpoints Cloud does not have, quota errors and rate limits. Everything else matches the shared API reference.

Cloud runs the same API as self-hosted. One path differs, six endpoints do not exist, and quotas add one status code. Everything else, request and response, is documented once in the [API reference](https://docs.openinary.dev/api-reference/introduction.md).

One host serves both the API and the CDN. Send your key on every call, either header works.

```http theme={null}
POST https://cdn.openinary.dev/upload
x-api-key: oik_your_api_key
```

Keys are created in the dashboard under **Settings → API keys**, shown once, and pinned to a single bucket. That is why no endpoint takes a bucket ID: the key carries it. See [create an API key](https://docs.openinary.dev/cloud/quickstart.md#2-create-an-api-key). The dashboard at `https://app.openinary.dev` is not an API.

## The bucket prefix

Delivery is the one path that differs. It is public and needs no key.

```
https://cdn.openinary.dev/b/{bucketId}/t/{transformations}/{path}
```

Self-hosted, the same URL is `{base}/t/{transformations}/{path}`. Only the prefix changes: the transformation syntax after it is identical, and so is every other endpoint. See [your base URL](https://docs.openinary.dev/media-transformations/overview.md#your-base-url).

The `bucketId` is the `/b/.../` segment of the `url` an upload returns. It appears in every public URL you serve, so it is not a secret.

## What Cloud has

Every endpoint below behaves exactly as the shared reference describes it.

| Group | Endpoints |
| - | - |
| Files | [`POST /upload`](https://docs.openinary.dev/api-reference/files/upload) · [`POST /upload/sign`](https://docs.openinary.dev/api-reference/files/upload-sign) · [`POST /upload/createfolder`](https://docs.openinary.dev/api-reference/files/create-folder) · [`GET /download/{path}`](https://docs.openinary.dev/api-reference/files/download) |
| Storage | [list](https://docs.openinary.dev/api-reference/storage/list.md) · [folders](https://docs.openinary.dev/api-reference/storage/folders.md) · [summaries, stats, recalculate](https://docs.openinary.dev/api-reference/storage/stats.md) · [metadata](https://docs.openinary.dev/api-reference/storage/metadata.md) · [rename](https://docs.openinary.dev/api-reference/storage/rename.md) · [move](https://docs.openinary.dev/api-reference/storage/move.md) · [copy](https://docs.openinary.dev/api-reference/storage/copy.md) · [delete](https://docs.openinary.dev/api-reference/storage/delete.md) |
| Cache | [`POST /storage/cache/clear`](https://docs.openinary.dev/api-reference/cache/invalidate) |
| Video | [`GET /video-status/{path}`](https://docs.openinary.dev/api-reference/video/status) · [`GET /queue/events`](https://docs.openinary.dev/api-reference/queue/events) |

## What Cloud does not have (yet)

| Missing | What to do instead |
| - | - |
| `/authenticated/s--{sig}/…` signed delivery URLs | Keep genuinely private assets off Cloud for now |
| `/api-keys/*` | Manage keys in the dashboard |
| `/queue/stats`, `/queue/worker/stats`, `/queue/jobs` | Use `/queue/events` for live job updates |
| `DELETE /invalidate/{path}` | `POST /storage/cache/clear`, or delete and re-upload the asset |
| `/download-folder`, `/download-zip` | Download files individually |
| `/health` | Status is reported in the dashboard |

The `transformations` field on `POST /upload`, which prewarms variants on self-hosted, is accepted and ignored. Variants are generated on the first request instead.

## Presigned uploads

`POST /upload/sign` works as the [shared reference](https://docs.openinary.dev/api-reference/files/upload-sign.md) describes. The token names the account, bucket and folder it was minted for, so it cannot be replayed against another bucket. A signature that fails verification returns `401 Invalid or expired upload signature`, a Cloud-specific message.

See [File Uploader on Cloud](https://docs.openinary.dev/cloud/file-uploader.md) for the full browser flow.

## Video processing

Identical to self-hosted. The first request for a transformed video returns `202`, and you poll [`/video-status`](https://docs.openinary.dev/api-reference/video/status) or subscribe to [`/queue/events`](https://docs.openinary.dev/api-reference/queue/events) until it reports `completed`.

A video URL carrying no parameters is never transcoded. It streams the stored file with range requests, so seeking works, and costs no processing minutes.

## Errors

Same error shape as self-hosted, plus one status code of its own.

| Status | Meaning |
| - | - |
| `400` | Invalid parameters, unsupported file type, or a malformed path |
| `401` | Missing, invalid, disabled or expired API key, or an expired upload signature |
| `402` | A plan limit was reached |
| `403` | Account suspended |
| `404` | No such file, folder, bucket, or job |
| `429` | Rate limited |
| `500` | Something broke on our side |

A `402` names the allowance that ran out:

```json theme={null}
{
  "error": "Storage limit reached on the Free plan. Enable pay as you go to lift this limit.",
  "code": "quota_exceeded",
  "feature": "storage_mb",
  "plan": "Free",
  "planUrl": "https://app.openinary.dev/?settings=plan"
}
```

`feature` is one of `storage_mb`, `image_transformations`, `video_processing_seconds` or `cdn_requests`. Past the transformation quota, cached assets keep being served and only new work is refused. See [plans and limits](https://docs.openinary.dev/cloud/overview.md#plans-and-limits).

## Rate limits

| Scope | Limit |
| - | - |
| CDN delivery, per IP | 300 requests / 60s |
| CDN delivery, per account | 1,000 requests / 60s |

Both apply to the `/b/*` delivery path only, and both answer `429`. Upload, signing and storage calls are not rate limited. They exist to stop abuse rather than to shape normal traffic, so get in touch before you expect to run against them.

## Related

> [card] [API Reference](https://docs.openinary.dev/api-reference/introduction.md)
>
> Every endpoint, documented once for both deployments.

> [card] [Cloud Quickstart](https://docs.openinary.dev/cloud/quickstart.md)
>
> Account, key, first upload, first transformed URL.

> [card] [Account & buckets](https://docs.openinary.dev/cloud/overview.md)
>
> Buckets, plans, limits and billing.

> [card] [File Uploader on Cloud](https://docs.openinary.dev/cloud/file-uploader.md)
>
> Browser uploads with no key in the bundle.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.