---
name: my-storage-api
version: 1.0.0
description: >
Edge-hosted asset storage. Upload local files (.png/.jpg/.gif/.webp) directly, or have the server fetch from a public URL. Each asset gets a stable public CDN URL.
triggers: [storage, upload, ingest, asset, cdn, image hosting, file upload, get-url, download, public url]
checksum: sha256-pending
---
# MyStorageAPI
Per-org asset storage with edge CDN delivery. Two ways in: direct upload (local file → multipart) or ingest (server fetches a public URL). Both produce a stable public URL like `https://api.mystorageapi.com/storage/<id>`.
## Capabilities
<!-- llm:start -->
Storage is the asset layer. Anything you upload or ingest is served from the edge under a permanent public URL — embed it in funnel pages, email templates, anywhere.
`upload` accepts `.png`, `.jpg`, `.jpeg`, `.gif`, `.webp`, `.svg`, `.pdf`, `.mp4`, `.webm` from the local filesystem. For any other extension, host the file somewhere public and use `ingest` instead — the server fetches it for you.
Generated images from **myimageapi** automatically land here; they appear in `storage list` under their job id.
Use `get` for a round-trip metadata fetch. Use `get-url` when you just need the URL — it's a pure local URL constructor (no API call, no auth, no rate limit), perfect for piping to curl or embedding into HTML.
<!-- llm:end -->
## Commands
<!-- generated:start -->
| Command | What it does |
|---|---|
| `myapi storage list` | List all stored assets |
| `myapi storage upload <file>` | Direct multipart upload of a local file (image/svg/pdf/mp4/webm) |
| `myapi storage ingest <url>` | Server fetches a public URL into storage |
| `myapi storage get <asset_id>` | Round-trip the API for full metadata (`--json` or human block) |
| `myapi storage get-url <asset_id>` | Pure local URL constructor — no API call, no auth |
| `myapi storage delete <asset_id>` | Permanently delete the asset |
<!-- generated:end -->
## Examples
<!-- llm:start -->
```bash
# Direct upload of a local image
myapi storage upload ./logo.png --name "brand-logo"
# Ingest a remote file (server pulls it down)
myapi storage ingest https://example.com/hero.jpg --name "hero"
# Inspect
myapi storage list
myapi storage get <asset_id>
# Embed the URL — no API call, perfect for scripts
URL=$(myapi storage get-url <asset_id>)
echo "<img src=\"$URL\" />"
curl -O "$URL"
# Clean up
myapi storage delete <asset_id>
```
<!-- llm:end -->
## Upload vs Ingest
- **`upload`** — file is on your machine. Multipart POST. Supported extensions: `.png`, `.jpg`, `.jpeg`, `.gif`, `.webp`, `.svg`, `.pdf`, `.mp4`, `.webm`.
- **`ingest`** — file is at a public HTTP(S) URL. Server downloads and stores. Useful for migrating assets, pulling in third-party files you have rights to, or for extensions `upload` doesn't accept.
Both produce identical asset records — `list` doesn't distinguish.
## `get` vs `get-url`
- **`get <id>`** — round-trips the API. Returns name, URL, created_at. Honors `--json`. Use when you want metadata.
- **`get-url <id>`** — local URL constructor. No API call, no auth, no rate limit. Output is exactly `https://api.mystorageapi.com/storage/<id>` (or whatever `MYAPI_STORAGE_URL` is set to). Use to embed URLs into HTML, pipe to curl, or build download links cheaply.
## Notes
- Assets are public by default — don't store sensitive files.
- Delete is immediate and unrecoverable — run `myapi storage list` first to confirm the asset, pass `--org` explicitly, and pass `--yes` in non-interactive runs.
- The URL is permanent until you `myapi storage delete <id>` — embed it freely.
Run `myapi storage --help` for full flag reference.