---
name: agentdrop
description: >-
  Publish and update static sites (Markdown or HTML) plus short-lived supporting
  assets by calling the AgentDrop HTTP API. Use whenever the user asks to host,
  publish, share, or deploy a page, doc, report, landing page, or HTML/Markdown
  site and get back a public URL.
---

# AgentDrop

Deploy a static site (Markdown or HTML) with one HTTP call and get back a public,
real-time, undoable URL. Upload small supporting assets like images, MP4/WebM
videos, audio, PDFs, CSS, and fonts when the document needs them. No SDK, no API
key, no account required.

**API base:** `https://abundant-poodle-82.convex.site`

## How to deploy — it is just an HTTP call (there is NO CLI)

AgentDrop is **only an HTTP API**. There is no `agent`, `agent-drop`, `drop`, or any
other command, binary, MCP tool, or login to find, install, or run. **Do not search the
machine for a deploy command and do not run one.** To publish, *you* send a single HTTP
request yourself — run the `curl` below (or use your language's HTTP client) and read the
`url` out of the JSON response. That is the entire deploy.

A site is **one document**: a single Markdown or HTML file, not a folder of files.
If a new document references local files like `./assets/hero.mp4`, first create
the site to get a `slug` and `editToken`, upload each supporting file with the
assets endpoint (below), replace the local paths with the returned public `url`,
then `PUT` the final HTML back to the same slug. For an existing site, upload
the assets and then update the HTML. Never leave local paths in published content;
they will not resolve for viewers.

## Security — read first

NEVER put secrets in site content: no API keys, tokens, passwords, private keys,
`.env` values, connection strings, or internal URLs. Site content is **public**.
AgentDrop also rejects obvious credentials, but you are the first line of defense.

## Deploy a site

```bash
curl -X POST https://abundant-poodle-82.convex.site/api/v1/sites \
  -H "Content-Type: application/json" \
  -d '{
    "kind": "markdown",            # "markdown" or "html"
    "title": "Optional title",
    "content": "# Hello\n\nMarkdown or a full HTML document."
  }'
```

Response:

```json
{
  "slug": "3f9a8c1e-7b2d-4c6a-9e1f-2a8b7c6d5e4f",
  "url": "https://app.example/3f9a8c1e-7b2d-4c6a-9e1f-2a8b7c6d5e4f",        // share this with the user
  "manageUrl": "https://app.example/manage/3f9a8c1e-7b2d-4c6a-9e1f-2a8b7c6d5e4f?t=SECRET",
  "editToken": "SECRET",                          // SAVE THIS
  "kind": "markdown",
  "expiresAt": 1730000000000
}
```

Each deploy is assigned a random unguessable URL automatically — you don't choose it.
**Persist the `editToken` and `slug`** (e.g. in your working notes). You need the
token to update, undo, or delete the site later. Give the user the `url` and the
`manageUrl` (the manage page lets them sign in to keep the site for 90 days).

## Update content (replaces the current version, keeps history)

```bash
curl -X PUT https://abundant-poodle-82.convex.site/api/v1/sites/<slug> \
  -H "Authorization: Bearer <editToken>" \
  -H "Content-Type: application/json" \
  -d '{ "kind": "markdown", "content": "# Updated" }'
```

Prefer **update / undo over re-creating** a site — the URL stays stable and viewers
see changes in real time.

## Undo / redo

```bash
curl -X POST https://abundant-poodle-82.convex.site/api/v1/sites/<slug>/undo -H "Authorization: Bearer <editToken>"
curl -X POST https://abundant-poodle-82.convex.site/api/v1/sites/<slug>/redo -H "Authorization: Bearer <editToken>"
```

Use these to revert a bad edit instead of resending the whole site. Returns the new
`{ canUndo, canRedo, version, versions }`.

## Status & raw content

```bash
curl https://abundant-poodle-82.convex.site/api/v1/sites/<slug>          # metadata + history status
curl https://abundant-poodle-82.convex.site/api/v1/sites/<slug>/raw      # the raw Markdown/HTML
```

## Assets (optional)

Upload a small supporting asset, then embed the returned `url` in your Markdown/HTML.
Use this for images and short-lived media such as MP4/WebM video clips.

For a brand-new page with local assets, deploy once to get `slug`/`editToken`,
upload assets, then update the page content with the rewritten URLs.

```bash
curl -X POST https://abundant-poodle-82.convex.site/api/v1/sites/<slug>/assets \
  -H "Authorization: Bearer <editToken>" \
  -H "Content-Type: video/mp4" \
  --data-binary @demo.mp4
# → { "url": "https://abundant-poodle-82.convex.site/api/v1/assets/<id>", "assetKind": "video", "expiresAt": 1730000000000 }
```

Supported types:
- Images: PNG, JPEG, WebP, GIF, AVIF, SVG — ≤ 5 MB each, expire after 7 days.
- Video: MP4, WebM, Ogg/Theora, QuickTime — ≤ 25 MB each, expire after 3 days.
- Audio: MP3, M4A, WAV, WebM, Ogg, AAC — ≤ 10 MB each, expire after 3 days.
- Other small supporting assets: PDF, CSS, WOFF/WOFF2 fonts — ≤ 10 MB for PDF,
  ≤ 2 MB for CSS/fonts, expire after 3 days.

Each site can have up to 20 assets. The older `/images` endpoint still works for
image uploads only; use `/assets` for everything new. Tell the user when you use
assets because these URLs are public and short-lived.

## Delete

```bash
curl -X DELETE https://abundant-poodle-82.convex.site/api/v1/sites/<slug> -H "Authorization: Bearer <editToken>"
```

## Retention

- Anonymous sites: kept **30 days** from the last update.
- Claimed sites (user signs in on the manage page): **90 days**.
- Image assets: **7 days**, always.
- Video/audio/PDF/CSS/font assets: **3 days**, always.

## Limits

- Content: ≤ 1 MB per site. `kind` must be `markdown` or `html`.
- Assets: ≤ 20 per site, with the per-type limits above. Asset URLs are public
  bearer URLs and expire independently from the site.
- Errors return JSON `{ "error": "..." }` with a 4xx/5xx status; rate limits return 429.
