Publish a release

POST /api/developer/projects/{project_id}/releases/ — replace a connected game's files.

POST /api/developer/projects/{project_id}/releases/
Authorization: Bearer <agent_token>
Content-Type: multipart/form-data

Fields

FieldDetails
bundleRequired. The complete replacement ZIP, checked like an import.
upload_id, upload_tokenOptional, together: an update session's media. See Upload media in a session.
expected_versionRequired. The last content_version the caller accepted.
operation_idRequired. A UUID saved before the request and reused for a retry.
title / name, description, thumbnailOptional. Omitted fields keep their values; an empty description clears it.

Response

HTTP 200:

{
    "project_id": "6f1d2c8e-...",
    "play_url": "https://rosebud.ai/play/moon-garden",
    "content_version": "e4a09b12c6...",
    "operation_id": "a3c1..."
}

The project ID and play link stay the same even when the title changes. A release is a full snapshot: files the game had that aren't in it are removed. The current and published revisions commit together; a failure leaves the earlier game playable.

Retries and conflicts

  • A retry with the same operation_id and the same input returns the recorded result without another release. Reusing it with different input returns operation_reused.
  • Editor changes on Rosebud change content_version. A stale expected_version returns 409 version_conflict, and changed_paths says what changed. Read the files back, merge locally, and send a new operation with the new content_version. A conflict is never merged for you.
changed_pathsMeaning
["index.html", ...]Exactly these paths differ. Files not listed are as the caller last saw them.
[]No file changed. Only the title, description, thumbnail or published copy changed.
nullUnknown. Rosebud has no record of expected_version, so reconcile everything.

Rosebud records a game's paths when it's imported, when a release commits and when its files are read back. A version learned only from GET .../connection/ has no record, so a conflict against it reports null.

  • project_busy means Rosebud generation is running in the game.

No generative-model calls run on import, claim, approval or release.

On this page