Skip to content

Creator API

Connect your build tools and AI agents to your Mayavoo games.

Start with a key

Sign in, complete your creator profile, and create a key in your account. Use read only for status tools, or read and write to upload and edit games. Keys expire after 90 days and can be revoked at any time.

Keep the key in an environment variable or secret store. Send it as Authorization: Bearer YOUR_KEY to /api/v1 on this site over HTTPS. Keys access only their owner's games.

Give your agent the plain-text guide and OpenAPI schema. All write requests need a persisted UUID in the Idempotency-Key header.

Make your first request

Set MAYAVOO_API_KEY in your shell from a secret store, then list your games:

curl https://mayavoo.com/api/v1/games \
  -H "Authorization: Bearer $MAYAVOO_API_KEY"

The response contains games, your quota, and nextCursor. Each game has an id to use for details, edits, and new versions. A read-only key is enough for GET requests.

To create a draft, send a title and persist a UUID for retries:

node -e 'console.log(crypto.randomUUID())' > create-operation.txt
curl https://mayavoo.com/api/v1/games \
  -H "Authorization: Bearer $MAYAVOO_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(cat create-operation.txt)" \
  --data '{"title":"Orbit Garden"}'

Keep the returned game.id. The missingFields array tells you what to complete before submitting a build. These examples use a POSIX shell; the downloadable Node.js script also works on Windows.

Upload a game

  1. Create a draft with a title and listing text, or get the ID of an existing game.
  2. Reserve uploads for the cover, screenshots, and build ZIP. PUT each file directly to its returned URL, with the returned headers. Keep your API key out of these upload requests.
  3. PATCH the listing with the uploaded image keys. Supply title, shortDescription, description, instructions, category, devices, a cover, and at least one screenshot.
  4. POST the buildKey to the versions endpoint. Poll the returned status URL every 30 seconds or longer. Processing checks the files before a reviewer can approve publication.

For a new version, upload a new ZIP and submit it to the same game. Editing details updates the live listing; submitting a build starts a review.

Download the Node.js upload example and example manifest. The script saves its operation IDs so interrupted uploads can be resumed.

Endpoints

All paths below begin with /api/v1. Collection responses include nextCursor. Pass it back with ?cursor=…&limit=20 to continue.

  • GET /games

    List games and account quota

  • POST /games

    Create a draft game

  • GET /games/{gameId}

    Read details and current status

  • PATCH /games/{gameId}

    Edit listing details

  • POST /games/{gameId}/uploads

    Reserve a direct file upload

  • GET /games/{gameId}/versions

    List submitted versions

  • POST /games/{gameId}/versions

    Submit a build for review

  • GET /games/{gameId}/versions/{versionId}

    Read processing and review status

Retries and limits

Persist one UUID per write operation before sending it. Retry with the same UUID and JSON for up to seven days. Different input with the same UUID returns a conflict. After that window, read the game before taking another action.

PATCH keeps omitted fields and replaces supplied arrays. Read the current listing before editing images. The response contains retained image keys to use in later edits.

Use Retry-After on 429 responses and exponential backoff for network errors and 5xx responses. Errors include a code, field names, a retryable flag, and a request ID. Quota and validation errors need action before retrying.

Each key allows approximately 60 requests and 10 writes per minute. The account ceiling across all keys is 120 requests and 20 writes per minute, with an additional 300-request IP limit. These edge counters apply per Cloudflare location. Uploads allow 30 new reservations per account per hour.

Builds are limited to one pending version per game and five per account. The games response reports your game quota. JSON request bodies can be up to 64 KiB.

ZIP files can be up to 50 MiB. JPEG, PNG, and WebP images can be up to 5 MiB and 20 million pixels. A listing can have six screenshots. Upload links last five minutes; repeat the same reservation to refresh a link.

Your data and credentials

Keys access only their owner's games. Responses include listing details, version status, and quotas. They exclude account emails, sign-in tokens, key hashes, reviewer identities, and internal build data.

Signed upload URLs grant temporary access to one upload and must stay private. Game images are public, including draft images. Keep API keys in your build tool's secret store and revoke a key if it is exposed.

The full guide includes request and response examples for all eight operations, required fields, upload instructions, and an error reference.

Prepare the build

Upload a production dist ZIP: index.html, HTML/CSS/JS files, and assets/ for game media, fonts and data. A single dist/ wrapper is accepted. Exclude source files, dependencies, source maps, configs, archives and unused assets. Use relative asset URLs. Code is minified during processing; bundle and remove unused files before uploading.