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-dataFields
| Field | Details |
|---|---|
bundle | Required. The complete replacement ZIP, checked like an import. |
upload_id, upload_token | Optional, together: an update session's media. See Upload media in a session. |
expected_version | Required. The last content_version the caller accepted. |
operation_id | Required. A UUID saved before the request and reused for a retry. |
title / name, description, thumbnail | Optional. 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_idand the same input returns the recorded result without another release. Reusing it with different input returnsoperation_reused. - Editor changes on Rosebud change
content_version. A staleexpected_versionreturns409 version_conflict, andchanged_pathssays what changed. Read the files back, merge locally, and send a new operation with the newcontent_version. A conflict is never merged for you.
changed_paths | Meaning |
|---|---|
["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. |
null | Unknown. 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_busymeans Rosebud generation is running in the game.
No generative-model calls run on import, claim, approval or release.