My Mini App Hoster

API

Everything the dashboard does is available over HTTPS. Create an API token in the dashboard and send it as Authorization: Bearer <token>. Tokens act as you, on your plan.

Publish from Claude instead

New here? The step-by-step guide walks through every route below.

The same platform is a remote MCP server. Add https://myminiapp.dev/mcp as a custom connector in Claude.ai, or run claude mcp add --transport http myminiapp https://myminiapp.dev/mcp, sign in, and ask Claude to publish.

Sites

GET/api/meYour account, plan and quota.
GET/api/sitesYour sites.
POST/api/sitesClaim a slug. Body {"slug": "my-app"}.
GET/api/sites/:slugState and recent deployments.
DELETE/api/sites/:slugDelete the site and all its files.
POST/api/sites/:slug/deployUpload a zip body (Content-Type: application/zip). Claims the slug if new. Returns the deployment id, URL and any warnings.
POST/api/sites/:slug/rollback/:deployIdMake an earlier deployment live.
GET/api/sites/:slug/analytics?days=NViews and visitors. Days are clamped to your plan.
POST/api/sites/:slug/listingShow in the gallery. Body {"listed": true, "title": "...", "description": "..."}.
POST/api/sites/:slug/passwordPremium. Body {"password": "..."} or {"password": null}.
GET, POST/api/sites/:slug/domainsPremium. Attach a hostname: body {"hostname": "app.example.com"}, then CNAME it to origin.myminiapp.dev.
DELETE/api/sites/:slug/domains/:hostnameDetach a hostname.

Public

GET/api/galleryListed sites with ratings and favourite counts.
POST/api/reportReport a site. Body {"site": "slug", "reason": "phishing|malware|adult|spam|copyright|other", "details": "..."}.
GET/api/statusHealth of the database and storage.

Example

zip -r site.zip index.html
curl -X POST https://myminiapp.dev/api/sites/my-app/deploy \
  -H "Authorization: Bearer mah_..." \
  -H "Content-Type: application/zip" \
  --data-binary @site.zip

Rules

An upload must have index.html at the top level and stay within your plan's size and file limits. Scripts may only load from well-known CDNs. Content that looks like phishing or a forced redirect is rejected; see the acceptable use rules. Errors come back as JSON with an error field and, for validation, an errors list.

Limits

Each account gets a number of deploys per day (30 on free, 100 on Premium; /api/me reports yours). The allowance refills continuously rather than resetting, so after a burst the next deploy is back within minutes, and a rejected upload costs nothing. A site keeps the files of its newest deployments only (3 on free, 10 on Premium): older ones stay in the history but cannot be made live again. Writes are also limited per address, and an account used from more than a few countries in one day has its writes paused for that day while reads keep working. Over a limit, the API answers 429 with an exact retryAfterSeconds.