> For the complete documentation index, see [llms.txt](https://docs.m-xr.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.m-xr.com/marso-studio-api/api/collections.md).

# Collections

Manage groups of logical Library Assets and their images.

## List collections

> Returns your collections after name, tag, and date filters. Equal creation dates use the collection ID as a stable tie-break.

```json
{"openapi":"3.1.0","info":{"title":"Marso Studio API","version":"0.0.1"},"tags":[{"name":"collections","description":"Manage groups of logical Library Assets and their images."}],"servers":[{"url":"https://api.marso.app/api/public/v1/","description":"Production server."}],"security":[{"apiKey":[]}],"components":{"securitySchemes":{"apiKey":{"type":"http","scheme":"bearer","description":"API key created in the Marso Studio dashboard. The value has the form\n`mxr_live_<entropy>` and is sent as a Bearer token in the `Authorization`\nheader.\n"}},"schemas":{"CollectionList":{"type":"object","description":"A filtered page of collections.","properties":{"data":{"type":"array","description":"The collections in creation-time order.","items":{"$ref":"#/components/schemas/Collection"}},"pagination":{"$ref":"#/components/schemas/PublicPagination"}},"required":["data","pagination"]},"Collection":{"type":"object","description":"A named group of logical Library Assets.","properties":{"marketplace":{"$ref":"#/components/schemas/MarketplaceCollectionInfo","description":"The source version. Absent for a studio Collection."},"collection_id":{"type":"string","description":"The collection ID.","format":"uuid"},"name":{"type":"string","description":"The collection name, from 1 to 100 Unicode characters.","minLength":1,"maxLength":100},"tags":{"type":"array","description":"The display tags. Each tag has 1 to 32 Unicode characters after trim. Case-insensitive duplicates return 400.","items":{"type":"string","description":"The tag text.","minLength":1,"maxLength":32},"maxItems":20},"creator":{"$ref":"#/components/schemas/CollectionCreator"},"asset_count":{"type":"integer","description":"The number of stored member references, including unavailable members.","minimum":0},"thumbnail_url":{"type":"string","description":"The preview URL. It travels with thumbnail_url_expires_at."},"thumbnail_url_expires_at":{"$ref":"#/components/schemas/EpochMillis"},"created_at":{"$ref":"#/components/schemas/EpochMillis"},"updated_at":{"$ref":"#/components/schemas/EpochMillis"}},"required":["collection_id","name","tags","creator","asset_count","created_at","updated_at"]},"MarketplaceCollectionInfo":{"type":"object","description":"The immutable marketplace version that created this personal Collection.","properties":{"listing_id":{"type":"string","format":"uuid","description":"The canonical marketplace listing ID."},"revision":{"type":"integer","minimum":1,"maximum":9007199254740991,"description":"The exact immutable revision, from 1 to 9007199254740991."},"source_type":{"type":"string","enum":["curated"],"description":"Possible enum values: `curated`: content from the curated marketplace."}},"required":["listing_id","revision","source_type"]},"CollectionCreator":{"type":"object","description":"The User who created the collection.","properties":{"user_id":{"type":"string","description":"The creator User ID."},"name":{"type":"string","description":"The current profile name. Absent if unavailable."}},"required":["user_id"]},"EpochMillis":{"type":"integer","format":"int64","description":"Time represented as milliseconds since the Unix epoch.\n"},"PublicPagination":{"type":"object","required":["has_more"],"description":"Cursor pagination envelope.\n","properties":{"next_cursor":{"type":"string","description":"Opaque cursor for the next page. Absent when the result set is\nexhausted. Echo it back verbatim as `cursor`.\n"},"has_more":{"type":"boolean","description":"Whether another page follows. Always agrees with the presence of\n`next_cursor`.\n"}}},"Error":{"type":"object","required":["error"],"description":"Canonical error envelope. The error payload is nested under the `error`\nkey.\n","properties":{"error":{"$ref":"#/components/schemas/ErrorBody"}}},"ErrorBody":{"type":"object","description":"The body of an error response. The `code` is a stable value clients can\nbranch on; the `message` is a human-readable explanation.\n","required":["code","message"],"properties":{"code":{"$ref":"#/components/schemas/ErrorCode"},"message":{"type":"string","description":"Human-readable description of the error.\n"},"details":{"type":["object","null"],"description":"Additional structured information about the error, or `null` if no\nextra details are available.\n","additionalProperties":true}}},"ErrorCode":{"type":"string","description":"Machine-readable error code. The enum contains every code that this API\ncan return.\n\nPossible enum values:\n- `INVALID_REQUEST`: the request body or a query parameter failed validation.\n- `MALFORMED_UUID`: a path parameter that should be a UUID is not one.\n- `UNAUTHORIZED`: the request could not be authenticated.\n- `API_KEY_MISSING`: no API key was supplied.\n- `API_KEY_INVALID`: the supplied API key does not match any known key.\n- `API_KEY_REVOKED`: the supplied API key has been revoked.\n- `PLAN_FEATURE_REQUIRED`: the account plan does not include a required feature.\n- `SUBSCRIPTION_FEATURE_REQUIRED`: a new Marketplace purchase requires a paid plan or assigned seat.\n- `PRICE_CHANGED`: the selected price differs from the price in the request.\n- `VERSION_CHANGED`: the selected Marketplace version differs from the requested version.\n- `IDEMPOTENCY_CONFLICT`: the same key was used for a different purchase request.\n- `DOWNLOAD_UNAVAILABLE`: the retained private content is temporarily unavailable.\n- `CATALOGUE_CHANGED`: the catalogue changed during pagination; restart the query.\n- `LISTING_NOT_FOUND`: the selected listing is absent or delisted.\n- `MARKETPLACE_DOWNLOAD_ONLY`: Marketplace content supports download and cannot enter generation.\n- `INSUFFICIENT_CREDITS`: the account does not have enough credits for this request.\n- `QUOTA_EXCEEDED`: a usage quota for the account has been exceeded.\n- `FILE_TOO_LARGE`: an uploaded or referenced file exceeds the allowed size.\n- `UPLOAD_TIMEOUT`: an image search upload exceeded 60 seconds. Try a smaller file or a faster connection.\n- `INVALID_CONTENT_TYPE`: a file's content type does not match its declared or expected type.\n- `UNSUPPORTED_ASSET_FORMAT`: a file's extension is not one of the supported asset formats.\n- `FORMAT_NOT_AVAILABLE`: the requested downloadable format does not exist for this asset.\n- `INVALID_FBX_ZIP_STRUCTURE`: a `.zip` upload is not a valid FBX bundle. The error message says why.\n- `IMAGE_RESOLUTION_EXCEEDED`: an image is larger than 4096 by 4096 pixels, or a texture in a mesh file is larger than 8192 by 8192 pixels.\n- `VALIDATION_FAILED`: the API could not check the uploaded file. Upload it again. This is the `error.code` of an upload status read. A failed batch item or run uses the same word with another meaning (see `ExecutionErrorBody`).\n- `UPLOAD_EXPIRED`: the upload did not finish within 1 hour. Upload the file again.\n- `MESH_REQUIREMENTS_NOT_MET`: the mesh file has no polygon geometry, no base-color texture, no UV coordinates, or it names a texture that the upload does not hold.\n- `COLLECTION_NOT_FOUND`: the collection does not exist in your account.\n- `PROJECT_NOT_FOUND`: the project does not exist, or another account owns it.\n- `GRAPH_NOT_FOUND`: the graph does not exist in this project.\n- `NODE_NOT_FOUND`: the node does not exist in this graph.\n- `GROUP_NOT_FOUND`: the group does not exist in this graph.\n- `PROJECT_NODE_LIMIT_EXCEEDED`: the project already holds as many nodes as it may hold.\n- `CONFLICT`: the request conflicts with the current state, so the server made no change.\n- `ASSET_NOT_FOUND`: the asset does not exist or does not belong to the account.\n- `ASSET_IN_USE`: an active execution uses a component, or another PBR execution shares a source or target component.\n- `BATCH_TOO_LARGE`: the batch contains more items than the endpoint allows.\n- `CONCURRENT_EXECUTION_LIMIT_EXCEEDED`: the account has reached its limit on simultaneous submissions.\n- `PBR_FAILURE_CAP_EXCEEDED`: the account has too many recent failed PBR runs; new submissions are temporarily blocked.\n- `EXECUTION_NOT_FOUND`: the execution or batch does not exist or does not belong to the account.\n- `EXECUTION_IN_PROGRESS`: the request conflicts with an execution that is still running.\n- `RATE_LIMITED`: the API key's rate limit was exceeded.\n- `SERVICE_UNAVAILABLE`: the requested operation is temporarily unavailable; retry later.\n- `MAINTENANCE_MODE`: the API is temporarily unavailable for maintenance.\n- `INTERNAL_SERVER_ERROR`: an unexpected server error occurred.\n- `WORKFLOW_CREATION_FAILED`: the API could not start the requested generation.\n- `WORKFLOW_API_ERROR`: generation stopped because of an unexpected error.\n","enum":["INVALID_REQUEST","MALFORMED_UUID","UNAUTHORIZED","API_KEY_MISSING","API_KEY_INVALID","API_KEY_REVOKED","PLAN_FEATURE_REQUIRED","SUBSCRIPTION_FEATURE_REQUIRED","PRICE_CHANGED","VERSION_CHANGED","IDEMPOTENCY_CONFLICT","DOWNLOAD_UNAVAILABLE","CATALOGUE_CHANGED","LISTING_NOT_FOUND","MARKETPLACE_DOWNLOAD_ONLY","INSUFFICIENT_CREDITS","QUOTA_EXCEEDED","FILE_TOO_LARGE","UPLOAD_TIMEOUT","INVALID_CONTENT_TYPE","UNSUPPORTED_ASSET_FORMAT","FORMAT_NOT_AVAILABLE","INVALID_FBX_ZIP_STRUCTURE","IMAGE_RESOLUTION_EXCEEDED","VALIDATION_FAILED","UPLOAD_EXPIRED","MESH_REQUIREMENTS_NOT_MET","COLLECTION_NOT_FOUND","PROJECT_NOT_FOUND","GRAPH_NOT_FOUND","NODE_NOT_FOUND","GROUP_NOT_FOUND","PROJECT_NODE_LIMIT_EXCEEDED","CONFLICT","ASSET_NOT_FOUND","ASSET_IN_USE","BATCH_TOO_LARGE","CONCURRENT_EXECUTION_LIMIT_EXCEEDED","PBR_FAILURE_CAP_EXCEEDED","EXECUTION_NOT_FOUND","EXECUTION_IN_PROGRESS","RATE_LIMITED","SERVICE_UNAVAILABLE","MAINTENANCE_MODE","INTERNAL_SERVER_ERROR","WORKFLOW_CREATION_FAILED","WORKFLOW_API_ERROR"]},"PlanFeatureRequiredError":{"type":"object","required":["error"],"description":"The error envelope for a missing subscription feature.","properties":{"error":{"type":"object","required":["code","message","details"],"description":"The missing-feature error body.","properties":{"code":{"type":"string","const":"PLAN_FEATURE_REQUIRED","description":"Stable error code for a missing subscription feature."},"message":{"type":"string","description":"Human-readable description of the error."},"details":{"$ref":"#/components/schemas/PlanFeatureRequiredErrorDetails"}}}}},"PlanFeatureRequiredErrorDetails":{"type":"object","required":["feature","upgrade_plan_codes"],"description":"The missing feature and the active plans that provide it.","properties":{"feature":{"$ref":"#/components/schemas/SubscriptionFeature"},"upgrade_plan_codes":{"type":"array","description":"Active plans available for purchase that provide the missing\nfeature. The array uses plan class and opaque code order.\n","items":{"$ref":"#/components/schemas/SubscriptionPlanCode"}}}},"SubscriptionFeature":{"type":"string","description":"Product capability available to the account.\n\nPossible enum values:\n- `commercial_license`: commercial-use rights.\n- `api_pbr`: PBR generation through the Public Platform API.\n- `api_asset_download`: asset downloads through the Public Platform API.\n- `custom_polycount`: custom polygon counts for 3D generation.\n- `image_edit`: image editing.\n- `multiview`: multiview generation.\n- `asset_download`: asset downloads in the Marso web app.\n- `api_access`: access to the Public Platform API.\n- `scene_generation`: scene generation and multi-asset runs in the Marso web app.\n- `application_apps`: the Sim Ready and Game Ready apps.\n","enum":["commercial_license","api_pbr","api_asset_download","custom_polycount","image_edit","multiview","asset_download","api_access","scene_generation","application_apps"]},"SubscriptionPlanCode":{"type":"string","pattern":"^plan_[A-Za-z0-9]{7,64}$","description":"Opaque and immutable code for a subscription plan. A plan display name\ncan change. The code starts with `plan_`, followed by 7 to 64 ASCII\nletters or digits.\n"}},"responses":{"Unauthorized":{"description":"The API key is missing, invalid, or revoked. Possible error codes:\n`API_KEY_MISSING`, `API_KEY_INVALID`, `API_KEY_REVOKED`, or `UNAUTHORIZED`.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"PlanFeatureRequired":{"description":"The account does not have the plan feature required by this operation\n(`PLAN_FEATURE_REQUIRED`). The Free plan lacks `api_access`, so every\noperation refuses a Free account with this response. An account that\nlacks `api_pbr` or `api_asset_download` also gets it on the routes that\nneed those features.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlanFeatureRequiredError"}}}},"RateLimited":{"description":"Rate limit exceeded (`RATE_LIMITED`). The response includes a `Retry-After`\nheader with the number of seconds to wait before retrying, plus the\n`X-RateLimit-*` headers. Those headers are also present on successful (2xx)\nresponses so a client can pace itself.\n","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"X-RateLimit-Limit":{"description":"Request burst capacity for the API key.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current burst window.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix epoch seconds when the burst capacity is fully restored.\n","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"paths":{"/collections":{"get":{"operationId":"listCollections","tags":["collections"],"summary":"List collections","description":"Returns your collections after name, tag, and date filters. Equal creation dates use the collection ID as a stable tie-break.","parameters":[{"name":"limit","in":"query","required":false,"description":"The page size. Defaults to 50; the API reduces values above 100 to 100.","schema":{"type":"integer","minimum":1,"default":50}},{"name":"cursor","in":"query","required":false,"description":"The opaque continuation token. Keep the same filters and sort order.","schema":{"type":"string"}},{"name":"q","in":"query","required":false,"description":"The literal case-insensitive substring of the collection name.","schema":{"type":"string","maxLength":100}},{"name":"tag","in":"query","required":false,"description":"The exact tags to match. Repeat this parameter for ALL matching tags.","schema":{"type":"array","items":{"type":"string","minLength":1,"maxLength":32},"maxItems":20},"style":"form","explode":true},{"name":"sort","in":"query","required":false,"description":"The creation-time order. Possible enum values: newest shows the newest first; oldest shows the oldest first.","schema":{"type":"string","enum":["newest","oldest"],"default":"newest"}},{"name":"created_from","in":"query","required":false,"description":"The created from bound in epoch milliseconds. From is inclusive and to is exclusive.","schema":{"type":"integer","minimum":0,"maximum":253402300799999}},{"name":"created_to","in":"query","required":false,"description":"The created to bound in epoch milliseconds. From is inclusive and to is exclusive.","schema":{"type":"integer","minimum":0,"maximum":253402300799999}},{"name":"updated_from","in":"query","required":false,"description":"The updated from bound in epoch milliseconds. From is inclusive and to is exclusive.","schema":{"type":"integer","minimum":0,"maximum":253402300799999}},{"name":"updated_to","in":"query","required":false,"description":"The updated to bound in epoch milliseconds. From is inclusive and to is exclusive.","schema":{"type":"integer","minimum":0,"maximum":253402300799999}}],"responses":{"200":{"description":"The requested collection data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CollectionList"}}}},"400":{"description":"The request, filters, cursor, or image is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/PlanFeatureRequired"},"404":{"description":"The collection or an added asset does not exist in your account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"description":"The API could not complete the request. Retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## Create a collection

> Creates an empty collection with the supplied name and optional tags. Names need not be unique.

```json
{"openapi":"3.1.0","info":{"title":"Marso Studio API","version":"0.0.1"},"tags":[{"name":"collections","description":"Manage groups of logical Library Assets and their images."}],"servers":[{"url":"https://api.marso.app/api/public/v1/","description":"Production server."}],"security":[{"apiKey":[]}],"components":{"securitySchemes":{"apiKey":{"type":"http","scheme":"bearer","description":"API key created in the Marso Studio dashboard. The value has the form\n`mxr_live_<entropy>` and is sent as a Bearer token in the `Authorization`\nheader.\n"}},"schemas":{"CreateCollectionRequest":{"type":"object","description":"The collection name and optional tags.","properties":{"name":{"type":"string","description":"The collection name, from 1 to 100 Unicode characters.","minLength":1,"maxLength":100},"tags":{"type":"array","description":"The display tags. Each tag has 1 to 32 Unicode characters after trim. Case-insensitive duplicates return 400.","items":{"type":"string","description":"The tag text.","minLength":1,"maxLength":32},"maxItems":20}},"required":["name"],"additionalProperties":false},"Collection":{"type":"object","description":"A named group of logical Library Assets.","properties":{"marketplace":{"$ref":"#/components/schemas/MarketplaceCollectionInfo","description":"The source version. Absent for a studio Collection."},"collection_id":{"type":"string","description":"The collection ID.","format":"uuid"},"name":{"type":"string","description":"The collection name, from 1 to 100 Unicode characters.","minLength":1,"maxLength":100},"tags":{"type":"array","description":"The display tags. Each tag has 1 to 32 Unicode characters after trim. Case-insensitive duplicates return 400.","items":{"type":"string","description":"The tag text.","minLength":1,"maxLength":32},"maxItems":20},"creator":{"$ref":"#/components/schemas/CollectionCreator"},"asset_count":{"type":"integer","description":"The number of stored member references, including unavailable members.","minimum":0},"thumbnail_url":{"type":"string","description":"The preview URL. It travels with thumbnail_url_expires_at."},"thumbnail_url_expires_at":{"$ref":"#/components/schemas/EpochMillis"},"created_at":{"$ref":"#/components/schemas/EpochMillis"},"updated_at":{"$ref":"#/components/schemas/EpochMillis"}},"required":["collection_id","name","tags","creator","asset_count","created_at","updated_at"]},"MarketplaceCollectionInfo":{"type":"object","description":"The immutable marketplace version that created this personal Collection.","properties":{"listing_id":{"type":"string","format":"uuid","description":"The canonical marketplace listing ID."},"revision":{"type":"integer","minimum":1,"maximum":9007199254740991,"description":"The exact immutable revision, from 1 to 9007199254740991."},"source_type":{"type":"string","enum":["curated"],"description":"Possible enum values: `curated`: content from the curated marketplace."}},"required":["listing_id","revision","source_type"]},"CollectionCreator":{"type":"object","description":"The User who created the collection.","properties":{"user_id":{"type":"string","description":"The creator User ID."},"name":{"type":"string","description":"The current profile name. Absent if unavailable."}},"required":["user_id"]},"EpochMillis":{"type":"integer","format":"int64","description":"Time represented as milliseconds since the Unix epoch.\n"},"Error":{"type":"object","required":["error"],"description":"Canonical error envelope. The error payload is nested under the `error`\nkey.\n","properties":{"error":{"$ref":"#/components/schemas/ErrorBody"}}},"ErrorBody":{"type":"object","description":"The body of an error response. The `code` is a stable value clients can\nbranch on; the `message` is a human-readable explanation.\n","required":["code","message"],"properties":{"code":{"$ref":"#/components/schemas/ErrorCode"},"message":{"type":"string","description":"Human-readable description of the error.\n"},"details":{"type":["object","null"],"description":"Additional structured information about the error, or `null` if no\nextra details are available.\n","additionalProperties":true}}},"ErrorCode":{"type":"string","description":"Machine-readable error code. The enum contains every code that this API\ncan return.\n\nPossible enum values:\n- `INVALID_REQUEST`: the request body or a query parameter failed validation.\n- `MALFORMED_UUID`: a path parameter that should be a UUID is not one.\n- `UNAUTHORIZED`: the request could not be authenticated.\n- `API_KEY_MISSING`: no API key was supplied.\n- `API_KEY_INVALID`: the supplied API key does not match any known key.\n- `API_KEY_REVOKED`: the supplied API key has been revoked.\n- `PLAN_FEATURE_REQUIRED`: the account plan does not include a required feature.\n- `SUBSCRIPTION_FEATURE_REQUIRED`: a new Marketplace purchase requires a paid plan or assigned seat.\n- `PRICE_CHANGED`: the selected price differs from the price in the request.\n- `VERSION_CHANGED`: the selected Marketplace version differs from the requested version.\n- `IDEMPOTENCY_CONFLICT`: the same key was used for a different purchase request.\n- `DOWNLOAD_UNAVAILABLE`: the retained private content is temporarily unavailable.\n- `CATALOGUE_CHANGED`: the catalogue changed during pagination; restart the query.\n- `LISTING_NOT_FOUND`: the selected listing is absent or delisted.\n- `MARKETPLACE_DOWNLOAD_ONLY`: Marketplace content supports download and cannot enter generation.\n- `INSUFFICIENT_CREDITS`: the account does not have enough credits for this request.\n- `QUOTA_EXCEEDED`: a usage quota for the account has been exceeded.\n- `FILE_TOO_LARGE`: an uploaded or referenced file exceeds the allowed size.\n- `UPLOAD_TIMEOUT`: an image search upload exceeded 60 seconds. Try a smaller file or a faster connection.\n- `INVALID_CONTENT_TYPE`: a file's content type does not match its declared or expected type.\n- `UNSUPPORTED_ASSET_FORMAT`: a file's extension is not one of the supported asset formats.\n- `FORMAT_NOT_AVAILABLE`: the requested downloadable format does not exist for this asset.\n- `INVALID_FBX_ZIP_STRUCTURE`: a `.zip` upload is not a valid FBX bundle. The error message says why.\n- `IMAGE_RESOLUTION_EXCEEDED`: an image is larger than 4096 by 4096 pixels, or a texture in a mesh file is larger than 8192 by 8192 pixels.\n- `VALIDATION_FAILED`: the API could not check the uploaded file. Upload it again. This is the `error.code` of an upload status read. A failed batch item or run uses the same word with another meaning (see `ExecutionErrorBody`).\n- `UPLOAD_EXPIRED`: the upload did not finish within 1 hour. Upload the file again.\n- `MESH_REQUIREMENTS_NOT_MET`: the mesh file has no polygon geometry, no base-color texture, no UV coordinates, or it names a texture that the upload does not hold.\n- `COLLECTION_NOT_FOUND`: the collection does not exist in your account.\n- `PROJECT_NOT_FOUND`: the project does not exist, or another account owns it.\n- `GRAPH_NOT_FOUND`: the graph does not exist in this project.\n- `NODE_NOT_FOUND`: the node does not exist in this graph.\n- `GROUP_NOT_FOUND`: the group does not exist in this graph.\n- `PROJECT_NODE_LIMIT_EXCEEDED`: the project already holds as many nodes as it may hold.\n- `CONFLICT`: the request conflicts with the current state, so the server made no change.\n- `ASSET_NOT_FOUND`: the asset does not exist or does not belong to the account.\n- `ASSET_IN_USE`: an active execution uses a component, or another PBR execution shares a source or target component.\n- `BATCH_TOO_LARGE`: the batch contains more items than the endpoint allows.\n- `CONCURRENT_EXECUTION_LIMIT_EXCEEDED`: the account has reached its limit on simultaneous submissions.\n- `PBR_FAILURE_CAP_EXCEEDED`: the account has too many recent failed PBR runs; new submissions are temporarily blocked.\n- `EXECUTION_NOT_FOUND`: the execution or batch does not exist or does not belong to the account.\n- `EXECUTION_IN_PROGRESS`: the request conflicts with an execution that is still running.\n- `RATE_LIMITED`: the API key's rate limit was exceeded.\n- `SERVICE_UNAVAILABLE`: the requested operation is temporarily unavailable; retry later.\n- `MAINTENANCE_MODE`: the API is temporarily unavailable for maintenance.\n- `INTERNAL_SERVER_ERROR`: an unexpected server error occurred.\n- `WORKFLOW_CREATION_FAILED`: the API could not start the requested generation.\n- `WORKFLOW_API_ERROR`: generation stopped because of an unexpected error.\n","enum":["INVALID_REQUEST","MALFORMED_UUID","UNAUTHORIZED","API_KEY_MISSING","API_KEY_INVALID","API_KEY_REVOKED","PLAN_FEATURE_REQUIRED","SUBSCRIPTION_FEATURE_REQUIRED","PRICE_CHANGED","VERSION_CHANGED","IDEMPOTENCY_CONFLICT","DOWNLOAD_UNAVAILABLE","CATALOGUE_CHANGED","LISTING_NOT_FOUND","MARKETPLACE_DOWNLOAD_ONLY","INSUFFICIENT_CREDITS","QUOTA_EXCEEDED","FILE_TOO_LARGE","UPLOAD_TIMEOUT","INVALID_CONTENT_TYPE","UNSUPPORTED_ASSET_FORMAT","FORMAT_NOT_AVAILABLE","INVALID_FBX_ZIP_STRUCTURE","IMAGE_RESOLUTION_EXCEEDED","VALIDATION_FAILED","UPLOAD_EXPIRED","MESH_REQUIREMENTS_NOT_MET","COLLECTION_NOT_FOUND","PROJECT_NOT_FOUND","GRAPH_NOT_FOUND","NODE_NOT_FOUND","GROUP_NOT_FOUND","PROJECT_NODE_LIMIT_EXCEEDED","CONFLICT","ASSET_NOT_FOUND","ASSET_IN_USE","BATCH_TOO_LARGE","CONCURRENT_EXECUTION_LIMIT_EXCEEDED","PBR_FAILURE_CAP_EXCEEDED","EXECUTION_NOT_FOUND","EXECUTION_IN_PROGRESS","RATE_LIMITED","SERVICE_UNAVAILABLE","MAINTENANCE_MODE","INTERNAL_SERVER_ERROR","WORKFLOW_CREATION_FAILED","WORKFLOW_API_ERROR"]},"PlanFeatureRequiredError":{"type":"object","required":["error"],"description":"The error envelope for a missing subscription feature.","properties":{"error":{"type":"object","required":["code","message","details"],"description":"The missing-feature error body.","properties":{"code":{"type":"string","const":"PLAN_FEATURE_REQUIRED","description":"Stable error code for a missing subscription feature."},"message":{"type":"string","description":"Human-readable description of the error."},"details":{"$ref":"#/components/schemas/PlanFeatureRequiredErrorDetails"}}}}},"PlanFeatureRequiredErrorDetails":{"type":"object","required":["feature","upgrade_plan_codes"],"description":"The missing feature and the active plans that provide it.","properties":{"feature":{"$ref":"#/components/schemas/SubscriptionFeature"},"upgrade_plan_codes":{"type":"array","description":"Active plans available for purchase that provide the missing\nfeature. The array uses plan class and opaque code order.\n","items":{"$ref":"#/components/schemas/SubscriptionPlanCode"}}}},"SubscriptionFeature":{"type":"string","description":"Product capability available to the account.\n\nPossible enum values:\n- `commercial_license`: commercial-use rights.\n- `api_pbr`: PBR generation through the Public Platform API.\n- `api_asset_download`: asset downloads through the Public Platform API.\n- `custom_polycount`: custom polygon counts for 3D generation.\n- `image_edit`: image editing.\n- `multiview`: multiview generation.\n- `asset_download`: asset downloads in the Marso web app.\n- `api_access`: access to the Public Platform API.\n- `scene_generation`: scene generation and multi-asset runs in the Marso web app.\n- `application_apps`: the Sim Ready and Game Ready apps.\n","enum":["commercial_license","api_pbr","api_asset_download","custom_polycount","image_edit","multiview","asset_download","api_access","scene_generation","application_apps"]},"SubscriptionPlanCode":{"type":"string","pattern":"^plan_[A-Za-z0-9]{7,64}$","description":"Opaque and immutable code for a subscription plan. A plan display name\ncan change. The code starts with `plan_`, followed by 7 to 64 ASCII\nletters or digits.\n"}},"responses":{"Unauthorized":{"description":"The API key is missing, invalid, or revoked. Possible error codes:\n`API_KEY_MISSING`, `API_KEY_INVALID`, `API_KEY_REVOKED`, or `UNAUTHORIZED`.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"PlanFeatureRequired":{"description":"The account does not have the plan feature required by this operation\n(`PLAN_FEATURE_REQUIRED`). The Free plan lacks `api_access`, so every\noperation refuses a Free account with this response. An account that\nlacks `api_pbr` or `api_asset_download` also gets it on the routes that\nneed those features.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlanFeatureRequiredError"}}}},"RateLimited":{"description":"Rate limit exceeded (`RATE_LIMITED`). The response includes a `Retry-After`\nheader with the number of seconds to wait before retrying, plus the\n`X-RateLimit-*` headers. Those headers are also present on successful (2xx)\nresponses so a client can pace itself.\n","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"X-RateLimit-Limit":{"description":"Request burst capacity for the API key.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current burst window.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix epoch seconds when the burst capacity is fully restored.\n","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"paths":{"/collections":{"post":{"operationId":"createCollection","tags":["collections"],"summary":"Create a collection","description":"Creates an empty collection with the supplied name and optional tags. Names need not be unique.","requestBody":{"required":true,"description":"The request fields.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCollectionRequest"}}}},"responses":{"201":{"description":"The requested collection data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Collection"}}}},"400":{"description":"The request, filters, cursor, or image is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/PlanFeatureRequired"},"404":{"description":"The collection or an added asset does not exist in your account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"description":"The API could not complete the request. Retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## Read collection membership

> Returns membership for the Library Assets in the request. It does not list every Collection.

```json
{"openapi":"3.1.0","info":{"title":"Marso Studio API","version":"0.0.1"},"tags":[{"name":"collections","description":"Manage groups of logical Library Assets and their images."}],"servers":[{"url":"https://api.marso.app/api/public/v1/","description":"Production server."}],"security":[{"apiKey":[]}],"components":{"securitySchemes":{"apiKey":{"type":"http","scheme":"bearer","description":"API key created in the Marso Studio dashboard. The value has the form\n`mxr_live_<entropy>` and is sent as a Bearer token in the `Authorization`\nheader.\n"}},"schemas":{"CollectionAssetsRequest":{"type":"object","description":"The member IDs to add or inspect.","properties":{"library_asset_ids":{"type":"array","description":"The IDs of Library Assets, from 1 to 100 per request.","items":{"type":"string","description":"The logical Library Asset ID.","format":"uuid"},"minItems":1,"maxItems":100}},"required":["library_asset_ids"],"additionalProperties":false},"CollectionMembershipList":{"type":"object","description":"Membership in distinct request order.","properties":{"data":{"type":"array","description":"The requested memberships.","items":{"$ref":"#/components/schemas/CollectionMembership"}}},"required":["data"]},"CollectionMembership":{"type":"object","description":"Membership of one requested live asset.","properties":{"library_asset_id":{"type":"string","description":"The logical Library Asset ID.","format":"uuid"},"collection_ids":{"type":"array","description":"The collection IDs. Empty for unavailable or unowned assets.","items":{"type":"string","description":"The collection ID.","format":"uuid"}}},"required":["library_asset_id","collection_ids"]},"Error":{"type":"object","required":["error"],"description":"Canonical error envelope. The error payload is nested under the `error`\nkey.\n","properties":{"error":{"$ref":"#/components/schemas/ErrorBody"}}},"ErrorBody":{"type":"object","description":"The body of an error response. The `code` is a stable value clients can\nbranch on; the `message` is a human-readable explanation.\n","required":["code","message"],"properties":{"code":{"$ref":"#/components/schemas/ErrorCode"},"message":{"type":"string","description":"Human-readable description of the error.\n"},"details":{"type":["object","null"],"description":"Additional structured information about the error, or `null` if no\nextra details are available.\n","additionalProperties":true}}},"ErrorCode":{"type":"string","description":"Machine-readable error code. The enum contains every code that this API\ncan return.\n\nPossible enum values:\n- `INVALID_REQUEST`: the request body or a query parameter failed validation.\n- `MALFORMED_UUID`: a path parameter that should be a UUID is not one.\n- `UNAUTHORIZED`: the request could not be authenticated.\n- `API_KEY_MISSING`: no API key was supplied.\n- `API_KEY_INVALID`: the supplied API key does not match any known key.\n- `API_KEY_REVOKED`: the supplied API key has been revoked.\n- `PLAN_FEATURE_REQUIRED`: the account plan does not include a required feature.\n- `SUBSCRIPTION_FEATURE_REQUIRED`: a new Marketplace purchase requires a paid plan or assigned seat.\n- `PRICE_CHANGED`: the selected price differs from the price in the request.\n- `VERSION_CHANGED`: the selected Marketplace version differs from the requested version.\n- `IDEMPOTENCY_CONFLICT`: the same key was used for a different purchase request.\n- `DOWNLOAD_UNAVAILABLE`: the retained private content is temporarily unavailable.\n- `CATALOGUE_CHANGED`: the catalogue changed during pagination; restart the query.\n- `LISTING_NOT_FOUND`: the selected listing is absent or delisted.\n- `MARKETPLACE_DOWNLOAD_ONLY`: Marketplace content supports download and cannot enter generation.\n- `INSUFFICIENT_CREDITS`: the account does not have enough credits for this request.\n- `QUOTA_EXCEEDED`: a usage quota for the account has been exceeded.\n- `FILE_TOO_LARGE`: an uploaded or referenced file exceeds the allowed size.\n- `UPLOAD_TIMEOUT`: an image search upload exceeded 60 seconds. Try a smaller file or a faster connection.\n- `INVALID_CONTENT_TYPE`: a file's content type does not match its declared or expected type.\n- `UNSUPPORTED_ASSET_FORMAT`: a file's extension is not one of the supported asset formats.\n- `FORMAT_NOT_AVAILABLE`: the requested downloadable format does not exist for this asset.\n- `INVALID_FBX_ZIP_STRUCTURE`: a `.zip` upload is not a valid FBX bundle. The error message says why.\n- `IMAGE_RESOLUTION_EXCEEDED`: an image is larger than 4096 by 4096 pixels, or a texture in a mesh file is larger than 8192 by 8192 pixels.\n- `VALIDATION_FAILED`: the API could not check the uploaded file. Upload it again. This is the `error.code` of an upload status read. A failed batch item or run uses the same word with another meaning (see `ExecutionErrorBody`).\n- `UPLOAD_EXPIRED`: the upload did not finish within 1 hour. Upload the file again.\n- `MESH_REQUIREMENTS_NOT_MET`: the mesh file has no polygon geometry, no base-color texture, no UV coordinates, or it names a texture that the upload does not hold.\n- `COLLECTION_NOT_FOUND`: the collection does not exist in your account.\n- `PROJECT_NOT_FOUND`: the project does not exist, or another account owns it.\n- `GRAPH_NOT_FOUND`: the graph does not exist in this project.\n- `NODE_NOT_FOUND`: the node does not exist in this graph.\n- `GROUP_NOT_FOUND`: the group does not exist in this graph.\n- `PROJECT_NODE_LIMIT_EXCEEDED`: the project already holds as many nodes as it may hold.\n- `CONFLICT`: the request conflicts with the current state, so the server made no change.\n- `ASSET_NOT_FOUND`: the asset does not exist or does not belong to the account.\n- `ASSET_IN_USE`: an active execution uses a component, or another PBR execution shares a source or target component.\n- `BATCH_TOO_LARGE`: the batch contains more items than the endpoint allows.\n- `CONCURRENT_EXECUTION_LIMIT_EXCEEDED`: the account has reached its limit on simultaneous submissions.\n- `PBR_FAILURE_CAP_EXCEEDED`: the account has too many recent failed PBR runs; new submissions are temporarily blocked.\n- `EXECUTION_NOT_FOUND`: the execution or batch does not exist or does not belong to the account.\n- `EXECUTION_IN_PROGRESS`: the request conflicts with an execution that is still running.\n- `RATE_LIMITED`: the API key's rate limit was exceeded.\n- `SERVICE_UNAVAILABLE`: the requested operation is temporarily unavailable; retry later.\n- `MAINTENANCE_MODE`: the API is temporarily unavailable for maintenance.\n- `INTERNAL_SERVER_ERROR`: an unexpected server error occurred.\n- `WORKFLOW_CREATION_FAILED`: the API could not start the requested generation.\n- `WORKFLOW_API_ERROR`: generation stopped because of an unexpected error.\n","enum":["INVALID_REQUEST","MALFORMED_UUID","UNAUTHORIZED","API_KEY_MISSING","API_KEY_INVALID","API_KEY_REVOKED","PLAN_FEATURE_REQUIRED","SUBSCRIPTION_FEATURE_REQUIRED","PRICE_CHANGED","VERSION_CHANGED","IDEMPOTENCY_CONFLICT","DOWNLOAD_UNAVAILABLE","CATALOGUE_CHANGED","LISTING_NOT_FOUND","MARKETPLACE_DOWNLOAD_ONLY","INSUFFICIENT_CREDITS","QUOTA_EXCEEDED","FILE_TOO_LARGE","UPLOAD_TIMEOUT","INVALID_CONTENT_TYPE","UNSUPPORTED_ASSET_FORMAT","FORMAT_NOT_AVAILABLE","INVALID_FBX_ZIP_STRUCTURE","IMAGE_RESOLUTION_EXCEEDED","VALIDATION_FAILED","UPLOAD_EXPIRED","MESH_REQUIREMENTS_NOT_MET","COLLECTION_NOT_FOUND","PROJECT_NOT_FOUND","GRAPH_NOT_FOUND","NODE_NOT_FOUND","GROUP_NOT_FOUND","PROJECT_NODE_LIMIT_EXCEEDED","CONFLICT","ASSET_NOT_FOUND","ASSET_IN_USE","BATCH_TOO_LARGE","CONCURRENT_EXECUTION_LIMIT_EXCEEDED","PBR_FAILURE_CAP_EXCEEDED","EXECUTION_NOT_FOUND","EXECUTION_IN_PROGRESS","RATE_LIMITED","SERVICE_UNAVAILABLE","MAINTENANCE_MODE","INTERNAL_SERVER_ERROR","WORKFLOW_CREATION_FAILED","WORKFLOW_API_ERROR"]},"PlanFeatureRequiredError":{"type":"object","required":["error"],"description":"The error envelope for a missing subscription feature.","properties":{"error":{"type":"object","required":["code","message","details"],"description":"The missing-feature error body.","properties":{"code":{"type":"string","const":"PLAN_FEATURE_REQUIRED","description":"Stable error code for a missing subscription feature."},"message":{"type":"string","description":"Human-readable description of the error."},"details":{"$ref":"#/components/schemas/PlanFeatureRequiredErrorDetails"}}}}},"PlanFeatureRequiredErrorDetails":{"type":"object","required":["feature","upgrade_plan_codes"],"description":"The missing feature and the active plans that provide it.","properties":{"feature":{"$ref":"#/components/schemas/SubscriptionFeature"},"upgrade_plan_codes":{"type":"array","description":"Active plans available for purchase that provide the missing\nfeature. The array uses plan class and opaque code order.\n","items":{"$ref":"#/components/schemas/SubscriptionPlanCode"}}}},"SubscriptionFeature":{"type":"string","description":"Product capability available to the account.\n\nPossible enum values:\n- `commercial_license`: commercial-use rights.\n- `api_pbr`: PBR generation through the Public Platform API.\n- `api_asset_download`: asset downloads through the Public Platform API.\n- `custom_polycount`: custom polygon counts for 3D generation.\n- `image_edit`: image editing.\n- `multiview`: multiview generation.\n- `asset_download`: asset downloads in the Marso web app.\n- `api_access`: access to the Public Platform API.\n- `scene_generation`: scene generation and multi-asset runs in the Marso web app.\n- `application_apps`: the Sim Ready and Game Ready apps.\n","enum":["commercial_license","api_pbr","api_asset_download","custom_polycount","image_edit","multiview","asset_download","api_access","scene_generation","application_apps"]},"SubscriptionPlanCode":{"type":"string","pattern":"^plan_[A-Za-z0-9]{7,64}$","description":"Opaque and immutable code for a subscription plan. A plan display name\ncan change. The code starts with `plan_`, followed by 7 to 64 ASCII\nletters or digits.\n"}},"responses":{"Unauthorized":{"description":"The API key is missing, invalid, or revoked. Possible error codes:\n`API_KEY_MISSING`, `API_KEY_INVALID`, `API_KEY_REVOKED`, or `UNAUTHORIZED`.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"PlanFeatureRequired":{"description":"The account does not have the plan feature required by this operation\n(`PLAN_FEATURE_REQUIRED`). The Free plan lacks `api_access`, so every\noperation refuses a Free account with this response. An account that\nlacks `api_pbr` or `api_asset_download` also gets it on the routes that\nneed those features.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlanFeatureRequiredError"}}}},"RateLimited":{"description":"Rate limit exceeded (`RATE_LIMITED`). The response includes a `Retry-After`\nheader with the number of seconds to wait before retrying, plus the\n`X-RateLimit-*` headers. Those headers are also present on successful (2xx)\nresponses so a client can pace itself.\n","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"X-RateLimit-Limit":{"description":"Request burst capacity for the API key.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current burst window.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix epoch seconds when the burst capacity is fully restored.\n","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"paths":{"/collections/membership":{"post":{"operationId":"getCollectionMembership","tags":["collections"],"summary":"Read collection membership","description":"Returns membership for the Library Assets in the request. It does not list every Collection.","requestBody":{"required":true,"description":"The request fields.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CollectionAssetsRequest"}}}},"responses":{"200":{"description":"The requested collection data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CollectionMembershipList"}}}},"400":{"description":"The request, filters, cursor, or image is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/PlanFeatureRequired"},"404":{"description":"The collection or an added asset does not exist in your account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"description":"The API could not complete the request. Retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## Retrieve a collection

> Returns one collection in your account.

```json
{"openapi":"3.1.0","info":{"title":"Marso Studio API","version":"0.0.1"},"tags":[{"name":"collections","description":"Manage groups of logical Library Assets and their images."}],"servers":[{"url":"https://api.marso.app/api/public/v1/","description":"Production server."}],"security":[{"apiKey":[]}],"components":{"securitySchemes":{"apiKey":{"type":"http","scheme":"bearer","description":"API key created in the Marso Studio dashboard. The value has the form\n`mxr_live_<entropy>` and is sent as a Bearer token in the `Authorization`\nheader.\n"}},"schemas":{"Collection":{"type":"object","description":"A named group of logical Library Assets.","properties":{"marketplace":{"$ref":"#/components/schemas/MarketplaceCollectionInfo","description":"The source version. Absent for a studio Collection."},"collection_id":{"type":"string","description":"The collection ID.","format":"uuid"},"name":{"type":"string","description":"The collection name, from 1 to 100 Unicode characters.","minLength":1,"maxLength":100},"tags":{"type":"array","description":"The display tags. Each tag has 1 to 32 Unicode characters after trim. Case-insensitive duplicates return 400.","items":{"type":"string","description":"The tag text.","minLength":1,"maxLength":32},"maxItems":20},"creator":{"$ref":"#/components/schemas/CollectionCreator"},"asset_count":{"type":"integer","description":"The number of stored member references, including unavailable members.","minimum":0},"thumbnail_url":{"type":"string","description":"The preview URL. It travels with thumbnail_url_expires_at."},"thumbnail_url_expires_at":{"$ref":"#/components/schemas/EpochMillis"},"created_at":{"$ref":"#/components/schemas/EpochMillis"},"updated_at":{"$ref":"#/components/schemas/EpochMillis"}},"required":["collection_id","name","tags","creator","asset_count","created_at","updated_at"]},"MarketplaceCollectionInfo":{"type":"object","description":"The immutable marketplace version that created this personal Collection.","properties":{"listing_id":{"type":"string","format":"uuid","description":"The canonical marketplace listing ID."},"revision":{"type":"integer","minimum":1,"maximum":9007199254740991,"description":"The exact immutable revision, from 1 to 9007199254740991."},"source_type":{"type":"string","enum":["curated"],"description":"Possible enum values: `curated`: content from the curated marketplace."}},"required":["listing_id","revision","source_type"]},"CollectionCreator":{"type":"object","description":"The User who created the collection.","properties":{"user_id":{"type":"string","description":"The creator User ID."},"name":{"type":"string","description":"The current profile name. Absent if unavailable."}},"required":["user_id"]},"EpochMillis":{"type":"integer","format":"int64","description":"Time represented as milliseconds since the Unix epoch.\n"},"Error":{"type":"object","required":["error"],"description":"Canonical error envelope. The error payload is nested under the `error`\nkey.\n","properties":{"error":{"$ref":"#/components/schemas/ErrorBody"}}},"ErrorBody":{"type":"object","description":"The body of an error response. The `code` is a stable value clients can\nbranch on; the `message` is a human-readable explanation.\n","required":["code","message"],"properties":{"code":{"$ref":"#/components/schemas/ErrorCode"},"message":{"type":"string","description":"Human-readable description of the error.\n"},"details":{"type":["object","null"],"description":"Additional structured information about the error, or `null` if no\nextra details are available.\n","additionalProperties":true}}},"ErrorCode":{"type":"string","description":"Machine-readable error code. The enum contains every code that this API\ncan return.\n\nPossible enum values:\n- `INVALID_REQUEST`: the request body or a query parameter failed validation.\n- `MALFORMED_UUID`: a path parameter that should be a UUID is not one.\n- `UNAUTHORIZED`: the request could not be authenticated.\n- `API_KEY_MISSING`: no API key was supplied.\n- `API_KEY_INVALID`: the supplied API key does not match any known key.\n- `API_KEY_REVOKED`: the supplied API key has been revoked.\n- `PLAN_FEATURE_REQUIRED`: the account plan does not include a required feature.\n- `SUBSCRIPTION_FEATURE_REQUIRED`: a new Marketplace purchase requires a paid plan or assigned seat.\n- `PRICE_CHANGED`: the selected price differs from the price in the request.\n- `VERSION_CHANGED`: the selected Marketplace version differs from the requested version.\n- `IDEMPOTENCY_CONFLICT`: the same key was used for a different purchase request.\n- `DOWNLOAD_UNAVAILABLE`: the retained private content is temporarily unavailable.\n- `CATALOGUE_CHANGED`: the catalogue changed during pagination; restart the query.\n- `LISTING_NOT_FOUND`: the selected listing is absent or delisted.\n- `MARKETPLACE_DOWNLOAD_ONLY`: Marketplace content supports download and cannot enter generation.\n- `INSUFFICIENT_CREDITS`: the account does not have enough credits for this request.\n- `QUOTA_EXCEEDED`: a usage quota for the account has been exceeded.\n- `FILE_TOO_LARGE`: an uploaded or referenced file exceeds the allowed size.\n- `UPLOAD_TIMEOUT`: an image search upload exceeded 60 seconds. Try a smaller file or a faster connection.\n- `INVALID_CONTENT_TYPE`: a file's content type does not match its declared or expected type.\n- `UNSUPPORTED_ASSET_FORMAT`: a file's extension is not one of the supported asset formats.\n- `FORMAT_NOT_AVAILABLE`: the requested downloadable format does not exist for this asset.\n- `INVALID_FBX_ZIP_STRUCTURE`: a `.zip` upload is not a valid FBX bundle. The error message says why.\n- `IMAGE_RESOLUTION_EXCEEDED`: an image is larger than 4096 by 4096 pixels, or a texture in a mesh file is larger than 8192 by 8192 pixels.\n- `VALIDATION_FAILED`: the API could not check the uploaded file. Upload it again. This is the `error.code` of an upload status read. A failed batch item or run uses the same word with another meaning (see `ExecutionErrorBody`).\n- `UPLOAD_EXPIRED`: the upload did not finish within 1 hour. Upload the file again.\n- `MESH_REQUIREMENTS_NOT_MET`: the mesh file has no polygon geometry, no base-color texture, no UV coordinates, or it names a texture that the upload does not hold.\n- `COLLECTION_NOT_FOUND`: the collection does not exist in your account.\n- `PROJECT_NOT_FOUND`: the project does not exist, or another account owns it.\n- `GRAPH_NOT_FOUND`: the graph does not exist in this project.\n- `NODE_NOT_FOUND`: the node does not exist in this graph.\n- `GROUP_NOT_FOUND`: the group does not exist in this graph.\n- `PROJECT_NODE_LIMIT_EXCEEDED`: the project already holds as many nodes as it may hold.\n- `CONFLICT`: the request conflicts with the current state, so the server made no change.\n- `ASSET_NOT_FOUND`: the asset does not exist or does not belong to the account.\n- `ASSET_IN_USE`: an active execution uses a component, or another PBR execution shares a source or target component.\n- `BATCH_TOO_LARGE`: the batch contains more items than the endpoint allows.\n- `CONCURRENT_EXECUTION_LIMIT_EXCEEDED`: the account has reached its limit on simultaneous submissions.\n- `PBR_FAILURE_CAP_EXCEEDED`: the account has too many recent failed PBR runs; new submissions are temporarily blocked.\n- `EXECUTION_NOT_FOUND`: the execution or batch does not exist or does not belong to the account.\n- `EXECUTION_IN_PROGRESS`: the request conflicts with an execution that is still running.\n- `RATE_LIMITED`: the API key's rate limit was exceeded.\n- `SERVICE_UNAVAILABLE`: the requested operation is temporarily unavailable; retry later.\n- `MAINTENANCE_MODE`: the API is temporarily unavailable for maintenance.\n- `INTERNAL_SERVER_ERROR`: an unexpected server error occurred.\n- `WORKFLOW_CREATION_FAILED`: the API could not start the requested generation.\n- `WORKFLOW_API_ERROR`: generation stopped because of an unexpected error.\n","enum":["INVALID_REQUEST","MALFORMED_UUID","UNAUTHORIZED","API_KEY_MISSING","API_KEY_INVALID","API_KEY_REVOKED","PLAN_FEATURE_REQUIRED","SUBSCRIPTION_FEATURE_REQUIRED","PRICE_CHANGED","VERSION_CHANGED","IDEMPOTENCY_CONFLICT","DOWNLOAD_UNAVAILABLE","CATALOGUE_CHANGED","LISTING_NOT_FOUND","MARKETPLACE_DOWNLOAD_ONLY","INSUFFICIENT_CREDITS","QUOTA_EXCEEDED","FILE_TOO_LARGE","UPLOAD_TIMEOUT","INVALID_CONTENT_TYPE","UNSUPPORTED_ASSET_FORMAT","FORMAT_NOT_AVAILABLE","INVALID_FBX_ZIP_STRUCTURE","IMAGE_RESOLUTION_EXCEEDED","VALIDATION_FAILED","UPLOAD_EXPIRED","MESH_REQUIREMENTS_NOT_MET","COLLECTION_NOT_FOUND","PROJECT_NOT_FOUND","GRAPH_NOT_FOUND","NODE_NOT_FOUND","GROUP_NOT_FOUND","PROJECT_NODE_LIMIT_EXCEEDED","CONFLICT","ASSET_NOT_FOUND","ASSET_IN_USE","BATCH_TOO_LARGE","CONCURRENT_EXECUTION_LIMIT_EXCEEDED","PBR_FAILURE_CAP_EXCEEDED","EXECUTION_NOT_FOUND","EXECUTION_IN_PROGRESS","RATE_LIMITED","SERVICE_UNAVAILABLE","MAINTENANCE_MODE","INTERNAL_SERVER_ERROR","WORKFLOW_CREATION_FAILED","WORKFLOW_API_ERROR"]},"PlanFeatureRequiredError":{"type":"object","required":["error"],"description":"The error envelope for a missing subscription feature.","properties":{"error":{"type":"object","required":["code","message","details"],"description":"The missing-feature error body.","properties":{"code":{"type":"string","const":"PLAN_FEATURE_REQUIRED","description":"Stable error code for a missing subscription feature."},"message":{"type":"string","description":"Human-readable description of the error."},"details":{"$ref":"#/components/schemas/PlanFeatureRequiredErrorDetails"}}}}},"PlanFeatureRequiredErrorDetails":{"type":"object","required":["feature","upgrade_plan_codes"],"description":"The missing feature and the active plans that provide it.","properties":{"feature":{"$ref":"#/components/schemas/SubscriptionFeature"},"upgrade_plan_codes":{"type":"array","description":"Active plans available for purchase that provide the missing\nfeature. The array uses plan class and opaque code order.\n","items":{"$ref":"#/components/schemas/SubscriptionPlanCode"}}}},"SubscriptionFeature":{"type":"string","description":"Product capability available to the account.\n\nPossible enum values:\n- `commercial_license`: commercial-use rights.\n- `api_pbr`: PBR generation through the Public Platform API.\n- `api_asset_download`: asset downloads through the Public Platform API.\n- `custom_polycount`: custom polygon counts for 3D generation.\n- `image_edit`: image editing.\n- `multiview`: multiview generation.\n- `asset_download`: asset downloads in the Marso web app.\n- `api_access`: access to the Public Platform API.\n- `scene_generation`: scene generation and multi-asset runs in the Marso web app.\n- `application_apps`: the Sim Ready and Game Ready apps.\n","enum":["commercial_license","api_pbr","api_asset_download","custom_polycount","image_edit","multiview","asset_download","api_access","scene_generation","application_apps"]},"SubscriptionPlanCode":{"type":"string","pattern":"^plan_[A-Za-z0-9]{7,64}$","description":"Opaque and immutable code for a subscription plan. A plan display name\ncan change. The code starts with `plan_`, followed by 7 to 64 ASCII\nletters or digits.\n"}},"responses":{"Unauthorized":{"description":"The API key is missing, invalid, or revoked. Possible error codes:\n`API_KEY_MISSING`, `API_KEY_INVALID`, `API_KEY_REVOKED`, or `UNAUTHORIZED`.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"PlanFeatureRequired":{"description":"The account does not have the plan feature required by this operation\n(`PLAN_FEATURE_REQUIRED`). The Free plan lacks `api_access`, so every\noperation refuses a Free account with this response. An account that\nlacks `api_pbr` or `api_asset_download` also gets it on the routes that\nneed those features.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlanFeatureRequiredError"}}}},"RateLimited":{"description":"Rate limit exceeded (`RATE_LIMITED`). The response includes a `Retry-After`\nheader with the number of seconds to wait before retrying, plus the\n`X-RateLimit-*` headers. Those headers are also present on successful (2xx)\nresponses so a client can pace itself.\n","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"X-RateLimit-Limit":{"description":"Request burst capacity for the API key.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current burst window.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix epoch seconds when the burst capacity is fully restored.\n","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"paths":{"/collections/{collection_id}":{"get":{"operationId":"getCollection","tags":["collections"],"summary":"Retrieve a collection","description":"Returns one collection in your account.","parameters":[{"name":"collection_id","in":"path","required":true,"description":"The collection ID.","schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"The requested collection data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Collection"}}}},"400":{"description":"The request, filters, cursor, or image is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/PlanFeatureRequired"},"404":{"description":"The collection or an added asset does not exist in your account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"description":"The API could not complete the request. Retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## Delete a collection

> Removes the collection and its independent thumbnail. Its assets remain available.

```json
{"openapi":"3.1.0","info":{"title":"Marso Studio API","version":"0.0.1"},"tags":[{"name":"collections","description":"Manage groups of logical Library Assets and their images."}],"servers":[{"url":"https://api.marso.app/api/public/v1/","description":"Production server."}],"security":[{"apiKey":[]}],"components":{"securitySchemes":{"apiKey":{"type":"http","scheme":"bearer","description":"API key created in the Marso Studio dashboard. The value has the form\n`mxr_live_<entropy>` and is sent as a Bearer token in the `Authorization`\nheader.\n"}},"schemas":{"Error":{"type":"object","required":["error"],"description":"Canonical error envelope. The error payload is nested under the `error`\nkey.\n","properties":{"error":{"$ref":"#/components/schemas/ErrorBody"}}},"ErrorBody":{"type":"object","description":"The body of an error response. The `code` is a stable value clients can\nbranch on; the `message` is a human-readable explanation.\n","required":["code","message"],"properties":{"code":{"$ref":"#/components/schemas/ErrorCode"},"message":{"type":"string","description":"Human-readable description of the error.\n"},"details":{"type":["object","null"],"description":"Additional structured information about the error, or `null` if no\nextra details are available.\n","additionalProperties":true}}},"ErrorCode":{"type":"string","description":"Machine-readable error code. The enum contains every code that this API\ncan return.\n\nPossible enum values:\n- `INVALID_REQUEST`: the request body or a query parameter failed validation.\n- `MALFORMED_UUID`: a path parameter that should be a UUID is not one.\n- `UNAUTHORIZED`: the request could not be authenticated.\n- `API_KEY_MISSING`: no API key was supplied.\n- `API_KEY_INVALID`: the supplied API key does not match any known key.\n- `API_KEY_REVOKED`: the supplied API key has been revoked.\n- `PLAN_FEATURE_REQUIRED`: the account plan does not include a required feature.\n- `SUBSCRIPTION_FEATURE_REQUIRED`: a new Marketplace purchase requires a paid plan or assigned seat.\n- `PRICE_CHANGED`: the selected price differs from the price in the request.\n- `VERSION_CHANGED`: the selected Marketplace version differs from the requested version.\n- `IDEMPOTENCY_CONFLICT`: the same key was used for a different purchase request.\n- `DOWNLOAD_UNAVAILABLE`: the retained private content is temporarily unavailable.\n- `CATALOGUE_CHANGED`: the catalogue changed during pagination; restart the query.\n- `LISTING_NOT_FOUND`: the selected listing is absent or delisted.\n- `MARKETPLACE_DOWNLOAD_ONLY`: Marketplace content supports download and cannot enter generation.\n- `INSUFFICIENT_CREDITS`: the account does not have enough credits for this request.\n- `QUOTA_EXCEEDED`: a usage quota for the account has been exceeded.\n- `FILE_TOO_LARGE`: an uploaded or referenced file exceeds the allowed size.\n- `UPLOAD_TIMEOUT`: an image search upload exceeded 60 seconds. Try a smaller file or a faster connection.\n- `INVALID_CONTENT_TYPE`: a file's content type does not match its declared or expected type.\n- `UNSUPPORTED_ASSET_FORMAT`: a file's extension is not one of the supported asset formats.\n- `FORMAT_NOT_AVAILABLE`: the requested downloadable format does not exist for this asset.\n- `INVALID_FBX_ZIP_STRUCTURE`: a `.zip` upload is not a valid FBX bundle. The error message says why.\n- `IMAGE_RESOLUTION_EXCEEDED`: an image is larger than 4096 by 4096 pixels, or a texture in a mesh file is larger than 8192 by 8192 pixels.\n- `VALIDATION_FAILED`: the API could not check the uploaded file. Upload it again. This is the `error.code` of an upload status read. A failed batch item or run uses the same word with another meaning (see `ExecutionErrorBody`).\n- `UPLOAD_EXPIRED`: the upload did not finish within 1 hour. Upload the file again.\n- `MESH_REQUIREMENTS_NOT_MET`: the mesh file has no polygon geometry, no base-color texture, no UV coordinates, or it names a texture that the upload does not hold.\n- `COLLECTION_NOT_FOUND`: the collection does not exist in your account.\n- `PROJECT_NOT_FOUND`: the project does not exist, or another account owns it.\n- `GRAPH_NOT_FOUND`: the graph does not exist in this project.\n- `NODE_NOT_FOUND`: the node does not exist in this graph.\n- `GROUP_NOT_FOUND`: the group does not exist in this graph.\n- `PROJECT_NODE_LIMIT_EXCEEDED`: the project already holds as many nodes as it may hold.\n- `CONFLICT`: the request conflicts with the current state, so the server made no change.\n- `ASSET_NOT_FOUND`: the asset does not exist or does not belong to the account.\n- `ASSET_IN_USE`: an active execution uses a component, or another PBR execution shares a source or target component.\n- `BATCH_TOO_LARGE`: the batch contains more items than the endpoint allows.\n- `CONCURRENT_EXECUTION_LIMIT_EXCEEDED`: the account has reached its limit on simultaneous submissions.\n- `PBR_FAILURE_CAP_EXCEEDED`: the account has too many recent failed PBR runs; new submissions are temporarily blocked.\n- `EXECUTION_NOT_FOUND`: the execution or batch does not exist or does not belong to the account.\n- `EXECUTION_IN_PROGRESS`: the request conflicts with an execution that is still running.\n- `RATE_LIMITED`: the API key's rate limit was exceeded.\n- `SERVICE_UNAVAILABLE`: the requested operation is temporarily unavailable; retry later.\n- `MAINTENANCE_MODE`: the API is temporarily unavailable for maintenance.\n- `INTERNAL_SERVER_ERROR`: an unexpected server error occurred.\n- `WORKFLOW_CREATION_FAILED`: the API could not start the requested generation.\n- `WORKFLOW_API_ERROR`: generation stopped because of an unexpected error.\n","enum":["INVALID_REQUEST","MALFORMED_UUID","UNAUTHORIZED","API_KEY_MISSING","API_KEY_INVALID","API_KEY_REVOKED","PLAN_FEATURE_REQUIRED","SUBSCRIPTION_FEATURE_REQUIRED","PRICE_CHANGED","VERSION_CHANGED","IDEMPOTENCY_CONFLICT","DOWNLOAD_UNAVAILABLE","CATALOGUE_CHANGED","LISTING_NOT_FOUND","MARKETPLACE_DOWNLOAD_ONLY","INSUFFICIENT_CREDITS","QUOTA_EXCEEDED","FILE_TOO_LARGE","UPLOAD_TIMEOUT","INVALID_CONTENT_TYPE","UNSUPPORTED_ASSET_FORMAT","FORMAT_NOT_AVAILABLE","INVALID_FBX_ZIP_STRUCTURE","IMAGE_RESOLUTION_EXCEEDED","VALIDATION_FAILED","UPLOAD_EXPIRED","MESH_REQUIREMENTS_NOT_MET","COLLECTION_NOT_FOUND","PROJECT_NOT_FOUND","GRAPH_NOT_FOUND","NODE_NOT_FOUND","GROUP_NOT_FOUND","PROJECT_NODE_LIMIT_EXCEEDED","CONFLICT","ASSET_NOT_FOUND","ASSET_IN_USE","BATCH_TOO_LARGE","CONCURRENT_EXECUTION_LIMIT_EXCEEDED","PBR_FAILURE_CAP_EXCEEDED","EXECUTION_NOT_FOUND","EXECUTION_IN_PROGRESS","RATE_LIMITED","SERVICE_UNAVAILABLE","MAINTENANCE_MODE","INTERNAL_SERVER_ERROR","WORKFLOW_CREATION_FAILED","WORKFLOW_API_ERROR"]},"PlanFeatureRequiredError":{"type":"object","required":["error"],"description":"The error envelope for a missing subscription feature.","properties":{"error":{"type":"object","required":["code","message","details"],"description":"The missing-feature error body.","properties":{"code":{"type":"string","const":"PLAN_FEATURE_REQUIRED","description":"Stable error code for a missing subscription feature."},"message":{"type":"string","description":"Human-readable description of the error."},"details":{"$ref":"#/components/schemas/PlanFeatureRequiredErrorDetails"}}}}},"PlanFeatureRequiredErrorDetails":{"type":"object","required":["feature","upgrade_plan_codes"],"description":"The missing feature and the active plans that provide it.","properties":{"feature":{"$ref":"#/components/schemas/SubscriptionFeature"},"upgrade_plan_codes":{"type":"array","description":"Active plans available for purchase that provide the missing\nfeature. The array uses plan class and opaque code order.\n","items":{"$ref":"#/components/schemas/SubscriptionPlanCode"}}}},"SubscriptionFeature":{"type":"string","description":"Product capability available to the account.\n\nPossible enum values:\n- `commercial_license`: commercial-use rights.\n- `api_pbr`: PBR generation through the Public Platform API.\n- `api_asset_download`: asset downloads through the Public Platform API.\n- `custom_polycount`: custom polygon counts for 3D generation.\n- `image_edit`: image editing.\n- `multiview`: multiview generation.\n- `asset_download`: asset downloads in the Marso web app.\n- `api_access`: access to the Public Platform API.\n- `scene_generation`: scene generation and multi-asset runs in the Marso web app.\n- `application_apps`: the Sim Ready and Game Ready apps.\n","enum":["commercial_license","api_pbr","api_asset_download","custom_polycount","image_edit","multiview","asset_download","api_access","scene_generation","application_apps"]},"SubscriptionPlanCode":{"type":"string","pattern":"^plan_[A-Za-z0-9]{7,64}$","description":"Opaque and immutable code for a subscription plan. A plan display name\ncan change. The code starts with `plan_`, followed by 7 to 64 ASCII\nletters or digits.\n"}},"responses":{"Unauthorized":{"description":"The API key is missing, invalid, or revoked. Possible error codes:\n`API_KEY_MISSING`, `API_KEY_INVALID`, `API_KEY_REVOKED`, or `UNAUTHORIZED`.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"PlanFeatureRequired":{"description":"The account does not have the plan feature required by this operation\n(`PLAN_FEATURE_REQUIRED`). The Free plan lacks `api_access`, so every\noperation refuses a Free account with this response. An account that\nlacks `api_pbr` or `api_asset_download` also gets it on the routes that\nneed those features.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlanFeatureRequiredError"}}}},"RateLimited":{"description":"Rate limit exceeded (`RATE_LIMITED`). The response includes a `Retry-After`\nheader with the number of seconds to wait before retrying, plus the\n`X-RateLimit-*` headers. Those headers are also present on successful (2xx)\nresponses so a client can pace itself.\n","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"X-RateLimit-Limit":{"description":"Request burst capacity for the API key.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current burst window.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix epoch seconds when the burst capacity is fully restored.\n","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"paths":{"/collections/{collection_id}":{"delete":{"operationId":"deleteCollection","tags":["collections"],"summary":"Delete a collection","description":"Removes the collection and its independent thumbnail. Its assets remain available.","parameters":[{"name":"collection_id","in":"path","required":true,"description":"The collection ID.","schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":"The operation completed."},"400":{"description":"The request, filters, cursor, or image is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/PlanFeatureRequired"},"404":{"description":"The collection or an added asset does not exist in your account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"description":"The API could not complete the request. Retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## Update a collection

> Changes name and tags together. Omitted fields keep their value. An empty array clears the tags.

```json
{"openapi":"3.1.0","info":{"title":"Marso Studio API","version":"0.0.1"},"tags":[{"name":"collections","description":"Manage groups of logical Library Assets and their images."}],"servers":[{"url":"https://api.marso.app/api/public/v1/","description":"Production server."}],"security":[{"apiKey":[]}],"components":{"securitySchemes":{"apiKey":{"type":"http","scheme":"bearer","description":"API key created in the Marso Studio dashboard. The value has the form\n`mxr_live_<entropy>` and is sent as a Bearer token in the `Authorization`\nheader.\n"}},"schemas":{"UpdateCollectionRequest":{"type":"object","description":"The fields to change together. Supply name or tags. An empty tags array removes all tags.","properties":{"name":{"type":"string","description":"The collection name, from 1 to 100 Unicode characters.","minLength":1,"maxLength":100},"tags":{"type":"array","description":"The display tags. Each tag has 1 to 32 Unicode characters after trim. Case-insensitive duplicates return 400.","items":{"type":"string","description":"The tag text.","minLength":1,"maxLength":32},"maxItems":20}},"required":[],"additionalProperties":false,"minProperties":1},"Collection":{"type":"object","description":"A named group of logical Library Assets.","properties":{"marketplace":{"$ref":"#/components/schemas/MarketplaceCollectionInfo","description":"The source version. Absent for a studio Collection."},"collection_id":{"type":"string","description":"The collection ID.","format":"uuid"},"name":{"type":"string","description":"The collection name, from 1 to 100 Unicode characters.","minLength":1,"maxLength":100},"tags":{"type":"array","description":"The display tags. Each tag has 1 to 32 Unicode characters after trim. Case-insensitive duplicates return 400.","items":{"type":"string","description":"The tag text.","minLength":1,"maxLength":32},"maxItems":20},"creator":{"$ref":"#/components/schemas/CollectionCreator"},"asset_count":{"type":"integer","description":"The number of stored member references, including unavailable members.","minimum":0},"thumbnail_url":{"type":"string","description":"The preview URL. It travels with thumbnail_url_expires_at."},"thumbnail_url_expires_at":{"$ref":"#/components/schemas/EpochMillis"},"created_at":{"$ref":"#/components/schemas/EpochMillis"},"updated_at":{"$ref":"#/components/schemas/EpochMillis"}},"required":["collection_id","name","tags","creator","asset_count","created_at","updated_at"]},"MarketplaceCollectionInfo":{"type":"object","description":"The immutable marketplace version that created this personal Collection.","properties":{"listing_id":{"type":"string","format":"uuid","description":"The canonical marketplace listing ID."},"revision":{"type":"integer","minimum":1,"maximum":9007199254740991,"description":"The exact immutable revision, from 1 to 9007199254740991."},"source_type":{"type":"string","enum":["curated"],"description":"Possible enum values: `curated`: content from the curated marketplace."}},"required":["listing_id","revision","source_type"]},"CollectionCreator":{"type":"object","description":"The User who created the collection.","properties":{"user_id":{"type":"string","description":"The creator User ID."},"name":{"type":"string","description":"The current profile name. Absent if unavailable."}},"required":["user_id"]},"EpochMillis":{"type":"integer","format":"int64","description":"Time represented as milliseconds since the Unix epoch.\n"},"Error":{"type":"object","required":["error"],"description":"Canonical error envelope. The error payload is nested under the `error`\nkey.\n","properties":{"error":{"$ref":"#/components/schemas/ErrorBody"}}},"ErrorBody":{"type":"object","description":"The body of an error response. The `code` is a stable value clients can\nbranch on; the `message` is a human-readable explanation.\n","required":["code","message"],"properties":{"code":{"$ref":"#/components/schemas/ErrorCode"},"message":{"type":"string","description":"Human-readable description of the error.\n"},"details":{"type":["object","null"],"description":"Additional structured information about the error, or `null` if no\nextra details are available.\n","additionalProperties":true}}},"ErrorCode":{"type":"string","description":"Machine-readable error code. The enum contains every code that this API\ncan return.\n\nPossible enum values:\n- `INVALID_REQUEST`: the request body or a query parameter failed validation.\n- `MALFORMED_UUID`: a path parameter that should be a UUID is not one.\n- `UNAUTHORIZED`: the request could not be authenticated.\n- `API_KEY_MISSING`: no API key was supplied.\n- `API_KEY_INVALID`: the supplied API key does not match any known key.\n- `API_KEY_REVOKED`: the supplied API key has been revoked.\n- `PLAN_FEATURE_REQUIRED`: the account plan does not include a required feature.\n- `SUBSCRIPTION_FEATURE_REQUIRED`: a new Marketplace purchase requires a paid plan or assigned seat.\n- `PRICE_CHANGED`: the selected price differs from the price in the request.\n- `VERSION_CHANGED`: the selected Marketplace version differs from the requested version.\n- `IDEMPOTENCY_CONFLICT`: the same key was used for a different purchase request.\n- `DOWNLOAD_UNAVAILABLE`: the retained private content is temporarily unavailable.\n- `CATALOGUE_CHANGED`: the catalogue changed during pagination; restart the query.\n- `LISTING_NOT_FOUND`: the selected listing is absent or delisted.\n- `MARKETPLACE_DOWNLOAD_ONLY`: Marketplace content supports download and cannot enter generation.\n- `INSUFFICIENT_CREDITS`: the account does not have enough credits for this request.\n- `QUOTA_EXCEEDED`: a usage quota for the account has been exceeded.\n- `FILE_TOO_LARGE`: an uploaded or referenced file exceeds the allowed size.\n- `UPLOAD_TIMEOUT`: an image search upload exceeded 60 seconds. Try a smaller file or a faster connection.\n- `INVALID_CONTENT_TYPE`: a file's content type does not match its declared or expected type.\n- `UNSUPPORTED_ASSET_FORMAT`: a file's extension is not one of the supported asset formats.\n- `FORMAT_NOT_AVAILABLE`: the requested downloadable format does not exist for this asset.\n- `INVALID_FBX_ZIP_STRUCTURE`: a `.zip` upload is not a valid FBX bundle. The error message says why.\n- `IMAGE_RESOLUTION_EXCEEDED`: an image is larger than 4096 by 4096 pixels, or a texture in a mesh file is larger than 8192 by 8192 pixels.\n- `VALIDATION_FAILED`: the API could not check the uploaded file. Upload it again. This is the `error.code` of an upload status read. A failed batch item or run uses the same word with another meaning (see `ExecutionErrorBody`).\n- `UPLOAD_EXPIRED`: the upload did not finish within 1 hour. Upload the file again.\n- `MESH_REQUIREMENTS_NOT_MET`: the mesh file has no polygon geometry, no base-color texture, no UV coordinates, or it names a texture that the upload does not hold.\n- `COLLECTION_NOT_FOUND`: the collection does not exist in your account.\n- `PROJECT_NOT_FOUND`: the project does not exist, or another account owns it.\n- `GRAPH_NOT_FOUND`: the graph does not exist in this project.\n- `NODE_NOT_FOUND`: the node does not exist in this graph.\n- `GROUP_NOT_FOUND`: the group does not exist in this graph.\n- `PROJECT_NODE_LIMIT_EXCEEDED`: the project already holds as many nodes as it may hold.\n- `CONFLICT`: the request conflicts with the current state, so the server made no change.\n- `ASSET_NOT_FOUND`: the asset does not exist or does not belong to the account.\n- `ASSET_IN_USE`: an active execution uses a component, or another PBR execution shares a source or target component.\n- `BATCH_TOO_LARGE`: the batch contains more items than the endpoint allows.\n- `CONCURRENT_EXECUTION_LIMIT_EXCEEDED`: the account has reached its limit on simultaneous submissions.\n- `PBR_FAILURE_CAP_EXCEEDED`: the account has too many recent failed PBR runs; new submissions are temporarily blocked.\n- `EXECUTION_NOT_FOUND`: the execution or batch does not exist or does not belong to the account.\n- `EXECUTION_IN_PROGRESS`: the request conflicts with an execution that is still running.\n- `RATE_LIMITED`: the API key's rate limit was exceeded.\n- `SERVICE_UNAVAILABLE`: the requested operation is temporarily unavailable; retry later.\n- `MAINTENANCE_MODE`: the API is temporarily unavailable for maintenance.\n- `INTERNAL_SERVER_ERROR`: an unexpected server error occurred.\n- `WORKFLOW_CREATION_FAILED`: the API could not start the requested generation.\n- `WORKFLOW_API_ERROR`: generation stopped because of an unexpected error.\n","enum":["INVALID_REQUEST","MALFORMED_UUID","UNAUTHORIZED","API_KEY_MISSING","API_KEY_INVALID","API_KEY_REVOKED","PLAN_FEATURE_REQUIRED","SUBSCRIPTION_FEATURE_REQUIRED","PRICE_CHANGED","VERSION_CHANGED","IDEMPOTENCY_CONFLICT","DOWNLOAD_UNAVAILABLE","CATALOGUE_CHANGED","LISTING_NOT_FOUND","MARKETPLACE_DOWNLOAD_ONLY","INSUFFICIENT_CREDITS","QUOTA_EXCEEDED","FILE_TOO_LARGE","UPLOAD_TIMEOUT","INVALID_CONTENT_TYPE","UNSUPPORTED_ASSET_FORMAT","FORMAT_NOT_AVAILABLE","INVALID_FBX_ZIP_STRUCTURE","IMAGE_RESOLUTION_EXCEEDED","VALIDATION_FAILED","UPLOAD_EXPIRED","MESH_REQUIREMENTS_NOT_MET","COLLECTION_NOT_FOUND","PROJECT_NOT_FOUND","GRAPH_NOT_FOUND","NODE_NOT_FOUND","GROUP_NOT_FOUND","PROJECT_NODE_LIMIT_EXCEEDED","CONFLICT","ASSET_NOT_FOUND","ASSET_IN_USE","BATCH_TOO_LARGE","CONCURRENT_EXECUTION_LIMIT_EXCEEDED","PBR_FAILURE_CAP_EXCEEDED","EXECUTION_NOT_FOUND","EXECUTION_IN_PROGRESS","RATE_LIMITED","SERVICE_UNAVAILABLE","MAINTENANCE_MODE","INTERNAL_SERVER_ERROR","WORKFLOW_CREATION_FAILED","WORKFLOW_API_ERROR"]},"PlanFeatureRequiredError":{"type":"object","required":["error"],"description":"The error envelope for a missing subscription feature.","properties":{"error":{"type":"object","required":["code","message","details"],"description":"The missing-feature error body.","properties":{"code":{"type":"string","const":"PLAN_FEATURE_REQUIRED","description":"Stable error code for a missing subscription feature."},"message":{"type":"string","description":"Human-readable description of the error."},"details":{"$ref":"#/components/schemas/PlanFeatureRequiredErrorDetails"}}}}},"PlanFeatureRequiredErrorDetails":{"type":"object","required":["feature","upgrade_plan_codes"],"description":"The missing feature and the active plans that provide it.","properties":{"feature":{"$ref":"#/components/schemas/SubscriptionFeature"},"upgrade_plan_codes":{"type":"array","description":"Active plans available for purchase that provide the missing\nfeature. The array uses plan class and opaque code order.\n","items":{"$ref":"#/components/schemas/SubscriptionPlanCode"}}}},"SubscriptionFeature":{"type":"string","description":"Product capability available to the account.\n\nPossible enum values:\n- `commercial_license`: commercial-use rights.\n- `api_pbr`: PBR generation through the Public Platform API.\n- `api_asset_download`: asset downloads through the Public Platform API.\n- `custom_polycount`: custom polygon counts for 3D generation.\n- `image_edit`: image editing.\n- `multiview`: multiview generation.\n- `asset_download`: asset downloads in the Marso web app.\n- `api_access`: access to the Public Platform API.\n- `scene_generation`: scene generation and multi-asset runs in the Marso web app.\n- `application_apps`: the Sim Ready and Game Ready apps.\n","enum":["commercial_license","api_pbr","api_asset_download","custom_polycount","image_edit","multiview","asset_download","api_access","scene_generation","application_apps"]},"SubscriptionPlanCode":{"type":"string","pattern":"^plan_[A-Za-z0-9]{7,64}$","description":"Opaque and immutable code for a subscription plan. A plan display name\ncan change. The code starts with `plan_`, followed by 7 to 64 ASCII\nletters or digits.\n"}},"responses":{"Unauthorized":{"description":"The API key is missing, invalid, or revoked. Possible error codes:\n`API_KEY_MISSING`, `API_KEY_INVALID`, `API_KEY_REVOKED`, or `UNAUTHORIZED`.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"PlanFeatureRequired":{"description":"The account does not have the plan feature required by this operation\n(`PLAN_FEATURE_REQUIRED`). The Free plan lacks `api_access`, so every\noperation refuses a Free account with this response. An account that\nlacks `api_pbr` or `api_asset_download` also gets it on the routes that\nneed those features.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlanFeatureRequiredError"}}}},"RateLimited":{"description":"Rate limit exceeded (`RATE_LIMITED`). The response includes a `Retry-After`\nheader with the number of seconds to wait before retrying, plus the\n`X-RateLimit-*` headers. Those headers are also present on successful (2xx)\nresponses so a client can pace itself.\n","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"X-RateLimit-Limit":{"description":"Request burst capacity for the API key.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current burst window.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix epoch seconds when the burst capacity is fully restored.\n","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"paths":{"/collections/{collection_id}":{"patch":{"operationId":"updateCollection","tags":["collections"],"summary":"Update a collection","description":"Changes name and tags together. Omitted fields keep their value. An empty array clears the tags.","parameters":[{"name":"collection_id","in":"path","required":true,"description":"The collection ID.","schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"description":"The request fields.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCollectionRequest"}}}},"responses":{"200":{"description":"The requested collection data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Collection"}}}},"400":{"description":"The request, filters, cursor, or image is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/PlanFeatureRequired"},"404":{"description":"The collection or an added asset does not exist in your account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"description":"The API could not complete the request. Retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## List collection members

> Returns members in insertion order, with physical file IDs and project IDs. The unavailable\_library\_asset\_ids field names members that cannot resolve.

```json
{"openapi":"3.1.0","info":{"title":"Marso Studio API","version":"0.0.1"},"tags":[{"name":"collections","description":"Manage groups of logical Library Assets and their images."}],"servers":[{"url":"https://api.marso.app/api/public/v1/","description":"Production server."}],"security":[{"apiKey":[]}],"components":{"securitySchemes":{"apiKey":{"type":"http","scheme":"bearer","description":"API key created in the Marso Studio dashboard. The value has the form\n`mxr_live_<entropy>` and is sent as a Bearer token in the `Authorization`\nheader.\n"}},"schemas":{"CollectionMemberList":{"type":"object","description":"An insertion-ordered member page. Continue while has_more is true, including after an empty data array.","properties":{"data":{"type":"array","description":"The live logical members.","items":{"$ref":"#/components/schemas/CollectionMember"}},"pagination":{"$ref":"#/components/schemas/PublicPagination"},"unavailable_library_asset_ids":{"type":"array","description":"The references that this page cannot resolve.","items":{"type":"string","description":"The logical Library Asset ID.","format":"uuid"}}},"required":["data","pagination","unavailable_library_asset_ids"]},"CollectionMember":{"description":"A member and the physical file references a download client needs.","allOf":[{"$ref":"#/components/schemas/LibraryAsset"},{"type":"object","description":"The file components and storage status.","properties":{"component_asset_ids":{"type":"object","description":"IDs of physical assets, keyed by component role. Empty if no components exist.","additionalProperties":{"type":"string"}},"storage_state":{"type":"string","description":"The file storage status. Possible enum values: AVAILABLE means files are available; BLOB_DELETED means files are absent; DOC_DELETED means the logical row is unavailable.","enum":["AVAILABLE","BLOB_DELETED","DOC_DELETED"]}},"required":["component_asset_ids","storage_state"]}]},"LibraryAsset":{"type":"object","required":["library_asset_id","primary_asset_id","kind","project_ids","has_pbr","created_at"],"description":"One row of the asset library.\n\n`library_asset_id` and `primary_asset_id` name two different objects, so\nthis is not one object with two identifiers. The first names the\ncatalogue row, and the second names the file behind it. Download the file\nwith `GET /assets/{primary_asset_id}`.\n","properties":{"marketplace":{"$ref":"#/components/schemas/MarketplaceLibraryInfo","description":"The retained marketplace metadata. Absent for a studio asset."},"library_asset_id":{"type":"string","description":"Unique identifier of the catalogue row."},"primary_asset_id":{"type":"string","description":"The file behind the row. Download it with\n`GET /assets/{primary_asset_id}`.\n"},"kind":{"type":"string","enum":["MESH","IMAGE","PBR_MATERIAL","MULTIVIEW_SET","GENERATED_3D"],"description":"What the asset is.\n\nPossible enum values:\n`MESH`: an uploaded 3D mesh.\n`IMAGE`: a single image.\n`PBR_MATERIAL`: a generated PBR material.\n`MULTIVIEW_SET`: a set of images of one object.\n`GENERATED_3D`: a mesh a model generated.\n"},"name":{"type":"string","description":"A readable label for the asset. Absent when the row carries none.\n"},"project_ids":{"type":"array","description":"The projects the asset belongs to. Never null, and empty when the\nasset belongs to no project.\n","items":{"type":"string","format":"uuid"}},"has_pbr":{"type":"boolean","description":"Whether a PBR material exists for this 3D asset."},"generation_3d_model":{"type":"string","description":"The model version that produced this asset. Absent for an asset no\nmodel produced.\n"},"thumbnail_url":{"type":"string","description":"Presigned URL of a preview image. Absent when the row has no preview.\nIt travels with `thumbnail_url_expires_at`.\n"},"thumbnail_url_expires_at":{"$ref":"#/components/schemas/NullableEpochMillis"},"created_at":{"$ref":"#/components/schemas/EpochMillis"}}},"MarketplaceLibraryInfo":{"type":"object","description":"The immutable provenance, metadata, and public previews of a purchased Asset.","properties":{"listing_id":{"type":"string","format":"uuid","description":"The canonical marketplace listing ID."},"revision":{"type":"integer","minimum":1,"maximum":9007199254740991,"description":"The exact immutable revision, from 1 to 9007199254740991."},"source_type":{"type":"string","enum":["curated"],"description":"Possible enum values: `curated`: content from the curated marketplace."},"publisher":{"$ref":"#/components/schemas/MarketplacePublisher","description":"The publisher of this retained version."},"metadata":{"$ref":"#/components/schemas/MarketplaceAssetMetadata","description":"The metadata of this retained version."},"previews":{"$ref":"#/components/schemas/MarketplacePreviews","description":"The public previews of this retained version."},"license":{"$ref":"#/components/schemas/MarketplaceLicense","description":"The retained license. Absent when the version has no license."}},"required":["listing_id","revision","source_type","publisher","metadata","previews"]},"MarketplacePublisher":{"type":"object","additionalProperties":false,"properties":{"id":{"type":"string","description":"The identifier assigned by the producer."},"name":{"type":"string","description":"The name shown to visitors."}},"required":["id","name"],"description":"Curated marketplace publisher."},"MarketplaceAssetMetadata":{"type":"object","additionalProperties":false,"properties":{"display_name":{"type":"string","description":"The asset name shown to visitors."},"description_short":{"type":"string","description":"The short producer description."},"description_long":{"type":"string","description":"The full producer description."},"category":{"type":"string","description":"The primary category assigned by the producer."},"subcategory":{"type":"string","description":"The secondary category assigned by the producer."},"search_aliases":{"type":"array","items":{"type":"string","description":"One value supplied by the producer."},"description":"Alternative names supplied for search."},"tags":{"type":"array","items":{"type":"string","description":"One value supplied by the producer."},"description":"The descriptive tags supplied by the producer."},"materials":{"type":"array","items":{"type":"string","description":"One value supplied by the producer."},"description":"The materials identified by the producer."},"makers":{"$ref":"#/components/schemas/MarketplaceMakers","description":"The producer credits for model, physics, and textures."},"moving_parts_count":{"type":"integer","description":"The number of moving parts."},"articulation_types":{"type":"array","items":{"type":"string","description":"One value supplied by the producer."},"description":"The types of joint movement supplied by the producer."},"vertices_count":{"type":"integer","description":"The number of mesh vertices."},"polygon_count":{"type":"integer","description":"The number of mesh polygons."},"file_size_bytes":{"type":"integer","description":"The size of the retained USDZ in bytes."},"est_height_meters":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"The estimated height in meters, or null when unknown."},"est_width_meters":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"The estimated width in meters, or null when unknown."},"est_depth_meters":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"The estimated depth in meters, or null when unknown."},"semantic_scale":{"type":"string","description":"The scale description supplied by the producer."}},"required":["display_name","description_short","description_long","category","subcategory","search_aliases","tags","materials","makers","moving_parts_count","articulation_types","vertices_count","polygon_count","file_size_bytes","est_height_meters","est_width_meters","est_depth_meters","semantic_scale"],"description":"Curated marketplace asset metadata."},"MarketplaceMakers":{"type":"object","additionalProperties":false,"properties":{"model_maker":{"type":"string","description":"The person or team who created the model."},"physics_maker":{"type":"string","description":"The person or team who prepared its physics."},"physics_checker":{"type":"string","description":"The person or team who checked its physics."},"texturing":{"type":"string","description":"The person or team who created its textures."}},"required":["model_maker","physics_maker","physics_checker","texturing"],"description":"Curated marketplace makers."},"MarketplacePreviews":{"type":"object","additionalProperties":false,"properties":{"primary_image":{"$ref":"#/components/schemas/MarketplaceMedia","description":"The main public preview image."},"multiview":{"type":"array","items":{"$ref":"#/components/schemas/MarketplaceView"},"description":"The public images for the canonical camera angles."},"banner":{"$ref":"#/components/schemas/MarketplaceMedia","description":"The public banner image."},"physics_video":{"$ref":"#/components/schemas/MarketplaceMedia","description":"The public video that demonstrates physics."},"qc_report":{"$ref":"#/components/schemas/MarketplaceMedia","description":"The public report of quality checks."},"data_sheet":{"$ref":"#/components/schemas/MarketplaceMedia","description":"The public document that describes this asset version."}},"required":["primary_image","multiview","banner","physics_video","qc_report","data_sheet"],"description":"Curated marketplace previews."},"MarketplaceMedia":{"type":"object","additionalProperties":false,"properties":{"url":{"type":"string","description":"A preview URL that can expire. Read the current listing again to refresh a signed URL."},"content_type":{"type":"string","description":"The media type of the file."},"size_bytes":{"type":"integer","description":"The size of the file in bytes."}},"required":["url","content_type","size_bytes"],"description":"Curated marketplace media."},"MarketplaceView":{"type":"object","additionalProperties":false,"properties":{"label":{"type":"string","enum":["three-quarter","front","right","back","left","top"],"description":"The canonical camera angle: three-quarter, front, right, back, left, or top."},"media":{"$ref":"#/components/schemas/MarketplaceMedia","description":"The public image for this camera angle."}},"required":["label","media"],"description":"Curated marketplace view."},"MarketplaceLicense":{"type":"object","additionalProperties":false,"properties":{"id":{"type":"string","description":"The identifier assigned by the producer."},"version":{"type":"string","description":"The version assigned by the producer."},"name":{"type":"string","description":"The name shown to visitors."},"document":{"$ref":"#/components/schemas/MarketplaceMedia","description":"The public document supplied by the producer."}},"required":["id","version","name","document"],"description":"Curated marketplace license."},"NullableEpochMillis":{"type":["integer","null"],"format":"int64","description":"Time represented as milliseconds since the Unix epoch, or `null` when the\nfield has not been set.\n"},"EpochMillis":{"type":"integer","format":"int64","description":"Time represented as milliseconds since the Unix epoch.\n"},"PublicPagination":{"type":"object","required":["has_more"],"description":"Cursor pagination envelope.\n","properties":{"next_cursor":{"type":"string","description":"Opaque cursor for the next page. Absent when the result set is\nexhausted. Echo it back verbatim as `cursor`.\n"},"has_more":{"type":"boolean","description":"Whether another page follows. Always agrees with the presence of\n`next_cursor`.\n"}}},"Error":{"type":"object","required":["error"],"description":"Canonical error envelope. The error payload is nested under the `error`\nkey.\n","properties":{"error":{"$ref":"#/components/schemas/ErrorBody"}}},"ErrorBody":{"type":"object","description":"The body of an error response. The `code` is a stable value clients can\nbranch on; the `message` is a human-readable explanation.\n","required":["code","message"],"properties":{"code":{"$ref":"#/components/schemas/ErrorCode"},"message":{"type":"string","description":"Human-readable description of the error.\n"},"details":{"type":["object","null"],"description":"Additional structured information about the error, or `null` if no\nextra details are available.\n","additionalProperties":true}}},"ErrorCode":{"type":"string","description":"Machine-readable error code. The enum contains every code that this API\ncan return.\n\nPossible enum values:\n- `INVALID_REQUEST`: the request body or a query parameter failed validation.\n- `MALFORMED_UUID`: a path parameter that should be a UUID is not one.\n- `UNAUTHORIZED`: the request could not be authenticated.\n- `API_KEY_MISSING`: no API key was supplied.\n- `API_KEY_INVALID`: the supplied API key does not match any known key.\n- `API_KEY_REVOKED`: the supplied API key has been revoked.\n- `PLAN_FEATURE_REQUIRED`: the account plan does not include a required feature.\n- `SUBSCRIPTION_FEATURE_REQUIRED`: a new Marketplace purchase requires a paid plan or assigned seat.\n- `PRICE_CHANGED`: the selected price differs from the price in the request.\n- `VERSION_CHANGED`: the selected Marketplace version differs from the requested version.\n- `IDEMPOTENCY_CONFLICT`: the same key was used for a different purchase request.\n- `DOWNLOAD_UNAVAILABLE`: the retained private content is temporarily unavailable.\n- `CATALOGUE_CHANGED`: the catalogue changed during pagination; restart the query.\n- `LISTING_NOT_FOUND`: the selected listing is absent or delisted.\n- `MARKETPLACE_DOWNLOAD_ONLY`: Marketplace content supports download and cannot enter generation.\n- `INSUFFICIENT_CREDITS`: the account does not have enough credits for this request.\n- `QUOTA_EXCEEDED`: a usage quota for the account has been exceeded.\n- `FILE_TOO_LARGE`: an uploaded or referenced file exceeds the allowed size.\n- `UPLOAD_TIMEOUT`: an image search upload exceeded 60 seconds. Try a smaller file or a faster connection.\n- `INVALID_CONTENT_TYPE`: a file's content type does not match its declared or expected type.\n- `UNSUPPORTED_ASSET_FORMAT`: a file's extension is not one of the supported asset formats.\n- `FORMAT_NOT_AVAILABLE`: the requested downloadable format does not exist for this asset.\n- `INVALID_FBX_ZIP_STRUCTURE`: a `.zip` upload is not a valid FBX bundle. The error message says why.\n- `IMAGE_RESOLUTION_EXCEEDED`: an image is larger than 4096 by 4096 pixels, or a texture in a mesh file is larger than 8192 by 8192 pixels.\n- `VALIDATION_FAILED`: the API could not check the uploaded file. Upload it again. This is the `error.code` of an upload status read. A failed batch item or run uses the same word with another meaning (see `ExecutionErrorBody`).\n- `UPLOAD_EXPIRED`: the upload did not finish within 1 hour. Upload the file again.\n- `MESH_REQUIREMENTS_NOT_MET`: the mesh file has no polygon geometry, no base-color texture, no UV coordinates, or it names a texture that the upload does not hold.\n- `COLLECTION_NOT_FOUND`: the collection does not exist in your account.\n- `PROJECT_NOT_FOUND`: the project does not exist, or another account owns it.\n- `GRAPH_NOT_FOUND`: the graph does not exist in this project.\n- `NODE_NOT_FOUND`: the node does not exist in this graph.\n- `GROUP_NOT_FOUND`: the group does not exist in this graph.\n- `PROJECT_NODE_LIMIT_EXCEEDED`: the project already holds as many nodes as it may hold.\n- `CONFLICT`: the request conflicts with the current state, so the server made no change.\n- `ASSET_NOT_FOUND`: the asset does not exist or does not belong to the account.\n- `ASSET_IN_USE`: an active execution uses a component, or another PBR execution shares a source or target component.\n- `BATCH_TOO_LARGE`: the batch contains more items than the endpoint allows.\n- `CONCURRENT_EXECUTION_LIMIT_EXCEEDED`: the account has reached its limit on simultaneous submissions.\n- `PBR_FAILURE_CAP_EXCEEDED`: the account has too many recent failed PBR runs; new submissions are temporarily blocked.\n- `EXECUTION_NOT_FOUND`: the execution or batch does not exist or does not belong to the account.\n- `EXECUTION_IN_PROGRESS`: the request conflicts with an execution that is still running.\n- `RATE_LIMITED`: the API key's rate limit was exceeded.\n- `SERVICE_UNAVAILABLE`: the requested operation is temporarily unavailable; retry later.\n- `MAINTENANCE_MODE`: the API is temporarily unavailable for maintenance.\n- `INTERNAL_SERVER_ERROR`: an unexpected server error occurred.\n- `WORKFLOW_CREATION_FAILED`: the API could not start the requested generation.\n- `WORKFLOW_API_ERROR`: generation stopped because of an unexpected error.\n","enum":["INVALID_REQUEST","MALFORMED_UUID","UNAUTHORIZED","API_KEY_MISSING","API_KEY_INVALID","API_KEY_REVOKED","PLAN_FEATURE_REQUIRED","SUBSCRIPTION_FEATURE_REQUIRED","PRICE_CHANGED","VERSION_CHANGED","IDEMPOTENCY_CONFLICT","DOWNLOAD_UNAVAILABLE","CATALOGUE_CHANGED","LISTING_NOT_FOUND","MARKETPLACE_DOWNLOAD_ONLY","INSUFFICIENT_CREDITS","QUOTA_EXCEEDED","FILE_TOO_LARGE","UPLOAD_TIMEOUT","INVALID_CONTENT_TYPE","UNSUPPORTED_ASSET_FORMAT","FORMAT_NOT_AVAILABLE","INVALID_FBX_ZIP_STRUCTURE","IMAGE_RESOLUTION_EXCEEDED","VALIDATION_FAILED","UPLOAD_EXPIRED","MESH_REQUIREMENTS_NOT_MET","COLLECTION_NOT_FOUND","PROJECT_NOT_FOUND","GRAPH_NOT_FOUND","NODE_NOT_FOUND","GROUP_NOT_FOUND","PROJECT_NODE_LIMIT_EXCEEDED","CONFLICT","ASSET_NOT_FOUND","ASSET_IN_USE","BATCH_TOO_LARGE","CONCURRENT_EXECUTION_LIMIT_EXCEEDED","PBR_FAILURE_CAP_EXCEEDED","EXECUTION_NOT_FOUND","EXECUTION_IN_PROGRESS","RATE_LIMITED","SERVICE_UNAVAILABLE","MAINTENANCE_MODE","INTERNAL_SERVER_ERROR","WORKFLOW_CREATION_FAILED","WORKFLOW_API_ERROR"]},"PlanFeatureRequiredError":{"type":"object","required":["error"],"description":"The error envelope for a missing subscription feature.","properties":{"error":{"type":"object","required":["code","message","details"],"description":"The missing-feature error body.","properties":{"code":{"type":"string","const":"PLAN_FEATURE_REQUIRED","description":"Stable error code for a missing subscription feature."},"message":{"type":"string","description":"Human-readable description of the error."},"details":{"$ref":"#/components/schemas/PlanFeatureRequiredErrorDetails"}}}}},"PlanFeatureRequiredErrorDetails":{"type":"object","required":["feature","upgrade_plan_codes"],"description":"The missing feature and the active plans that provide it.","properties":{"feature":{"$ref":"#/components/schemas/SubscriptionFeature"},"upgrade_plan_codes":{"type":"array","description":"Active plans available for purchase that provide the missing\nfeature. The array uses plan class and opaque code order.\n","items":{"$ref":"#/components/schemas/SubscriptionPlanCode"}}}},"SubscriptionFeature":{"type":"string","description":"Product capability available to the account.\n\nPossible enum values:\n- `commercial_license`: commercial-use rights.\n- `api_pbr`: PBR generation through the Public Platform API.\n- `api_asset_download`: asset downloads through the Public Platform API.\n- `custom_polycount`: custom polygon counts for 3D generation.\n- `image_edit`: image editing.\n- `multiview`: multiview generation.\n- `asset_download`: asset downloads in the Marso web app.\n- `api_access`: access to the Public Platform API.\n- `scene_generation`: scene generation and multi-asset runs in the Marso web app.\n- `application_apps`: the Sim Ready and Game Ready apps.\n","enum":["commercial_license","api_pbr","api_asset_download","custom_polycount","image_edit","multiview","asset_download","api_access","scene_generation","application_apps"]},"SubscriptionPlanCode":{"type":"string","pattern":"^plan_[A-Za-z0-9]{7,64}$","description":"Opaque and immutable code for a subscription plan. A plan display name\ncan change. The code starts with `plan_`, followed by 7 to 64 ASCII\nletters or digits.\n"}},"responses":{"Unauthorized":{"description":"The API key is missing, invalid, or revoked. Possible error codes:\n`API_KEY_MISSING`, `API_KEY_INVALID`, `API_KEY_REVOKED`, or `UNAUTHORIZED`.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"PlanFeatureRequired":{"description":"The account does not have the plan feature required by this operation\n(`PLAN_FEATURE_REQUIRED`). The Free plan lacks `api_access`, so every\noperation refuses a Free account with this response. An account that\nlacks `api_pbr` or `api_asset_download` also gets it on the routes that\nneed those features.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlanFeatureRequiredError"}}}},"RateLimited":{"description":"Rate limit exceeded (`RATE_LIMITED`). The response includes a `Retry-After`\nheader with the number of seconds to wait before retrying, plus the\n`X-RateLimit-*` headers. Those headers are also present on successful (2xx)\nresponses so a client can pace itself.\n","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"X-RateLimit-Limit":{"description":"Request burst capacity for the API key.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current burst window.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix epoch seconds when the burst capacity is fully restored.\n","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"paths":{"/collections/{collection_id}/assets":{"get":{"operationId":"listCollectionAssets","tags":["collections"],"summary":"List collection members","description":"Returns members in insertion order, with physical file IDs and project IDs. The unavailable_library_asset_ids field names members that cannot resolve.","parameters":[{"name":"collection_id","in":"path","required":true,"description":"The collection ID.","schema":{"type":"string","format":"uuid"}},{"name":"limit","in":"query","required":false,"description":"The page size. Defaults to 50; the API reduces values above 100 to 100.","schema":{"type":"integer","minimum":1,"default":50}},{"name":"cursor","in":"query","required":false,"description":"The opaque continuation token. Keep the same filters and sort order.","schema":{"type":"string"}}],"responses":{"200":{"description":"The requested collection data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CollectionMemberList"}}}},"400":{"description":"The request, filters, cursor, or image is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/PlanFeatureRequired"},"404":{"description":"The collection or an added asset does not exist in your account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"description":"The API could not complete the request. Retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## Add collection members

> Adds distinct live assets from your account. The response reports committed additions and already-present IDs. A collection can hold 10000 members.

```json
{"openapi":"3.1.0","info":{"title":"Marso Studio API","version":"0.0.1"},"tags":[{"name":"collections","description":"Manage groups of logical Library Assets and their images."}],"servers":[{"url":"https://api.marso.app/api/public/v1/","description":"Production server."}],"security":[{"apiKey":[]}],"components":{"securitySchemes":{"apiKey":{"type":"http","scheme":"bearer","description":"API key created in the Marso Studio dashboard. The value has the form\n`mxr_live_<entropy>` and is sent as a Bearer token in the `Authorization`\nheader.\n"}},"schemas":{"CollectionAssetsRequest":{"type":"object","description":"The member IDs to add or inspect.","properties":{"library_asset_ids":{"type":"array","description":"The IDs of Library Assets, from 1 to 100 per request.","items":{"type":"string","description":"The logical Library Asset ID.","format":"uuid"},"minItems":1,"maxItems":100}},"required":["library_asset_ids"],"additionalProperties":false},"CollectionAddResult":{"type":"object","description":"The collection and committed member counts.","properties":{"collection":{"$ref":"#/components/schemas/Collection"},"added_count":{"type":"integer","minimum":0,"description":"The number of distinct IDs added."},"skipped_count":{"type":"integer","minimum":0,"description":"The number of distinct IDs already present."}},"required":["collection","added_count","skipped_count"]},"Collection":{"type":"object","description":"A named group of logical Library Assets.","properties":{"marketplace":{"$ref":"#/components/schemas/MarketplaceCollectionInfo","description":"The source version. Absent for a studio Collection."},"collection_id":{"type":"string","description":"The collection ID.","format":"uuid"},"name":{"type":"string","description":"The collection name, from 1 to 100 Unicode characters.","minLength":1,"maxLength":100},"tags":{"type":"array","description":"The display tags. Each tag has 1 to 32 Unicode characters after trim. Case-insensitive duplicates return 400.","items":{"type":"string","description":"The tag text.","minLength":1,"maxLength":32},"maxItems":20},"creator":{"$ref":"#/components/schemas/CollectionCreator"},"asset_count":{"type":"integer","description":"The number of stored member references, including unavailable members.","minimum":0},"thumbnail_url":{"type":"string","description":"The preview URL. It travels with thumbnail_url_expires_at."},"thumbnail_url_expires_at":{"$ref":"#/components/schemas/EpochMillis"},"created_at":{"$ref":"#/components/schemas/EpochMillis"},"updated_at":{"$ref":"#/components/schemas/EpochMillis"}},"required":["collection_id","name","tags","creator","asset_count","created_at","updated_at"]},"MarketplaceCollectionInfo":{"type":"object","description":"The immutable marketplace version that created this personal Collection.","properties":{"listing_id":{"type":"string","format":"uuid","description":"The canonical marketplace listing ID."},"revision":{"type":"integer","minimum":1,"maximum":9007199254740991,"description":"The exact immutable revision, from 1 to 9007199254740991."},"source_type":{"type":"string","enum":["curated"],"description":"Possible enum values: `curated`: content from the curated marketplace."}},"required":["listing_id","revision","source_type"]},"CollectionCreator":{"type":"object","description":"The User who created the collection.","properties":{"user_id":{"type":"string","description":"The creator User ID."},"name":{"type":"string","description":"The current profile name. Absent if unavailable."}},"required":["user_id"]},"EpochMillis":{"type":"integer","format":"int64","description":"Time represented as milliseconds since the Unix epoch.\n"},"Error":{"type":"object","required":["error"],"description":"Canonical error envelope. The error payload is nested under the `error`\nkey.\n","properties":{"error":{"$ref":"#/components/schemas/ErrorBody"}}},"ErrorBody":{"type":"object","description":"The body of an error response. The `code` is a stable value clients can\nbranch on; the `message` is a human-readable explanation.\n","required":["code","message"],"properties":{"code":{"$ref":"#/components/schemas/ErrorCode"},"message":{"type":"string","description":"Human-readable description of the error.\n"},"details":{"type":["object","null"],"description":"Additional structured information about the error, or `null` if no\nextra details are available.\n","additionalProperties":true}}},"ErrorCode":{"type":"string","description":"Machine-readable error code. The enum contains every code that this API\ncan return.\n\nPossible enum values:\n- `INVALID_REQUEST`: the request body or a query parameter failed validation.\n- `MALFORMED_UUID`: a path parameter that should be a UUID is not one.\n- `UNAUTHORIZED`: the request could not be authenticated.\n- `API_KEY_MISSING`: no API key was supplied.\n- `API_KEY_INVALID`: the supplied API key does not match any known key.\n- `API_KEY_REVOKED`: the supplied API key has been revoked.\n- `PLAN_FEATURE_REQUIRED`: the account plan does not include a required feature.\n- `SUBSCRIPTION_FEATURE_REQUIRED`: a new Marketplace purchase requires a paid plan or assigned seat.\n- `PRICE_CHANGED`: the selected price differs from the price in the request.\n- `VERSION_CHANGED`: the selected Marketplace version differs from the requested version.\n- `IDEMPOTENCY_CONFLICT`: the same key was used for a different purchase request.\n- `DOWNLOAD_UNAVAILABLE`: the retained private content is temporarily unavailable.\n- `CATALOGUE_CHANGED`: the catalogue changed during pagination; restart the query.\n- `LISTING_NOT_FOUND`: the selected listing is absent or delisted.\n- `MARKETPLACE_DOWNLOAD_ONLY`: Marketplace content supports download and cannot enter generation.\n- `INSUFFICIENT_CREDITS`: the account does not have enough credits for this request.\n- `QUOTA_EXCEEDED`: a usage quota for the account has been exceeded.\n- `FILE_TOO_LARGE`: an uploaded or referenced file exceeds the allowed size.\n- `UPLOAD_TIMEOUT`: an image search upload exceeded 60 seconds. Try a smaller file or a faster connection.\n- `INVALID_CONTENT_TYPE`: a file's content type does not match its declared or expected type.\n- `UNSUPPORTED_ASSET_FORMAT`: a file's extension is not one of the supported asset formats.\n- `FORMAT_NOT_AVAILABLE`: the requested downloadable format does not exist for this asset.\n- `INVALID_FBX_ZIP_STRUCTURE`: a `.zip` upload is not a valid FBX bundle. The error message says why.\n- `IMAGE_RESOLUTION_EXCEEDED`: an image is larger than 4096 by 4096 pixels, or a texture in a mesh file is larger than 8192 by 8192 pixels.\n- `VALIDATION_FAILED`: the API could not check the uploaded file. Upload it again. This is the `error.code` of an upload status read. A failed batch item or run uses the same word with another meaning (see `ExecutionErrorBody`).\n- `UPLOAD_EXPIRED`: the upload did not finish within 1 hour. Upload the file again.\n- `MESH_REQUIREMENTS_NOT_MET`: the mesh file has no polygon geometry, no base-color texture, no UV coordinates, or it names a texture that the upload does not hold.\n- `COLLECTION_NOT_FOUND`: the collection does not exist in your account.\n- `PROJECT_NOT_FOUND`: the project does not exist, or another account owns it.\n- `GRAPH_NOT_FOUND`: the graph does not exist in this project.\n- `NODE_NOT_FOUND`: the node does not exist in this graph.\n- `GROUP_NOT_FOUND`: the group does not exist in this graph.\n- `PROJECT_NODE_LIMIT_EXCEEDED`: the project already holds as many nodes as it may hold.\n- `CONFLICT`: the request conflicts with the current state, so the server made no change.\n- `ASSET_NOT_FOUND`: the asset does not exist or does not belong to the account.\n- `ASSET_IN_USE`: an active execution uses a component, or another PBR execution shares a source or target component.\n- `BATCH_TOO_LARGE`: the batch contains more items than the endpoint allows.\n- `CONCURRENT_EXECUTION_LIMIT_EXCEEDED`: the account has reached its limit on simultaneous submissions.\n- `PBR_FAILURE_CAP_EXCEEDED`: the account has too many recent failed PBR runs; new submissions are temporarily blocked.\n- `EXECUTION_NOT_FOUND`: the execution or batch does not exist or does not belong to the account.\n- `EXECUTION_IN_PROGRESS`: the request conflicts with an execution that is still running.\n- `RATE_LIMITED`: the API key's rate limit was exceeded.\n- `SERVICE_UNAVAILABLE`: the requested operation is temporarily unavailable; retry later.\n- `MAINTENANCE_MODE`: the API is temporarily unavailable for maintenance.\n- `INTERNAL_SERVER_ERROR`: an unexpected server error occurred.\n- `WORKFLOW_CREATION_FAILED`: the API could not start the requested generation.\n- `WORKFLOW_API_ERROR`: generation stopped because of an unexpected error.\n","enum":["INVALID_REQUEST","MALFORMED_UUID","UNAUTHORIZED","API_KEY_MISSING","API_KEY_INVALID","API_KEY_REVOKED","PLAN_FEATURE_REQUIRED","SUBSCRIPTION_FEATURE_REQUIRED","PRICE_CHANGED","VERSION_CHANGED","IDEMPOTENCY_CONFLICT","DOWNLOAD_UNAVAILABLE","CATALOGUE_CHANGED","LISTING_NOT_FOUND","MARKETPLACE_DOWNLOAD_ONLY","INSUFFICIENT_CREDITS","QUOTA_EXCEEDED","FILE_TOO_LARGE","UPLOAD_TIMEOUT","INVALID_CONTENT_TYPE","UNSUPPORTED_ASSET_FORMAT","FORMAT_NOT_AVAILABLE","INVALID_FBX_ZIP_STRUCTURE","IMAGE_RESOLUTION_EXCEEDED","VALIDATION_FAILED","UPLOAD_EXPIRED","MESH_REQUIREMENTS_NOT_MET","COLLECTION_NOT_FOUND","PROJECT_NOT_FOUND","GRAPH_NOT_FOUND","NODE_NOT_FOUND","GROUP_NOT_FOUND","PROJECT_NODE_LIMIT_EXCEEDED","CONFLICT","ASSET_NOT_FOUND","ASSET_IN_USE","BATCH_TOO_LARGE","CONCURRENT_EXECUTION_LIMIT_EXCEEDED","PBR_FAILURE_CAP_EXCEEDED","EXECUTION_NOT_FOUND","EXECUTION_IN_PROGRESS","RATE_LIMITED","SERVICE_UNAVAILABLE","MAINTENANCE_MODE","INTERNAL_SERVER_ERROR","WORKFLOW_CREATION_FAILED","WORKFLOW_API_ERROR"]},"PlanFeatureRequiredError":{"type":"object","required":["error"],"description":"The error envelope for a missing subscription feature.","properties":{"error":{"type":"object","required":["code","message","details"],"description":"The missing-feature error body.","properties":{"code":{"type":"string","const":"PLAN_FEATURE_REQUIRED","description":"Stable error code for a missing subscription feature."},"message":{"type":"string","description":"Human-readable description of the error."},"details":{"$ref":"#/components/schemas/PlanFeatureRequiredErrorDetails"}}}}},"PlanFeatureRequiredErrorDetails":{"type":"object","required":["feature","upgrade_plan_codes"],"description":"The missing feature and the active plans that provide it.","properties":{"feature":{"$ref":"#/components/schemas/SubscriptionFeature"},"upgrade_plan_codes":{"type":"array","description":"Active plans available for purchase that provide the missing\nfeature. The array uses plan class and opaque code order.\n","items":{"$ref":"#/components/schemas/SubscriptionPlanCode"}}}},"SubscriptionFeature":{"type":"string","description":"Product capability available to the account.\n\nPossible enum values:\n- `commercial_license`: commercial-use rights.\n- `api_pbr`: PBR generation through the Public Platform API.\n- `api_asset_download`: asset downloads through the Public Platform API.\n- `custom_polycount`: custom polygon counts for 3D generation.\n- `image_edit`: image editing.\n- `multiview`: multiview generation.\n- `asset_download`: asset downloads in the Marso web app.\n- `api_access`: access to the Public Platform API.\n- `scene_generation`: scene generation and multi-asset runs in the Marso web app.\n- `application_apps`: the Sim Ready and Game Ready apps.\n","enum":["commercial_license","api_pbr","api_asset_download","custom_polycount","image_edit","multiview","asset_download","api_access","scene_generation","application_apps"]},"SubscriptionPlanCode":{"type":"string","pattern":"^plan_[A-Za-z0-9]{7,64}$","description":"Opaque and immutable code for a subscription plan. A plan display name\ncan change. The code starts with `plan_`, followed by 7 to 64 ASCII\nletters or digits.\n"}},"responses":{"Unauthorized":{"description":"The API key is missing, invalid, or revoked. Possible error codes:\n`API_KEY_MISSING`, `API_KEY_INVALID`, `API_KEY_REVOKED`, or `UNAUTHORIZED`.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"PlanFeatureRequired":{"description":"The account does not have the plan feature required by this operation\n(`PLAN_FEATURE_REQUIRED`). The Free plan lacks `api_access`, so every\noperation refuses a Free account with this response. An account that\nlacks `api_pbr` or `api_asset_download` also gets it on the routes that\nneed those features.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlanFeatureRequiredError"}}}},"RateLimited":{"description":"Rate limit exceeded (`RATE_LIMITED`). The response includes a `Retry-After`\nheader with the number of seconds to wait before retrying, plus the\n`X-RateLimit-*` headers. Those headers are also present on successful (2xx)\nresponses so a client can pace itself.\n","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"X-RateLimit-Limit":{"description":"Request burst capacity for the API key.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current burst window.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix epoch seconds when the burst capacity is fully restored.\n","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"paths":{"/collections/{collection_id}/assets":{"post":{"operationId":"addCollectionAssets","tags":["collections"],"summary":"Add collection members","description":"Adds distinct live assets from your account. The response reports committed additions and already-present IDs. A collection can hold 10000 members.","parameters":[{"name":"collection_id","in":"path","required":true,"description":"The collection ID.","schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"description":"The request fields.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CollectionAssetsRequest"}}}},"responses":{"200":{"description":"The requested collection data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CollectionAddResult"}}}},"400":{"description":"The request, filters, cursor, or image is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/PlanFeatureRequired"},"404":{"description":"The collection or an added asset does not exist in your account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"description":"The API could not complete the request. Retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## Remove a collection member

> Removes a member reference and keeps the collection thumbnail.

```json
{"openapi":"3.1.0","info":{"title":"Marso Studio API","version":"0.0.1"},"tags":[{"name":"collections","description":"Manage groups of logical Library Assets and their images."}],"servers":[{"url":"https://api.marso.app/api/public/v1/","description":"Production server."}],"security":[{"apiKey":[]}],"components":{"securitySchemes":{"apiKey":{"type":"http","scheme":"bearer","description":"API key created in the Marso Studio dashboard. The value has the form\n`mxr_live_<entropy>` and is sent as a Bearer token in the `Authorization`\nheader.\n"}},"schemas":{"Error":{"type":"object","required":["error"],"description":"Canonical error envelope. The error payload is nested under the `error`\nkey.\n","properties":{"error":{"$ref":"#/components/schemas/ErrorBody"}}},"ErrorBody":{"type":"object","description":"The body of an error response. The `code` is a stable value clients can\nbranch on; the `message` is a human-readable explanation.\n","required":["code","message"],"properties":{"code":{"$ref":"#/components/schemas/ErrorCode"},"message":{"type":"string","description":"Human-readable description of the error.\n"},"details":{"type":["object","null"],"description":"Additional structured information about the error, or `null` if no\nextra details are available.\n","additionalProperties":true}}},"ErrorCode":{"type":"string","description":"Machine-readable error code. The enum contains every code that this API\ncan return.\n\nPossible enum values:\n- `INVALID_REQUEST`: the request body or a query parameter failed validation.\n- `MALFORMED_UUID`: a path parameter that should be a UUID is not one.\n- `UNAUTHORIZED`: the request could not be authenticated.\n- `API_KEY_MISSING`: no API key was supplied.\n- `API_KEY_INVALID`: the supplied API key does not match any known key.\n- `API_KEY_REVOKED`: the supplied API key has been revoked.\n- `PLAN_FEATURE_REQUIRED`: the account plan does not include a required feature.\n- `SUBSCRIPTION_FEATURE_REQUIRED`: a new Marketplace purchase requires a paid plan or assigned seat.\n- `PRICE_CHANGED`: the selected price differs from the price in the request.\n- `VERSION_CHANGED`: the selected Marketplace version differs from the requested version.\n- `IDEMPOTENCY_CONFLICT`: the same key was used for a different purchase request.\n- `DOWNLOAD_UNAVAILABLE`: the retained private content is temporarily unavailable.\n- `CATALOGUE_CHANGED`: the catalogue changed during pagination; restart the query.\n- `LISTING_NOT_FOUND`: the selected listing is absent or delisted.\n- `MARKETPLACE_DOWNLOAD_ONLY`: Marketplace content supports download and cannot enter generation.\n- `INSUFFICIENT_CREDITS`: the account does not have enough credits for this request.\n- `QUOTA_EXCEEDED`: a usage quota for the account has been exceeded.\n- `FILE_TOO_LARGE`: an uploaded or referenced file exceeds the allowed size.\n- `UPLOAD_TIMEOUT`: an image search upload exceeded 60 seconds. Try a smaller file or a faster connection.\n- `INVALID_CONTENT_TYPE`: a file's content type does not match its declared or expected type.\n- `UNSUPPORTED_ASSET_FORMAT`: a file's extension is not one of the supported asset formats.\n- `FORMAT_NOT_AVAILABLE`: the requested downloadable format does not exist for this asset.\n- `INVALID_FBX_ZIP_STRUCTURE`: a `.zip` upload is not a valid FBX bundle. The error message says why.\n- `IMAGE_RESOLUTION_EXCEEDED`: an image is larger than 4096 by 4096 pixels, or a texture in a mesh file is larger than 8192 by 8192 pixels.\n- `VALIDATION_FAILED`: the API could not check the uploaded file. Upload it again. This is the `error.code` of an upload status read. A failed batch item or run uses the same word with another meaning (see `ExecutionErrorBody`).\n- `UPLOAD_EXPIRED`: the upload did not finish within 1 hour. Upload the file again.\n- `MESH_REQUIREMENTS_NOT_MET`: the mesh file has no polygon geometry, no base-color texture, no UV coordinates, or it names a texture that the upload does not hold.\n- `COLLECTION_NOT_FOUND`: the collection does not exist in your account.\n- `PROJECT_NOT_FOUND`: the project does not exist, or another account owns it.\n- `GRAPH_NOT_FOUND`: the graph does not exist in this project.\n- `NODE_NOT_FOUND`: the node does not exist in this graph.\n- `GROUP_NOT_FOUND`: the group does not exist in this graph.\n- `PROJECT_NODE_LIMIT_EXCEEDED`: the project already holds as many nodes as it may hold.\n- `CONFLICT`: the request conflicts with the current state, so the server made no change.\n- `ASSET_NOT_FOUND`: the asset does not exist or does not belong to the account.\n- `ASSET_IN_USE`: an active execution uses a component, or another PBR execution shares a source or target component.\n- `BATCH_TOO_LARGE`: the batch contains more items than the endpoint allows.\n- `CONCURRENT_EXECUTION_LIMIT_EXCEEDED`: the account has reached its limit on simultaneous submissions.\n- `PBR_FAILURE_CAP_EXCEEDED`: the account has too many recent failed PBR runs; new submissions are temporarily blocked.\n- `EXECUTION_NOT_FOUND`: the execution or batch does not exist or does not belong to the account.\n- `EXECUTION_IN_PROGRESS`: the request conflicts with an execution that is still running.\n- `RATE_LIMITED`: the API key's rate limit was exceeded.\n- `SERVICE_UNAVAILABLE`: the requested operation is temporarily unavailable; retry later.\n- `MAINTENANCE_MODE`: the API is temporarily unavailable for maintenance.\n- `INTERNAL_SERVER_ERROR`: an unexpected server error occurred.\n- `WORKFLOW_CREATION_FAILED`: the API could not start the requested generation.\n- `WORKFLOW_API_ERROR`: generation stopped because of an unexpected error.\n","enum":["INVALID_REQUEST","MALFORMED_UUID","UNAUTHORIZED","API_KEY_MISSING","API_KEY_INVALID","API_KEY_REVOKED","PLAN_FEATURE_REQUIRED","SUBSCRIPTION_FEATURE_REQUIRED","PRICE_CHANGED","VERSION_CHANGED","IDEMPOTENCY_CONFLICT","DOWNLOAD_UNAVAILABLE","CATALOGUE_CHANGED","LISTING_NOT_FOUND","MARKETPLACE_DOWNLOAD_ONLY","INSUFFICIENT_CREDITS","QUOTA_EXCEEDED","FILE_TOO_LARGE","UPLOAD_TIMEOUT","INVALID_CONTENT_TYPE","UNSUPPORTED_ASSET_FORMAT","FORMAT_NOT_AVAILABLE","INVALID_FBX_ZIP_STRUCTURE","IMAGE_RESOLUTION_EXCEEDED","VALIDATION_FAILED","UPLOAD_EXPIRED","MESH_REQUIREMENTS_NOT_MET","COLLECTION_NOT_FOUND","PROJECT_NOT_FOUND","GRAPH_NOT_FOUND","NODE_NOT_FOUND","GROUP_NOT_FOUND","PROJECT_NODE_LIMIT_EXCEEDED","CONFLICT","ASSET_NOT_FOUND","ASSET_IN_USE","BATCH_TOO_LARGE","CONCURRENT_EXECUTION_LIMIT_EXCEEDED","PBR_FAILURE_CAP_EXCEEDED","EXECUTION_NOT_FOUND","EXECUTION_IN_PROGRESS","RATE_LIMITED","SERVICE_UNAVAILABLE","MAINTENANCE_MODE","INTERNAL_SERVER_ERROR","WORKFLOW_CREATION_FAILED","WORKFLOW_API_ERROR"]},"PlanFeatureRequiredError":{"type":"object","required":["error"],"description":"The error envelope for a missing subscription feature.","properties":{"error":{"type":"object","required":["code","message","details"],"description":"The missing-feature error body.","properties":{"code":{"type":"string","const":"PLAN_FEATURE_REQUIRED","description":"Stable error code for a missing subscription feature."},"message":{"type":"string","description":"Human-readable description of the error."},"details":{"$ref":"#/components/schemas/PlanFeatureRequiredErrorDetails"}}}}},"PlanFeatureRequiredErrorDetails":{"type":"object","required":["feature","upgrade_plan_codes"],"description":"The missing feature and the active plans that provide it.","properties":{"feature":{"$ref":"#/components/schemas/SubscriptionFeature"},"upgrade_plan_codes":{"type":"array","description":"Active plans available for purchase that provide the missing\nfeature. The array uses plan class and opaque code order.\n","items":{"$ref":"#/components/schemas/SubscriptionPlanCode"}}}},"SubscriptionFeature":{"type":"string","description":"Product capability available to the account.\n\nPossible enum values:\n- `commercial_license`: commercial-use rights.\n- `api_pbr`: PBR generation through the Public Platform API.\n- `api_asset_download`: asset downloads through the Public Platform API.\n- `custom_polycount`: custom polygon counts for 3D generation.\n- `image_edit`: image editing.\n- `multiview`: multiview generation.\n- `asset_download`: asset downloads in the Marso web app.\n- `api_access`: access to the Public Platform API.\n- `scene_generation`: scene generation and multi-asset runs in the Marso web app.\n- `application_apps`: the Sim Ready and Game Ready apps.\n","enum":["commercial_license","api_pbr","api_asset_download","custom_polycount","image_edit","multiview","asset_download","api_access","scene_generation","application_apps"]},"SubscriptionPlanCode":{"type":"string","pattern":"^plan_[A-Za-z0-9]{7,64}$","description":"Opaque and immutable code for a subscription plan. A plan display name\ncan change. The code starts with `plan_`, followed by 7 to 64 ASCII\nletters or digits.\n"}},"responses":{"Unauthorized":{"description":"The API key is missing, invalid, or revoked. Possible error codes:\n`API_KEY_MISSING`, `API_KEY_INVALID`, `API_KEY_REVOKED`, or `UNAUTHORIZED`.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"PlanFeatureRequired":{"description":"The account does not have the plan feature required by this operation\n(`PLAN_FEATURE_REQUIRED`). The Free plan lacks `api_access`, so every\noperation refuses a Free account with this response. An account that\nlacks `api_pbr` or `api_asset_download` also gets it on the routes that\nneed those features.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlanFeatureRequiredError"}}}},"RateLimited":{"description":"Rate limit exceeded (`RATE_LIMITED`). The response includes a `Retry-After`\nheader with the number of seconds to wait before retrying, plus the\n`X-RateLimit-*` headers. Those headers are also present on successful (2xx)\nresponses so a client can pace itself.\n","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"X-RateLimit-Limit":{"description":"Request burst capacity for the API key.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current burst window.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix epoch seconds when the burst capacity is fully restored.\n","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"paths":{"/collections/{collection_id}/assets/{library_asset_id}":{"delete":{"operationId":"removeCollectionAsset","tags":["collections"],"summary":"Remove a collection member","description":"Removes a member reference and keeps the collection thumbnail.","parameters":[{"name":"collection_id","in":"path","required":true,"description":"The collection ID.","schema":{"type":"string","format":"uuid"}},{"name":"library_asset_id","in":"path","required":true,"description":"The logical Library Asset ID.","schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":"The operation completed."},"400":{"description":"The request, filters, cursor, or image is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/PlanFeatureRequired"},"404":{"description":"The collection or an added asset does not exist in your account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"description":"The API could not complete the request. Retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## Save a collection thumbnail

> Saves raw PNG or WebP bytes as an independent image. The limit is 10 MiB and 4096 pixels per edge.

```json
{"openapi":"3.1.0","info":{"title":"Marso Studio API","version":"0.0.1"},"tags":[{"name":"collections","description":"Manage groups of logical Library Assets and their images."}],"servers":[{"url":"https://api.marso.app/api/public/v1/","description":"Production server."}],"security":[{"apiKey":[]}],"components":{"securitySchemes":{"apiKey":{"type":"http","scheme":"bearer","description":"API key created in the Marso Studio dashboard. The value has the form\n`mxr_live_<entropy>` and is sent as a Bearer token in the `Authorization`\nheader.\n"}},"schemas":{"Error":{"type":"object","required":["error"],"description":"Canonical error envelope. The error payload is nested under the `error`\nkey.\n","properties":{"error":{"$ref":"#/components/schemas/ErrorBody"}}},"ErrorBody":{"type":"object","description":"The body of an error response. The `code` is a stable value clients can\nbranch on; the `message` is a human-readable explanation.\n","required":["code","message"],"properties":{"code":{"$ref":"#/components/schemas/ErrorCode"},"message":{"type":"string","description":"Human-readable description of the error.\n"},"details":{"type":["object","null"],"description":"Additional structured information about the error, or `null` if no\nextra details are available.\n","additionalProperties":true}}},"ErrorCode":{"type":"string","description":"Machine-readable error code. The enum contains every code that this API\ncan return.\n\nPossible enum values:\n- `INVALID_REQUEST`: the request body or a query parameter failed validation.\n- `MALFORMED_UUID`: a path parameter that should be a UUID is not one.\n- `UNAUTHORIZED`: the request could not be authenticated.\n- `API_KEY_MISSING`: no API key was supplied.\n- `API_KEY_INVALID`: the supplied API key does not match any known key.\n- `API_KEY_REVOKED`: the supplied API key has been revoked.\n- `PLAN_FEATURE_REQUIRED`: the account plan does not include a required feature.\n- `SUBSCRIPTION_FEATURE_REQUIRED`: a new Marketplace purchase requires a paid plan or assigned seat.\n- `PRICE_CHANGED`: the selected price differs from the price in the request.\n- `VERSION_CHANGED`: the selected Marketplace version differs from the requested version.\n- `IDEMPOTENCY_CONFLICT`: the same key was used for a different purchase request.\n- `DOWNLOAD_UNAVAILABLE`: the retained private content is temporarily unavailable.\n- `CATALOGUE_CHANGED`: the catalogue changed during pagination; restart the query.\n- `LISTING_NOT_FOUND`: the selected listing is absent or delisted.\n- `MARKETPLACE_DOWNLOAD_ONLY`: Marketplace content supports download and cannot enter generation.\n- `INSUFFICIENT_CREDITS`: the account does not have enough credits for this request.\n- `QUOTA_EXCEEDED`: a usage quota for the account has been exceeded.\n- `FILE_TOO_LARGE`: an uploaded or referenced file exceeds the allowed size.\n- `UPLOAD_TIMEOUT`: an image search upload exceeded 60 seconds. Try a smaller file or a faster connection.\n- `INVALID_CONTENT_TYPE`: a file's content type does not match its declared or expected type.\n- `UNSUPPORTED_ASSET_FORMAT`: a file's extension is not one of the supported asset formats.\n- `FORMAT_NOT_AVAILABLE`: the requested downloadable format does not exist for this asset.\n- `INVALID_FBX_ZIP_STRUCTURE`: a `.zip` upload is not a valid FBX bundle. The error message says why.\n- `IMAGE_RESOLUTION_EXCEEDED`: an image is larger than 4096 by 4096 pixels, or a texture in a mesh file is larger than 8192 by 8192 pixels.\n- `VALIDATION_FAILED`: the API could not check the uploaded file. Upload it again. This is the `error.code` of an upload status read. A failed batch item or run uses the same word with another meaning (see `ExecutionErrorBody`).\n- `UPLOAD_EXPIRED`: the upload did not finish within 1 hour. Upload the file again.\n- `MESH_REQUIREMENTS_NOT_MET`: the mesh file has no polygon geometry, no base-color texture, no UV coordinates, or it names a texture that the upload does not hold.\n- `COLLECTION_NOT_FOUND`: the collection does not exist in your account.\n- `PROJECT_NOT_FOUND`: the project does not exist, or another account owns it.\n- `GRAPH_NOT_FOUND`: the graph does not exist in this project.\n- `NODE_NOT_FOUND`: the node does not exist in this graph.\n- `GROUP_NOT_FOUND`: the group does not exist in this graph.\n- `PROJECT_NODE_LIMIT_EXCEEDED`: the project already holds as many nodes as it may hold.\n- `CONFLICT`: the request conflicts with the current state, so the server made no change.\n- `ASSET_NOT_FOUND`: the asset does not exist or does not belong to the account.\n- `ASSET_IN_USE`: an active execution uses a component, or another PBR execution shares a source or target component.\n- `BATCH_TOO_LARGE`: the batch contains more items than the endpoint allows.\n- `CONCURRENT_EXECUTION_LIMIT_EXCEEDED`: the account has reached its limit on simultaneous submissions.\n- `PBR_FAILURE_CAP_EXCEEDED`: the account has too many recent failed PBR runs; new submissions are temporarily blocked.\n- `EXECUTION_NOT_FOUND`: the execution or batch does not exist or does not belong to the account.\n- `EXECUTION_IN_PROGRESS`: the request conflicts with an execution that is still running.\n- `RATE_LIMITED`: the API key's rate limit was exceeded.\n- `SERVICE_UNAVAILABLE`: the requested operation is temporarily unavailable; retry later.\n- `MAINTENANCE_MODE`: the API is temporarily unavailable for maintenance.\n- `INTERNAL_SERVER_ERROR`: an unexpected server error occurred.\n- `WORKFLOW_CREATION_FAILED`: the API could not start the requested generation.\n- `WORKFLOW_API_ERROR`: generation stopped because of an unexpected error.\n","enum":["INVALID_REQUEST","MALFORMED_UUID","UNAUTHORIZED","API_KEY_MISSING","API_KEY_INVALID","API_KEY_REVOKED","PLAN_FEATURE_REQUIRED","SUBSCRIPTION_FEATURE_REQUIRED","PRICE_CHANGED","VERSION_CHANGED","IDEMPOTENCY_CONFLICT","DOWNLOAD_UNAVAILABLE","CATALOGUE_CHANGED","LISTING_NOT_FOUND","MARKETPLACE_DOWNLOAD_ONLY","INSUFFICIENT_CREDITS","QUOTA_EXCEEDED","FILE_TOO_LARGE","UPLOAD_TIMEOUT","INVALID_CONTENT_TYPE","UNSUPPORTED_ASSET_FORMAT","FORMAT_NOT_AVAILABLE","INVALID_FBX_ZIP_STRUCTURE","IMAGE_RESOLUTION_EXCEEDED","VALIDATION_FAILED","UPLOAD_EXPIRED","MESH_REQUIREMENTS_NOT_MET","COLLECTION_NOT_FOUND","PROJECT_NOT_FOUND","GRAPH_NOT_FOUND","NODE_NOT_FOUND","GROUP_NOT_FOUND","PROJECT_NODE_LIMIT_EXCEEDED","CONFLICT","ASSET_NOT_FOUND","ASSET_IN_USE","BATCH_TOO_LARGE","CONCURRENT_EXECUTION_LIMIT_EXCEEDED","PBR_FAILURE_CAP_EXCEEDED","EXECUTION_NOT_FOUND","EXECUTION_IN_PROGRESS","RATE_LIMITED","SERVICE_UNAVAILABLE","MAINTENANCE_MODE","INTERNAL_SERVER_ERROR","WORKFLOW_CREATION_FAILED","WORKFLOW_API_ERROR"]},"PlanFeatureRequiredError":{"type":"object","required":["error"],"description":"The error envelope for a missing subscription feature.","properties":{"error":{"type":"object","required":["code","message","details"],"description":"The missing-feature error body.","properties":{"code":{"type":"string","const":"PLAN_FEATURE_REQUIRED","description":"Stable error code for a missing subscription feature."},"message":{"type":"string","description":"Human-readable description of the error."},"details":{"$ref":"#/components/schemas/PlanFeatureRequiredErrorDetails"}}}}},"PlanFeatureRequiredErrorDetails":{"type":"object","required":["feature","upgrade_plan_codes"],"description":"The missing feature and the active plans that provide it.","properties":{"feature":{"$ref":"#/components/schemas/SubscriptionFeature"},"upgrade_plan_codes":{"type":"array","description":"Active plans available for purchase that provide the missing\nfeature. The array uses plan class and opaque code order.\n","items":{"$ref":"#/components/schemas/SubscriptionPlanCode"}}}},"SubscriptionFeature":{"type":"string","description":"Product capability available to the account.\n\nPossible enum values:\n- `commercial_license`: commercial-use rights.\n- `api_pbr`: PBR generation through the Public Platform API.\n- `api_asset_download`: asset downloads through the Public Platform API.\n- `custom_polycount`: custom polygon counts for 3D generation.\n- `image_edit`: image editing.\n- `multiview`: multiview generation.\n- `asset_download`: asset downloads in the Marso web app.\n- `api_access`: access to the Public Platform API.\n- `scene_generation`: scene generation and multi-asset runs in the Marso web app.\n- `application_apps`: the Sim Ready and Game Ready apps.\n","enum":["commercial_license","api_pbr","api_asset_download","custom_polycount","image_edit","multiview","asset_download","api_access","scene_generation","application_apps"]},"SubscriptionPlanCode":{"type":"string","pattern":"^plan_[A-Za-z0-9]{7,64}$","description":"Opaque and immutable code for a subscription plan. A plan display name\ncan change. The code starts with `plan_`, followed by 7 to 64 ASCII\nletters or digits.\n"}},"responses":{"Unauthorized":{"description":"The API key is missing, invalid, or revoked. Possible error codes:\n`API_KEY_MISSING`, `API_KEY_INVALID`, `API_KEY_REVOKED`, or `UNAUTHORIZED`.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"PlanFeatureRequired":{"description":"The account does not have the plan feature required by this operation\n(`PLAN_FEATURE_REQUIRED`). The Free plan lacks `api_access`, so every\noperation refuses a Free account with this response. An account that\nlacks `api_pbr` or `api_asset_download` also gets it on the routes that\nneed those features.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlanFeatureRequiredError"}}}},"RateLimited":{"description":"Rate limit exceeded (`RATE_LIMITED`). The response includes a `Retry-After`\nheader with the number of seconds to wait before retrying, plus the\n`X-RateLimit-*` headers. Those headers are also present on successful (2xx)\nresponses so a client can pace itself.\n","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"X-RateLimit-Limit":{"description":"Request burst capacity for the API key.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current burst window.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix epoch seconds when the burst capacity is fully restored.\n","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"paths":{"/collections/{collection_id}/thumbnail":{"put":{"operationId":"uploadCollectionThumbnail","tags":["collections"],"summary":"Save a collection thumbnail","description":"Saves raw PNG or WebP bytes as an independent image. The limit is 10 MiB and 4096 pixels per edge.","parameters":[{"name":"collection_id","in":"path","required":true,"description":"The collection ID.","schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"description":"The image bytes, with the matching Content-Type.","content":{"image/png":{"schema":{"type":"string","format":"binary"}},"image/webp":{"schema":{"type":"string","format":"binary"}}}},"responses":{"204":{"description":"The operation completed."},"400":{"description":"The request, filters, cursor, or image is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/PlanFeatureRequired"},"404":{"description":"The collection or an added asset does not exist in your account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"description":"The API could not complete the request. Retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## Generate a collection preview

> Returns a 1280 by 720 PNG from the first 8 live members in a 4 by 2 grid. Missing or invalid thumbnails leave blank tiles. This changes no saved image. Save the preview with PUT /collections/{collection\_id}/thumbnail.

```json
{"openapi":"3.1.0","info":{"title":"Marso Studio API","version":"0.0.1"},"tags":[{"name":"collections","description":"Manage groups of logical Library Assets and their images."}],"servers":[{"url":"https://api.marso.app/api/public/v1/","description":"Production server."}],"security":[{"apiKey":[]}],"components":{"securitySchemes":{"apiKey":{"type":"http","scheme":"bearer","description":"API key created in the Marso Studio dashboard. The value has the form\n`mxr_live_<entropy>` and is sent as a Bearer token in the `Authorization`\nheader.\n"}},"schemas":{"Error":{"type":"object","required":["error"],"description":"Canonical error envelope. The error payload is nested under the `error`\nkey.\n","properties":{"error":{"$ref":"#/components/schemas/ErrorBody"}}},"ErrorBody":{"type":"object","description":"The body of an error response. The `code` is a stable value clients can\nbranch on; the `message` is a human-readable explanation.\n","required":["code","message"],"properties":{"code":{"$ref":"#/components/schemas/ErrorCode"},"message":{"type":"string","description":"Human-readable description of the error.\n"},"details":{"type":["object","null"],"description":"Additional structured information about the error, or `null` if no\nextra details are available.\n","additionalProperties":true}}},"ErrorCode":{"type":"string","description":"Machine-readable error code. The enum contains every code that this API\ncan return.\n\nPossible enum values:\n- `INVALID_REQUEST`: the request body or a query parameter failed validation.\n- `MALFORMED_UUID`: a path parameter that should be a UUID is not one.\n- `UNAUTHORIZED`: the request could not be authenticated.\n- `API_KEY_MISSING`: no API key was supplied.\n- `API_KEY_INVALID`: the supplied API key does not match any known key.\n- `API_KEY_REVOKED`: the supplied API key has been revoked.\n- `PLAN_FEATURE_REQUIRED`: the account plan does not include a required feature.\n- `SUBSCRIPTION_FEATURE_REQUIRED`: a new Marketplace purchase requires a paid plan or assigned seat.\n- `PRICE_CHANGED`: the selected price differs from the price in the request.\n- `VERSION_CHANGED`: the selected Marketplace version differs from the requested version.\n- `IDEMPOTENCY_CONFLICT`: the same key was used for a different purchase request.\n- `DOWNLOAD_UNAVAILABLE`: the retained private content is temporarily unavailable.\n- `CATALOGUE_CHANGED`: the catalogue changed during pagination; restart the query.\n- `LISTING_NOT_FOUND`: the selected listing is absent or delisted.\n- `MARKETPLACE_DOWNLOAD_ONLY`: Marketplace content supports download and cannot enter generation.\n- `INSUFFICIENT_CREDITS`: the account does not have enough credits for this request.\n- `QUOTA_EXCEEDED`: a usage quota for the account has been exceeded.\n- `FILE_TOO_LARGE`: an uploaded or referenced file exceeds the allowed size.\n- `UPLOAD_TIMEOUT`: an image search upload exceeded 60 seconds. Try a smaller file or a faster connection.\n- `INVALID_CONTENT_TYPE`: a file's content type does not match its declared or expected type.\n- `UNSUPPORTED_ASSET_FORMAT`: a file's extension is not one of the supported asset formats.\n- `FORMAT_NOT_AVAILABLE`: the requested downloadable format does not exist for this asset.\n- `INVALID_FBX_ZIP_STRUCTURE`: a `.zip` upload is not a valid FBX bundle. The error message says why.\n- `IMAGE_RESOLUTION_EXCEEDED`: an image is larger than 4096 by 4096 pixels, or a texture in a mesh file is larger than 8192 by 8192 pixels.\n- `VALIDATION_FAILED`: the API could not check the uploaded file. Upload it again. This is the `error.code` of an upload status read. A failed batch item or run uses the same word with another meaning (see `ExecutionErrorBody`).\n- `UPLOAD_EXPIRED`: the upload did not finish within 1 hour. Upload the file again.\n- `MESH_REQUIREMENTS_NOT_MET`: the mesh file has no polygon geometry, no base-color texture, no UV coordinates, or it names a texture that the upload does not hold.\n- `COLLECTION_NOT_FOUND`: the collection does not exist in your account.\n- `PROJECT_NOT_FOUND`: the project does not exist, or another account owns it.\n- `GRAPH_NOT_FOUND`: the graph does not exist in this project.\n- `NODE_NOT_FOUND`: the node does not exist in this graph.\n- `GROUP_NOT_FOUND`: the group does not exist in this graph.\n- `PROJECT_NODE_LIMIT_EXCEEDED`: the project already holds as many nodes as it may hold.\n- `CONFLICT`: the request conflicts with the current state, so the server made no change.\n- `ASSET_NOT_FOUND`: the asset does not exist or does not belong to the account.\n- `ASSET_IN_USE`: an active execution uses a component, or another PBR execution shares a source or target component.\n- `BATCH_TOO_LARGE`: the batch contains more items than the endpoint allows.\n- `CONCURRENT_EXECUTION_LIMIT_EXCEEDED`: the account has reached its limit on simultaneous submissions.\n- `PBR_FAILURE_CAP_EXCEEDED`: the account has too many recent failed PBR runs; new submissions are temporarily blocked.\n- `EXECUTION_NOT_FOUND`: the execution or batch does not exist or does not belong to the account.\n- `EXECUTION_IN_PROGRESS`: the request conflicts with an execution that is still running.\n- `RATE_LIMITED`: the API key's rate limit was exceeded.\n- `SERVICE_UNAVAILABLE`: the requested operation is temporarily unavailable; retry later.\n- `MAINTENANCE_MODE`: the API is temporarily unavailable for maintenance.\n- `INTERNAL_SERVER_ERROR`: an unexpected server error occurred.\n- `WORKFLOW_CREATION_FAILED`: the API could not start the requested generation.\n- `WORKFLOW_API_ERROR`: generation stopped because of an unexpected error.\n","enum":["INVALID_REQUEST","MALFORMED_UUID","UNAUTHORIZED","API_KEY_MISSING","API_KEY_INVALID","API_KEY_REVOKED","PLAN_FEATURE_REQUIRED","SUBSCRIPTION_FEATURE_REQUIRED","PRICE_CHANGED","VERSION_CHANGED","IDEMPOTENCY_CONFLICT","DOWNLOAD_UNAVAILABLE","CATALOGUE_CHANGED","LISTING_NOT_FOUND","MARKETPLACE_DOWNLOAD_ONLY","INSUFFICIENT_CREDITS","QUOTA_EXCEEDED","FILE_TOO_LARGE","UPLOAD_TIMEOUT","INVALID_CONTENT_TYPE","UNSUPPORTED_ASSET_FORMAT","FORMAT_NOT_AVAILABLE","INVALID_FBX_ZIP_STRUCTURE","IMAGE_RESOLUTION_EXCEEDED","VALIDATION_FAILED","UPLOAD_EXPIRED","MESH_REQUIREMENTS_NOT_MET","COLLECTION_NOT_FOUND","PROJECT_NOT_FOUND","GRAPH_NOT_FOUND","NODE_NOT_FOUND","GROUP_NOT_FOUND","PROJECT_NODE_LIMIT_EXCEEDED","CONFLICT","ASSET_NOT_FOUND","ASSET_IN_USE","BATCH_TOO_LARGE","CONCURRENT_EXECUTION_LIMIT_EXCEEDED","PBR_FAILURE_CAP_EXCEEDED","EXECUTION_NOT_FOUND","EXECUTION_IN_PROGRESS","RATE_LIMITED","SERVICE_UNAVAILABLE","MAINTENANCE_MODE","INTERNAL_SERVER_ERROR","WORKFLOW_CREATION_FAILED","WORKFLOW_API_ERROR"]},"PlanFeatureRequiredError":{"type":"object","required":["error"],"description":"The error envelope for a missing subscription feature.","properties":{"error":{"type":"object","required":["code","message","details"],"description":"The missing-feature error body.","properties":{"code":{"type":"string","const":"PLAN_FEATURE_REQUIRED","description":"Stable error code for a missing subscription feature."},"message":{"type":"string","description":"Human-readable description of the error."},"details":{"$ref":"#/components/schemas/PlanFeatureRequiredErrorDetails"}}}}},"PlanFeatureRequiredErrorDetails":{"type":"object","required":["feature","upgrade_plan_codes"],"description":"The missing feature and the active plans that provide it.","properties":{"feature":{"$ref":"#/components/schemas/SubscriptionFeature"},"upgrade_plan_codes":{"type":"array","description":"Active plans available for purchase that provide the missing\nfeature. The array uses plan class and opaque code order.\n","items":{"$ref":"#/components/schemas/SubscriptionPlanCode"}}}},"SubscriptionFeature":{"type":"string","description":"Product capability available to the account.\n\nPossible enum values:\n- `commercial_license`: commercial-use rights.\n- `api_pbr`: PBR generation through the Public Platform API.\n- `api_asset_download`: asset downloads through the Public Platform API.\n- `custom_polycount`: custom polygon counts for 3D generation.\n- `image_edit`: image editing.\n- `multiview`: multiview generation.\n- `asset_download`: asset downloads in the Marso web app.\n- `api_access`: access to the Public Platform API.\n- `scene_generation`: scene generation and multi-asset runs in the Marso web app.\n- `application_apps`: the Sim Ready and Game Ready apps.\n","enum":["commercial_license","api_pbr","api_asset_download","custom_polycount","image_edit","multiview","asset_download","api_access","scene_generation","application_apps"]},"SubscriptionPlanCode":{"type":"string","pattern":"^plan_[A-Za-z0-9]{7,64}$","description":"Opaque and immutable code for a subscription plan. A plan display name\ncan change. The code starts with `plan_`, followed by 7 to 64 ASCII\nletters or digits.\n"}},"responses":{"Unauthorized":{"description":"The API key is missing, invalid, or revoked. Possible error codes:\n`API_KEY_MISSING`, `API_KEY_INVALID`, `API_KEY_REVOKED`, or `UNAUTHORIZED`.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"PlanFeatureRequired":{"description":"The account does not have the plan feature required by this operation\n(`PLAN_FEATURE_REQUIRED`). The Free plan lacks `api_access`, so every\noperation refuses a Free account with this response. An account that\nlacks `api_pbr` or `api_asset_download` also gets it on the routes that\nneed those features.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlanFeatureRequiredError"}}}},"RateLimited":{"description":"Rate limit exceeded (`RATE_LIMITED`). The response includes a `Retry-After`\nheader with the number of seconds to wait before retrying, plus the\n`X-RateLimit-*` headers. Those headers are also present on successful (2xx)\nresponses so a client can pace itself.\n","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"X-RateLimit-Limit":{"description":"Request burst capacity for the API key.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current burst window.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix epoch seconds when the burst capacity is fully restored.\n","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"paths":{"/collections/{collection_id}/thumbnail/generate":{"post":{"operationId":"generateCollectionThumbnail","tags":["collections"],"summary":"Generate a collection preview","description":"Returns a 1280 by 720 PNG from the first 8 live members in a 4 by 2 grid. Missing or invalid thumbnails leave blank tiles. This changes no saved image. Save the preview with PUT /collections/{collection_id}/thumbnail.","parameters":[{"name":"collection_id","in":"path","required":true,"description":"The collection ID.","schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"The PNG preview. No saved image changes.","content":{"image/png":{"schema":{"type":"string","format":"binary"}}}},"400":{"description":"The request, filters, cursor, or image is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/PlanFeatureRequired"},"404":{"description":"The collection or an added asset does not exist in your account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"description":"The API could not complete the request. Retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## List direct source images

> Returns direct image inputs for mesh generation, including multiview components. PBR members use their geometry inputs. Download the physical IDs through the asset endpoints.

```json
{"openapi":"3.1.0","info":{"title":"Marso Studio API","version":"0.0.1"},"tags":[{"name":"collections","description":"Manage groups of logical Library Assets and their images."}],"servers":[{"url":"https://api.marso.app/api/public/v1/","description":"Production server."}],"security":[{"apiKey":[]}],"components":{"securitySchemes":{"apiKey":{"type":"http","scheme":"bearer","description":"API key created in the Marso Studio dashboard. The value has the form\n`mxr_live_<entropy>` and is sent as a Bearer token in the `Authorization`\nheader.\n"}},"schemas":{"CollectionSourceImageList":{"type":"object","description":"The source references for one member page. Downloads use the existing asset endpoints and their plan requirements.","properties":{"data":{"type":"array","description":"The member source references.","items":{"$ref":"#/components/schemas/CollectionSourceImages"}},"pagination":{"$ref":"#/components/schemas/PublicPagination"},"unavailable_library_asset_ids":{"type":"array","description":"The IDs that this page cannot resolve.","items":{"type":"string","description":"The logical Library Asset ID.","format":"uuid"}}},"required":["data","pagination","unavailable_library_asset_ids"]},"CollectionSourceImages":{"type":"object","description":"Direct inputs for a collection member. PBR members use their geometry inputs. This list does not walk earlier ancestors of images.","properties":{"library_asset_id":{"type":"string","description":"The collection member ID.","format":"uuid"},"source_images":{"type":"array","description":"The direct image files, without duplicate physical IDs.","items":{"$ref":"#/components/schemas/CollectionSourceImage"}},"unavailable_source_library_asset_ids":{"type":"array","description":"The unresolved logical inputs.","items":{"type":"string","description":"The ID of the Library Asset that supplied the input.","format":"uuid"}}},"required":["library_asset_id","source_images","unavailable_source_library_asset_ids"]},"CollectionSourceImage":{"type":"object","description":"A file for a direct image input.","properties":{"asset_id":{"type":"string","description":"The physical Asset ID. Download through GET /assets/{asset_id} or POST /assets/download.","format":"uuid"},"input_role":{"type":"string","description":"The generation input role or multiview component role."},"source_library_asset_id":{"type":"string","description":"The ID of the Library Asset that supplied the input.","format":"uuid"}},"required":["asset_id","input_role","source_library_asset_id"]},"PublicPagination":{"type":"object","required":["has_more"],"description":"Cursor pagination envelope.\n","properties":{"next_cursor":{"type":"string","description":"Opaque cursor for the next page. Absent when the result set is\nexhausted. Echo it back verbatim as `cursor`.\n"},"has_more":{"type":"boolean","description":"Whether another page follows. Always agrees with the presence of\n`next_cursor`.\n"}}},"Error":{"type":"object","required":["error"],"description":"Canonical error envelope. The error payload is nested under the `error`\nkey.\n","properties":{"error":{"$ref":"#/components/schemas/ErrorBody"}}},"ErrorBody":{"type":"object","description":"The body of an error response. The `code` is a stable value clients can\nbranch on; the `message` is a human-readable explanation.\n","required":["code","message"],"properties":{"code":{"$ref":"#/components/schemas/ErrorCode"},"message":{"type":"string","description":"Human-readable description of the error.\n"},"details":{"type":["object","null"],"description":"Additional structured information about the error, or `null` if no\nextra details are available.\n","additionalProperties":true}}},"ErrorCode":{"type":"string","description":"Machine-readable error code. The enum contains every code that this API\ncan return.\n\nPossible enum values:\n- `INVALID_REQUEST`: the request body or a query parameter failed validation.\n- `MALFORMED_UUID`: a path parameter that should be a UUID is not one.\n- `UNAUTHORIZED`: the request could not be authenticated.\n- `API_KEY_MISSING`: no API key was supplied.\n- `API_KEY_INVALID`: the supplied API key does not match any known key.\n- `API_KEY_REVOKED`: the supplied API key has been revoked.\n- `PLAN_FEATURE_REQUIRED`: the account plan does not include a required feature.\n- `SUBSCRIPTION_FEATURE_REQUIRED`: a new Marketplace purchase requires a paid plan or assigned seat.\n- `PRICE_CHANGED`: the selected price differs from the price in the request.\n- `VERSION_CHANGED`: the selected Marketplace version differs from the requested version.\n- `IDEMPOTENCY_CONFLICT`: the same key was used for a different purchase request.\n- `DOWNLOAD_UNAVAILABLE`: the retained private content is temporarily unavailable.\n- `CATALOGUE_CHANGED`: the catalogue changed during pagination; restart the query.\n- `LISTING_NOT_FOUND`: the selected listing is absent or delisted.\n- `MARKETPLACE_DOWNLOAD_ONLY`: Marketplace content supports download and cannot enter generation.\n- `INSUFFICIENT_CREDITS`: the account does not have enough credits for this request.\n- `QUOTA_EXCEEDED`: a usage quota for the account has been exceeded.\n- `FILE_TOO_LARGE`: an uploaded or referenced file exceeds the allowed size.\n- `UPLOAD_TIMEOUT`: an image search upload exceeded 60 seconds. Try a smaller file or a faster connection.\n- `INVALID_CONTENT_TYPE`: a file's content type does not match its declared or expected type.\n- `UNSUPPORTED_ASSET_FORMAT`: a file's extension is not one of the supported asset formats.\n- `FORMAT_NOT_AVAILABLE`: the requested downloadable format does not exist for this asset.\n- `INVALID_FBX_ZIP_STRUCTURE`: a `.zip` upload is not a valid FBX bundle. The error message says why.\n- `IMAGE_RESOLUTION_EXCEEDED`: an image is larger than 4096 by 4096 pixels, or a texture in a mesh file is larger than 8192 by 8192 pixels.\n- `VALIDATION_FAILED`: the API could not check the uploaded file. Upload it again. This is the `error.code` of an upload status read. A failed batch item or run uses the same word with another meaning (see `ExecutionErrorBody`).\n- `UPLOAD_EXPIRED`: the upload did not finish within 1 hour. Upload the file again.\n- `MESH_REQUIREMENTS_NOT_MET`: the mesh file has no polygon geometry, no base-color texture, no UV coordinates, or it names a texture that the upload does not hold.\n- `COLLECTION_NOT_FOUND`: the collection does not exist in your account.\n- `PROJECT_NOT_FOUND`: the project does not exist, or another account owns it.\n- `GRAPH_NOT_FOUND`: the graph does not exist in this project.\n- `NODE_NOT_FOUND`: the node does not exist in this graph.\n- `GROUP_NOT_FOUND`: the group does not exist in this graph.\n- `PROJECT_NODE_LIMIT_EXCEEDED`: the project already holds as many nodes as it may hold.\n- `CONFLICT`: the request conflicts with the current state, so the server made no change.\n- `ASSET_NOT_FOUND`: the asset does not exist or does not belong to the account.\n- `ASSET_IN_USE`: an active execution uses a component, or another PBR execution shares a source or target component.\n- `BATCH_TOO_LARGE`: the batch contains more items than the endpoint allows.\n- `CONCURRENT_EXECUTION_LIMIT_EXCEEDED`: the account has reached its limit on simultaneous submissions.\n- `PBR_FAILURE_CAP_EXCEEDED`: the account has too many recent failed PBR runs; new submissions are temporarily blocked.\n- `EXECUTION_NOT_FOUND`: the execution or batch does not exist or does not belong to the account.\n- `EXECUTION_IN_PROGRESS`: the request conflicts with an execution that is still running.\n- `RATE_LIMITED`: the API key's rate limit was exceeded.\n- `SERVICE_UNAVAILABLE`: the requested operation is temporarily unavailable; retry later.\n- `MAINTENANCE_MODE`: the API is temporarily unavailable for maintenance.\n- `INTERNAL_SERVER_ERROR`: an unexpected server error occurred.\n- `WORKFLOW_CREATION_FAILED`: the API could not start the requested generation.\n- `WORKFLOW_API_ERROR`: generation stopped because of an unexpected error.\n","enum":["INVALID_REQUEST","MALFORMED_UUID","UNAUTHORIZED","API_KEY_MISSING","API_KEY_INVALID","API_KEY_REVOKED","PLAN_FEATURE_REQUIRED","SUBSCRIPTION_FEATURE_REQUIRED","PRICE_CHANGED","VERSION_CHANGED","IDEMPOTENCY_CONFLICT","DOWNLOAD_UNAVAILABLE","CATALOGUE_CHANGED","LISTING_NOT_FOUND","MARKETPLACE_DOWNLOAD_ONLY","INSUFFICIENT_CREDITS","QUOTA_EXCEEDED","FILE_TOO_LARGE","UPLOAD_TIMEOUT","INVALID_CONTENT_TYPE","UNSUPPORTED_ASSET_FORMAT","FORMAT_NOT_AVAILABLE","INVALID_FBX_ZIP_STRUCTURE","IMAGE_RESOLUTION_EXCEEDED","VALIDATION_FAILED","UPLOAD_EXPIRED","MESH_REQUIREMENTS_NOT_MET","COLLECTION_NOT_FOUND","PROJECT_NOT_FOUND","GRAPH_NOT_FOUND","NODE_NOT_FOUND","GROUP_NOT_FOUND","PROJECT_NODE_LIMIT_EXCEEDED","CONFLICT","ASSET_NOT_FOUND","ASSET_IN_USE","BATCH_TOO_LARGE","CONCURRENT_EXECUTION_LIMIT_EXCEEDED","PBR_FAILURE_CAP_EXCEEDED","EXECUTION_NOT_FOUND","EXECUTION_IN_PROGRESS","RATE_LIMITED","SERVICE_UNAVAILABLE","MAINTENANCE_MODE","INTERNAL_SERVER_ERROR","WORKFLOW_CREATION_FAILED","WORKFLOW_API_ERROR"]},"PlanFeatureRequiredError":{"type":"object","required":["error"],"description":"The error envelope for a missing subscription feature.","properties":{"error":{"type":"object","required":["code","message","details"],"description":"The missing-feature error body.","properties":{"code":{"type":"string","const":"PLAN_FEATURE_REQUIRED","description":"Stable error code for a missing subscription feature."},"message":{"type":"string","description":"Human-readable description of the error."},"details":{"$ref":"#/components/schemas/PlanFeatureRequiredErrorDetails"}}}}},"PlanFeatureRequiredErrorDetails":{"type":"object","required":["feature","upgrade_plan_codes"],"description":"The missing feature and the active plans that provide it.","properties":{"feature":{"$ref":"#/components/schemas/SubscriptionFeature"},"upgrade_plan_codes":{"type":"array","description":"Active plans available for purchase that provide the missing\nfeature. The array uses plan class and opaque code order.\n","items":{"$ref":"#/components/schemas/SubscriptionPlanCode"}}}},"SubscriptionFeature":{"type":"string","description":"Product capability available to the account.\n\nPossible enum values:\n- `commercial_license`: commercial-use rights.\n- `api_pbr`: PBR generation through the Public Platform API.\n- `api_asset_download`: asset downloads through the Public Platform API.\n- `custom_polycount`: custom polygon counts for 3D generation.\n- `image_edit`: image editing.\n- `multiview`: multiview generation.\n- `asset_download`: asset downloads in the Marso web app.\n- `api_access`: access to the Public Platform API.\n- `scene_generation`: scene generation and multi-asset runs in the Marso web app.\n- `application_apps`: the Sim Ready and Game Ready apps.\n","enum":["commercial_license","api_pbr","api_asset_download","custom_polycount","image_edit","multiview","asset_download","api_access","scene_generation","application_apps"]},"SubscriptionPlanCode":{"type":"string","pattern":"^plan_[A-Za-z0-9]{7,64}$","description":"Opaque and immutable code for a subscription plan. A plan display name\ncan change. The code starts with `plan_`, followed by 7 to 64 ASCII\nletters or digits.\n"}},"responses":{"Unauthorized":{"description":"The API key is missing, invalid, or revoked. Possible error codes:\n`API_KEY_MISSING`, `API_KEY_INVALID`, `API_KEY_REVOKED`, or `UNAUTHORIZED`.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"PlanFeatureRequired":{"description":"The account does not have the plan feature required by this operation\n(`PLAN_FEATURE_REQUIRED`). The Free plan lacks `api_access`, so every\noperation refuses a Free account with this response. An account that\nlacks `api_pbr` or `api_asset_download` also gets it on the routes that\nneed those features.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlanFeatureRequiredError"}}}},"RateLimited":{"description":"Rate limit exceeded (`RATE_LIMITED`). The response includes a `Retry-After`\nheader with the number of seconds to wait before retrying, plus the\n`X-RateLimit-*` headers. Those headers are also present on successful (2xx)\nresponses so a client can pace itself.\n","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"X-RateLimit-Limit":{"description":"Request burst capacity for the API key.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current burst window.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix epoch seconds when the burst capacity is fully restored.\n","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"paths":{"/collections/{collection_id}/source-images":{"get":{"operationId":"listCollectionSourceImages","tags":["collections"],"summary":"List direct source images","description":"Returns direct image inputs for mesh generation, including multiview components. PBR members use their geometry inputs. Download the physical IDs through the asset endpoints.","parameters":[{"name":"collection_id","in":"path","required":true,"description":"The collection ID.","schema":{"type":"string","format":"uuid"}},{"name":"limit","in":"query","required":false,"description":"The page size. Defaults to 50; the API reduces values above 100 to 100.","schema":{"type":"integer","minimum":1,"default":50}},{"name":"cursor","in":"query","required":false,"description":"The opaque continuation token. Keep the same filters and sort order.","schema":{"type":"string"}}],"responses":{"200":{"description":"The requested collection data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CollectionSourceImageList"}}}},"400":{"description":"The request, filters, cursor, or image is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/PlanFeatureRequired"},"404":{"description":"The collection or an added asset does not exist in your account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"description":"The API could not complete the request. Retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://docs.m-xr.com/marso-studio-api/api/collections.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
