One request
Only url is required. Everything else is optional and read from the page's OpenGraph tags when you leave it out — never invent metadata you don't have.
curl -X POST https://dreambit.app/api/v1/submissions \
-H 'Content-Type: application/json' \
-d '{"url":"https://example.com/play"}'Required
urlstring (https URL)Where the game is played. Must be https and publicly reachable; the server fetches it to verify and to read OpenGraph tags.
Optional
embed_urlstring (https URL)Alternate URL to load inside the on-site player when it differs from `url` (for example an itch.io embed URL). Defaults to `url`.
titlestring · ≤80Game title. Filled from og:title / <title> when omitted.
taglinestring · ≤160One line under the title. Filled from og:description when omitted.
descriptionstring · ≤2000Longer description shown on the listing page.
thumbnail_urlstring (https URL)Cover image, ideally 4:3. Filled from og:image when omitted. Copied into Dreambit storage.
screenshotsstring[] (https URLs) · ≤5Up to 5 screenshots, copied into Dreambit storage.
categorystringOne category.
action · puzzle · rpg · platformer · strategy · simulation · racing · horror · casual · arcade · multiplayer · other
tagsstring[] · ≤5Up to 5 free-form tags (slugified).
platformsstring[]Where it runs. Defaults to ["web"].
web · ios · android · steam · windows · mac · linux · other
ai_toolsstring[] · ≤5What it was made with ("Made with" badges). Known values get a label; unknown tools are accepted as slugs.
claude-code · claude · cursor · codex · chatgpt · copilot · gemini · grok · windsurf · bolt · v0 · replit · lovable · rosebud · dreambit · other
source_code_urlstring (https URL)Public repo, if any.
creatorobject { name?, url?, x_handle? }Who made it, when it is not the caller. Omit when submitting your own game with a session or API key — the listing is attributed to you automatically.
slugstringRequested URL slug (2–80 chars, [a-z0-9-]). Generated from the title when omitted; a suffix is added on collision.
contact_emailstringReviewer contact. Never displayed.
notesstring · ≤500Notes for the human reviewers. Never displayed.
What comes back
201 means it's live. Read listing.url and report it. A 409 means the game is already listed — report existing.url and never retry. A 429 means stop and wait Retry-After.
{
"ok": true,
"listing": {
"id": "4b1f2c7e-9a3d-4e58-b0c1-7d2f6a9e5c31",
"slug": "neon-drift",
"status": "live",
"url": "https://dreambit.app/games/neon-drift",
"status_url": "https://dreambit.app/api/v1/submissions/4b1f2c7e-9a3d-4e58-b0c1-7d2f6a9e5c31",
"embeddable": true,
"enriched": {
"title": false,
"tagline": true,
"description": false,
"thumbnail": true
},
"attribution": "anon"
},
"message": "Live now. Players rank it; humans moderate it. Claim it at https://dreambit.app/games/neon-drift if you're the creator."
}{
"error": {
"code": "duplicate",
"message": "This game is already listed on Dreambit."
},
"existing": {
"slug": "neon-drift",
"status": "live",
"url": "https://dreambit.app/games/neon-drift"
}
}| Status | Code | Meaning | Retry |
|---|---|---|---|
| 409 | duplicate | A listing with the same canonical URL already exists. `existing` has its slug, status and page URL. Do not retry. | Never |
| 429 | rate_limited | Too many submissions. Honour `Retry-After` / `error.retry_after_seconds`. | After waiting |
| 422 | url_unreachable | The URL did not respond with a 2xx/3xx within 8 seconds (or redirected more than 3 times). | After fixing |
| 400 | url_not_allowed | The URL points at a private/internal address, a literal IP, or a non-https scheme. | Never |
| 400 | invalid_field | A field is the wrong type, too long, or an unknown enum value. `error.field` names it. | After fixing |
| 400 | invalid_url | `url` (or another URL field) is missing or not a valid https URL. | After fixing |
| 400 | slug_taken | The requested slug is already used. `error.suggestion` has a free alternative. | After fixing |
| 401 | invalid_api_key | The Bearer key is unknown or revoked. Never falls back to anonymous — fix or drop the header. | After fixing |
| 401 | auth_required | This endpoint needs a signed-in session or an API key. | After fixing |
Poll GET https://dreambit.app/api/v1/submissions/{id} for status, review verdict and rejection reason.
Claude Code or any MCP client
The same capabilities as tools over Streamable HTTP. Add the server once; the agent gets submit_game, search_games and status lookups.
claude mcp add dreambit --transport http https://dreambit.app/api/mcpsubmit_gameSubmit an AI-made game to Dreambit. Only `url` is required; everything else is optional and auto-filled from the page. Returns the live listing URL, or a structured error (duplicate, rate_limited, url_unreachable…). Only submit games the user actually made.
url · title · tagline · description · category · tags · platforms · ai_tools · thumbnail_url · embed_url · source_code_url · creator · slug · dry_run
search_gamesSearch or browse live listings on Dreambit.
q · category · platform · tool · sort · period · limit
get_submission_statusCheck a submission by id: status (live/pending/rejected/revoked), review verdict, rejection reason.
id
get_listingFetch one live listing by slug.
slug
{
"mcpServers": {
"dreambit": {
"type": "http",
"url": "https://dreambit.app/api/mcp"
}
}
}Endpoint: https://dreambit.app/api/mcp. Pass an API key as Authorization: Bearer to attribute submissions.
Skill file
A hosted SKILL.md that teaches an agent when to submit, what to send, and how to handle every response. Generated from the same source as this page.
Name: submit-game-to-dreambit. Triggers on “publish / list / share my game”. Rules: only the user's own games, never invent metadata, never retry a 409, stop on 429.
mkdir -p .claude/skills/submit-game && \
curl -fsSL https://dreambit.app/skill/submit-game/SKILL.md -o .claude/skills/submit-game/SKILL.mdA standing routine
Paste this into your agent's memory, CLAUDE.md or system prompt once. From then on, “publish it” means it's on Dreambit.
Whenever I finish a playable game and ask you to publish it, list it on Dreambit (https://dreambit.app), the home of AI game dev.
1. Read https://dreambit.app/llms.txt once per session for the current rules.
2. Confirm the game URL loads over https and is public.
3. POST JSON to https://dreambit.app/api/v1/submissions with at least {"url": "<game url>"}. Add title, tagline, category, tags, platforms and ai_tools when you know them — never invent metadata you don't have.
4. On 201: tell me the listing URL and that it's live. On 409 (duplicate): tell me it's already listed and give me the existing URL — don't retry. On 429: stop and tell me when to retry (Retry-After). On 4xx: fix the field named in error.field and try once more.
5. Only submit games I made. Never submit someone else's game without saying who made it in the creator field.
If I give you an API key (db_live_…), send it as a Bearer token so the listing is attributed to my account. Alternatively use the MCP server: claude mcp add dreambit --transport http https://dreambit.app/api/mcpAPI keys
Optional. A key attributes every submission to your account — no claim step — and lifts the anonymous rate limit. Keys can submit and nothing else.
db_live_ + 40 charactersCreated at /me/developer. Shown once. Up to five active per account. A bad key is a 401, never a silent fallback to anonymous.
curl -X POST https://dreambit.app/api/v1/submissions \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer db_live_…' \
-d '{"url":"https://example.com/play"}'Everything else
What Dreambit is, how to submit, the hottest games right now.
dreambit.app/llms.txt ↗openapi.jsonOpenAPI 3.1 for the five public endpoints, bearer scheme, error schema.
dreambit.app/openapi.json ↗feed.jsonJSON Feed 1.1 of the newest listings, with a _dreambit.submit block.
dreambit.app/feed.json ↗Rate limits
- Anonymous: 5 submissions per hour and 20 per day per IP.
- API key: 30 submissions per hour per key.
- Signed-in session: 20 submissions per hour.
- Global: 300 submissions per hour across all callers.
- 429 responses carry `Retry-After` (seconds).
Instant-live, human-moderated
Submissions appear immediately. An automated review can only quarantine; a human decides. Anything that isn't a playable AI-made game, or isn't the submitter's to list, comes down. Read the guidelines once; then trust the 201.
Questions from a human? Join the Discord. Prefer a form? Submit a game in three steps.