PBR
Submit meshes and images for PBR generation.
Batches group one or more PBR generation jobs together. Use these endpoints to submit 3D mesh to PBR or image to PBR batches, poll a batch for progress, and list recent batches.
Submits one or more ready mesh assets for 3D mesh to PBR generation. The same options are applied to every mesh in the batch. Each asset must be a ready mesh uploaded via POST /batch/uploads.
The request returns immediately with a batch_id (202). Poll GET /batch/{batch_id} for the batch status and, as each item finishes, its generated material maps and download URLs. Credits are reserved when you submit and refunded automatically for any item that fails, so you are only charged for successful results.
API key created in the Marso Studio dashboard. The value has the form
mxr_live_<entropy> and is sent as a Bearer token in the Authorization
header.
Request body for POST /batch/pbr/mesh. Submit one or more ready mesh
assets for 3D mesh to PBR generation.
IDs of the ready mesh assets to process. These assets must have been
uploaded via POST /batch/uploads and must currently be in the ready
state.
Batch created and queued.
Body returned by POST /batch/pbr/* (202) and GET /batch/{batch_id}
(200). On submission items is empty; poll the batch to populate it.
completed_at is set once the batch reaches a terminal status; failed_at
is set only when that terminal status is FAILED.
Unique identifier of the batch.
Aggregate status of a PBR batch.
Possible enum values:
QUEUED: the batch is waiting to start.RUNNING: at least one item is being processed.COMPLETED: every item succeeded.PARTIALLY_COMPLETED: the batch finished with a mix of successes and failures.FAILED: every item failed.
Time represented as milliseconds since the Unix epoch.
Time represented as milliseconds since the Unix epoch, or null when the
field has not been set.
Time represented as milliseconds since the Unix epoch, or null when the
field has not been set.
The request is invalid because the asset_ids list is empty or too
long, an asset was not found or is not owned by the authenticated account, an asset
is not a mesh, or an asset is not ready (INVALID_REQUEST).
The API key is missing, invalid, or revoked. Possible error codes:
API_KEY_MISSING, API_KEY_INVALID, API_KEY_REVOKED, or UNAUTHORIZED.
The account does not have the plan feature required by this operation
(PLAN_FEATURE_REQUIRED).
The request could not be accepted because of a rate or concurrency limit. Possible error codes:
RATE_LIMITED: the API-key rate limit was exceeded.CONCURRENT_EXECUTION_LIMIT_EXCEEDED: a single submission exceeded the concurrency limit.PBR_FAILURE_CAP_EXCEEDED: too many consecutive failures; check the input before retrying.
POST /api/public/v1/batch/pbr/mesh HTTP/1.1
Host: api.marso.app/
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 161
{
"asset_ids": [
"123e4567-e89b-12d3-a456-426614174000"
],
"options": {
"detail_transfer": {
"enabled": true
},
"output_2d": {
"orm": {
"enabled": false,
"channel_order": "ORM"
}
}
}
}{
"batch_id": "text",
"status": "QUEUED",
"request_counts": {
"total": 1,
"completed": 1,
"failed": 1,
"pending": 1
},
"created_at": 1,
"completed_at": null,
"failed_at": null,
"items": [
{
"execution_id": "text",
"asset_id": "text",
"status": "QUEUED",
"thumbnail_url": "https://example.com",
"thumbnail_url_expires_at": 1,
"pbr_material_assets": {
"ANY_ADDITIONAL_PROPERTY": {
"asset_id": "text",
"download_url": "https://example.com",
"expires_at": 1
}
},
"usdz": {
"asset_id": "text",
"download_url": "https://example.com",
"expires_at": 1
},
"error": {
"code": "VALIDATION_FAILED",
"message": "text"
},
"created_at": 1
}
]
}Submits one or more ready image assets for image to PBR generation. The image counterpart of POST /batch/pbr/mesh. It takes the same options, except output_2d. Image results do not include a USDZ file.
The request returns immediately with a batch_id (202). Poll GET /batch/{batch_id} for the batch status and each image's generated material maps and download URLs. Credits are reserved when you submit and refunded automatically for any item that fails.
API key created in the Marso Studio dashboard. The value has the form
mxr_live_<entropy> and is sent as a Bearer token in the Authorization
header.
Request body for POST /batch/pbr/image. Image PBR options do not
include output_2d.
IDs of the ready image assets to process. These assets must have
been uploaded via POST /batch/uploads and must currently be in the
ready state.
Batch created and queued.
Body returned by POST /batch/pbr/* (202) and GET /batch/{batch_id}
(200). On submission items is empty; poll the batch to populate it.
completed_at is set once the batch reaches a terminal status; failed_at
is set only when that terminal status is FAILED.
Unique identifier of the batch.
Aggregate status of a PBR batch.
Possible enum values:
QUEUED: the batch is waiting to start.RUNNING: at least one item is being processed.COMPLETED: every item succeeded.PARTIALLY_COMPLETED: the batch finished with a mix of successes and failures.FAILED: every item failed.
Time represented as milliseconds since the Unix epoch.
Time represented as milliseconds since the Unix epoch, or null when the
field has not been set.
Time represented as milliseconds since the Unix epoch, or null when the
field has not been set.
The request is invalid because the asset_ids list is empty or too
long, an asset was not found or is not owned by the authenticated account, an asset
is not an image, or an asset is not ready (INVALID_REQUEST).
The API key is missing, invalid, or revoked. Possible error codes:
API_KEY_MISSING, API_KEY_INVALID, API_KEY_REVOKED, or UNAUTHORIZED.
The account does not have the plan feature required by this operation
(PLAN_FEATURE_REQUIRED).
The request could not be accepted because of a rate or concurrency limit. Possible error codes:
RATE_LIMITED: the API-key rate limit was exceeded.CONCURRENT_EXECUTION_LIMIT_EXCEEDED: a single submission exceeded the concurrency limit.PBR_FAILURE_CAP_EXCEEDED: too many consecutive failures; check the input before retrying.
POST /api/public/v1/batch/pbr/image HTTP/1.1
Host: api.marso.app/
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 101
{
"asset_ids": [
"123e4567-e89b-12d3-a456-426614174000"
],
"options": {
"detail_transfer": {
"enabled": true
}
}
}{
"batch_id": "text",
"status": "QUEUED",
"request_counts": {
"total": 1,
"completed": 1,
"failed": 1,
"pending": 1
},
"created_at": 1,
"completed_at": null,
"failed_at": null,
"items": [
{
"execution_id": "text",
"asset_id": "text",
"status": "QUEUED",
"thumbnail_url": "https://example.com",
"thumbnail_url_expires_at": 1,
"pbr_material_assets": {
"ANY_ADDITIONAL_PROPERTY": {
"asset_id": "text",
"download_url": "https://example.com",
"expires_at": 1
}
},
"usdz": {
"asset_id": "text",
"download_url": "https://example.com",
"expires_at": 1
},
"error": {
"code": "VALIDATION_FAILED",
"message": "text"
},
"created_at": 1
}
]
}Returns your PBR batches, newest first, as paginated summaries. Each summary contains the batch ID, status, per-status counts, and timestamps. Per-item results are not included; use GET /batch/{batch_id} to fetch the full results for a batch.
API key created in the Marso Studio dashboard. The value has the form
mxr_live_<entropy> and is sent as a Bearer token in the Authorization
header.
Page size. Defaults to 50 and is clamped to a maximum of 200. Non-positive or non-numeric values fall back to the default.
50Opaque pagination cursor returned by the previous page as next_cursor.
Omit on the first request.
A page of batch summaries.
Response from GET /batch. A paginated list of batch summaries.
Opaque cursor for the next page. Absent or empty when the result set is exhausted.
A query parameter is invalid (INVALID_REQUEST).
The API key is missing, invalid, or revoked. Possible error codes:
API_KEY_MISSING, API_KEY_INVALID, API_KEY_REVOKED, or UNAUTHORIZED.
Rate limit exceeded (RATE_LIMITED). The response includes a Retry-After
header with the number of seconds to wait before retrying, plus the
X-RateLimit-* headers. Those headers are also present on successful (2xx)
responses so a client can pace itself.
GET /api/public/v1/batch HTTP/1.1
Host: api.marso.app/
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
"batches": [
{
"batch_id": "text",
"status": "QUEUED",
"request_counts": {
"total": 1,
"completed": 1,
"failed": 1,
"pending": 1
},
"created_at": 1,
"completed_at": null,
"failed_at": null
}
],
"next_cursor": "text"
}Returns a batch's status, per-item counts, and the finished results for each item. As items finish, the response includes their generated material maps with ready-to-use download URLs, or a typed error for failed items. This is the endpoint you poll after submitting a PBR batch. items is empty until at least one item has reached a terminal state.
API key created in the Marso Studio dashboard. The value has the form
mxr_live_<entropy> and is sent as a Bearer token in the Authorization
header.
Unique identifier of the batch.
Batch status and finished items.
Body returned by POST /batch/pbr/* (202) and GET /batch/{batch_id}
(200). On submission items is empty; poll the batch to populate it.
completed_at is set once the batch reaches a terminal status; failed_at
is set only when that terminal status is FAILED.
Unique identifier of the batch.
Aggregate status of a PBR batch.
Possible enum values:
QUEUED: the batch is waiting to start.RUNNING: at least one item is being processed.COMPLETED: every item succeeded.PARTIALLY_COMPLETED: the batch finished with a mix of successes and failures.FAILED: every item failed.
Time represented as milliseconds since the Unix epoch.
Time represented as milliseconds since the Unix epoch, or null when the
field has not been set.
Time represented as milliseconds since the Unix epoch, or null when the
field has not been set.
The API key is missing, invalid, or revoked. Possible error codes:
API_KEY_MISSING, API_KEY_INVALID, API_KEY_REVOKED, or UNAUTHORIZED.
The account does not have the plan feature required by this operation
(PLAN_FEATURE_REQUIRED).
The batch does not exist or does not belong to your account (EXECUTION_NOT_FOUND).
Rate limit exceeded (RATE_LIMITED). The response includes a Retry-After
header with the number of seconds to wait before retrying, plus the
X-RateLimit-* headers. Those headers are also present on successful (2xx)
responses so a client can pace itself.
GET /api/public/v1/batch/{batch_id} HTTP/1.1
Host: api.marso.app/
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
"batch_id": "text",
"status": "QUEUED",
"request_counts": {
"total": 1,
"completed": 1,
"failed": 1,
"pending": 1
},
"created_at": 1,
"completed_at": null,
"failed_at": null,
"items": [
{
"execution_id": "text",
"asset_id": "text",
"status": "QUEUED",
"thumbnail_url": "https://example.com",
"thumbnail_url_expires_at": 1,
"pbr_material_assets": {
"ANY_ADDITIONAL_PROPERTY": {
"asset_id": "text",
"download_url": "https://example.com",
"expires_at": 1
}
},
"usdz": {
"asset_id": "text",
"download_url": "https://example.com",
"expires_at": 1
},
"error": {
"code": "VALIDATION_FAILED",
"message": "text"
},
"created_at": 1
}
]
}Submits one ready mesh asset for 3D mesh to PBR generation. The asset must be a ready mesh uploaded with POST /uploads or POST /batch/uploads.
The request returns immediately with an execution_id (202). Poll GET /pbr/executions/{execution_id} for the status and, once the run finishes, the generated material maps and their download URLs. Credits are reserved when you submit and refunded automatically if the run fails, so you are only charged for a successful result.
Use POST /batch/pbr/mesh instead when you have several meshes to submit together.
API key created in the Marso Studio dashboard. The value has the form
mxr_live_<entropy> and is sent as a Bearer token in the Authorization
header.
Request body for POST /pbr/execute/mesh. Submit one ready mesh asset
for PBR generation.
The ID of the mesh asset to process. Upload it with POST /uploads
or POST /batch/uploads first. Its status must be ready.
The execution was created and queued.
Body returned by POST /pbr/execute/* (202) and
GET /pbr/executions/{execution_id} (200). It describes one execution and
is not a batch envelope: there is no batch ID, no counts, and no items
array.
On submission every result field is empty, because nothing has finished
yet. asset_id is the source asset you submitted, so a failed execution is
always traceable to its input. pbr_material_assets maps each
"<slot>/<pass>" to its generated texture asset and a ready-to-use
download_url, and usdz is the textured 3D model of a succeeded mesh
execution. thumbnail_url is a preview image, always present on a
succeeded mesh execution, and best-effort on a succeeded image execution.
error is set only when the execution failed.
Unique identifier of the execution. Poll it at
GET /pbr/executions/{execution_id}.
The ID of the source asset that was submitted.
Status of a single item within a batch.
Possible enum values:
QUEUED: the item is waiting to start.RUNNING: the item is being processed.SUCCEEDED: the item completed successfully.PARTIAL_SUCCEEDED: the item completed but some optional outputs are missing.FAILED: the item failed. See theerrorfield for details.CANCELED: the item stopped without producing a result, and any credits held for it are returned. Submit the request again to retry it.
URL of a preview image. Always present on a succeeded mesh execution; best-effort on a succeeded image execution.
Time represented as milliseconds since the Unix epoch.
Time represented as milliseconds since the Unix epoch.
Time represented as milliseconds since the Unix epoch, or null when the
field has not been set.
The API rejects a request without asset_id. It also rejects
unsupported options, a non-mesh asset, or an asset outside the
ready state (INVALID_REQUEST).
The API key is missing, invalid, or revoked. Possible error codes:
API_KEY_MISSING, API_KEY_INVALID, API_KEY_REVOKED, or UNAUTHORIZED.
The account does not have the plan feature required by this operation
(PLAN_FEATURE_REQUIRED).
The asset does not exist or does not belong to the authenticated
account (ASSET_NOT_FOUND).
The request could not be accepted because of a rate or concurrency limit. Possible error codes:
RATE_LIMITED: the API-key rate limit was exceeded.CONCURRENT_EXECUTION_LIMIT_EXCEEDED: a single submission exceeded the concurrency limit.PBR_FAILURE_CAP_EXCEEDED: too many consecutive failures; check the input before retrying.
POST /api/public/v1/pbr/execute/mesh HTTP/1.1
Host: api.marso.app/
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 158
{
"asset_id": "123e4567-e89b-12d3-a456-426614174000",
"options": {
"detail_transfer": {
"enabled": true
},
"output_2d": {
"orm": {
"enabled": false,
"channel_order": "ORM"
}
}
}
}{
"execution_id": "text",
"asset_id": "text",
"status": "QUEUED",
"thumbnail_url": "https://example.com",
"thumbnail_url_expires_at": 1,
"pbr_material_assets": {
"ANY_ADDITIONAL_PROPERTY": {
"asset_id": "text",
"download_url": "https://example.com",
"expires_at": 1
}
},
"usdz": {
"asset_id": "text",
"download_url": "https://example.com",
"expires_at": 1
},
"error": {
"code": "VALIDATION_FAILED",
"message": "text"
},
"created_at": 1,
"completed_at": null
}Submits one ready image asset for image to PBR generation. The image counterpart of POST /pbr/execute/mesh. It takes the same options, except output_2d. Image results do not include a USDZ file.
The request returns immediately with an execution_id (202). Poll GET /pbr/executions/{execution_id} for the status and the generated material maps. Credits are reserved when you submit and refunded automatically if the run fails.
Use POST /batch/pbr/image instead when you have several images to submit together.
API key created in the Marso Studio dashboard. The value has the form
mxr_live_<entropy> and is sent as a Bearer token in the Authorization
header.
Request body for POST /pbr/execute/image. Submit one ready image asset
for PBR generation. Image PBR options do not include output_2d.
The ID of the image asset to process. Upload it with
POST /uploads or POST /batch/uploads first. Its status must be
ready.
The execution was created and queued.
Body returned by POST /pbr/execute/* (202) and
GET /pbr/executions/{execution_id} (200). It describes one execution and
is not a batch envelope: there is no batch ID, no counts, and no items
array.
On submission every result field is empty, because nothing has finished
yet. asset_id is the source asset you submitted, so a failed execution is
always traceable to its input. pbr_material_assets maps each
"<slot>/<pass>" to its generated texture asset and a ready-to-use
download_url, and usdz is the textured 3D model of a succeeded mesh
execution. thumbnail_url is a preview image, always present on a
succeeded mesh execution, and best-effort on a succeeded image execution.
error is set only when the execution failed.
Unique identifier of the execution. Poll it at
GET /pbr/executions/{execution_id}.
The ID of the source asset that was submitted.
Status of a single item within a batch.
Possible enum values:
QUEUED: the item is waiting to start.RUNNING: the item is being processed.SUCCEEDED: the item completed successfully.PARTIAL_SUCCEEDED: the item completed but some optional outputs are missing.FAILED: the item failed. See theerrorfield for details.CANCELED: the item stopped without producing a result, and any credits held for it are returned. Submit the request again to retry it.
URL of a preview image. Always present on a succeeded mesh execution; best-effort on a succeeded image execution.
Time represented as milliseconds since the Unix epoch.
Time represented as milliseconds since the Unix epoch.
Time represented as milliseconds since the Unix epoch, or null when the
field has not been set.
The API rejects a request without asset_id. It also rejects
unsupported options, a non-image asset, or an asset outside the
ready state (INVALID_REQUEST).
The API key is missing, invalid, or revoked. Possible error codes:
API_KEY_MISSING, API_KEY_INVALID, API_KEY_REVOKED, or UNAUTHORIZED.
The account does not have the plan feature required by this operation
(PLAN_FEATURE_REQUIRED).
The asset does not exist or does not belong to the authenticated
account (ASSET_NOT_FOUND).
The request could not be accepted because of a rate or concurrency limit. Possible error codes:
RATE_LIMITED: the API-key rate limit was exceeded.CONCURRENT_EXECUTION_LIMIT_EXCEEDED: a single submission exceeded the concurrency limit.PBR_FAILURE_CAP_EXCEEDED: too many consecutive failures; check the input before retrying.
POST /api/public/v1/pbr/execute/image HTTP/1.1
Host: api.marso.app/
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 98
{
"asset_id": "123e4567-e89b-12d3-a456-426614174000",
"options": {
"detail_transfer": {
"enabled": true
}
}
}{
"execution_id": "text",
"asset_id": "text",
"status": "QUEUED",
"thumbnail_url": "https://example.com",
"thumbnail_url_expires_at": 1,
"pbr_material_assets": {
"ANY_ADDITIONAL_PROPERTY": {
"asset_id": "text",
"download_url": "https://example.com",
"expires_at": 1
}
},
"usdz": {
"asset_id": "text",
"download_url": "https://example.com",
"expires_at": 1
},
"error": {
"code": "VALIDATION_FAILED",
"message": "text"
},
"created_at": 1,
"completed_at": null
}Returns the status of one execution submitted with POST /pbr/execute/mesh or POST /pbr/execute/image and, once it finishes, its generated material maps with ready-to-use download URLs, or a typed error if it failed. This is the endpoint you poll after a single submission.
The status moves from QUEUED straight to its terminal value. A single execution does not report RUNNING, so poll for a terminal status rather than waiting for a start signal.
This endpoint serves single submissions only. The items of a batch are read with GET /batch/{batch_id}.
API key created in the Marso Studio dashboard. The value has the form
mxr_live_<entropy> and is sent as a Bearer token in the Authorization
header.
Unique identifier of the execution.
The status and final result of the execution.
Body returned by POST /pbr/execute/* (202) and
GET /pbr/executions/{execution_id} (200). It describes one execution and
is not a batch envelope: there is no batch ID, no counts, and no items
array.
On submission every result field is empty, because nothing has finished
yet. asset_id is the source asset you submitted, so a failed execution is
always traceable to its input. pbr_material_assets maps each
"<slot>/<pass>" to its generated texture asset and a ready-to-use
download_url, and usdz is the textured 3D model of a succeeded mesh
execution. thumbnail_url is a preview image, always present on a
succeeded mesh execution, and best-effort on a succeeded image execution.
error is set only when the execution failed.
Unique identifier of the execution. Poll it at
GET /pbr/executions/{execution_id}.
The ID of the source asset that was submitted.
Status of a single item within a batch.
Possible enum values:
QUEUED: the item is waiting to start.RUNNING: the item is being processed.SUCCEEDED: the item completed successfully.PARTIAL_SUCCEEDED: the item completed but some optional outputs are missing.FAILED: the item failed. See theerrorfield for details.CANCELED: the item stopped without producing a result, and any credits held for it are returned. Submit the request again to retry it.
URL of a preview image. Always present on a succeeded mesh execution; best-effort on a succeeded image execution.
Time represented as milliseconds since the Unix epoch.
Time represented as milliseconds since the Unix epoch.
Time represented as milliseconds since the Unix epoch, or null when the
field has not been set.
The execution ID is malformed (MALFORMED_UUID).
The API key is missing, invalid, or revoked. Possible error codes:
API_KEY_MISSING, API_KEY_INVALID, API_KEY_REVOKED, or UNAUTHORIZED.
The account does not have the plan feature required by this operation
(PLAN_FEATURE_REQUIRED).
The execution does not exist, does not belong to your account, or was not
created by a single submission (EXECUTION_NOT_FOUND). The items of a
batch are read with GET /batch/{batch_id}.
Rate limit exceeded (RATE_LIMITED). The response includes a Retry-After
header with the number of seconds to wait before retrying, plus the
X-RateLimit-* headers. Those headers are also present on successful (2xx)
responses so a client can pace itself.
GET /api/public/v1/pbr/executions/{execution_id} HTTP/1.1
Host: api.marso.app/
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
"execution_id": "text",
"asset_id": "text",
"status": "QUEUED",
"thumbnail_url": "https://example.com",
"thumbnail_url_expires_at": 1,
"pbr_material_assets": {
"ANY_ADDITIONAL_PROPERTY": {
"asset_id": "text",
"download_url": "https://example.com",
"expires_at": 1
}
},
"usdz": {
"asset_id": "text",
"download_url": "https://example.com",
"expires_at": 1
},
"error": {
"code": "VALIDATION_FAILED",
"message": "text"
},
"created_at": 1,
"completed_at": null
}Last updated
