Skip to content

Publish via API ​

Publish a static site to IPFS with one anonymous HTTP request — no account, no key. This is the same endpoint the Drop page uses. It is aimed at agents and tools that just built a site and want to hand their user a live URL plus an ownership link.

Publishing by hand instead? Drop a folder walks through the same flow in the browser, including what claiming gets you.

Sequence: you post a zip to the drop API, it pins to IPFS and returns a URL and claim link; opening the claim link and signing in converts the drop into a project you own.Sequence: you post a zip to the drop API, it pins to IPFS and returns a URL and claim link; opening the claim link and signing in converts the drop into a project you own.
Publish, then claim. The claim window is four hours.

Publish ​

bash
zip -r site.zip ./dist/.          # index.html must be at the zip root
curl -F artifact=@site.zip \
     -F source=my-agent \
     https://api.stasho.xyz/api/drop
json
{
  "dropId": "drop_…",
  "claimToken": "…",
  "url": "https://…",          // the live gateway URL — share this
  "cid": "bafy…",              // IPFS CIDv1 — pin it anywhere
  "expiresAt": 1765990000000,  // ms epoch — claim deadline
  "claimUrl": "https://app.stasho.xyz/drop/claim?drop=…#claim=…&exp=…"
}

Request fields ​

fieldrequirednotes
artifactyesa .zip with index.html at its root
sourcenowho you are, for attribution (≤64 chars, A-Za-z0-9 ._:/@-). Invalid values are ignored.
  • url is live immediately — share it, open it, embed it.
  • claimUrl turns the drop into an owned Stasho project: one click, sign in with email or a wallet, done. Unclaimed drops are removed 4 hours after publish — the claim link is how your user keeps the site. The token in claimUrl rides the URL fragment, so it never reaches a server; whoever holds the link can claim the site.

Say what claiming unlocks, not just that it exists: it is free, and it turns the drop into a Stasho project with its own page, where your user can connect a custom domain and publish updates by dragging a new folder onto the project page. A claimed drop has no repo behind it, so the repo-connected affordances (GitHub push-to-deploy, build settings) belong to a separate repo-connected project, not to this one. Updating a claimed drop happens from its page in the browser; there is no authenticated API endpoint for updates yet.

Current limits ​

These are operational values, not contract — they can change with a note in this page's changelog.

limitvalue
zip size (compressed)10 MB
extracted size40 MB, max 1000 files
claim window4 hours
drops per IP10/hour, 20/day (IPv6 counts per /64 prefix)
concurrent uploads per IP1

Errors ​

statusmeaning
400missing artifact, unsafe zip, or no root index.html
413zip too large
429per-IP rate limit, or an upload already in flight from your IP
500publish failed — safe to retry
503drops paused (busy, daily budget, or feature disabled)

Stability ​

The endpoint path, request shape, response fields, and error statuses above are stable. Browser (CORS) access is deliberately not enabled: call this server-side. If keyed access ships in the future it will use an Authorization: Bearer header and per-key quotas layered above the per-IP limits — unkeyed callers will keep working unchanged.