For agents

Built for agents.

Your agent can list a game in one request. No account needed. Listings go live immediately; humans moderate after.

REST, MCP, a hosted SKILL.md and llms.txt. Same API behind all four.

One request, bash
curl -X POST https://dreambit.app/api/v1/submissions \
  -H 'Content-Type: application/json' \
  -d '{"url":"https://example.com/play"}'
01

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.

Bash
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 · ≤80

    Game title. Filled from og:title / <title> when omitted.

  • taglinestring · ≤160

    One line under the title. Filled from og:description when omitted.

  • descriptionstring · ≤2000

    Longer 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) · ≤5

    Up to 5 screenshots, copied into Dreambit storage.

  • categorystring

    One category.

    action · puzzle · rpg · platformer · strategy · simulation · racing · horror · casual · arcade · multiplayer · other

  • tagsstring[] · ≤5

    Up to 5 free-form tags (slugified).

  • platformsstring[]

    Where it runs. Defaults to ["web"].

    web · ios · android · steam · windows · mac · linux · other

  • ai_toolsstring[] · ≤5

    What 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.

  • slugstring

    Requested URL slug (2–80 chars, [a-z0-9-]). Generated from the title when omitted; a suffix is added on collision.

  • contact_emailstring

    Reviewer contact. Never displayed.

  • notesstring · ≤500

    Notes for the human reviewers. Never displayed.

02

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.

201 Created
{
  "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."
}
409 Conflict
{
  "error": {
    "code": "duplicate",
    "message": "This game is already listed on Dreambit."
  },
  "existing": {
    "slug": "neon-drift",
    "status": "live",
    "url": "https://dreambit.app/games/neon-drift"
  }
}
StatusCodeMeaningRetry
409duplicateA listing with the same canonical URL already exists. `existing` has its slug, status and page URL. Do not retry.Never
429rate_limitedToo many submissions. Honour `Retry-After` / `error.retry_after_seconds`.After waiting
422url_unreachableThe URL did not respond with a 2xx/3xx within 8 seconds (or redirected more than 3 times).After fixing
400url_not_allowedThe URL points at a private/internal address, a literal IP, or a non-https scheme.Never
400invalid_fieldA field is the wrong type, too long, or an unknown enum value. `error.field` names it.After fixing
400invalid_url`url` (or another URL field) is missing or not a valid https URL.After fixing
400slug_takenThe requested slug is already used. `error.suggestion` has a free alternative.After fixing
401invalid_api_keyThe Bearer key is unknown or revoked. Never falls back to anonymous — fix or drop the header.After fixing
401auth_requiredThis 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.

03

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 Code
claude mcp add dreambit --transport http https://dreambit.app/api/mcp
  • submit_game

    Submit 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_games

    Search or browse live listings on Dreambit.

    q · category · platform · tool · sort · period · limit

  • get_submission_status

    Check a submission by id: status (live/pending/rejected/revoked), review verdict, rejection reason.

    id

  • get_listing

    Fetch one live listing by slug.

    slug

Any MCP client (JSON)
{
  "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.

04

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.

Hosted at
https://dreambit.app/skill/submit-game/SKILL.md

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.

Install into a project
mkdir -p .claude/skills/submit-game && \
  curl -fsSL https://dreambit.app/skill/submit-game/SKILL.md -o .claude/skills/submit-game/SKILL.md
05

A 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.

Standing prompt
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/mcp
06

API 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.

Format
db_live_ + 40 characters

Created at /me/developer. Shown once. Up to five active per account. A bad key is a 401, never a silent fallback to anonymous.

Bash, with a key
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"}'
07

Everything else

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.