AI photoshoot studio: garments, avatars, locations, and art direction
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Use this when the user attaches images in this chat and wants them in Uwear, on the Shoot Board or in a shoot: clothing, a Model, a Location or a reference. Put each attachment in its own field, image_file_1, image_file_2, ... in attachment order, as the chat provides it: ChatGPT passes the file itself, also when you see only a file name or path. Chat attachments only: a web address is refused (ask the user to attach that photo). kinds: {image_file_N: garment|avatar|location|reference} for photos whose kind the user said or is clear (avatar: a person to use as a Model); Uwear sorts the rest. Saves each photo to the library (a repeat is reused), adds it to the board and returns its pile and asset id for propose_brief / update_brief. A photo returned unsure lists two candidates: ask the user and call again with the same files, kinds, sides and back_of. back_of: {image_file_N: image_file_M} when image_file_N is the back of the same garment image_file_M shows from the front (you can see they match): Uwear saves one garment with both photos. sides: {image_file_N: back} for a garment photo that plainly shows a garment's back with no front photo of it here; left out, a photo is its garment's front.
The open Shoot Board's board_id, from Open Shoot Board or your context.
An image attached in this chat, passed as the chat provides it.
What each photo is, when you can tell (garment: clothing; avatar: a person to use as a Model; location: a place; reference: a pose, mood or styling photo), or the user's answer for one that came back unsure: {image_file_N: kind}. A photo left out is sorted by Uwear.
Garment photos only, when you can see which side one shows: {image_file_N: back} for a photo of the garment's back. A photo left out is its garment's front.
Two photos of one garment, when you can see they match: {image_file_N: image_file_M} for image_file_N showing the back of the garment image_file_M shows from the front. Uwear saves one garment with both photos.
An image attached in this chat, passed as the chat provides it.
An image attached in this chat, passed as the chat provides it.
An image attached in this chat, passed as the chat provides it.
An image attached in this chat, passed as the chat provides it.
An image attached in this chat, passed as the chat provides it.
An image attached in this chat, passed as the chat provides it.
An image attached in this chat, passed as the chat provides it.
An image attached in this chat, passed as the chat provides it.
An image attached in this chat, passed as the chat provides it.
Only after running a previous call's upload_command: {image_file_N: the sha256 it printed for that photo}. Never the attachments themselves: those go in image_file_N.
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
Tool list last changed Oct 25, 2026.
Use this when the user attaches images in this chat and wants them in Uwear, on the Shoot Board or in a shoot: clothing, a Model, a Location or a reference. Put each attachment in its own field, image_file_1, image_file_2, ... in attachment order, as the chat provides it: ChatGPT passes the file itself, also when you see only a file name or path. Chat attachments only: a web address is refused (ask the user to attach that photo). kinds: {image_file_N: garment|avatar|location|reference} for photos whose kind the user said or is clear (avatar: a person to use as a Model); Uwear sorts the rest. Saves each photo to the library (a repeat is reused), adds it to the board and returns its pile and asset id for propose_brief / update_brief. A photo returned unsure lists two candidates: ask the user and call again with the same files, kinds, sides and back_of. back_of: {image_file_N: image_file_M} when image_file_N is the back of the same garment image_file_M shows from the front (you can see they match): Uwear saves one garment with both photos. sides: {image_file_N: back} for a garment photo that plainly shows a garment's back with no front photo of it here; left out, a photo is its garment's front.
| Argument | Type | Description |
|---|---|---|
| kinds | object | What each photo is, when you can tell (garment: clothing; avatar: a person to use as a Model; location: a place; reference: a pose, mood or styling photo), or the user's answer for one that came back unsure: {image_file_N: kind}. A photo left out is sorted by Uwear. |
| sides | object | Garment photos only, when you can see which side one shows: {image_file_N: back} for a photo of the garment's back. A photo left out is its garment's front. |
| back_of | object | Two photos of one garment, when you can see they match: {image_file_N: image_file_M} for image_file_N showing the back of the garment image_file_M shows from the front. Uwear saves one garment with both photos. |
| board_id* | string | The open Shoot Board's board_id, from Open Shoot Board or your context. |
| image_file_1* | object | An image attached in this chat, passed as the chat provides it. |
| image_file_2 | object | An image attached in this chat, passed as the chat provides it. |
| image_file_3 | object | An image attached in this chat, passed as the chat provides it. |
| image_file_4 | object | An image attached in this chat, passed as the chat provides it. |
| image_file_5 | object | An image attached in this chat, passed as the chat provides it. |
| image_file_6 | object | An image attached in this chat, passed as the chat provides it. |
| image_file_7 | object | An image attached in this chat, passed as the chat provides it. |
| image_file_8 | object | An image attached in this chat, passed as the chat provides it. |
| image_file_9 | object | An image attached in this chat, passed as the chat provides it. |
| image_file_10 | object | An image attached in this chat, passed as the chat provides it. |
| upload_handles | object | Only after running a previous call's upload_command: {image_file_N: the sha256 it printed for that photo}. Never the attachments themselves: those go in image_file_N. |
{
"type": "object",
"required": [
"image_file_1",
"board_id"
],
"properties": {
"kinds": {
"type": "object",
"properties": {
"image_file_1": {
"enum": [
"garment",
"avatar",
"location",
"reference"
],
"type": "string"
},
"image_file_2": {
"enum": [
"garment",
"avatar",
"location",
"reference"
],
"type": "string"
},
"image_file_3": {
"enum": [
"garment",
"avatar",
"location",
"reference"
],
"type": "string"
},
"image_file_4": {
"enum": [
"garment",
"avatar",
"location",
"reference"
],
"type": "string"
},
"image_file_5": {
"enum": [
"garment",
"avatar",
"location",
"reference"
],
"type": "string"
},
"image_file_6": {
"enum": [
"garment",
"avatar",
"location",
"reference"
],
"type": "string"
},
"image_file_7": {
"enum": [
"garment",
"avatar",
"location",
"reference"
],
"type": "string"
},
"image_file_8": {
"enum": [
"garment",
"avatar",
"location",
"reference"
],
"type": "string"
},
"image_file_9": {
"enum": [
"garment",
"avatar",
"location",
"reference"
],
"type": "string"
},
"image_file_10": {
"enum": [
"garment",
"avatar",
"location",
"reference"
],
"type": "string"
}
},
"description": "What each photo is, when you can tell (garment: clothing; avatar: a person to use as a Model; location: a place; reference: a pose, mood or styling photo), or the user's answer for one that came back unsure: {image_file_N: kind}. A photo left out is sorted by Uwear.",
"additionalProperties": false
},
"sides": {
"type": "object",
"properties": {
"image_file_1": {
"enum": [
"front",
"back"
],
"type": "string"
},
"image_file_2": {
"enum": [
"front",
"back"
],
"type": "string"
},
"image_file_3": {
"enum": [
"front",
"back"
],
"type": "string"
},
"image_file_4": {
"enum": [
"front",
"back"
],
"type": "string"
},
"image_file_5": {
"enum": [
"front",
"back"
],
"type": "string"
},
"image_file_6": {
"enum": [
"front",
"back"
],
"type": "string"
},
"image_file_7": {
"enum": [
"front",
"back"
],
"type": "string"
},
"image_file_8": {
"enum": [
"front",
"back"
],
"type": "string"
},
"image_file_9": {
"enum": [
"front",
"back"
],
"type": "string"
},
"image_file_10": {
"enum": [
"front",
"back"
],
"type": "string"
}
},
"description": "Garment photos only, when you can see which side one shows: {image_file_N: back} for a photo of the garment's back. A photo left out is its garment's front.",
"additionalProperties": false
},
"back_of": {
"type": "object",
"properties": {
"image_file_1": {
"type": "string",
"pattern": "^image_file_([1-9]|10)$"
},
"image_file_2": {
"type": "string",
"pattern": "^image_file_([1-9]|10)$"
},
"image_file_3": {
"type": "string",
"pattern": "^image_file_([1-9]|10)$"
},
"image_file_4": {
"type": "string",
"pattern": "^image_file_([1-9]|10)$"
},
"image_file_5": {
"type": "string",
"pattern": "^image_file_([1-9]|10)$"
},
"image_file_6": {
"type": "string",
"pattern": "^image_file_([1-9]|10)$"
},
"image_file_7": {
"type": "string",
"pattern": "^image_file_([1-9]|10)$"
},
"image_file_8": {
"type": "string",
"pattern": "^image_file_([1-9]|10)$"
},
"image_file_9": {
"type": "string",
"pattern": "^image_file_([1-9]|10)$"
},
"image_file_10": {
"type": "string",
"pattern": "^image_file_([1-9]|10)$"
}
},
"description": "Two photos of one garment, when you can see they match: {image_file_N: image_file_M} for image_file_N showing the back of the garment image_file_M shows from the front. Uwear saves one garment with both photos.",
"additionalProperties": false
},
"board_id": {
"type": "string",
"description": "The open Shoot Board's board_id, from Open Shoot Board or your context."
},
"image_file_1": {
"type": "object",
"required": [
"download_url",
"file_id"
],
"properties": {
"file_id": {
"type": "string"
},
"file_name": {
"type": "string"
},
"mime_type": {
"type": "string"
},
"download_url": {
"type": "string"
}
},
"description": "An image attached in this chat, passed as the chat provides it.",
"additionalProperties": false
},
"image_file_2": {
"type": "object",
"required": [
"download_url",
"file_id"
],
"properties": {
"file_id": {
"type": "string"
},
"file_name": {
"type": "string"
},
"mime_type": {
"type": "string"
},
"download_url": {
"type": "string"
}
},
"description": "An image attached in this chat, passed as the chat provides it.",
"additionalProperties": false
},
"image_file_3": {
"type": "object",
"required": [
"download_url",
"file_id"
],
"properties": {
"file_id": {
"type": "string"
},
"file_name": {
"type": "string"
},
"mime_type": {
"type": "string"
},
"download_url": {
"type": "string"
}
},
"description": "An image attached in this chat, passed as the chat provides it.",
"additionalProperties": false
},
"image_file_4": {
"type": "object",
"required": [
"download_url",
"file_id"
],
"properties": {
"file_id": {
"type": "string"
},
"file_name": {
"type": "string"
},
"mime_type": {
"type": "string"
},
"download_url": {
"type": "string"
}
},
"description": "An image attached in this chat, passed as the chat provides it.",
"additionalProperties": false
},
"image_file_5": {
"type": "object",
"required": [
"download_url",
"file_id"
],
"properties": {
"file_id": {
"type": "string"
},
"file_name": {
"type": "string"
},
"mime_type": {
"type": "string"
},
"download_url": {
"type": "string"
}
},
"description": "An image attached in this chat, passed as the chat provides it.",
"additionalProperties": false
},
"image_file_6": {
"type": "object",
"required": [
"download_url",
"file_id"
],
"properties": {
"file_id": {
"type": "string"
},
"file_name": {
"type": "string"
},
"mime_type": {
"type": "string"
},
"download_url": {
"type": "string"
}
},
"description": "An image attached in this chat, passed as the chat provides it.",
"additionalProperties": false
},
"image_file_7": {
"type": "object",
"required": [
"download_url",
"file_id"
],
"properties": {
"file_id": {
"type": "string"
},
"file_name": {
"type": "string"
},
"mime_type": {
"type": "string"
},
"download_url": {
"type": "string"
}
},
"description": "An image attached in this chat, passed as the chat provides it.",
"additionalProperties": false
},
"image_file_8": {
"type": "object",
"required": [
"download_url",
"file_id"
],
"properties": {
"file_id": {
"type": "string"
},
"file_name": {
"type": "string"
},
"mime_type": {
"type": "string"
},
"download_url": {
"type": "string"
}
},
"description": "An image attached in this chat, passed as the chat provides it.",
"additionalProperties": false
},
"image_file_9": {
"type": "object",
"required": [
"download_url",
"file_id"
],
"properties": {
"file_id": {
"type": "string"
},
"file_name": {
"type": "string"
},
"mime_type": {
"type": "string"
},
"download_url": {
"type": "string"
}
},
"description": "An image attached in this chat, passed as the chat provides it.",
"additionalProperties": false
},
"image_file_10": {
"type": "object",
"required": [
"download_url",
"file_id"
],
"properties": {
"file_id": {
"type": "string"
},
"file_name": {
"type": "string"
},
"mime_type": {
"type": "string"
},
"download_url": {
"type": "string"
}
},
"description": "An image attached in this chat, passed as the chat provides it.",
"additionalProperties": false
},
"upload_handles": {
"type": "object",
"properties": {
"image_file_1": {
"type": "string"
},
"image_file_2": {
"type": "string"
},
"image_file_3": {
"type": "string"
},
"image_file_4": {
"type": "string"
},
"image_file_5": {
"type": "string"
},
"image_file_6": {
"type": "string"
},
"image_file_7": {
"type": "string"
},
"image_file_8": {
"type": "string"
},
"image_file_9": {
"type": "string"
},
"image_file_10": {
"type": "string"
}
},
"description": "Only after running a previous call's upload_command: {image_file_N: the sha256 it printed for that photo}. Never the attachments themselves: those go in image_file_N.",
"additionalProperties": false
}
},
"additionalProperties": false
}Executes the reviewed photoshoot flow, including its declared image and video steps. Spends credits at the brief's quote. This client may show no approval prompt, so call it only when the user agreed in chat to run the brief: their message asking to generate or run it is that agreement, a request to change the brief is not one; otherwise give the quote and wait for their yes. expected_brief_revision, runs and expected_total_credits must match the latest brief; if they changed, nothing runs and the current brief is returned. The same idempotency_key never runs or charges twice.
| Argument | Type | Description |
|---|---|---|
| runs* | array | What this Generate runs: each Automation, its looks and its steps, as get_brief returns them. |
| board_id* | string | The open Shoot Board's board_id, from Open Shoot Board or your context. |
| brief_id* | integer | |
| idempotency_key* | string | Retry key for one Generate: never runs or charges twice. |
| expected_total_credits* | integer | The credits this Generate charges, as get_brief returns them. |
| expected_brief_revision* | integer |
Create a reusable location/scene reference from an image URL. If no description is supplied, the backend analyzes the image. Use the returned location_id in propose_brief/update_brief.
| Argument | Type | Description |
|---|---|---|
| name* | string | Name for the reusable location/scene reference |
| tag_ids | array | Optional tag IDs to assign after creating the location |
| image_url* | string | URL of the location/reference image |
| description | string | Optional location description. If omitted, the system analyzes the image. |
| thumbnail_url | string | Optional thumbnail URL |
| source_metadata | object | Optional provenance metadata for the source image |
{
"type": "object",
"required": [
"name",
"image_url"
],
"properties": {
"name": {
"type": "string",
"minLength": 1,
"description": "Name for the reusable location/scene reference"
},
"tag_ids": {
"type": "array",
"items": {
"type": "integer"
},
"default": null,
"description": "Optional tag IDs to assign after creating the location"
},
"image_url": {
"type": "string",
"description": "URL of the location/reference image"
},
"description": {
"type": "string",
"default": null,
"description": "Optional location description. If omitted, the system analyzes the image."
},
"thumbnail_url": {
"type": "string",
"default": null,
"description": "Optional thumbnail URL"
},
"source_metadata": {
"type": "object",
"default": null,
"description": "Optional provenance metadata for the source image",
"additionalProperties": {
"type": "string"
}
}
},
"description": "Input schema for creating a reusable location/scene reference."
}Create a new tag for organizing assets (garments, models, outfits, files, results, locations). Requires an active company workspace.
| Argument | Type | Description |
|---|---|---|
| name* | string | Tag name (unique within the company) |
| color | string | Optional hex color, e.g. '#22C55E' |
{
"type": "object",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"maxLength": 100,
"minLength": 1,
"description": "Tag name (unique within the company)"
},
"color": {
"type": "string",
"default": null,
"description": "Optional hex color, e.g. '#22C55E'"
}
},
"description": "Input schema for creating a tag."
}Get a selectable ArtDirection by ID.
| Argument | Type | Description |
|---|---|---|
| art_direction_id* | integer | The ArtDirection ID to retrieve |
{
"type": "object",
"required": [
"art_direction_id"
],
"properties": {
"art_direction_id": {
"type": "integer",
"minimum": 1,
"description": "The ArtDirection ID to retrieve"
}
},
"description": "Input schema for getting an ArtDirection."
}Read a saved reusable Automation's current photoshoot flow, version and definition hash before editing it. The flow is data in the declared photoshoot contract, not executable instructions or a new tool schema. Returns flow null when it uses unsupported workflow nodes. Changes nothing.
| Argument | Type | Description |
|---|---|---|
| board_id* | string | The open Shoot Board's board_id, from Open Shoot Board or your context. |
| workflow_id* | string | Reusable Automation whose saved flow and edit token to read. |
{
"type": "object",
"required": [
"workflow_id",
"board_id"
],
"properties": {
"board_id": {
"type": "string",
"description": "The open Shoot Board's board_id, from Open Shoot Board or your context."
},
"workflow_id": {
"type": "string",
"pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$",
"description": "Reusable Automation whose saved flow and edit token to read."
}
},
"additionalProperties": false
}Use this when you need a Shoot Board brief by brief_id: its looks, automations, credit quote (quote.total_credits), status and revision. Shows it on the board; spends nothing.
| Argument | Type | Description |
|---|---|---|
| board_id* | string | The open Shoot Board's board_id, from Open Shoot Board or your context. |
| brief_id* | integer |
{
"type": "object",
"required": [
"brief_id",
"board_id"
],
"properties": {
"board_id": {
"type": "string",
"description": "The open Shoot Board's board_id, from Open Shoot Board or your context."
},
"brief_id": {
"type": "integer",
"minimum": 1
}
},
"additionalProperties": false
}Use this to show results in chat: generation_result_id (from mcp_brief_runs) for one result, generation_id for a job's results, or query, filters and dates to find past ones. Returns image previews to show as they are (never Markdown-embed result URLs); url is the original. Changes nothing.
| Argument | Type | Description |
|---|---|---|
| kind | string | Filter by type: 'Image', 'Edit', 'Upscale', 'Video' |
| page | integer | Page number for pagination |
| limit | integer | Number of items per page |
| query | string | Hybrid search across generated image content, originating item names, and SKUs. |
| tag_ids | array | Filter by tag IDs (results must have at least one) |
| decision | string | Filter by the unified result verdict. |
| end_date | string | Filter results created on or before this ISO date/datetime, e.g. 2026-04-27. |
| model_ids | array | Filter results to images generated with these AI models |
Use this to check one generation job by generation_id: its status, credits and, when it failed, a safe error_message. A brief's runs are read with mcp_brief_runs. Changes nothing.
| Argument | Type | Description |
|---|---|---|
| generation_id* | integer | The generation ID to check. Returns compact status, avatar_id, model_id, model_slug, and use_case. UI 'Gemini Pro' maps to model_slug nano-banana-pro or nano_banana_pro_clothing. |
| include_snapshot | boolean | Include full generation settings, resource snapshots and raw prompt payloads. Large; use only for prompt recovery. |
{
"type": "object",
"required": [
"generation_id"
],
"properties": {
"generation_id": {
"type": "integer",
"description": "The generation ID to check. Returns compact status, avatar_id, model_id, model_slug, and use_case. UI 'Gemini Pro' maps to model_slug nano-banana-pro or nano_banana_pro_clothing."
},
"include_snapshot": {
"type": "boolean",
"default": false,
"description": "Include full generation settings, resource snapshots and raw prompt payloads. Large; use only for prompt recovery."
}
},
"description": "Input schema for checking generation status.",
"additionalProperties": false
}Get user's current credit balance.
No arguments.
{
"type": "object",
"required": [],
"properties": {}
}List selectable ArtDirections as compact summaries: visible system ArtDirections plus company ArtDirections. Use query to match exact names and natural-language creative requests. Use this as the catalog step before choosing an art_direction_id for a brief; if there is no clear match, fall back to the user's phrase as prompt/creative_context. Use get_art_direction for the full markdown document before reusing one in a brief.
| Argument | Type | Description |
|---|---|---|
| page | integer | Page number for pagination |
| limit | integer | Number of compact ArtDirection summaries per page |
| query | string | Hybrid search across saved ArtDirection names and creative content. |
{
"type": "object",
"properties": {
"page": {
"type": "integer",
"default": 1,
"minimum": 1,
"description": "Page number for pagination"
},
"limit": {
"type": "integer",
"default": 20,
"maximum": 100,
"minimum": 1,
"description": "Number of compact ArtDirection summaries per page"
},
"query": {
"type": "string",
"default": null,
"minLength": 2,
"description": "Hybrid search across saved ArtDirection names and creative content."
}
},
"description": "Input schema for listing available ArtDirections.",
"additionalProperties": false
}Lists the user's Automations, most recently used first, one row each. 10 per page (limit up to 25; cursor: next_cursor for more). Changes nothing.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Rows per page (default 10). |
| cursor | string | The next rows: the next_cursor of the previous page. |
| board_id* | string | The open Shoot Board's board_id, from Open Shoot Board or your context. |
{
"type": "object",
"required": [
"board_id"
],
"properties": {
"limit": {
"type": "integer",
"default": 10,
"maximum": 25,
"minimum": 1,
"description": "Rows per page (default 10)."
},
"cursor": {
"type": "string",
"default": null,
"pattern": "^-?\\d+:-?\\d+:[0-9a-f-]{36}$",
"description": "The next rows: the next_cursor of the previous page."
},
"board_id": {
"type": "string",
"description": "The open Shoot Board's board_id, from Open Shoot Board or your context."
}
},
"additionalProperties": false
}List the user's Models: the reusable people who wear the Clothing (not the AI models; for those, use mcp_list_model_catalog). Supports structured filters or query for hybrid name/metadata/image-attribute search. Set include_image_url=true when the Model's image itself is needed.
| Argument | Type | Description |
|---|---|---|
| page | integer | Page number for pagination |
| sort | string | Sort order: 'field:direction', e.g. 'created_at:desc'. Default: created_at:desc |
| limit | integer | Number of items per page |
| query | string | Hybrid search across avatar/model names, metadata, and visual attributes. |
| tag_ids | array | Filter to avatars with any of these tags |
| end_date | string | Filter: created on or before this date (ISO format) |
| avatar_ids | array | Filter to specific avatar IDs |
| start_date | string | Filter: created on or after this date (ISO format) |
| include_image_url |
Use this to find a past shoot when the user refers to one ("run the same as last week") or asks what ran: the account's briefs, newest first, 10 by default (limit up to 25; before: next_before for older ones; status ran for generated ones only; automation_workflow_id for the runs of one Automation). Each compact row has its brief_id, title, status, ran_at, automations, direction label, image model, output, look count and credits. Then read the one you need with get_brief for its full values. Changes nothing.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Rows per page (default 10). |
| before | integer | Older briefs: the next_before of the previous page. |
| status | string | ran: briefs that were generated; draft: this board's unrun brief. Omit for both. |
| board_id* | string | The open Shoot Board's board_id, from Open Shoot Board or your context. |
| automation_workflow_id | string | Only briefs on this Automation (a workflow_id from list_automations or a brief row), its copies included; the board's draft counts unless status is ran. |
{
"type": "object",
"required": [
"board_id"
],
"properties": {
"limit": {
"type": "integer",
"default": 10,
"maximum": 25,
"minimum": 1,
"description": "Rows per page (default 10)."
},
"before": {
"type": "integer",
"default": null,
"minimum": 1,
"description": "Older briefs: the next_before of the previous page."
},
"status": {
"enum": [
"ran",
"draft"
],
"type": "string",
"default": null,
"description": "ran: briefs that were generated; draft: this board's unrun brief. Omit for both."
},
"board_id": {
"type": "string",
"description": "The open Shoot Board's board_id, from Open Shoot Board or your context."
},
"automation_workflow_id": {
"type": "string",
"default": null,
"pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$",
"description": "Only briefs on this Automation (a workflow_id from list_automations or a brief row), its copies included; the board's draft counts unless status is ran."
}
},
"additionalProperties": false
}List user's garments with structured filters or query for hybrid name/SKU/metadata/image-attribute search. body_zone expands to categories and is ORed with category when both are given. With a category or body_zone filter and include_uncategorized=false, uncategorized_count reports garments hidden by the category filter within the same scope. If matches are short and uncategorized_count > 0, call again with include_uncategorized=true and inspect those garments.
| Argument | Type | Description |
|---|---|---|
| page | integer | Page number for pagination |
| sort | string | Sort order: 'field:direction', e.g. 'created_at:desc', 'clothing_item_name:asc'. Default: created_at:desc |
| limit | integer | Number of items per page |
| query | string | Hybrid search across garment names, SKUs, metadata, and visual attributes. |
| tag_ids | array | Filter to garments with any of these tags |
| category | array | Filter to garments in any of these canonical categories; OR with body_zone when both are given. |
| end_date | string | Filter: created on or before this date (ISO format) |
| body_zone |
List reusable location/scene reference images by structured filters or query: IDs, tags, date range, and sort. Use when the user wants to pick a saved background/location reference for a generation.
| Argument | Type | Description |
|---|---|---|
| page | integer | Page number for pagination |
| sort | string | Sort order: 'field:direction', e.g. 'created_at:desc', 'location_name:asc'. Default: created_at:desc |
| limit | integer | Number of items per page |
| query | string | Hybrid search across location names, metadata, and visual attributes. |
| tag_ids | array | Filter to locations with any of these tags |
| end_date | string | Filter: created on or before this date (ISO format) |
| start_date | string | Filter: created on or after this date (ISO format) |
| location_ids | array | Filter to specific location IDs |
| include_image_url | boolean |
List user's outfits (saved garment combinations). Filter by garment IDs, active status, date range, or query against contained garments.
| Argument | Type | Description |
|---|---|---|
| page | integer | Page number for pagination |
| sort | string | Sort: 'field:direction'. Use 'latest_generation_at:desc' to surface recently generated outfits. Default: created_at:desc |
| limit | integer | Number of items per page |
| query | string | Search outfit names and contained garments. |
| source | string | Filter by outfit source. |
| tag_ids | array | Filter to outfits with any of these tags |
| end_date | string | Filter: created on or before this date (ISO format) |
| is_active | string | Filter by status: 'true', 'false', or 'both' (default: both) |
| outfit_ids | array | Filter to specific outfit IDs |
List available tags for the user's company. Use this to resolve user-provided tag names like 'summer26' before selecting garments, outfits, models, files, generations, or locations. For no-UI MCP flows, find the tag ID here, then call get_items_by_tag or the relevant list_* tool with tag_ids.
No arguments.
{
"type": "object",
"properties": {},
"description": "Input schema for listing available tags.",
"additionalProperties": false
}List canonical company templates, optionally filtered by kind, scope, command use case, creator, or public t-xxxx share code, with usage sorting. Keeps identify which values apply. Templates persist canonical commands but do not execute generations. System templates named `Demo — …` are worked examples of the canonical command language; read one with `get_template` before authoring a first brief or workflow.
| Argument | Type | Description |
|---|---|---|
| kind | string | |
| page | integer | Page number for pagination |
| sort | string | |
| use_case | string | Filter by a use_case present in any stored command |
| share_code | string | Return the template assigned this public t-xxxx share code |
| catalog_scope | any | Filter by library or owner_only. Owner-only templates are hidden unless explicitly requested. |
| template_kind | any | Filter generation presets or read-only historical batch_workflow records |
| items_per_page | integer | Number of templates per page |
Append items to the Uwear Shoot Board.
| Argument | Type | Description |
|---|---|---|
| board_id* | string | The open Shoot Board's board_id, from Open Shoot Board or your context. |
| board_version | integer | Pass 2 to receive board v2 state, including the board's output settings |
| context_items* | array | Shoot Board items to append to the current list |
| expected_revision* | integer | Board revision this write is based on; a stale revision returns a revision_conflict error with the current board instead of overwriting it |
{
"type": "object",
"required": [
"context_items",
"board_id",
"expected_revision"
],
"properties": {
"board_id": {
"type": "string",
"description": "The open Shoot Board's board_id, from Open Shoot Board or your context."
},
"board_version": {
"enum": [
2
],
"type": "integer",
"description": "Pass 2 to receive board v2 state, including the board's output settings"
},
"context_items": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"type"
],
"properties": {
"id": {
"oneOf": [
{
"type": "integer"
},
{
"type": "string"
}
]
},
"key": {
"type": "string"
},
"meta": {
"type": "array",
"items": {
"type": [
"string",
"number",
"boolean"
]
},
"maxItems": 8,
"description": "Short display facts, e.g. ['female', 'ID 7']"
},
"name": {
"type": "string"
},
"refs": {
"type": "object"
},
"type": {
"enum": [
"clothing",
"models",
"outfits",
"generations",
"files",
"locations",
"art_directions",
"automations"
],
"type": "string"
},
"gender": {
"type": "string",
"maxLength": 40
},
"intake": {
"type": [
"object",
"null"
],
"required": [
"status"
],
"properties": {
"status": {
"enum": [
"sorting",
"needs_answer",
"ready"
],
"type": "string"
},
"candidates": {
"type": "array",
"items": {
"enum": [
"clothing",
"models",
"outfits",
"generations",
"files",
"locations",
"art_directions",
"automations"
],
"type": "string"
}
},
"source_hash": {
"type": [
"string",
"null"
],
"description": "sha256 hex of the source file"
}
},
"description": "Board v2: intake state of an item still being sorted; absent means ready"
},
"isVideo": {
"type": "boolean"
},
"mediaUrl": {
"type": [
"string",
"null"
]
},
"posterUrl": {
"type": [
"string",
"null"
]
},
"description": {
"type": "string",
"maxLength": 500
},
"thumbnailUrl": {
"type": [
"string",
"null"
]
},
"schemaVersion": {
"type": "integer"
}
}
},
"description": "Shoot Board items to append to the current list"
},
"expected_revision": {
"type": "integer",
"minimum": 0,
"description": "Board revision this write is based on; a stale revision returns a revision_conflict error with the current board instead of overwriting it"
}
}
}A Clothing card dropped on another. The photo of from_garment_id becomes the back, side or detail view of garment_id, and from_garment_id leaves the board (deleted only when it is a fresh drop nothing else uses). Or a photo put in the brief's missing-photo slot: image_url instead of from_garment_id, nothing leaves the board. The board's draft brief is saved again when the view changes it. Returns the board (and brief); asking again answers status unchanged.
| Argument | Type | Description |
|---|---|---|
| view* | string | back, side, or detail (a close-up) |
| board_id* | string | The open Shoot Board's board_id, from Open Shoot Board or your context. |
| image_url | string | instead of from_garment_id: the stored photo (host file download URL, or the image_url mcp_upload_intake_photo returned) |
| garment_id* | integer | the board garment that gains the photo as a view |
| from_garment_id | integer | the board garment whose photo it is; it leaves the board |
| expected_revision* | integer | Board revision this write is based on; a stale revision returns a revision_conflict error with the current board instead of overwriting it |
The account's Shoot Board briefs, newest first: every brief that ran (on any Shoot Board) and this board's draft, each with its status, looks, automations, credits and covers.
| Argument | Type | Description |
|---|---|---|
| page | integer | |
| board_id* | string | The open Shoot Board's board_id, from Open Shoot Board or your context. |
{
"type": "object",
"required": [
"board_id"
],
"properties": {
"page": {
"type": "integer",
"default": 1,
"minimum": 1
},
"board_id": {
"type": "string",
"description": "The open Shoot Board's board_id, from Open Shoot Board or your context."
}
},
"additionalProperties": false
}Use this after confirm_brief or when the user asks how a shoot is going: each look's run of brief_id with its status, credits, results (generation_result_id, kind, url) by step and the error of every step that failed (failures lists them all). Read it again until done is true; while it runs, say so (the board shows progress). Then show the results with get_generation_results. Changes nothing.
| Argument | Type | Description |
|---|---|---|
| board_id* | string | The open Shoot Board's board_id, from Open Shoot Board or your context. |
| brief_id | integer | |
| workflow_run_ids | array |
{
"type": "object",
"required": [
"board_id"
],
"properties": {
"board_id": {
"type": "string",
"description": "The open Shoot Board's board_id, from Open Shoot Board or your context."
},
"brief_id": {
"type": "integer",
"default": null,
"minimum": 1
},
"workflow_run_ids": {
"type": "array",
"items": {
"type": "string",
"pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"
},
"default": null,
"maxItems": 50,
"minItems": 1
}
},
"description": "A brief's runs (``brief_id``), or runs by id (``workflow_run_ids``): exactly one.",
"additionalProperties": false
}Clear all Shoot Board items, or only one context type.
| Argument | Type | Description |
|---|---|---|
| type | string | Context type to remove; omit to clear the entire Shoot Board |
| board_id* | string | The open Shoot Board's board_id, from Open Shoot Board or your context. |
| board_version | integer | Pass 2 to receive board v2 state, including the board's output settings |
| expected_revision* | integer | Board revision this write is based on; a stale revision returns a revision_conflict error with the current board instead of overwriting it |
{
"type": "object",
"required": [
"board_id",
"expected_revision"
],
"properties": {
"type": {
"enum": [
"clothing",
"models",
"outfits",
"generations",
"file",
"files",
"location",
"locations",
"art_direction",
"art_directions",
"automation",
"automations"
],
"type": "string",
"description": "Context type to remove; omit to clear the entire Shoot Board"
},
"board_id": {
"type": "string",
"description": "The open Shoot Board's board_id, from Open Shoot Board or your context."
},
"board_version": {
"enum": [
2
],
"type": "integer",
"description": "Pass 2 to receive board v2 state, including the board's output settings"
},
"expected_revision": {
"type": "integer",
"minimum": 0,
"description": "Board revision this write is based on; a stale revision returns a revision_conflict error with the current board instead of overwriting it"
}
}
}Save sorted Shoot Board photos to the library as garments, avatars, locations or reference files, skip ones already saved, and add them to the Shoot Board at expected_revision; a board that changed is refused before anything is saved (revision_conflict with the current board).
| Argument | Type | Description |
|---|---|---|
| items* | array | Photos to save, each with its confirmed kind |
| board_id* | string | The open Shoot Board's board_id, from Open Shoot Board or your context. |
| expected_revision* | integer | Board revision this write is based on; a stale revision returns a revision_conflict error with the current board instead of overwriting it |
{
"type": "object",
"required": [
"items",
"expected_revision",
"board_id"
],
"properties": {
"items": {
"type": "array",
"items": {
"type": "object",
"required": [
"image_url",
"kind",
"sha256"
],
"properties": {
"back": {
"type": "object",
"required": [
"image_url",
"sha256"
],
"properties": {
"sha256": {
"type": "string",
"pattern": "^[0-9a-fA-F]{64}$",
"description": "Hex SHA-256 of the file bytes, computed by the widget"
},
"image_url": {
"type": "string",
"description": "Public HTTP(S) URL of the uploaded image (host file download URL, or the image_url mcp_upload_intake_photo returned)"
}
},
"description": "A new garment only: another photo of the same garment, showing its back (saved as its back photo; not with side back)"
},
"kind": {
"enum": [
"garment",
"avatar",
"location",
"reference"
],
"type": "string",
"description": "Pile the photo belongs in"
},
"name": {
"type": "string",
"description": "Display name for the saved asset"
},
"side": {
"enum": [
"front",
"back"
],
"type": "string",
"description": "A new garment only: the side its photo shows (default front; back: it is also its back photo)"
},
"views": {
"type": "array",
"items": {
"type": "object",
"required": [
"image_url",
"sha256",
"asset_kind",
"asset_view"
],
"properties": {
"sha256": {
"type": "string",
"pattern": "^[0-9a-fA-F]{64}$",
"description": "Hex SHA-256 of the file bytes, computed by the widget"
},
"image_url": {
"type": "string",
"description": "Public HTTP(S) URL of the uploaded image (host file download URL, or the image_url mcp_upload_intake_photo returned)"
},
"asset_kind": {
"enum": [
"full",
"detail"
],
"type": "string"
},
"asset_view": {
"enum": [
"front",
"back",
"side",
"unspecified"
],
"type": "string"
}
}
},
"maxItems": 12,
"description": "A new garment only: its other photos (full back or side once each, not with back; details any view, repeatable; not with side back)"
},
"sha256": {
"type": "string",
"pattern": "^[0-9a-fA-F]{64}$",
"description": "Hex SHA-256 of the file bytes, computed by the widget"
},
"image_url": {
"type": "string",
"description": "Public HTTP(S) URL of the uploaded image (host file download URL, or the image_url mcp_upload_intake_photo returned)"
}
}
},
"maxItems": 50,
"minItems": 1,
"description": "Photos to save, each with its confirmed kind"
},
"board_id": {
"type": "string",
"description": "The open Shoot Board's board_id, from Open Shoot Board or your context."
},
"expected_revision": {
"type": "integer",
"minimum": 0,
"description": "Board revision this write is based on; a stale revision returns a revision_conflict error with the current board instead of overwriting it"
}
}
}Delete the user's results and their stored images, as the platform's Delete. Cannot be undone: call it only after the user confirmed in chat which results to delete.
| Argument | Type | Description |
|---|---|---|
| generation_result_ids* | array |
{
"type": "object",
"required": [
"generation_result_ids"
],
"properties": {
"generation_result_ids": {
"type": "array",
"items": {
"type": "integer",
"minimum": 1
},
"maxItems": 100,
"minItems": 1
}
},
"additionalProperties": false
}Edit the Shoot Board's brief by hand: add, remove or change looks, or run looks through another automation. Saves a new brief linked to the board and returns the board, the brief, its quote and the credit delta; dry_run only quotes.
| Argument | Type | Description |
|---|---|---|
| ops* | array | |
| dry_run | boolean | Quote the edit and its credit delta; save nothing. |
| board_id* | string | The open Shoot Board's board_id, from Open Shoot Board or your context. |
| brief_id* | integer | The board's brief (board.brief_id). |
| expected_brief_revision* | integer | The board's brief_revision shown with the brief. |
{
"type": "object",
"$defs": {
"LookAdd": {
"type": "object",
"required": [
"op",
"look"
],
"properties": {
"op": {
"type": "string",
"const": "look.add"
},
"look": {
"$ref": "#/$defs/LookFields"
},
"recipe_key": {
"type": "string",
"default": null,
"pattern": "^recipe_\\d{2,3}$",
"description": "Default: the first automation."
}
},
"description": "Add a look (its key is assigned: the next look_NN).",
"additionalProperties": false
},
"LookSet": {
"type": "object",
"required": [
"op",
"key",
"fields"
],
"properties": {
"op": {
"type": "string",
"const": "look.set"
},
"key": {
"type": "string",
"pattern": "^look_\\d{2,3}$"
},
"fields": {
"type": "object",
"description": "Any of label, model_id, outfit_id, clothing_ids, location_id, reference_ids.",
"additionalProperties": true
}
},
"description": "Change some of a look's fields; a field sent as null (or []) is cleared.",
"additionalProperties": false
},
"LookFields": {
"type": "object",
"properties": {
"label": {
"type": "string",
"default": "",
"maxLength": 120,
"description": "The look's name, e.g. 'Linen summer set'."
},
"model_id": {
"type": "integer",
"default": null,
"minimum": 1,
"description": "The Model who wears the look."
},
"outfit_id": {
"type": "integer",
"default": null,
"minimum": 1,
"description": "A saved outfit."
},
"location_id": {
"type": "integer",
"default": null,
"minimum": 1,
"description": "Where the look is shot."
},
"clothing_ids": {
"type": "array",
"items": {
"type": "integer",
"minimum": 1
},
"maxItems": 4,
"description": "Clothing worn together."
},
"reference_ids": {
"type": "array",
"items": {
"type": "integer",
"minimum": 1
},
"maxItems": 50,
"description": "Reference photos (uploaded file ids from the board's References)."
}
},
"description": "Who, what and where of one look (all optional; the recipe decides what it needs).",
"additionalProperties": false
},
"LookRemove": {
"type": "object",
"required": [
"op",
"key"
],
"properties": {
"op": {
"type": "string",
"const": "look.remove"
},
"key": {
"type": "string",
"pattern": "^look_\\d{2,3}$"
}
},
"additionalProperties": false
},
"BriefDiscard": {
"type": "object",
"required": [
"op"
],
"properties": {
"op": {
"type": "string",
"const": "brief.discard"
}
},
"description": "Take the brief off the board; the only op of its call.",
"additionalProperties": false
},
"BriefRefresh": {
"type": "object",
"required": [
"op"
],
"properties": {
"op": {
"type": "string",
"const": "brief.refresh"
}
},
"description": "Re-pin every automation to its current draft (or live version) and price, after it is saved.",
"additionalProperties": false
},
"BriefRestore": {
"type": "object",
"required": [
"op",
"brief_id"
],
"properties": {
"op": {
"type": "string",
"const": "brief.restore"
},
"brief_id": {
"type": "integer",
"minimum": 1
}
},
"description": "Relink a previous draft of this brief (Undo); the only op of its call.",
"additionalProperties": false
},
"BriefModelsSet": {
"type": "object",
"required": [
"op"
],
"properties": {
"op": {
"type": "string",
"const": "brief.models"
},
"image_model": {
"type": "string",
"default": null,
"maxLength": 100,
"minLength": 1
},
"video_model": {
"type": "string",
"default": null,
"maxLength": 100,
"minLength": 1
}
},
"description": "Set the shoot's AI models, the same for every look and step (the one left out: kept). Never\nchanges an automation: Generate runs its AI model cards on them.",
"additionalProperties": false
},
"BriefOutputSet": {
"type": "object",
"required": [
"op"
],
"properties": {
"op": {
"type": "string",
"const": "brief.output"
},
"duration": {
"type": "integer",
"default": null,
"minimum": 1,
"description": "Video steps only: the clip's length in seconds, one of the video model's durations (a longer one costs more)."
},
"resolution": {
"type": "string",
"default": null,
"pattern": "^\\d{1,2}(\\.\\d)?K$",
"description": "e.g. \"1K\", \"2K\", \"4K\": one of the shoot image model's resolutions (a higher one costs more)."
},
"aspect_ratio": {
"type": "string",
"default": null,
"pattern": "^\\d{1,2}(\\.\\d{1,2})?:\\d{1,2}(\\.\\d{1,2})?$",
"description": "e.g. \"3:4\", \"1:1\", \"9:16\": one of the shoot image model's aspect_ratios."
},
"generate_audio": {
"type": "boolean",
"default": null,
"description": "Video steps only: true for a clip with sound (only a video model that supports audio), false for a silent one."
},
"upscale_factor": {
"anyOf": [
{
"type": "integer",
"exclusiveMinimum": 0
},
{
"type": "number",
"exclusiveMinimum": 0
}
],
"default": null,
"description": "Upscale steps only: e.g. 2, 4: one of the upscale model's upscale_factors."
}
},
"description": "Set this brief's output: a field left out is kept, null follows the board's default (the user's\npreferences) again. Every step it is for (a Shoot, a Video, an Upscale) runs and is priced on it.",
"additionalProperties": false
},
"LookAssignRecipe": {
"type": "object",
"required": [
"op",
"keys"
],
"properties": {
"op": {
"type": "string",
"const": "look.assign_recipe"
},
"keys": {
"type": "array",
"items": {
"type": "string",
"pattern": "^look_\\d{2,3}$"
},
"maxItems": 50,
"minItems": 1
},
"recipe_key": {
"type": "string",
"default": null,
"pattern": "^recipe_\\d{2,3}$"
},
"workflow_id": {
"type": "string",
"default": null,
"pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$",
"description": "An automation (one that is not this shoot's own is copied first)."
}
},
"description": "Run these looks through a recipe of the brief (recipe_key) or another workflow (workflow_id).",
"additionalProperties": false
},
"BriefDirectionSet": {
"type": "object",
"required": [
"op"
],
"properties": {
"op": {
"type": "string",
"const": "brief.direction"
},
"prompt": {
"type": "string",
"default": null,
"maxLength": 2000
},
"art_direction_id": {
"type": "integer",
"default": null,
"minimum": 1
}
},
"description": "Set the shoot's Direction, the same for every look: the words every shot follows and/or an art\ndirection (the one left out: none; both left out: nothing directs the shoot and Generate waits for\none, ``slots.UNDIRECTED``). Never changes an automation.",
"additionalProperties": false
}
},
"required": [
"brief_id",
"expected_brief_revision",
"ops",
"board_id"
],
"properties": {
"ops": {
"type": "array",
"items": {
"oneOf": [
{
"$ref": "#/$defs/LookAdd"
},
{
"$ref": "#/$defs/LookRemove"
},
{
"$ref": "#/$defs/LookSet"
},
{
"$ref": "#/$defs/LookAssignRecipe"
},
{
"$ref": "#/$defs/BriefDirectionSet"
},
{
"$ref": "#/$defs/BriefModelsSet"
},
{
"$ref": "#/$defs/BriefOutputSet"
},
{
"$ref": "#/$defs/BriefRefresh"
},
{
"$ref": "#/$defs/BriefRestore"
},
{
"$ref": "#/$defs/BriefDiscard"
}
],
"discriminator": {
"mapping": {
"look.add": "#/$defs/LookAdd",
"look.set": "#/$defs/LookSet",
"look.remove": "#/$defs/LookRemove",
"brief.models": "#/$defs/BriefModelsSet",
"brief.output": "#/$defs/BriefOutputSet",
"brief.discard": "#/$defs/BriefDiscard",
"brief.refresh": "#/$defs/BriefRefresh",
"brief.restore": "#/$defs/BriefRestore",
"brief.direction": "#/$defs/BriefDirectionSet",
"look.assign_recipe": "#/$defs/LookAssignRecipe"
},
"propertyName": "op"
}
},
"maxItems": 20,
"minItems": 1
},
"dry_run": {
"type": "boolean",
"default": false,
"description": "Quote the edit and its credit delta; save nothing."
},
"board_id": {
"type": "string",
"description": "The open Shoot Board's board_id, from Open Shoot Board or your context."
},
"brief_id": {
"type": "integer",
"minimum": 1,
"description": "The board's brief (board.brief_id)."
},
"expected_brief_revision": {
"type": "integer",
"minimum": 0,
"description": "The board's brief_revision shown with the brief."
}
},
"description": "Edit the Shoot Board's brief: ops applied in order, saved as a new brief.",
"additionalProperties": false
}Export montage clips as one stitched video. Spends credits: call it only after the user confirmed the clips and their order in chat. Returns the generation_id to poll with get_generation_status.
| Argument | Type | Description |
|---|---|---|
| clips* | array | Ordered generation-result clips to stitch into the montage |
| fit_mode* | string | How each clip fits the output frame: contain or cover |
| aspect_ratio* | string | Output video aspect ratio in W:H format |
| base_resolution* | integer | Output base resolution in pixels |
{
"type": "object",
"required": [
"clips",
"aspect_ratio",
"base_resolution",
"fit_mode"
],
"properties": {
"clips": {
"type": "array",
"items": {
"type": "object",
"required": [
"generation_result_id",
"order"
],
"properties": {
"muted": {
"type": [
"boolean",
"null"
]
},
"order": {
"type": "integer",
"minimum": 0
},
"speed": {
"type": [
"number",
"null"
]
},
"in_point": {
"type": [
"number",
"null"
]
},
"out_point": {
"type": [
"number",
"null"
]
},
"generation_result_id": {
"type": "integer",
"minimum": 1
}
}
},
"minItems": 1,
"description": "Ordered generation-result clips to stitch into the montage"
},
"fit_mode": {
"type": "string",
"description": "How each clip fits the output frame: contain or cover"
},
"aspect_ratio": {
"type": "string",
"description": "Output video aspect ratio in W:H format"
},
"base_resolution": {
"type": "integer",
"minimum": 1,
"description": "Output base resolution in pixels"
}
}
}Save a still frame of a video result as a new image result, as POST /generation-result/{id}/extract-frame. The result viewer's Save frame.
| Argument | Type | Description |
|---|---|---|
| timestamp_seconds | number | null | Frame time in seconds; omit for the last frame. |
| generation_result_id* | integer |
{
"type": "object",
"required": [
"generation_result_id"
],
"properties": {
"timestamp_seconds": {
"type": [
"number",
"null"
],
"minimum": 0,
"description": "Frame time in seconds; omit for the last frame."
},
"generation_result_id": {
"type": "integer",
"minimum": 1
}
},
"additionalProperties": false
}Queue an image-to-video generation for one montage clip. Spends credits: call it only after the user agreed in chat. Returns the generation_id to poll with get_generation_status.
| Argument | Type | Description |
|---|---|---|
| model* | string | Video model slug or supported model name |
| prompt | string | null | Optional motion prompt for the video clip |
| duration | integer | null | Video duration in seconds; defaults to 5 |
| image_url | string | null | HTTPS source image URL; provide exactly one source |
| resolution | string | null | Optional output resolution; defaults to 480p |
| generate_audio | boolean | null | Include audio in the delivered video. False delivers a silent file; fixed-audio providers are muted after generation at the same credits. |
| last_frame_url | string | null | Optional final-frame image URL for supported video models |
| uploaded_file_id | integer | null | Uploaded file ID to use as the source image; provide exactly one source |
Read the Uwear Shoot Board.
| Argument | Type | Description |
|---|---|---|
| board_id* | string | The open Shoot Board's board_id, from Open Shoot Board or your context. |
| board_version | integer | Pass 2 to receive board v2 state, including the board's output settings |
{
"type": "object",
"required": [
"board_id"
],
"properties": {
"board_id": {
"type": "string",
"description": "The open Shoot Board's board_id, from Open Shoot Board or your context."
},
"board_version": {
"enum": [
2
],
"type": "integer",
"description": "Pass 2 to receive board v2 state, including the board's output settings"
}
}
}Sort photos dropped on the Shoot Board into garment, avatar, location or reference (or unsure with two candidates) and report duplicates within the drop and in the library. Saves nothing. A photo the call had no time left for comes back with error deferred: send it again.
| Argument | Type | Description |
|---|---|---|
| files* | array | Dropped photos, in drop order; results use the same index |
| board_id | string | The open Shoot Board's board_id, from Open Shoot Board or your context. |
{
"type": "object",
"required": [
"files"
],
"properties": {
"files": {
"type": "array",
"items": {
"type": "object",
"required": [
"image_url",
"sha256"
],
"properties": {
"sha256": {
"type": "string",
"pattern": "^[0-9a-fA-F]{64}$",
"description": "Hex SHA-256 of the file bytes, computed by the widget"
},
"file_name": {
"type": "string",
"description": "Original file name, used only as a sorting hint"
},
"image_url": {
"type": "string",
"description": "Public HTTP(S) URL of the uploaded image (host file download URL, or the image_url mcp_upload_intake_photo returned)"
}
}
},
"maxItems": 50,
"minItems": 1,
"description": "Dropped photos, in drop order; results use the same index"
},
"board_id": {
"type": "string",
"description": "The open Shoot Board's board_id, from Open Shoot Board or your context."
}
}
}List uploaded (reference) files for the Uwear MCP workspace files tab and the Shoot Board's References tab.
| Argument | Type | Description |
|---|---|---|
| page | integer | Page number for uploaded file results |
| limit | integer | Maximum number of uploaded files per page |
| query | string | Optional search over file names and tags (the Shoot Board's References tab) |
| tag_ids | array | Optional: only files with any of these tags |
{
"type": "object",
"required": [],
"properties": {
"page": {
"type": "integer",
"minimum": 1,
"description": "Page number for uploaded file results"
},
"limit": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "Maximum number of uploaded files per page"
},
"query": {
"type": "string",
"description": "Optional search over file names and tags (the Shoot Board's References tab)"
},
"tag_ids": {
"type": "array",
"items": {
"type": "integer"
},
"description": "Optional: only files with any of these tags"
}
}
}The active AI models with their capabilities and pricing rules, as GET /models returns them, for the widget's model pickers.
No arguments.
{
"type": "object",
"properties": {},
"additionalProperties": false
}One generation with its results as GET /generation/{id} returns it (prompt, model, settings, inputs), for the result viewer's Info panel.
| Argument | Type | Description |
|---|---|---|
| generation_id* | integer |
{
"type": "object",
"required": [
"generation_id"
],
"properties": {
"generation_id": {
"type": "integer",
"minimum": 1
}
},
"additionalProperties": false
}One generation result as GET /generation-result/{id} returns it (tags, review verdict, QA, prompt, model), for the widget's result viewer.
| Argument | Type | Description |
|---|---|---|
| generation_result_id* | integer |
{
"type": "object",
"required": [
"generation_result_id"
],
"properties": {
"generation_result_id": {
"type": "integer",
"minimum": 1
}
},
"additionalProperties": false
}Copy an automation as a new automation for this shoot.
| Argument | Type | Description |
|---|---|---|
| name | string | |
| board_id* | string | The open Shoot Board's board_id, from Open Shoot Board or your context. |
| source_version_id | string | |
| source_workflow_id* | string |
{
"type": "object",
"required": [
"source_workflow_id",
"board_id"
],
"properties": {
"name": {
"type": "string",
"default": null,
"maxLength": 200,
"minLength": 1
},
"board_id": {
"type": "string",
"description": "The open Shoot Board's board_id, from Open Shoot Board or your context."
},
"source_version_id": {
"type": "string",
"default": null,
"pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"
},
"source_workflow_id": {
"type": "string",
"pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"
}
},
"additionalProperties": false
}An automation's past runs, newest first: one row per Shoot Board Generate (its looks) or per run started on Uwear, with when, how it went, credits and covers.
| Argument | Type | Description |
|---|---|---|
| page | integer | |
| board_id* | string | The open Shoot Board's board_id, from Open Shoot Board or your context. |
| workflow_id* | string |
{
"type": "object",
"required": [
"workflow_id",
"board_id"
],
"properties": {
"page": {
"type": "integer",
"default": 1,
"minimum": 1
},
"board_id": {
"type": "string",
"description": "The open Shoot Board's board_id, from Open Shoot Board or your context."
},
"workflow_id": {
"type": "string",
"pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"
}
},
"additionalProperties": false
}The company's shoot automations (and other automations to copy).
| Argument | Type | Description |
|---|---|---|
| page | integer | |
| query | string | Name search. |
| board_id* | string | The open Shoot Board's board_id, from Open Shoot Board or your context. |
| items_per_page | integer | |
| include_automations | boolean | Also list automations (read/copy only). |
| include_definitions | boolean | Also return each listed automation's live graph (the cards that draw its steps). |
{
"type": "object",
"required": [
"board_id"
],
"properties": {
"page": {
"type": "integer",
"default": 1,
"minimum": 1
},
"query": {
"type": "string",
"default": null,
"maxLength": 200,
"minLength": 2,
"description": "Name search."
},
"board_id": {
"type": "string",
"description": "The open Shoot Board's board_id, from Open Shoot Board or your context."
},
"items_per_page": {
"type": "integer",
"default": 50,
"maximum": 100,
"minimum": 1
},
"include_automations": {
"type": "boolean",
"default": true,
"description": "Also list automations (read/copy only)."
},
"include_definitions": {
"type": "boolean",
"default": false,
"description": "Also return each listed automation's live graph (the cards that draw its steps)."
}
},
"additionalProperties": false
}Open the brief's automation in the builder: its draft, or once Generate published it its live version (saving an edit of it makes a new automation); another automation opens read-only.
| Argument | Type | Description |
|---|---|---|
| board_id* | string | The open Shoot Board's board_id, from Open Shoot Board or your context. |
| read_only | boolean | Show a published version (version_id, else the live one) without opening a draft: a brief that ran shows what it ran, the board's pinned Automation its live version. |
| version_id | string | The published version to show (an automation, or read_only); a brief recipe opened to edit always opens its draft. |
| workflow_id* | string |
{
"type": "object",
"required": [
"workflow_id",
"board_id"
],
"properties": {
"board_id": {
"type": "string",
"description": "The open Shoot Board's board_id, from Open Shoot Board or your context."
},
"read_only": {
"type": "boolean",
"default": false,
"description": "Show a published version (version_id, else the live one) without opening a draft: a brief that ran shows what it ran, the board's pinned Automation its live version."
},
"version_id": {
"type": "string",
"default": null,
"pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$",
"description": "The published version to show (an automation, or read_only); a brief recipe opened to edit always opens its draft."
},
"workflow_id": {
"type": "string",
"pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"
}
},
"additionalProperties": false
}Validate and price the automation being edited.
| Argument | Type | Description |
|---|---|---|
| graph* | object | The unsaved authoring graph (as the builder holds it). |
| board_id* | string | The open Shoot Board's board_id, from Open Shoot Board or your context. |
| version_id* | string | |
| workflow_id* | string |
{
"type": "object",
"required": [
"workflow_id",
"version_id",
"graph",
"board_id"
],
"properties": {
"graph": {
"type": "object",
"description": "The unsaved authoring graph (as the builder holds it).",
"additionalProperties": true
},
"board_id": {
"type": "string",
"description": "The open Shoot Board's board_id, from Open Shoot Board or your context."
},
"version_id": {
"type": "string",
"pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"
},
"workflow_id": {
"type": "string",
"pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"
}
},
"additionalProperties": false
}Save the automation's draft.
| Argument | Type | Description |
|---|---|---|
| edges* | array | |
| nodes* | array | |
| board_id* | string | The open Shoot Board's board_id, from Open Shoot Board or your context. |
| version_id | string | |
| workflow_id* | string | |
| failure_policy | string | |
| base_version_id | string | |
| contract_version | string | |
| result_projection | array | |
| expected_definition_hash | string |
Move a Shoot Board photo between the Clothing, Models and Locations piles. Saves the same image as the new kind and swaps it on the board; the old asset is deleted only if intake saved it in the last 24 hours and nothing uses it, otherwise it stays in the library. Asking for a move that already happened changes nothing and returns the board (status "unchanged").
| Argument | Type | Description |
|---|---|---|
| to* | string | The pile to move it to |
| item* | object | The board item to move |
| board_id* | string | The open Shoot Board's board_id, from Open Shoot Board or your context. |
| expected_revision* | integer | Board revision this write is based on; a stale revision returns a revision_conflict error with the current board instead of overwriting it |
{
"type": "object",
"required": [
"item",
"to",
"expected_revision",
"board_id"
],
"properties": {
"to": {
"enum": [
"clothing",
"models",
"locations"
],
"type": "string",
"description": "The pile to move it to"
},
"item": {
"type": "object",
"required": [
"type",
"id"
],
"properties": {
"id": {
"type": "integer",
"minimum": 1
},
"type": {
"enum": [
"clothing",
"models",
"locations"
],
"type": "string"
}
},
"description": "The board item to move"
},
"board_id": {
"type": "string",
"description": "The open Shoot Board's board_id, from Open Shoot Board or your context."
},
"expected_revision": {
"type": "integer",
"minimum": 0,
"description": "Board revision this write is based on; a stale revision returns a revision_conflict error with the current board instead of overwriting it"
}
}
}Replace the Uwear Shoot Board items.
| Argument | Type | Description |
|---|---|---|
| board_id* | string | The open Shoot Board's board_id, from Open Shoot Board or your context. |
| board_version | integer | Pass 2 to receive board v2 state, including the board's output settings |
| context_items | array | Shoot Board items that replace the current list when context_state is omitted |
| context_state | object | Complete Shoot Board state to sanitize and persist; takes precedence over context_items |
| expected_revision* | integer | Board revision this write is based on; a stale revision returns a revision_conflict error with the current board instead of overwriting it |
{
"type": "object",
"required": [
"board_id",
"expected_revision"
],
"properties": {
"board_id": {
"type": "string",
"description": "The open Shoot Board's board_id, from Open Shoot Board or your context."
},
"board_version": {
"enum": [
2
],
"type": "integer",
"description": "Pass 2 to receive board v2 state, including the board's output settings"
},
"context_items": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"type"
],
"properties": {
"id": {
"oneOf": [
{
"type": "integer"
},
{
"type": "string"
}
]
},
"key": {
"type": "string"
},
"meta": {
"type": "array",
"items": {
"type": [
"string",
"number",
"boolean"
]
},
"maxItems": 8,
"description": "Short display facts, e.g. ['female', 'ID 7']"
},
"name": {
"type": "string"
},
"refs": {
"type": "object"
},
"type": {
"enum": [
"clothing",
"models",
"outfits",
"generations",
"files",
"locations",
"art_directions",
"automations"
],
"type": "string"
},
"gender": {
"type": "string",
"maxLength": 40
},
"intake": {
"type": [
"object",
"null"
],
"required": [
"status"
],
"properties": {
"status": {
"enum": [
"sorting",
"needs_answer",
"ready"
],
"type": "string"
},
"candidates": {
"type": "array",
"items": {
"enum": [
"clothing",
"models",
"outfits",
"generations",
"files",
"locations",
"art_directions",
"automations"
],
"type": "string"
}
},
"source_hash": {
"type": [
"string",
"null"
],
"description": "sha256 hex of the source file"
}
},
"description": "Board v2: intake state of an item still being sorted; absent means ready"
},
"isVideo": {
"type": "boolean"
},
"mediaUrl": {
"type": [
"string",
"null"
]
},
"posterUrl": {
"type": [
"string",
"null"
]
},
"description": {
"type": "string",
"maxLength": 500
},
"thumbnailUrl": {
"type": [
"string",
"null"
]
},
"schemaVersion": {
"type": "integer"
}
}
},
"description": "Shoot Board items that replace the current list when context_state is omitted"
},
"context_state": {
"type": "object",
"properties": {
"items": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"type"
],
"properties": {
"id": {
"oneOf": [
{
"type": "integer"
},
{
"type": "string"
}
]
},
"key": {
"type": "string"
},
"meta": {
"type": "array",
"items": {
"type": [
"string",
"number",
"boolean"
]
},
"maxItems": 8,
"description": "Short display facts, e.g. ['female', 'ID 7']"
},
"name": {
"type": "string"
},
"refs": {
"type": "object"
},
"type": {
"enum": [
"clothing",
"models",
"outfits",
"generations",
"files",
"locations",
"art_directions",
"automations"
],
"type": "string"
},
"gender": {
"type": "string",
"maxLength": 40
},
"intake": {
"type": [
"object",
"null"
],
"required": [
"status"
],
"properties": {
"status": {
"enum": [
"sorting",
"needs_answer",
"ready"
],
"type": "string"
},
"candidates": {
"type": "array",
"items": {
"enum": [
"clothing",
"models",
"outfits",
"generations",
"files",
"locations",
"art_directions",
"automations"
],
"type": "string"
}
},
"source_hash": {
"type": [
"string",
"null"
],
"description": "sha256 hex of the source file"
}
},
"description": "Board v2: intake state of an item still being sorted; absent means ready"
},
"isVideo": {
"type": "boolean"
},
"mediaUrl": {
"type": [
"string",
"null"
]
},
"posterUrl": {
"type": [
"string",
"null"
]
},
"description": {
"type": "string",
"maxLength": 500
},
"thumbnailUrl": {
"type": [
"string",
"null"
]
},
"schemaVersion": {
"type": "integer"
}
}
}
},
"output": {
"type": [
"object",
"null"
],
"properties": {
"model_slug": {
"type": [
"string",
"null"
]
},
"num_images": {
"type": [
"integer",
"null"
],
"minimum": 1
},
"resolution": {
"type": [
"string",
"null"
],
"description": "e.g. \"2K\""
},
"aspect_ratio": {
"type": [
"string",
"null"
],
"description": "e.g. \"3:4\""
}
},
"description": "Board v2: the shoot's output settings; omitted keys keep their current value"
},
"revision": {
"type": "integer"
},
"updatedAt": {
"type": "string"
},
"schemaVersion": {
"type": "integer"
},
"pendingRequest": {
"type": [
"object",
"null"
]
},
"draftSelectionKeys": {
"type": "array",
"items": {
"type": "string"
}
}
},
"description": "Complete Shoot Board state to sanitize and persist; takes precedence over context_items"
},
"expected_revision": {
"type": "integer",
"minimum": 0,
"description": "Board revision this write is based on; a stale revision returns a revision_conflict error with the current board instead of overwriting it"
}
}
}The result viewer's review rail. Sets the user's verdict on their own results to approved or rejected, or clears it (decision null), replacing any verdict they had; deletes nothing and spends no credits.
| Argument | Type | Description |
|---|---|---|
| note | string | null | |
| decision* | string | null | |
| generation_result_ids* | array |
{
"type": "object",
"required": [
"generation_result_ids",
"decision"
],
"properties": {
"note": {
"type": [
"string",
"null"
],
"maxLength": 1000
},
"decision": {
"enum": [
"approved",
"rejected",
null
],
"type": [
"string",
"null"
]
},
"generation_result_ids": {
"type": "array",
"items": {
"type": "integer",
"minimum": 1
},
"maxItems": 50,
"minItems": 1
}
},
"additionalProperties": false
}Save an edited image (image_base64) as a new child result of parent_generation_result_id. Changes no existing result.
| Argument | Type | Description |
|---|---|---|
| file_name | string | null | Optional filename for the saved retouched image |
| mime_type | string | null | Optional image MIME type; inferred from a data URL or defaults to image/png |
| operations | any | Optional retouch operation metadata stored with the child result |
| image_base64* | string | Retouched image encoded as base64 or an image data URL |
| parent_generation_result_id* | integer | Generation result ID of the original image |
{
"type": "object",
"required": [
"parent_generation_result_id",
"image_base64"
],
"properties": {
"file_name": {
"type": [
"string",
"null"
],
"description": "Optional filename for the saved retouched image"
},
"mime_type": {
"type": [
"string",
"null"
],
"description": "Optional image MIME type; inferred from a data URL or defaults to image/png"
},
"operations": {
"description": "Optional retouch operation metadata stored with the child result"
},
"image_base64": {
"type": "string",
"description": "Retouched image encoded as base64 or an image data URL"
},
"parent_generation_result_id": {
"type": "integer",
"minimum": 1,
"description": "Generation result ID of the original image"
}
}
}Replace a result's tags with tag_ids (empty removes all), as PUT /generation-result/{id}/tags. The result viewer's tag tray. A tag that starts one of the user's automations starts it, as on the platform.
| Argument | Type | Description |
|---|---|---|
| tag_ids* | array | |
| generation_result_id* | integer |
{
"type": "object",
"required": [
"generation_result_id",
"tag_ids"
],
"properties": {
"tag_ids": {
"type": "array",
"items": {
"type": "integer",
"minimum": 1
},
"maxItems": 100
},
"generation_result_id": {
"type": "integer",
"minimum": 1
}
},
"additionalProperties": false
}Rename or recolor one of the company's tags, as PATCH /tag/{id}. The result viewer's tag tray.
| Argument | Type | Description |
|---|---|---|
| name | string | null | |
| color | string | null | |
| tag_id* | integer |
{
"type": "object",
"required": [
"tag_id"
],
"properties": {
"name": {
"type": [
"string",
"null"
],
"maxLength": 100,
"minLength": 1
},
"color": {
"type": [
"string",
"null"
],
"maxLength": 32
},
"tag_id": {
"type": "integer",
"minimum": 1
}
},
"additionalProperties": false
}Store one photo dropped on the Shoot Board, sent inline as base64, for a host that cannot upload files itself. Returns a receipt (sha256, size, stored, image_url, image_url_expires_at); pass image_url to mcp_intake_files and mcp_commit_intake. Without data, stores nothing and returns the receipt of the photo already stored under sha256 (a fresh image_url), or stored: false.
| Argument | Type | Description |
|---|---|---|
| data | string | The image bytes, standard base64, at most 4 MiB decoded (downscale larger photos). Omit it to ask for the receipt of a photo already stored |
| sha256* | string | Hex SHA-256 of the dropped file as the user picked it (the intake tools take the same value), even when data is a downscaled copy |
| content_type | string | Image MIME type of data (required with data) |
{
"type": "object",
"required": [
"sha256"
],
"properties": {
"data": {
"type": "string",
"maxLength": 5592408,
"minLength": 4,
"description": "The image bytes, standard base64, at most 4 MiB decoded (downscale larger photos). Omit it to ask for the receipt of a photo already stored",
"contentEncoding": "base64"
},
"sha256": {
"type": "string",
"pattern": "^[0-9a-fA-F]{64}$",
"description": "Hex SHA-256 of the dropped file as the user picked it (the intake tools take the same value), even when data is a downscaled copy"
},
"content_type": {
"enum": [
"image/jpeg",
"image/png",
"image/webp",
"image/avif",
"image/gif",
"image/bmp",
"image/tiff"
],
"type": "string",
"description": "Image MIME type of data (required with data)"
}
}
}The automation builder reads library items (Clothing, Models, Locations, ...) of one kind by id to show them on its cards. Read-only.
| Argument | Type | Description |
|---|---|---|
| ids* | array | |
| kind* | string | |
| board_id* | string | The open Shoot Board's board_id, from Open Shoot Board or your context. |
{
"type": "object",
"required": [
"kind",
"ids",
"board_id"
],
"properties": {
"ids": {
"type": "array",
"items": {
"type": "integer"
},
"maxItems": 100
},
"kind": {
"type": "string"
},
"board_id": {
"type": "string",
"description": "The open Shoot Board's board_id, from Open Shoot Board or your context."
}
},
"additionalProperties": false
}The camera views (front, side, back, crops) a shot or camera edit can use, for the automation builder. Read-only.
| Argument | Type | Description |
|---|---|---|
| board_id* | string | The open Shoot Board's board_id, from Open Shoot Board or your context. |
{
"type": "object",
"required": [
"board_id"
],
"properties": {
"board_id": {
"type": "string",
"description": "The open Shoot Board's board_id, from Open Shoot Board or your context."
}
},
"additionalProperties": false
}The automation format (step kinds and their settings) the automation builder edits against. Read-only.
| Argument | Type | Description |
|---|---|---|
| board_id* | string | The open Shoot Board's board_id, from Open Shoot Board or your context. |
| contract_version | string |
{
"type": "object",
"required": [
"board_id"
],
"properties": {
"board_id": {
"type": "string",
"description": "The open Shoot Board's board_id, from Open Shoot Board or your context."
},
"contract_version": {
"type": "string",
"default": null
}
},
"additionalProperties": false
}The automation builder's picker: one page of the user's library items of one kind, filtered by search text, tags or category. Read-only.
| Argument | Type | Description |
|---|---|---|
| kind* | string | |
| page | integer | |
| query | string | |
| tag_ids | array | |
| board_id* | string | The open Shoot Board's board_id, from Open Shoot Board or your context. |
| page_size | integer | |
| categories | array |
{
"type": "object",
"required": [
"kind",
"board_id"
],
"properties": {
"kind": {
"type": "string"
},
"page": {
"type": "integer",
"default": 1,
"minimum": 1
},
"query": {
"type": "string",
"default": null,
"maxLength": 200
},
"tag_ids": {
"type": "array",
"items": {
"type": "integer"
},
"default": null
},
"board_id": {
"type": "string",
"description": "The open Shoot Board's board_id, from Open Shoot Board or your context."
},
"page_size": {
"type": "integer",
"default": 24,
"maximum": 60,
"minimum": 1
},
"categories": {
"type": "array",
"items": {
"type": "string"
},
"default": null
}
},
"additionalProperties": false
}The garment categories, for the automation builder's category filters. Read-only.
| Argument | Type | Description |
|---|---|---|
| board_id* | string | The open Shoot Board's board_id, from Open Shoot Board or your context. |
{
"type": "object",
"required": [
"board_id"
],
"properties": {
"board_id": {
"type": "string",
"description": "The open Shoot Board's board_id, from Open Shoot Board or your context."
}
},
"additionalProperties": false
}The account's tags, for the automation builder's tag filters. Read-only.
| Argument | Type | Description |
|---|---|---|
| board_id* | string | The open Shoot Board's board_id, from Open Shoot Board or your context. |
{
"type": "object",
"required": [
"board_id"
],
"properties": {
"board_id": {
"type": "string",
"description": "The open Shoot Board's board_id, from Open Shoot Board or your context."
}
},
"additionalProperties": false
}Use this when the user asks in chat to change what is on the open Shoot Board. add puts items on it; set replaces the whole item list (to remove items, send the ones to keep); clear empties one type, or without type starts a new shoot on the same board (its brief is unlinked; photos stay in the library); add_as_view makes from_garment_id's photo the back, side or detail view of garment_id and takes from_garment_id off the board, only after the user agrees the two show one garment. Items are {type, id} from search_uwear_library or read_shoot_board. To reuse an automation, add {type: automations, id: a workflow_id from brief_inputs.automations}: the board pins one and the next brief runs every look through it. Pass expected_revision from read_shoot_board; on revision_conflict, apply the change to the returned board once.
| Argument | Type | Description |
|---|---|---|
| type | string | clear: only this type; omit for a new shoot (the whole board and its brief) |
| view | string | add_as_view: back, side, or detail (a close-up) |
| items | array | add / set: the items. An automations item (id: a workflow_id from brief_inputs.automations) pins the Automation every look of the brief runs through; a board pins one, a new one replaces it. A board holds one art direction the same way |
| action* | string | add: put items on the board; set: replace all items; clear: remove one type, or without type everything and the board's brief (a new shoot on this board); add_as_view: from_garment_id's photo becomes a view of garment_id |
Append or replace one background removal. Revises the selected looks using the named brief flow (default: all its looks); requires the current brief revision. Photo format is shared across the shoot. Returns a new brief and quote. No media generation, credit charge or library change. Read the returned recipe_key before the next edit.
| Argument | Type | Description |
|---|---|---|
| board_id* | string | The open Shoot Board's board_id, from Open Shoot Board or your context. |
| brief_id* | integer | |
| look_keys | array | Affected looks using this flow; omit for every look using it. Other looks retain their flow. |
| recipe_key* | string | Flow from the current brief. |
| shot_index* | integer | |
| step_index | integer | One-based dependent step to replace; omit to append. Each tool accepts only its own operation's settings. |
| expected_brief_revision* | integer |
{
"type": "object",
"required": [
"brief_id",
"expected_brief_revision",
"recipe_key",
"shot_index",
"board_id"
],
"properties": {
"board_id": {
"type": "string",
"description": "The open Shoot Board's board_id, from Open Shoot Board or your context."
},
"brief_id": {
"type": "integer",
"minimum": 1
},
"look_keys": {
"type": "array",
"items": {
"type": "string",
"pattern": "^look_\\d{2,3}$"
},
"default": null,
"maxItems": 50,
"minItems": 1,
"description": "Affected looks using this flow; omit for every look using it. Other looks retain their flow."
},
"recipe_key": {
"type": "string",
"pattern": "^recipe_\\d{2,3}$",
"description": "Flow from the current brief."
},
"shot_index": {
"type": "integer",
"maximum": 8,
"minimum": 1
},
"step_index": {
"type": "integer",
"default": null,
"maximum": 4,
"minimum": 1,
"description": "One-based dependent step to replace; omit to append. Each tool accepts only its own operation's settings."
},
"expected_brief_revision": {
"type": "integer",
"minimum": 0
}
},
"additionalProperties": false
}Append or replace one camera-view edit. Revises the selected looks using the named brief flow (default: all its looks); requires the current brief revision. Photo format is shared across the shoot. Returns a new brief and quote. No media generation, credit charge or library change. Read the returned recipe_key before the next edit.
| Argument | Type | Description |
|---|---|---|
| board_id* | string | The open Shoot Board's board_id, from Open Shoot Board or your context. |
| brief_id* | integer | |
| look_keys | array | Affected looks using this flow; omit for every look using it. Other looks retain their flow. |
| recipe_key* | string | Flow from the current brief. |
| shot_index* | integer | |
| step_index | integer | One-based dependent step to replace; omit to append. Each tool accepts only its own operation's settings. |
| camera_edit_id* | string | Camera edit preset. |
| expected_brief_revision* | integer |
Append or replace one prompt-based image edit. Revises the selected looks using the named brief flow (default: all its looks); requires the current brief revision. Photo format is shared across the shoot. Returns a new brief and quote. No media generation, credit charge or library change. Read the returned recipe_key before the next edit.
| Argument | Type | Description |
|---|---|---|
| prompt* | string | |
| board_id* | string | The open Shoot Board's board_id, from Open Shoot Board or your context. |
| brief_id* | integer | |
| look_keys | array | Affected looks using this flow; omit for every look using it. Other looks retain their flow. |
| recipe_key* | string | Flow from the current brief. |
| shot_index* | integer | |
| step_index | integer | One-based dependent step to replace; omit to append. Each tool accepts only its own operation's settings. |
| expected_brief_revision* | integer |
Add a base image shot or revise its camera. Revises the selected looks using the named brief flow (default: all its looks); requires the current brief revision. Photo format is shared across the shoot. Returns a new brief and quote. No media generation, credit charge or library change. Read the returned recipe_key before the next edit.
| Argument | Type | Description |
|---|---|---|
| camera* | string | |
| board_id* | string | The open Shoot Board's board_id, from Open Shoot Board or your context. |
| brief_id* | integer | |
| look_keys | array | Affected looks using this flow; omit for every look using it. Other looks retain their flow. |
| recipe_key* | string | Flow from the current brief. |
| resolution | string | Shared photo resolution for the whole shoot. |
| shot_index | integer | One-based shot to revise; omit to append a new shot. Revising its camera retains dependent steps. |
| aspect_ratio | string | Shared photo format for the whole shoot. |
Append or replace one image upscale. Revises the selected looks using the named brief flow (default: all its looks); requires the current brief revision. Photo format is shared across the shoot. Returns a new brief and quote. No media generation, credit charge or library change. Read the returned recipe_key before the next edit.
| Argument | Type | Description |
|---|---|---|
| factor* | number | |
| board_id* | string | The open Shoot Board's board_id, from Open Shoot Board or your context. |
| brief_id* | integer | |
| look_keys | array | Affected looks using this flow; omit for every look using it. Other looks retain their flow. |
| recipe_key* | string | Flow from the current brief. |
| shot_index* | integer | |
| step_index | integer | One-based dependent step to replace; omit to append. Each tool accepts only its own operation's settings. |
| expected_brief_revision* | integer |
Append or replace one image-to-video step. Revises the selected looks using the named brief flow (default: all its looks); requires the current brief revision. Photo format is shared across the shoot. Returns a new brief and quote. No media generation, credit charge or library change. Read the returned recipe_key before the next edit.
| Argument | Type | Description |
|---|---|---|
| sound | boolean | |
| prompt | string | |
| board_id* | string | The open Shoot Board's board_id, from Open Shoot Board or your context. |
| brief_id* | integer | |
| look_keys | array | Affected looks using this flow; omit for every look using it. Other looks retain their flow. |
| recipe_key* | string | Flow from the current brief. |
| shot_index* | integer | |
| step_index | integer | One-based dependent step to replace; omit to append. Each tool accepts only its own operation's settings. |
| length_seconds |
Saves a new brief and shows it on the board: the looks to shoot, their direction and the Automation they run through. The previous brief is kept (one that ran stays in Brief History). Returns the saved brief, or the problems to fix.
| Argument | Type | Description |
|---|---|---|
| looks* | array | The looks to shoot, each one outfit worn in the shoot, with ids from read_shoot_board. |
| title | string | The shoot's name, only in the user's own words; otherwise leave it out. |
| board_id* | string | The open Shoot Board's board_id, from Open Shoot Board or your context. |
| direction* | any | Required: what every shot of every look follows, exactly what Generate runs: prompt, art_direction_id (a saved art direction), or both. Write one direction for every look from what the user wants (setting, light, mood, poses, purpose). Never name a garment, model, location or look: the same words run on every look. |
| image_model | string | The shoot's image model: a slug from brief_inputs.ai_models (omit: kept). |
| video_model | string | The shoot's video model: a slug from brief_inputs.ai_models (omit: kept). |
| recipe_workflow_id | string | The Automation every look runs through, as it is saved: a workflow_id from brief_inputs.automations or save_automation. Omitted while the board pins one (brief_inputs.pinned_automation): every look runs it. |
ONLY for video montage/stitching/export workflows. Use when the user explicitly asks to create a montage, stitch clips, make a reel, export a video sequence, make video clips from images, or combine images/videos into one final video. Never use this for a photoshoot, lookbook, product shoot, collection shoot, outfit shoot, garment shoot, or image-generation request; those must use request_user_context followed by propose_brief/update_brief. Do not call this merely because selected context contains images, generations, garments, or models. A photoshoot may later feed a montage, but the photoshoot itself must be proposed as a BriefProposal first. PROPOSES the montage for user review — user can edit clips, generate missing videos, then export. Supports: existing videos with optional trim (`target_duration` or `start_time`/`end_time`), images that need video generation (specify video_model + a bespoke per-image motion prompt, and optionally `target_duration` or `duration`), per-clip speed/mute, global aspect ratio. If the user asks for clips to be e.g. '3 seconds each', set `target_duration: 3` on every item, including image items. For image items, avoid generic repeated prompts: tailor each prompt to the specific image and any requested zoom, movement, energy, or camera direction. If motion is not specified, inspect the image first with view_image and then write a fitting motion prompt from the image content before proposing. The user reviews and confirms in the UI. Export is free (0 credits); video generation clips cost credits per their model.
| Argument | Type | Description |
|---|---|---|
| items* | array | Ordered list of montage items. Each is either an existing video or an image needing video generation. Min 1, max 10. |
| board_id | string | The open Shoot Board's board_id, from Open Shoot Board or your context. |
| aspect_ratio | string | Output aspect ratio (e.g. '9:16', '16:9', '1:1') |
Default tool for generation-result QA. Use this whenever the user asks to QA, quality check, validate, review, inspect for defects, approve/reject, or assess already-created generation results. Do not substitute view_image for QA unless the user explicitly asks for a manual visual critique instead of the official Uwear QA pipeline. First identify the numeric generation_result_ids, then call this tool, then call read_generation_result_qa for the same IDs. QA is free. QA is built for scale — validating large batches (hundreds or thousands of results). When the user is iterating on a handful of results one by one, do not queue QA on your own initiative; run it when the user asks for it or when operating at batch scale.
| Argument | Type | Description |
|---|---|---|
| max_qa_retries | integer | Maximum QA-triggered retry generations to allow. Retry generations can cost additional generation credits. |
| generation_result_ids* | array | Generation result IDs to QA. QA is free. |
{
"type": "object",
"required": [
"generation_result_ids"
],
"properties": {
"max_qa_retries": {
"type": "integer",
"default": 0,
"maximum": 5,
"minimum": 0,
"description": "Maximum QA-triggered retry generations to allow. Retry generations can cost additional generation credits."
},
"generation_result_ids": {
"type": "array",
"items": {
"type": "integer"
},
"maxItems": 50,
"minItems": 1,
"description": "Generation result IDs to QA. QA is free."
}
},
"description": "Input schema for queueing QA on existing generation results."
}Read official Uwear QA status, decision, and structured QA JSON for existing generation results. Call this after queue_generation_result_qa when the user asks to QA/check/validate/review generated outputs; summarize the structured decision and issues, not a manual view_image opinion.
| Argument | Type | Description |
|---|---|---|
| generation_result_ids* | array | Generation result IDs to read QA for |
{
"type": "object",
"required": [
"generation_result_ids"
],
"properties": {
"generation_result_ids": {
"type": "array",
"items": {
"type": "integer"
},
"maxItems": 50,
"minItems": 1,
"description": "Generation result IDs to read QA for"
}
},
"description": "Input schema for reading QA rows for generation results."
}Use this before modify_shoot_board, propose_brief or update_brief: the user changes the board in the widget at any time. Returns the board's items (Clothing, Models, Outfits, Locations, art directions, files, results) with ids and names, its revision, its linked brief_id, and brief_inputs: the guide, asset facts, automations, cameras, AI models and limits a brief is written from. Changes nothing.
| Argument | Type | Description |
|---|---|---|
| board_id* | string | The open Shoot Board's board_id, from Open Shoot Board or your context. |
{
"type": "object",
"required": [
"board_id"
],
"properties": {
"board_id": {
"type": "string",
"description": "The open Shoot Board's board_id, from Open Shoot Board or your context."
}
},
"additionalProperties": false
}Remove one base shot and its dependent steps. Revises the selected looks using the named brief flow (default: all its looks); requires the current brief revision. Photo format is shared across the shoot. Returns a new brief and quote. No media generation, credit charge or library change. Read the returned recipe_key before the next edit.
| Argument | Type | Description |
|---|---|---|
| board_id* | string | The open Shoot Board's board_id, from Open Shoot Board or your context. |
| brief_id* | integer | |
| look_keys | array | Affected looks using this flow; omit for every look using it. Other looks retain their flow. |
| recipe_key* | string | Flow from the current brief. |
| shot_index* | integer | |
| expected_brief_revision* | integer |
{
"type": "object",
"required": [
"brief_id",
"expected_brief_revision",
"recipe_key",
"shot_index",
"board_id"
],
"properties": {
"board_id": {
"type": "string",
"description": "The open Shoot Board's board_id, from Open Shoot Board or your context."
},
"brief_id": {
"type": "integer",
"minimum": 1
},
"look_keys": {
"type": "array",
"items": {
"type": "string",
"pattern": "^look_\\d{2,3}$"
},
"default": null,
"maxItems": 50,
"minItems": 1,
"description": "Affected looks using this flow; omit for every look using it. Other looks retain their flow."
},
"recipe_key": {
"type": "string",
"pattern": "^recipe_\\d{2,3}$",
"description": "Flow from the current brief."
},
"shot_index": {
"type": "integer",
"maximum": 8,
"minimum": 1
},
"expected_brief_revision": {
"type": "integer",
"minimum": 0
}
},
"additionalProperties": false
}Remove one dependent step and reconnect its successor. Revises the selected looks using the named brief flow (default: all its looks); requires the current brief revision. Photo format is shared across the shoot. Returns a new brief and quote. No media generation, credit charge or library change. Read the returned recipe_key before the next edit.
| Argument | Type | Description |
|---|---|---|
| board_id* | string | The open Shoot Board's board_id, from Open Shoot Board or your context. |
| brief_id* | integer | |
| look_keys | array | Affected looks using this flow; omit for every look using it. Other looks retain their flow. |
| recipe_key* | string | Flow from the current brief. |
| shot_index* | integer | |
| step_index* | integer | |
| expected_brief_revision* | integer |
{
"type": "object",
"required": [
"brief_id",
"expected_brief_revision",
"recipe_key",
"shot_index",
"step_index",
"board_id"
],
"properties": {
"board_id": {
"type": "string",
"description": "The open Shoot Board's board_id, from Open Shoot Board or your context."
},
"brief_id": {
"type": "integer",
"minimum": 1
},
"look_keys": {
"type": "array",
"items": {
"type": "string",
"pattern": "^look_\\d{2,3}$"
},
"default": null,
"maxItems": 50,
"minItems": 1,
"description": "Affected looks using this flow; omit for every look using it. Other looks retain their flow."
},
"recipe_key": {
"type": "string",
"pattern": "^recipe_\\d{2,3}$",
"description": "Flow from the current brief."
},
"shot_index": {
"type": "integer",
"maximum": 8,
"minimum": 1
},
"step_index": {
"type": "integer",
"maximum": 4,
"minimum": 1
},
"expected_brief_revision": {
"type": "integer",
"minimum": 0
}
},
"additionalProperties": false
}Use this when the user wants a photoshoot and you have no board_id yet. Creates a new, empty Uwear Shoot Board and returns its board_id, which every other Shoot Board tool takes. This client shows no widget: build the shoot with tools (search_uwear_library, modify_shoot_board, propose_brief) and tell the user what is on the board. prompt: one line describing the shoot; expected_types: what it needs.
| Argument | Type | Description |
|---|---|---|
| prompt* | string | Instruction shown to the user, e.g. 'Select the clothing items you want to use and add them to the Shoot Board' |
| board_id | string | The open Shoot Board's board_id, from Open Shoot Board or your context. |
| min_items | integer | Minimum number of items the user must provide |
| expected_types* | array | Accepted item types (match panel tabs): 'clothing', 'models', 'outfits', 'generations', 'files'. Legacy 'file' is accepted as an alias for 'files'. |
{
"type": "object",
"required": [
"prompt",
"expected_types"
],
"properties": {
"prompt": {
"type": "string",
"description": "Instruction shown to the user, e.g. 'Select the clothing items you want to use and add them to the Shoot Board'"
},
"board_id": {
"type": "string",
"description": "The open Shoot Board's board_id, from Open Shoot Board or your context."
},
"min_items": {
"type": "integer",
"default": 1,
"description": "Minimum number of items the user must provide"
},
"expected_types": {
"type": "array",
"items": {
"type": "string"
},
"description": "Accepted item types (match panel tabs): 'clothing', 'models', 'outfits', 'generations', 'files'. Legacy 'file' is accepted as an alias for 'files'."
}
},
"description": "Input schema for requesting user-selected items from the MCP app/gallery.",
"additionalProperties": false
}Use this when the user asks to create, write or save an art direction, or the board's New art direction asks for one: write it from their words, the chat and the board, and save it in the same turn. Saves it to the library and makes it the board's one art direction, replacing the previous one (which stays in the library). Fill every section with concrete, photographable choices. It applies to every look, so it names no garment, outfit, Model or Location (text naming a board item is refused). If the board has a brief, apply it with update_brief direction.art_direction_id. If the result lists problems, fix them all and call again.
| Argument | Type | Description |
|---|---|---|
| mood* | string | The feeling and the pose language: energy, expression, how the model moves. |
| name* | string | Its title, 2-6 words, the one you used in chat (never Untitled or Art direction). |
| avoid | array | What never appears, one per line. |
| light* | string | Direction, softness, colour temperature and shadows (e.g. low warm sun from the left, long soft shadows). |
| camera* | string | Framing, angle, lens feel and distance (e.g. eye-level 50mm, full body with headroom). |
| palette* | string | The colours of set, light and styling (e.g. terracotta, sand, washed olive). |
Save one flow from a reviewed brief as a new reusable library Automation, with its current shots, dependent steps and settings. Does not modify the brief, generate media or charge credits.
| Argument | Type | Description |
|---|---|---|
| name* | string | Name of the reusable library Automation to save. |
| board_id* | string | The open Shoot Board's board_id, from Open Shoot Board or your context. |
| brief_id* | integer | |
| recipe_key* | string | The flow's key in the brief's recipes list. |
| expected_brief_revision* | integer |
{
"type": "object",
"required": [
"brief_id",
"expected_brief_revision",
"recipe_key",
"name",
"board_id"
],
"properties": {
"name": {
"type": "string",
"maxLength": 80,
"minLength": 1,
"description": "Name of the reusable library Automation to save."
},
"board_id": {
"type": "string",
"description": "The open Shoot Board's board_id, from Open Shoot Board or your context."
},
"brief_id": {
"type": "integer",
"minimum": 1
},
"recipe_key": {
"type": "string",
"pattern": "^recipe_\\d{2,3}$",
"description": "The flow's key in the brief's recipes list."
},
"expected_brief_revision": {
"type": "integer",
"minimum": 0
}
},
"additionalProperties": false
}Batch save reference images from chat attachments into the Files library. Keep file metadata in files[] and pass top-level image_file_1, image_file_2, etc. in the same order. No base64, no local paths. Use for mood boards, backgrounds, and other reference images that are not Clothing or Models.
| Argument | Type | Description |
|---|---|---|
| files | array | Reference file metadata in the same order as image_file_1, image_file_2, etc. No base64. |
| board_id | string | The open Shoot Board's board_id, from Open Shoot Board or your context. |
| file_name | string | Single recovered display name |
| image_url | string | Single resolved download URL used by automatic opaque-file recovery. |
| mime_type | string | Single recovered MIME/content type, e.g. image/png |
| image_file_1 | object | Host-provided uploaded file reference for the matching item index when it has no image_url. Use the file object supplied by the host, not a bare file_... ID. |
| image_file_2 | object | Host-provided uploaded file reference for the matching item index when it has no image_url. Use the file object supplied by the host, not a bare file_... ID. |
| image_file_3 |
Use this when the user names Clothing, Models, Locations, art directions, files or past results in chat and you need their ids. Takes a short keyword query (2-5 words, or an exact name, SKU or id) and returns typed ids, names and thumbnails. It finds items; it does not recommend them. Changes nothing.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Maximum number of hybrid matches to return |
| query* | string | Short keyword query: 2 to 5 words, one concept per call, or an exact name/SKU/ID. Every word must match for lexical results, so long sentences can return no lexical matches. Describing a garment finds that garment, not pieces to pair with it. |
| item_types | array | Optional item types to search. Omit to search clothing, avatars/models, locations, art directions, uploaded files, and generation results. |
| refresh_index | boolean | Deprecated compatibility input. No index refresh is performed, even when true. Search uses the maintained index and current lexical metadata. Leave false. |
| exclude_clothing_item_ids | array | Exclude these garment IDs after ranking and before the result limit; other item types are unaffected. |
{
"type": "object",
"required": [
"query"
],
"properties": {
"limit": {
"type": "integer",
"default": 10,
"maximum": 50,
"minimum": 1,
"description": "Maximum number of hybrid matches to return"
},
"query": {
"type": "string",
"minLength": 2,
"description": "Short keyword query: 2 to 5 words, one concept per call, or an exact name/SKU/ID. Every word must match for lexical results, so long sentences can return no lexical matches. Describing a garment finds that garment, not pieces to pair with it."
},
"item_types": {
"type": "array",
"items": {
"enum": [
"clothing_item",
"avatar",
"location",
"art_direction",
"uploaded_file",
"generation_result"
],
"type": "string"
},
"default": null,
"description": "Optional item types to search. Omit to search clothing, avatars/models, locations, art directions, uploaded files, and generation results."
},
"refresh_index": {
"type": "boolean",
"default": false,
"description": "Deprecated compatibility input. No index refresh is performed, even when true. Search uses the maintained index and current lexical metadata. Leave false."
},
"exclude_clothing_item_ids": {
"type": "array",
"items": {
"type": "integer"
},
"default": null,
"maxItems": 100,
"description": "Exclude these garment IDs after ranking and before the result limit; other item types are unaffected."
}
},
"description": "Input schema for universal hybrid library search.",
"additionalProperties": false
}Use this when a garment's photo shows its back but Uwear has it as the front (or the other way round): you saw the photo in this chat, or the user says so. side back makes the photo the garment's back, so back shots run from it; front undoes that. When the board holds the same garment twice, front and back photos as two garments, pass garment_id (the front) with side back and from_garment_id (the back): one garment with both photos. Call it yourself and continue (confirm_brief if the user asked to run): never ask the user to relabel a photo on the board. The board's brief is saved again with its new quote. Deletes nothing.
| Argument | Type | Description |
|---|---|---|
| side* | string | what its photo shows: back makes it the garment's back photo |
| board_id* | string | The open Shoot Board's board_id, from Open Shoot Board or your context. |
| garment_id* | integer | the garment (clothing id on the board, or worn by a look of its brief) |
| from_garment_id | integer | side back only: a board garment whose photo is garment_id's back (the same garment added twice). Its photo becomes garment_id's back; it leaves the board, kept in the library |
{
"type": "object",
"required": [
"garment_id",
"side",
"board_id"
],
"properties": {
"side": {
"enum": [
"front",
"back"
],
"type": "string",
"description": "what its photo shows: back makes it the garment's back photo"
},
"board_id": {
"type": "string",
"description": "The open Shoot Board's board_id, from Open Shoot Board or your context."
},
"garment_id": {
"type": "integer",
"minimum": 1,
"description": "the garment (clothing id on the board, or worn by a look of its brief)"
},
"from_garment_id": {
"type": "integer",
"minimum": 1,
"description": "side back only: a board garment whose photo is garment_id's back (the same garment added twice). Its photo becomes garment_id's back; it leaves the board, kept in the library"
}
},
"additionalProperties": false
}The result viewer's star. Marks one of the user's own generation results as a favorite (favorite true) or removes the mark (false); deletes nothing and spends no credits.
| Argument | Type | Description |
|---|---|---|
| is_favorite* | boolean | True to favorite, false to unfavorite |
| generation_result_id* | integer | The generation result ID |
{
"type": "object",
"required": [
"generation_result_id",
"is_favorite"
],
"properties": {
"is_favorite": {
"type": "boolean",
"description": "True to favorite, false to unfavorite"
},
"generation_result_id": {
"type": "integer",
"description": "The generation result ID"
}
},
"description": "Input schema for favoriting/unfavoriting a generation result."
}Moves a Shoot Board that is open in a widget to a view (board, brief, automation, results, brief_history). This client shows no widget, so it changes nothing the user sees: read the board, brief or results with read_shoot_board, get_brief or get_generation_results and tell the user.
| Argument | Type | Description |
|---|---|---|
| view* | string | board: the board's photos (Clothing, Models, Locations, references, the pinned Automation); brief: the brief's looks beside its automation (once it ran, each look with its photos and videos); automation: the same page, for its automation; results: a brief that ran, at its photos and videos; brief_history: every brief the user ran |
| board_id* | string | The open Shoot Board's board_id, from Open Shoot Board or your context. |
| look_key | string | brief / results: the look to bring forward (a key of the brief's looks) |
{
"type": "object",
"required": [
"view",
"board_id"
],
"properties": {
"view": {
"enum": [
"board",
"brief",
"automation",
"results",
"brief_history"
],
"type": "string",
"description": "board: the board's photos (Clothing, Models, Locations, references, the pinned Automation); brief: the brief's looks beside its automation (once it ran, each look with its photos and videos); automation: the same page, for its automation; results: a brief that ran, at its photos and videos; brief_history: every brief the user ran"
},
"board_id": {
"type": "string",
"description": "The open Shoot Board's board_id, from Open Shoot Board or your context."
},
"look_key": {
"type": "string",
"pattern": "^look_\\d{2,3}$",
"description": "brief / results: the look to bring forward (a key of the brief's looks)"
}
},
"additionalProperties": false
}Publish the reviewed flow identified by brief_id, revision and recipe_key as a new version of an existing reusable Automation. Requires its current definition hash. Accepts no operation definitions. Existing shoot snapshots remain unchanged. No media generation or charge.
| Argument | Type | Description |
|---|---|---|
| board_id* | string | The open Shoot Board's board_id, from Open Shoot Board or your context. |
| brief_id* | integer | |
| recipe_key* | string | The flow's key in the brief's recipes list. |
| workflow_id* | string | Reusable Automation to version using the reviewed brief flow named here. |
| expected_brief_revision* | integer | |
| expected_definition_hash* | string | Current library hash; stale edits are refused. |
{
"type": "object",
"required": [
"brief_id",
"expected_brief_revision",
"recipe_key",
"workflow_id",
"expected_definition_hash",
"board_id"
],
"properties": {
"board_id": {
"type": "string",
"description": "The open Shoot Board's board_id, from Open Shoot Board or your context."
},
"brief_id": {
"type": "integer",
"minimum": 1
},
"recipe_key": {
"type": "string",
"pattern": "^recipe_\\d{2,3}$",
"description": "The flow's key in the brief's recipes list."
},
"workflow_id": {
"type": "string",
"pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$",
"description": "Reusable Automation to version using the reviewed brief flow named here."
},
"expected_brief_revision": {
"type": "integer",
"minimum": 0
},
"expected_definition_hash": {
"type": "string",
"pattern": "^sha256:[a-f0-9]{64}$",
"description": "Current library hash; stale edits are refused."
}
},
"additionalProperties": false
}Revise shoot looks, direction or model settings, or assign a saved Automation by ID. Accepts no operation definitions; use the separately published plan_shoot tools to change individual steps. Returns the revised plan and quote. No media generation, credit charge or reusable-library write.
| Argument | Type | Description |
|---|---|---|
| looks* | array | The complete new look list (not a diff); an unchanged look keeps its key. |
| title | string | A new name for the shoot, only the user's own words (omit: kept). |
| board_id* | string | The open Shoot Board's board_id, from Open Shoot Board or your context. |
| brief_id* | integer | The brief being revised: the board's brief_id from read_shoot_board. |
| direction | any | A new Direction for the whole shoot, replacing the brief's (omit: kept): prompt, art_direction_id (a saved art direction), or both. Write one direction for every look from what the user wants (setting, light, mood, poses, purpose). Never name a garment, model, location or look: the same words run on every look. |
| image_model | string | The shoot's image model: a slug from brief_inputs.ai_models (omit: kept). |
| video_model | string | The shoot's video model: a slug from brief_inputs.ai_models (omit: kept). |
Patch the latest MontageProposal already shown in the UI. Use only for an existing video montage/reel/stitched sequence proposal; do not use this to modify a photoshoot brief. For photoshoot brief changes, call update_brief instead. Prefer `operations`, an ordered list of typed montage edits such as `clear_trim`, `remove`, `set_duration`, `set_trim_range`, `set_speed`, `set_muted`, `set_prompt`, `set_video_model`, `set_generate_audio`, `set_last_frame`, `set_aspect_ratio`, and `set_base_resolution`. Use `set_trim_range` for requests like 'use the second half', 'start at 3s', or 'trim from 3s to 6s'. Operations are applied in order to the current montage state. Legacy flat fields are still accepted as a compatibility shim. This updates the proposal only; it does not execute export or generation.
| Argument | Type | Description |
|---|---|---|
| muted | boolean | Mute or unmute the selected clip(s). |
| speed | number | Playback speed multiplier. |
| prompt | string | Update the motion prompt for image-to-video montage items. |
| remove | boolean | Remove the selected clip(s) from the proposal. |
| board_id | string | The open Shoot Board's board_id, from Open Shoot Board or your context. |
| end_time | number | Trim end time in seconds for legacy trim-range updates. |
| clear_trim | boolean |
Batch upload reusable Models from person photos the user attached in chat. Each photo becomes the upper_body_front identity anchor. Keep names and optional user-given age_range, build, and height_cm in avatars[], then pass top-level image_file_1, image_file_2, etc. in the same order. Traits are never guessed. No base64, no local paths. Do not use ordinary text-to-image results as an upload fallback. Use only when the user explicitly wants a specific or consistent person.
| Argument | Type | Description |
|---|---|---|
| name | string | Single recovered avatar/model name |
| build | string | Optional concrete physical build. Never inferred. |
| avatars | array | Avatar/model metadata in the same order as image_file_1, image_file_2, etc. No base64. |
| board_id | string | The open Shoot Board's board_id, from Open Shoot Board or your context. |
| age_range | string | Optional concrete age or age range. Never inferred. |
| file_name | string | Single recovered original file name |
| height_cm | integer | Optional height in centimeters. Never inferred. |
| image_url | string | Single resolved download URL used by automatic opaque-file recovery. |
Upload Clothing from public HTTP(S) image URLs. Queues a recoverable batch upload and returns an operation immediately; retry with the exact same arguments to read its state (a retry creates no second upload). Photos are stored as uploaded, without background removal; processing_mode is ignored. Prefer assets with {asset_kind: full|detail, asset_view: front|back|side, asset_url}; exactly one full front is required, every full view is unique, and detail views can repeat. No base64, chat file objects, or local paths.
| Argument | Type | Description |
|---|---|---|
| name | string | Single garment name |
| assets | array | Single garment full asset set. Use asset_kind/asset_view. Exactly one full front is required; full views are unique and detail views can repeat. |
| gender | string | Single garment gender: male, female, unisex |
| board_id | string | The open Shoot Board's board_id, from Open Shoot Board or your context. |
| garments | array | Garments to upload from public HTTP(S) URLs. No chat file objects and no base64. |
| file_name | string | Single original file name |
| image_url | string | Single public HTTP(S) front image URL |
| mime_type |
Read the user's saved photoshoot defaults (aspect ratio, camera, resolution) with every allowed value. Backs the plugin settings page.
No arguments.
{
"type": "object",
"properties": {},
"additionalProperties": false
}Save changed photoshoot defaults (aspect ratio, camera, resolution). Send only the settings that changed; returns every current value. Defaults never authorize a paid generation.
| Argument | Type | Description |
|---|---|---|
| set* | object |
{
"type": "object",
"required": [
"set"
],
"properties": {
"set": {
"type": "object",
"properties": {
"preferred_camera": {
"enum": [
"auto",
"full_body_front",
"full_body_back",
"full_body_side",
"upper_body_front",
"upper_body_back",
"upper_body_side",
"lower_body_front",
"lower_body_back",
"lower_body_side",
"clothing_detail_front",
"clothing_detail_back",
"clothing_detail_side"
],
"type": "string"
},
"default_resolution": {
"type": "string",
"minLength": 1,
"description": "Resolution such as 2K. Valid values are the enum in uwear_settings_read."
},
"default_aspect_ratio": {
"type": "string",
"minLength": 1,
"description": "Aspect ratio such as 3:4. Valid values are the enum in uwear_settings_read."
}
},
"minProperties": 1,
"additionalProperties": false
}
},
"additionalProperties": false
}| The board's brief_revision shown with this brief. |
{
"type": "object",
"$defs": {
"BriefRun": {
"type": "object",
"required": [
"automation",
"looks",
"steps"
],
"properties": {
"looks": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 50
},
"steps": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 100
},
"automation": {
"type": "string",
"maxLength": 300
}
},
"additionalProperties": false
}
},
"required": [
"brief_id",
"expected_brief_revision",
"idempotency_key",
"expected_total_credits",
"runs",
"board_id"
],
"properties": {
"runs": {
"type": "array",
"items": {
"$ref": "#/$defs/BriefRun"
},
"maxItems": 50,
"minItems": 1,
"description": "What this Generate runs: each Automation, its looks and its steps, as get_brief returns them."
},
"board_id": {
"type": "string",
"description": "The open Shoot Board's board_id, from Open Shoot Board or your context."
},
"brief_id": {
"type": "integer",
"minimum": 1
},
"idempotency_key": {
"type": "string",
"maxLength": 64,
"minLength": 1,
"description": "Retry key for one Generate: never runs or charges twice."
},
"expected_total_credits": {
"type": "integer",
"minimum": 0,
"description": "The credits this Generate charges, as get_brief returns them."
},
"expected_brief_revision": {
"type": "integer",
"minimum": 0,
"description": "The board's brief_revision shown with this brief."
}
},
"additionalProperties": false
}| avatar_ids |
| array |
| Filter results to images generated with these avatars |
| outfit_ids | array | Filter results to images generated with these outfits |
| start_date | string | Filter results created on or after this ISO date/datetime, e.g. 2026-04-20. |
| qa_statuses | array | Filter by QA statuses, e.g. pending, processing, completed, error. |
| location_ids | array | Filter results to images generated with these locations |
| generation_id | integer | Filter by parent generation ID (lists all result images from one generation job) |
| decision_source | string | Filter by the verdict source. |
| include_snapshot | boolean | Include full generation settings, resource snapshots and raw prompt payloads. Large; use only for prompt recovery. |
| art_direction_ids | array | Filter results to images generated with these art directions |
| clothing_item_ids | array | Filter results to images generated with these clothing items |
| generation_result_id | integer | Look up a single result image by its generation_result_id (the exact integer ID required by QA/edit/upscale/video tools). Returns that one result directly. |
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"default": null,
"description": "Filter by type: 'Image', 'Edit', 'Upscale', 'Video'"
},
"page": {
"type": "integer",
"default": 1,
"minimum": 1,
"description": "Page number for pagination"
},
"limit": {
"type": "integer",
"default": 20,
"maximum": 100,
"minimum": 1,
"description": "Number of items per page"
},
"query": {
"type": "string",
"default": null,
"minLength": 2,
"description": "Hybrid search across generated image content, originating item names, and SKUs."
},
"tag_ids": {
"type": "array",
"items": {
"type": "integer"
},
"default": null,
"description": "Filter by tag IDs (results must have at least one)"
},
"decision": {
"enum": [
"approved",
"rejected",
"undecided"
],
"type": "string",
"default": null,
"description": "Filter by the unified result verdict."
},
"end_date": {
"type": "string",
"default": null,
"description": "Filter results created on or before this ISO date/datetime, e.g. 2026-04-27."
},
"model_ids": {
"type": "array",
"items": {
"type": "integer"
},
"default": null,
"description": "Filter results to images generated with these AI models"
},
"avatar_ids": {
"type": "array",
"items": {
"type": "integer"
},
"default": null,
"description": "Filter results to images generated with these avatars"
},
"outfit_ids": {
"type": "array",
"items": {
"type": "integer"
},
"default": null,
"description": "Filter results to images generated with these outfits"
},
"start_date": {
"type": "string",
"default": null,
"description": "Filter results created on or after this ISO date/datetime, e.g. 2026-04-20."
},
"qa_statuses": {
"type": "array",
"items": {
"type": "string"
},
"default": null,
"description": "Filter by QA statuses, e.g. pending, processing, completed, error."
},
"location_ids": {
"type": "array",
"items": {
"type": "integer"
},
"default": null,
"description": "Filter results to images generated with these locations"
},
"generation_id": {
"type": "integer",
"default": null,
"description": "Filter by parent generation ID (lists all result images from one generation job)"
},
"decision_source": {
"enum": [
"auto",
"human"
],
"type": "string",
"default": null,
"description": "Filter by the verdict source."
},
"include_snapshot": {
"type": "boolean",
"default": false,
"description": "Include full generation settings, resource snapshots and raw prompt payloads. Large; use only for prompt recovery."
},
"art_direction_ids": {
"type": "array",
"items": {
"type": "integer"
},
"default": null,
"description": "Filter results to images generated with these art directions"
},
"clothing_item_ids": {
"type": "array",
"items": {
"type": "integer"
},
"default": null,
"description": "Filter results to images generated with these clothing items"
},
"generation_result_id": {
"type": "integer",
"default": null,
"description": "Look up a single result image by its generation_result_id (the exact integer ID required by QA/edit/upscale/video tools). Returns that one result directly."
}
},
"description": "Input schema for listing generation results.",
"additionalProperties": false
}| boolean |
| Set true when you need to inspect or reuse the avatar/model image URL. |
{
"type": "object",
"properties": {
"page": {
"type": "integer",
"default": 1,
"minimum": 1,
"description": "Page number for pagination"
},
"sort": {
"type": "string",
"default": null,
"description": "Sort order: 'field:direction', e.g. 'created_at:desc'. Default: created_at:desc"
},
"limit": {
"type": "integer",
"default": 10,
"maximum": 100,
"minimum": 1,
"description": "Number of items per page"
},
"query": {
"type": "string",
"default": null,
"minLength": 2,
"description": "Hybrid search across avatar/model names, metadata, and visual attributes."
},
"tag_ids": {
"type": "array",
"items": {
"type": "integer"
},
"default": null,
"description": "Filter to avatars with any of these tags"
},
"end_date": {
"type": "string",
"default": null,
"description": "Filter: created on or before this date (ISO format)"
},
"avatar_ids": {
"type": "array",
"items": {
"type": "integer"
},
"default": null,
"description": "Filter to specific avatar IDs"
},
"start_date": {
"type": "string",
"default": null,
"description": "Filter: created on or after this date (ISO format)"
},
"include_image_url": {
"type": "boolean",
"default": false,
"description": "Set true when you need to inspect or reuse the avatar/model image URL."
}
},
"description": "Input schema for listing avatars.",
"additionalProperties": false
}| array |
| Filter to categories in any of these body zones; OR with category when both are given. |
| start_date | string | Filter: created on or after this date (ISO format, e.g. '2025-06-01') |
| clothing_item_ids | array | Filter to specific garment IDs |
| include_image_url | boolean | Set true when the garment image itself is needed for visual display or reuse. |
| include_uncategorized | boolean | Also include garments with no category when category and/or body_zone filters are used. If the first result has uncategorized_count > 0 and too few matches, call again with true and inspect those garments. |
| exclude_clothing_item_ids | array | Exclude these garment IDs, for example the attached garment. |
{
"type": "object",
"properties": {
"page": {
"type": "integer",
"default": 1,
"minimum": 1,
"description": "Page number for pagination"
},
"sort": {
"type": "string",
"default": null,
"description": "Sort order: 'field:direction', e.g. 'created_at:desc', 'clothing_item_name:asc'. Default: created_at:desc"
},
"limit": {
"type": "integer",
"default": 10,
"maximum": 100,
"minimum": 1,
"description": "Number of items per page"
},
"query": {
"type": "string",
"default": null,
"minLength": 2,
"description": "Hybrid search across garment names, SKUs, metadata, and visual attributes."
},
"tag_ids": {
"type": "array",
"items": {
"type": "integer"
},
"default": null,
"description": "Filter to garments with any of these tags"
},
"category": {
"type": "array",
"items": {
"enum": [
"activewear",
"baby_and_childrens_clothing",
"blouses",
"bodysuits",
"cardigans",
"corset_tops",
"hoodies",
"overshirts",
"polos",
"shirts",
"sweaters",
"sweatshirts",
"t_shirts",
"tank_tops",
"tunics",
"dresses",
"lingerie",
"maternity_clothing",
"mens_undergarments",
"one_pieces",
"outerwear",
"outfit_sets",
"pants",
"shorts",
"skirts",
"skorts",
"sleepwear_and_loungewear",
"socks",
"suits",
"swimwear",
"traditional_and_ceremonial_clothing",
"uniforms_and_workwear",
"wedding_and_bridal_party_dresses",
"clothing_accessories",
"costumes_and_accessories",
"handbag_and_wallet_accessories",
"handbags_wallets_and_cases",
"jewelry",
"shoe_accessories",
"shoes",
"other"
],
"type": "string"
},
"default": null,
"description": "Filter to garments in any of these canonical categories; OR with body_zone when both are given."
},
"end_date": {
"type": "string",
"default": null,
"description": "Filter: created on or before this date (ISO format)"
},
"body_zone": {
"type": "array",
"items": {
"enum": [
"upper_body",
"lower_body",
"full_body",
"footwear",
"accessory",
"other"
],
"type": "string"
},
"default": null,
"description": "Filter to categories in any of these body zones; OR with category when both are given."
},
"start_date": {
"type": "string",
"default": null,
"description": "Filter: created on or after this date (ISO format, e.g. '2025-06-01')"
},
"clothing_item_ids": {
"type": "array",
"items": {
"type": "integer"
},
"default": null,
"description": "Filter to specific garment IDs"
},
"include_image_url": {
"type": "boolean",
"default": false,
"description": "Set true when the garment image itself is needed for visual display or reuse."
},
"include_uncategorized": {
"type": "boolean",
"default": false,
"description": "Also include garments with no category when category and/or body_zone filters are used. If the first result has uncategorized_count > 0 and too few matches, call again with true and inspect those garments."
},
"exclude_clothing_item_ids": {
"type": "array",
"items": {
"type": "integer"
},
"default": null,
"maxItems": 100,
"description": "Exclude these garment IDs, for example the attached garment."
}
},
"description": "Input schema for listing garments.",
"additionalProperties": false
}| Set true when the location/reference image URL is needed for inspection or reuse. |
{
"type": "object",
"properties": {
"page": {
"type": "integer",
"default": 1,
"minimum": 1,
"description": "Page number for pagination"
},
"sort": {
"type": "string",
"default": null,
"description": "Sort order: 'field:direction', e.g. 'created_at:desc', 'location_name:asc'. Default: created_at:desc"
},
"limit": {
"type": "integer",
"default": 10,
"maximum": 100,
"minimum": 1,
"description": "Number of items per page"
},
"query": {
"type": "string",
"default": null,
"minLength": 2,
"description": "Hybrid search across location names, metadata, and visual attributes."
},
"tag_ids": {
"type": "array",
"items": {
"type": "integer"
},
"default": null,
"description": "Filter to locations with any of these tags"
},
"end_date": {
"type": "string",
"default": null,
"description": "Filter: created on or before this date (ISO format)"
},
"start_date": {
"type": "string",
"default": null,
"description": "Filter: created on or after this date (ISO format)"
},
"location_ids": {
"type": "array",
"items": {
"type": "integer"
},
"default": null,
"description": "Filter to specific location IDs"
},
"include_image_url": {
"type": "boolean",
"default": false,
"description": "Set true when the location/reference image URL is needed for inspection or reuse."
}
},
"description": "Input schema for listing reusable location/scene references.",
"additionalProperties": false
}| start_date |
| string |
| Filter: created on or after this date (ISO format) |
| clothing_item_ids | array | Filter to outfits containing any of these garments |
{
"type": "object",
"properties": {
"page": {
"type": "integer",
"default": 1,
"minimum": 1,
"description": "Page number for pagination"
},
"sort": {
"type": "string",
"default": null,
"description": "Sort: 'field:direction'. Use 'latest_generation_at:desc' to surface recently generated outfits. Default: created_at:desc"
},
"limit": {
"type": "integer",
"default": 10,
"maximum": 100,
"minimum": 1,
"description": "Number of items per page"
},
"query": {
"type": "string",
"default": null,
"minLength": 2,
"description": "Search outfit names and contained garments."
},
"source": {
"enum": [
"manual",
"auto",
"proposed"
],
"type": "string",
"default": null,
"description": "Filter by outfit source."
},
"tag_ids": {
"type": "array",
"items": {
"type": "integer"
},
"default": null,
"description": "Filter to outfits with any of these tags"
},
"end_date": {
"type": "string",
"default": null,
"description": "Filter: created on or before this date (ISO format)"
},
"is_active": {
"type": "string",
"default": null,
"description": "Filter by status: 'true', 'false', or 'both' (default: both)"
},
"outfit_ids": {
"type": "array",
"items": {
"type": "integer"
},
"default": null,
"description": "Filter to specific outfit IDs"
},
"start_date": {
"type": "string",
"default": null,
"description": "Filter: created on or after this date (ISO format)"
},
"clothing_item_ids": {
"type": "array",
"items": {
"type": "integer"
},
"default": null,
"description": "Filter to outfits containing any of these garments"
}
},
"description": "Input schema for listing outfits.",
"additionalProperties": false
}| created_by_profile_id | integer |
{
"type": "object",
"$defs": {
"CatalogScope": {
"enum": [
"library",
"owner_only"
],
"type": "string"
},
"TemplateKind": {
"enum": [
"generation_preset",
"batch_workflow"
],
"type": "string",
"description": "generation_preset is writable; batch_workflow is retained read-only history."
}
},
"properties": {
"kind": {
"enum": [
"image",
"edit",
"video"
],
"type": "string",
"default": null
},
"page": {
"type": "integer",
"default": 1,
"minimum": 1,
"description": "Page number for pagination"
},
"sort": {
"enum": [
"newest",
"most_used",
"last_used"
],
"type": "string",
"default": "newest"
},
"use_case": {
"type": "string",
"default": null,
"minLength": 1,
"description": "Filter by a use_case present in any stored command"
},
"share_code": {
"type": "string",
"default": null,
"pattern": "^t-[a-z0-9]{4}$",
"description": "Return the template assigned this public t-xxxx share code"
},
"catalog_scope": {
"$ref": "#/$defs/CatalogScope",
"default": null,
"description": "Filter by library or owner_only. Owner-only templates are hidden unless explicitly requested."
},
"template_kind": {
"$ref": "#/$defs/TemplateKind",
"default": null,
"description": "Filter generation presets or read-only historical batch_workflow records"
},
"items_per_page": {
"type": "integer",
"default": 50,
"maximum": 100,
"minimum": 1,
"description": "Number of templates per page"
},
"created_by_profile_id": {
"type": "integer",
"default": null,
"minimum": 1
}
},
"description": "Input schema for listing company templates.",
"additionalProperties": false
}{
"type": "object",
"required": [
"garment_id",
"view",
"expected_revision",
"board_id"
],
"properties": {
"view": {
"enum": [
"back",
"side",
"detail"
],
"type": "string",
"description": "back, side, or detail (a close-up)"
},
"board_id": {
"type": "string",
"description": "The open Shoot Board's board_id, from Open Shoot Board or your context."
},
"image_url": {
"type": "string",
"description": "instead of from_garment_id: the stored photo (host file download URL, or the image_url mcp_upload_intake_photo returned)"
},
"garment_id": {
"type": "integer",
"minimum": 1,
"description": "the board garment that gains the photo as a view"
},
"from_garment_id": {
"type": "integer",
"minimum": 1,
"description": "the board garment whose photo it is; it leaves the board"
},
"expected_revision": {
"type": "integer",
"minimum": 0,
"description": "Board revision this write is based on; a stale revision returns a revision_conflict error with the current board instead of overwriting it"
}
}
}| generation_result_id | integer | null | Existing generation result ID to use as the source image; provide exactly one source |
{
"type": "object",
"required": [
"model"
],
"properties": {
"model": {
"type": "string",
"description": "Video model slug or supported model name"
},
"prompt": {
"type": [
"string",
"null"
],
"description": "Optional motion prompt for the video clip"
},
"duration": {
"type": [
"integer",
"null"
],
"minimum": 1,
"description": "Video duration in seconds; defaults to 5"
},
"image_url": {
"type": [
"string",
"null"
],
"description": "HTTPS source image URL; provide exactly one source"
},
"resolution": {
"type": [
"string",
"null"
],
"description": "Optional output resolution; defaults to 480p"
},
"generate_audio": {
"type": [
"boolean",
"null"
],
"description": "Include audio in the delivered video. False delivers a silent file; fixed-audio providers are muted after generation at the same credits."
},
"last_frame_url": {
"type": [
"string",
"null"
],
"description": "Optional final-frame image URL for supported video models"
},
"uploaded_file_id": {
"type": [
"integer",
"null"
],
"minimum": 1,
"description": "Uploaded file ID to use as the source image; provide exactly one source"
},
"generation_result_id": {
"type": [
"integer",
"null"
],
"minimum": 1,
"description": "Existing generation result ID to use as the source image; provide exactly one source"
}
}
}{
"type": "object",
"required": [
"workflow_id",
"nodes",
"edges",
"board_id"
],
"properties": {
"edges": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": true
}
},
"nodes": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": true
}
},
"board_id": {
"type": "string",
"description": "The open Shoot Board's board_id, from Open Shoot Board or your context."
},
"version_id": {
"type": "string",
"default": null,
"pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"
},
"workflow_id": {
"type": "string",
"pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"
},
"failure_policy": {
"type": "string",
"default": null
},
"base_version_id": {
"type": "string",
"default": null,
"pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"
},
"contract_version": {
"type": "string",
"default": null
},
"result_projection": {
"type": "array",
"items": {
"type": "string"
},
"default": null
},
"expected_definition_hash": {
"type": "string",
"default": null
}
},
"description": "No version_id: a new draft (POST versions). With version_id: save it (PATCH), guarded by its hash.",
"additionalProperties": false
}| board_id* |
| string |
| The open Shoot Board's board_id, from Open Shoot Board or your context. |
| garment_id | integer | add_as_view: the board garment that gains the photo as a view |
| from_garment_id | integer | add_as_view: the board garment whose photo it is; it leaves the board |
| expected_revision* | integer | Board revision this write is based on; a stale revision returns a revision_conflict error with the current board instead of overwriting it |
{
"type": "object",
"required": [
"expected_revision",
"action",
"board_id"
],
"properties": {
"type": {
"enum": [
"clothing",
"models",
"outfits",
"generations",
"files",
"locations",
"art_directions",
"automations"
],
"type": "string",
"description": "clear: only this type; omit for a new shoot (the whole board and its brief)"
},
"view": {
"enum": [
"back",
"side",
"detail"
],
"type": "string",
"description": "add_as_view: back, side, or detail (a close-up)"
},
"items": {
"type": "array",
"items": {
"type": "object",
"required": [
"type",
"id"
],
"properties": {
"id": {
"oneOf": [
{
"type": "integer"
},
{
"type": "string"
}
]
},
"name": {
"type": "string"
},
"type": {
"enum": [
"clothing",
"models",
"outfits",
"generations",
"files",
"locations",
"art_directions",
"automations"
],
"type": "string"
}
}
},
"maxItems": 100,
"description": "add / set: the items. An automations item (id: a workflow_id from brief_inputs.automations) pins the Automation every look of the brief runs through; a board pins one, a new one replaces it. A board holds one art direction the same way"
},
"action": {
"enum": [
"add",
"set",
"clear",
"add_as_view"
],
"type": "string",
"description": "add: put items on the board; set: replace all items; clear: remove one type, or without type everything and the board's brief (a new shoot on this board); add_as_view: from_garment_id's photo becomes a view of garment_id"
},
"board_id": {
"type": "string",
"description": "The open Shoot Board's board_id, from Open Shoot Board or your context."
},
"garment_id": {
"type": "integer",
"minimum": 1,
"description": "add_as_view: the board garment that gains the photo as a view"
},
"from_garment_id": {
"type": "integer",
"minimum": 1,
"description": "add_as_view: the board garment whose photo it is; it leaves the board"
},
"expected_revision": {
"type": "integer",
"minimum": 0,
"description": "Board revision this write is based on; a stale revision returns a revision_conflict error with the current board instead of overwriting it"
}
},
"additionalProperties": false
}{
"type": "object",
"required": [
"brief_id",
"expected_brief_revision",
"recipe_key",
"shot_index",
"camera_edit_id",
"board_id"
],
"properties": {
"board_id": {
"type": "string",
"description": "The open Shoot Board's board_id, from Open Shoot Board or your context."
},
"brief_id": {
"type": "integer",
"minimum": 1
},
"look_keys": {
"type": "array",
"items": {
"type": "string",
"pattern": "^look_\\d{2,3}$"
},
"default": null,
"maxItems": 50,
"minItems": 1,
"description": "Affected looks using this flow; omit for every look using it. Other looks retain their flow."
},
"recipe_key": {
"type": "string",
"pattern": "^recipe_\\d{2,3}$",
"description": "Flow from the current brief."
},
"shot_index": {
"type": "integer",
"maximum": 8,
"minimum": 1
},
"step_index": {
"type": "integer",
"default": null,
"maximum": 4,
"minimum": 1,
"description": "One-based dependent step to replace; omit to append. Each tool accepts only its own operation's settings."
},
"camera_edit_id": {
"enum": [
"full_body_front",
"full_body_back",
"full_body_side",
"upper_body_front",
"upper_body_back",
"upper_body_side",
"lower_body_front",
"lower_body_back",
"lower_body_side",
"clothing_detail_front",
"clothing_detail_back",
"clothing_detail_side"
],
"type": "string",
"description": "Camera edit preset."
},
"expected_brief_revision": {
"type": "integer",
"minimum": 0
}
},
"additionalProperties": false
}{
"type": "object",
"required": [
"brief_id",
"expected_brief_revision",
"recipe_key",
"shot_index",
"prompt",
"board_id"
],
"properties": {
"prompt": {
"type": "string",
"maxLength": 1000,
"minLength": 1
},
"board_id": {
"type": "string",
"description": "The open Shoot Board's board_id, from Open Shoot Board or your context."
},
"brief_id": {
"type": "integer",
"minimum": 1
},
"look_keys": {
"type": "array",
"items": {
"type": "string",
"pattern": "^look_\\d{2,3}$"
},
"default": null,
"maxItems": 50,
"minItems": 1,
"description": "Affected looks using this flow; omit for every look using it. Other looks retain their flow."
},
"recipe_key": {
"type": "string",
"pattern": "^recipe_\\d{2,3}$",
"description": "Flow from the current brief."
},
"shot_index": {
"type": "integer",
"maximum": 8,
"minimum": 1
},
"step_index": {
"type": "integer",
"default": null,
"maximum": 4,
"minimum": 1,
"description": "One-based dependent step to replace; omit to append. Each tool accepts only its own operation's settings."
},
"expected_brief_revision": {
"type": "integer",
"minimum": 0
}
},
"additionalProperties": false
}| expected_brief_revision* | integer |
{
"type": "object",
"required": [
"brief_id",
"expected_brief_revision",
"recipe_key",
"camera",
"board_id"
],
"properties": {
"camera": {
"enum": [
"auto",
"full_body_front",
"full_body_back",
"full_body_side",
"upper_body_front",
"upper_body_back",
"upper_body_side",
"lower_body_front",
"lower_body_back",
"lower_body_side",
"clothing_detail_front",
"clothing_detail_back",
"clothing_detail_side"
],
"type": "string"
},
"board_id": {
"type": "string",
"description": "The open Shoot Board's board_id, from Open Shoot Board or your context."
},
"brief_id": {
"type": "integer",
"minimum": 1
},
"look_keys": {
"type": "array",
"items": {
"type": "string",
"pattern": "^look_\\d{2,3}$"
},
"default": null,
"maxItems": 50,
"minItems": 1,
"description": "Affected looks using this flow; omit for every look using it. Other looks retain their flow."
},
"recipe_key": {
"type": "string",
"pattern": "^recipe_\\d{2,3}$",
"description": "Flow from the current brief."
},
"resolution": {
"type": "string",
"default": null,
"pattern": "^\\d{1,2}(\\.\\d)?K$",
"description": "Shared photo resolution for the whole shoot."
},
"shot_index": {
"type": "integer",
"default": null,
"maximum": 8,
"minimum": 1,
"description": "One-based shot to revise; omit to append a new shot. Revising its camera retains dependent steps."
},
"aspect_ratio": {
"type": "string",
"default": null,
"pattern": "^\\d{1,2}(\\.\\d{1,2})?:\\d{1,2}(\\.\\d{1,2})?$",
"description": "Shared photo format for the whole shoot."
},
"expected_brief_revision": {
"type": "integer",
"minimum": 0
}
},
"additionalProperties": false
}{
"type": "object",
"required": [
"brief_id",
"expected_brief_revision",
"recipe_key",
"shot_index",
"factor",
"board_id"
],
"properties": {
"factor": {
"type": "number",
"exclusiveMinimum": 0
},
"board_id": {
"type": "string",
"description": "The open Shoot Board's board_id, from Open Shoot Board or your context."
},
"brief_id": {
"type": "integer",
"minimum": 1
},
"look_keys": {
"type": "array",
"items": {
"type": "string",
"pattern": "^look_\\d{2,3}$"
},
"default": null,
"maxItems": 50,
"minItems": 1,
"description": "Affected looks using this flow; omit for every look using it. Other looks retain their flow."
},
"recipe_key": {
"type": "string",
"pattern": "^recipe_\\d{2,3}$",
"description": "Flow from the current brief."
},
"shot_index": {
"type": "integer",
"maximum": 8,
"minimum": 1
},
"step_index": {
"type": "integer",
"default": null,
"maximum": 4,
"minimum": 1,
"description": "One-based dependent step to replace; omit to append. Each tool accepts only its own operation's settings."
},
"expected_brief_revision": {
"type": "integer",
"minimum": 0
}
},
"additionalProperties": false
}| integer |
| expected_brief_revision* | integer |
{
"type": "object",
"required": [
"brief_id",
"expected_brief_revision",
"recipe_key",
"shot_index",
"length_seconds",
"board_id"
],
"properties": {
"sound": {
"type": "boolean",
"default": false
},
"prompt": {
"type": "string",
"default": "",
"maxLength": 1000
},
"board_id": {
"type": "string",
"description": "The open Shoot Board's board_id, from Open Shoot Board or your context."
},
"brief_id": {
"type": "integer",
"minimum": 1
},
"look_keys": {
"type": "array",
"items": {
"type": "string",
"pattern": "^look_\\d{2,3}$"
},
"default": null,
"maxItems": 50,
"minItems": 1,
"description": "Affected looks using this flow; omit for every look using it. Other looks retain their flow."
},
"recipe_key": {
"type": "string",
"pattern": "^recipe_\\d{2,3}$",
"description": "Flow from the current brief."
},
"shot_index": {
"type": "integer",
"maximum": 8,
"minimum": 1
},
"step_index": {
"type": "integer",
"default": null,
"maximum": 4,
"minimum": 1,
"description": "One-based dependent step to replace; omit to append. Each tool accepts only its own operation's settings."
},
"length_seconds": {
"type": "integer",
"minimum": 1
},
"expected_brief_revision": {
"type": "integer",
"minimum": 0
}
},
"additionalProperties": false
}{
"type": "object",
"$defs": {
"LookInput": {
"type": "object",
"properties": {
"key": {
"type": "string",
"default": null,
"pattern": "^look_\\d{2,3}$",
"description": "update_brief: an existing look's key, to keep that look."
},
"label": {
"type": "string",
"default": "",
"maxLength": 120,
"description": "The look's name, e.g. 'Linen summer set'."
},
"model_id": {
"type": "integer",
"default": null,
"minimum": 1,
"description": "The Model who wears the look."
},
"outfit_id": {
"type": "integer",
"default": null,
"minimum": 1,
"description": "A saved outfit."
},
"location_id": {
"type": "integer",
"default": null,
"minimum": 1,
"description": "Where the look is shot."
},
"clothing_ids": {
"type": "array",
"items": {
"type": "integer",
"minimum": 1
},
"maxItems": 4,
"description": "Clothing worn together."
},
"reference_ids": {
"type": "array",
"items": {
"type": "integer",
"minimum": 1
},
"maxItems": 50,
"description": "Reference photos (uploaded file ids from the board's References)."
}
},
"description": "One look: one outfit worn in the shoot, with who wears it and where.",
"additionalProperties": false
},
"ProposedDirection": {
"type": "object",
"anyOf": [
{
"required": [
"prompt"
]
},
{
"required": [
"art_direction_id"
]
}
],
"properties": {
"prompt": {
"type": "string",
"default": null,
"maxLength": 2000,
"description": "Your words for this shoot, in English, 1-3 sentences. Write one direction for every look from what the user wants (setting, light, mood, poses, purpose). Never name a garment, model, location or look: the same words run on every look. Not needed with an art_direction_id."
},
"art_direction_id": {
"type": "integer",
"default": null,
"minimum": 1,
"description": "A saved art direction (a library id, or the id save_art_direction returns)."
}
},
"description": "The shoot's Direction as the host writes it: its words, a saved art direction, or both; never neither,\nso every brief says what runs.",
"additionalProperties": false
}
},
"required": [
"looks",
"direction",
"board_id"
],
"properties": {
"looks": {
"type": "array",
"items": {
"$ref": "#/$defs/LookInput"
},
"maxItems": 50,
"minItems": 1,
"description": "The looks to shoot, each one outfit worn in the shoot, with ids from read_shoot_board."
},
"title": {
"type": "string",
"default": "",
"maxLength": 80,
"description": "The shoot's name, only in the user's own words; otherwise leave it out."
},
"board_id": {
"type": "string",
"description": "The open Shoot Board's board_id, from Open Shoot Board or your context."
},
"direction": {
"$ref": "#/$defs/ProposedDirection",
"description": "Required: what every shot of every look follows, exactly what Generate runs: prompt, art_direction_id (a saved art direction), or both. Write one direction for every look from what the user wants (setting, light, mood, poses, purpose). Never name a garment, model, location or look: the same words run on every look."
},
"image_model": {
"type": "string",
"default": null,
"description": "The shoot's image model: a slug from brief_inputs.ai_models (omit: kept)."
},
"video_model": {
"type": "string",
"default": null,
"description": "The shoot's video model: a slug from brief_inputs.ai_models (omit: kept)."
},
"recipe_workflow_id": {
"type": "string",
"default": null,
"pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$",
"description": "The Automation every look runs through, as it is saved: a workflow_id from brief_inputs.automations or save_automation. Omitted while the board pins one (brief_inputs.pinned_automation): every look runs it."
}
},
"additionalProperties": false
}| base_resolution | integer | Output resolution height in pixels |
{
"type": "object",
"$defs": {
"MontageItemInput": {
"type": "object",
"required": [
"type"
],
"properties": {
"type": {
"enum": [
"video",
"image"
],
"type": "string",
"description": "'video' for existing video, 'image' for an image that needs video generation first"
},
"muted": {
"type": "boolean",
"default": false,
"description": "Mute audio for this item"
},
"speed": {
"type": "number",
"default": 1,
"maximum": 4,
"minimum": 0.25,
"description": "Playback speed multiplier (0.25-4.0)"
},
"prompt": {
"type": "string",
"default": null,
"description": "Per-image motion prompt for video generation. Make it specific to this image and the requested movement, camera motion, vibe, and pacing."
},
"duration": {
"type": "integer",
"default": null,
"description": "Exact generated video duration in seconds for image items. If omitted, target_duration can be used instead."
},
"end_time": {
"type": "number",
"default": null,
"description": "Optional trim end time in seconds for this clip",
"exclusiveMinimum": 0
},
"image_url": {
"type": "string",
"default": null,
"description": "URL of image to use as first frame (alternative to image_result_id)"
},
"start_time": {
"type": "number",
"default": null,
"minimum": 0,
"description": "Optional trim start time in seconds for this clip"
},
"video_model": {
"type": "string",
"default": null,
"description": "Video model slug (required when type='image'). Use list_models(model_type='video') to see options."
},
"generate_audio": {
"type": "boolean",
"default": false,
"description": "Generate audio with the video"
},
"last_frame_url": {
"type": "string",
"default": null,
"description": "URL of last frame image for first-to-last video generation"
},
"image_result_id": {
"type": "integer",
"default": null,
"description": "ID of image GenerationResult to use as first frame (required when type='image')"
},
"target_duration": {
"type": "number",
"default": null,
"description": "Desired final clip length in seconds. For existing videos, this trims from the start by default. For image items, this becomes the generated video duration.",
"exclusiveMinimum": 0
},
"video_result_id": {
"type": "integer",
"default": null,
"description": "ID of video GenerationResult (required when type='video')"
}
},
"description": "A single item in a montage proposal. Either an existing video or an image to generate video from."
}
},
"required": [
"items"
],
"properties": {
"items": {
"type": "array",
"items": {
"$ref": "#/$defs/MontageItemInput"
},
"maxItems": 10,
"minItems": 1,
"description": "Ordered list of montage items. Each is either an existing video or an image needing video generation. Min 1, max 10."
},
"board_id": {
"type": "string",
"description": "The open Shoot Board's board_id, from Open Shoot Board or your context."
},
"aspect_ratio": {
"type": "string",
"default": "9:16",
"description": "Output aspect ratio (e.g. '9:16', '16:9', '1:1')"
},
"base_resolution": {
"type": "integer",
"default": 1080,
"maximum": 4320,
"minimum": 360,
"description": "Output resolution height in pixels"
}
},
"description": "Input schema for proposing a montage (mix of existing videos and images to generate)."
}| setting* | string | Where it is shot: studio backdrop or place, surfaces, props. |
| styling* | string | How the clothes are worn, hair, makeup, accessories, footwear. |
| board_id* | string | The open Shoot Board's board_id, from Open Shoot Board or your context. |
| overview* | string | What the photos should feel like overall, in 1-2 sentences. |
| must_keep | array | Rules every photo keeps, one per line (the user's own must-haves). |
| variations | array | Only when the user wants variety across photos: each a name (Pose, Backdrop) and 2-6 complete alternatives Uwear rotates through. |
{
"type": "object",
"required": [
"name",
"overview",
"mood",
"light",
"setting",
"palette",
"camera",
"styling",
"board_id"
],
"properties": {
"mood": {
"type": "string",
"maxLength": 600,
"minLength": 3,
"description": "The feeling and the pose language: energy, expression, how the model moves."
},
"name": {
"type": "string",
"maxLength": 80,
"minLength": 2,
"description": "Its title, 2-6 words, the one you used in chat (never Untitled or Art direction)."
},
"avoid": {
"type": "array",
"items": {
"type": "string",
"maxLength": 200,
"minLength": 3
},
"maxItems": 8,
"description": "What never appears, one per line."
},
"light": {
"type": "string",
"maxLength": 600,
"minLength": 3,
"description": "Direction, softness, colour temperature and shadows (e.g. low warm sun from the left, long soft shadows)."
},
"camera": {
"type": "string",
"maxLength": 600,
"minLength": 3,
"description": "Framing, angle, lens feel and distance (e.g. eye-level 50mm, full body with headroom)."
},
"palette": {
"type": "string",
"maxLength": 600,
"minLength": 3,
"description": "The colours of set, light and styling (e.g. terracotta, sand, washed olive)."
},
"setting": {
"type": "string",
"maxLength": 600,
"minLength": 3,
"description": "Where it is shot: studio backdrop or place, surfaces, props."
},
"styling": {
"type": "string",
"maxLength": 600,
"minLength": 3,
"description": "How the clothes are worn, hair, makeup, accessories, footwear."
},
"board_id": {
"type": "string",
"description": "The open Shoot Board's board_id, from Open Shoot Board or your context."
},
"overview": {
"type": "string",
"maxLength": 600,
"minLength": 3,
"description": "What the photos should feel like overall, in 1-2 sentences."
},
"must_keep": {
"type": "array",
"items": {
"type": "string",
"maxLength": 200,
"minLength": 3
},
"maxItems": 8,
"description": "Rules every photo keeps, one per line (the user's own must-haves)."
},
"variations": {
"type": "array",
"items": {
"type": "object",
"required": [
"name",
"options"
],
"properties": {
"name": {
"type": "string",
"maxLength": 60,
"minLength": 2
},
"options": {
"type": "array",
"items": {
"type": "string",
"maxLength": 200,
"minLength": 3
},
"maxItems": 6,
"minItems": 2
}
},
"additionalProperties": false
},
"maxItems": 4,
"description": "Only when the user wants variety across photos: each a name (Pose, Backdrop) and 2-6 complete alternatives Uwear rotates through."
}
},
"additionalProperties": false
}| object |
| Host-provided uploaded file reference for the matching item index when it has no image_url. Use the file object supplied by the host, not a bare file_... ID. |
| image_file_4 | object | Host-provided uploaded file reference for the matching item index when it has no image_url. Use the file object supplied by the host, not a bare file_... ID. |
| image_file_5 | object | Host-provided uploaded file reference for the matching item index when it has no image_url. Use the file object supplied by the host, not a bare file_... ID. |
| image_file_6 | object | Host-provided uploaded file reference for the matching item index when it has no image_url. Use the file object supplied by the host, not a bare file_... ID. |
| image_file_7 | object | Host-provided uploaded file reference for the matching item index when it has no image_url. Use the file object supplied by the host, not a bare file_... ID. |
| image_file_8 | object | Host-provided uploaded file reference for the matching item index when it has no image_url. Use the file object supplied by the host, not a bare file_... ID. |
| image_file_9 | object | Host-provided uploaded file reference for the matching item index when it has no image_url. Use the file object supplied by the host, not a bare file_... ID. |
| image_file_10 | object | Host-provided uploaded file reference for the matching item index when it has no image_url. Use the file object supplied by the host, not a bare file_... ID. |
{
"type": "object",
"$defs": {
"ReferenceChatFileUploadItem": {
"type": "object",
"properties": {
"name": {
"type": "string",
"default": null,
"description": "Alternate display name for the saved reference file"
},
"file_name": {
"type": "string",
"default": null,
"description": "Display name for the saved reference file"
},
"image_url": {
"type": "string",
"default": null,
"description": "Resolved download URL. Used by the Uwear app when recovering a chat file ID."
},
"mime_type": {
"type": "string",
"default": null,
"description": "MIME/content type, e.g. image/png"
}
},
"description": "One reference file upload item for chat-file batch upload."
}
},
"required": [],
"properties": {
"files": {
"type": "array",
"items": {
"$ref": "#/$defs/ReferenceChatFileUploadItem"
},
"default": null,
"maxItems": 10,
"description": "Reference file metadata in the same order as image_file_1, image_file_2, etc. No base64."
},
"board_id": {
"type": "string",
"description": "The open Shoot Board's board_id, from Open Shoot Board or your context."
},
"file_name": {
"type": "string",
"default": null,
"description": "Single recovered display name"
},
"image_url": {
"type": "string",
"default": null,
"description": "Single resolved download URL used by automatic opaque-file recovery."
},
"mime_type": {
"type": "string",
"default": null,
"description": "Single recovered MIME/content type, e.g. image/png"
},
"image_file_1": {
"type": "object",
"required": [
"download_url",
"file_id"
],
"properties": {
"file_id": {
"type": "string"
},
"file_name": {
"type": "string"
},
"mime_type": {
"type": "string"
},
"download_url": {
"type": "string"
}
},
"description": "Host-provided uploaded file reference for the matching item index when it has no image_url. Use the file object supplied by the host, not a bare file_... ID.",
"additionalProperties": false
},
"image_file_2": {
"type": "object",
"required": [
"download_url",
"file_id"
],
"properties": {
"file_id": {
"type": "string"
},
"file_name": {
"type": "string"
},
"mime_type": {
"type": "string"
},
"download_url": {
"type": "string"
}
},
"description": "Host-provided uploaded file reference for the matching item index when it has no image_url. Use the file object supplied by the host, not a bare file_... ID.",
"additionalProperties": false
},
"image_file_3": {
"type": "object",
"required": [
"download_url",
"file_id"
],
"properties": {
"file_id": {
"type": "string"
},
"file_name": {
"type": "string"
},
"mime_type": {
"type": "string"
},
"download_url": {
"type": "string"
}
},
"description": "Host-provided uploaded file reference for the matching item index when it has no image_url. Use the file object supplied by the host, not a bare file_... ID.",
"additionalProperties": false
},
"image_file_4": {
"type": "object",
"required": [
"download_url",
"file_id"
],
"properties": {
"file_id": {
"type": "string"
},
"file_name": {
"type": "string"
},
"mime_type": {
"type": "string"
},
"download_url": {
"type": "string"
}
},
"description": "Host-provided uploaded file reference for the matching item index when it has no image_url. Use the file object supplied by the host, not a bare file_... ID.",
"additionalProperties": false
},
"image_file_5": {
"type": "object",
"required": [
"download_url",
"file_id"
],
"properties": {
"file_id": {
"type": "string"
},
"file_name": {
"type": "string"
},
"mime_type": {
"type": "string"
},
"download_url": {
"type": "string"
}
},
"description": "Host-provided uploaded file reference for the matching item index when it has no image_url. Use the file object supplied by the host, not a bare file_... ID.",
"additionalProperties": false
},
"image_file_6": {
"type": "object",
"required": [
"download_url",
"file_id"
],
"properties": {
"file_id": {
"type": "string"
},
"file_name": {
"type": "string"
},
"mime_type": {
"type": "string"
},
"download_url": {
"type": "string"
}
},
"description": "Host-provided uploaded file reference for the matching item index when it has no image_url. Use the file object supplied by the host, not a bare file_... ID.",
"additionalProperties": false
},
"image_file_7": {
"type": "object",
"required": [
"download_url",
"file_id"
],
"properties": {
"file_id": {
"type": "string"
},
"file_name": {
"type": "string"
},
"mime_type": {
"type": "string"
},
"download_url": {
"type": "string"
}
},
"description": "Host-provided uploaded file reference for the matching item index when it has no image_url. Use the file object supplied by the host, not a bare file_... ID.",
"additionalProperties": false
},
"image_file_8": {
"type": "object",
"required": [
"download_url",
"file_id"
],
"properties": {
"file_id": {
"type": "string"
},
"file_name": {
"type": "string"
},
"mime_type": {
"type": "string"
},
"download_url": {
"type": "string"
}
},
"description": "Host-provided uploaded file reference for the matching item index when it has no image_url. Use the file object supplied by the host, not a bare file_... ID.",
"additionalProperties": false
},
"image_file_9": {
"type": "object",
"required": [
"download_url",
"file_id"
],
"properties": {
"file_id": {
"type": "string"
},
"file_name": {
"type": "string"
},
"mime_type": {
"type": "string"
},
"download_url": {
"type": "string"
}
},
"description": "Host-provided uploaded file reference for the matching item index when it has no image_url. Use the file object supplied by the host, not a bare file_... ID.",
"additionalProperties": false
},
"image_file_10": {
"type": "object",
"required": [
"download_url",
"file_id"
],
"properties": {
"file_id": {
"type": "string"
},
"file_name": {
"type": "string"
},
"mime_type": {
"type": "string"
},
"download_url": {
"type": "string"
}
},
"description": "Host-provided uploaded file reference for the matching item index when it has no image_url. Use the file object supplied by the host, not a bare file_... ID.",
"additionalProperties": false
}
},
"description": "Input schema for saving reference files from chat file references."
}| recipe_look_keys | array | The looks (keys you send) that move to recipe_workflow_id; omit for every look. |
| recipe_workflow_id | string | The Automation the looks below move to, run as it is saved: a workflow_id from brief_inputs.automations or save_automation. |
| expected_brief_revision | integer |
{
"type": "object",
"$defs": {
"LookInput": {
"type": "object",
"properties": {
"key": {
"type": "string",
"default": null,
"pattern": "^look_\\d{2,3}$",
"description": "update_brief: an existing look's key, to keep that look."
},
"label": {
"type": "string",
"default": "",
"maxLength": 120,
"description": "The look's name, e.g. 'Linen summer set'."
},
"model_id": {
"type": "integer",
"default": null,
"minimum": 1,
"description": "The Model who wears the look."
},
"outfit_id": {
"type": "integer",
"default": null,
"minimum": 1,
"description": "A saved outfit."
},
"location_id": {
"type": "integer",
"default": null,
"minimum": 1,
"description": "Where the look is shot."
},
"clothing_ids": {
"type": "array",
"items": {
"type": "integer",
"minimum": 1
},
"maxItems": 4,
"description": "Clothing worn together."
},
"reference_ids": {
"type": "array",
"items": {
"type": "integer",
"minimum": 1
},
"maxItems": 50,
"description": "Reference photos (uploaded file ids from the board's References)."
}
},
"description": "One look: one outfit worn in the shoot, with who wears it and where.",
"additionalProperties": false
},
"ProposedDirection": {
"type": "object",
"anyOf": [
{
"required": [
"prompt"
]
},
{
"required": [
"art_direction_id"
]
}
],
"properties": {
"prompt": {
"type": "string",
"default": null,
"maxLength": 2000,
"description": "Your words for this shoot, in English, 1-3 sentences. Write one direction for every look from what the user wants (setting, light, mood, poses, purpose). Never name a garment, model, location or look: the same words run on every look. Not needed with an art_direction_id."
},
"art_direction_id": {
"type": "integer",
"default": null,
"minimum": 1,
"description": "A saved art direction (a library id, or the id save_art_direction returns)."
}
},
"description": "The shoot's Direction as the host writes it: its words, a saved art direction, or both; never neither,\nso every brief says what runs.",
"additionalProperties": false
}
},
"required": [
"brief_id",
"looks",
"board_id"
],
"properties": {
"looks": {
"type": "array",
"items": {
"$ref": "#/$defs/LookInput"
},
"maxItems": 50,
"minItems": 1,
"description": "The complete new look list (not a diff); an unchanged look keeps its key."
},
"title": {
"type": "string",
"default": null,
"maxLength": 80,
"description": "A new name for the shoot, only the user's own words (omit: kept)."
},
"board_id": {
"type": "string",
"description": "The open Shoot Board's board_id, from Open Shoot Board or your context."
},
"brief_id": {
"type": "integer",
"minimum": 1,
"description": "The brief being revised: the board's brief_id from read_shoot_board."
},
"direction": {
"$ref": "#/$defs/ProposedDirection",
"default": null,
"description": "A new Direction for the whole shoot, replacing the brief's (omit: kept): prompt, art_direction_id (a saved art direction), or both. Write one direction for every look from what the user wants (setting, light, mood, poses, purpose). Never name a garment, model, location or look: the same words run on every look."
},
"image_model": {
"type": "string",
"default": null,
"description": "The shoot's image model: a slug from brief_inputs.ai_models (omit: kept)."
},
"video_model": {
"type": "string",
"default": null,
"description": "The shoot's video model: a slug from brief_inputs.ai_models (omit: kept)."
},
"recipe_look_keys": {
"type": "array",
"items": {
"type": "string",
"pattern": "^look_\\d{2,3}$"
},
"default": null,
"maxItems": 50,
"description": "The looks (keys you send) that move to recipe_workflow_id; omit for every look."
},
"recipe_workflow_id": {
"type": "string",
"default": null,
"pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$",
"description": "The Automation the looks below move to, run as it is saved: a workflow_id from brief_inputs.automations or save_automation."
},
"expected_brief_revision": {
"type": "integer",
"default": null,
"minimum": 0
}
},
"additionalProperties": false
}| For video clips, remove trim bounds and restore the full clip length in the proposal. |
| operations | array | Ordered montage patch operations. Preferred over the legacy flat fields below. |
| start_time | number | Trim start time in seconds for legacy trim-range updates. |
| clip_number | integer | 1-based clip number to update. Omit when apply_to_all=true. |
| video_model | string | Update the video model for image-to-video montage items. |
| apply_to_all | boolean | Apply changes to every clip in the current montage proposal. |
| aspect_ratio | string | Update the montage output aspect ratio. |
| clip_numbers | array | Optional list of 1-based clip numbers to update together. |
| generate_audio | boolean | Enable or disable generated audio for image-to-video montage items. |
| last_frame_url | string | Optional last-frame URL for image-to-video montage items. |
| base_resolution | integer | Update the montage output resolution height. |
| target_duration | number | Desired final clip length in seconds. |
{
"type": "object",
"$defs": {
"MontagePatchOpInput": {
"type": "object",
"required": [
"op"
],
"properties": {
"op": {
"enum": [
"remove",
"clear_trim",
"set_duration",
"set_trim_range",
"set_speed",
"set_muted",
"set_prompt",
"set_video_model",
"set_generate_audio",
"set_last_frame",
"set_aspect_ratio",
"set_base_resolution"
],
"type": "string",
"description": "Patch operation to apply to the montage proposal."
},
"muted": {
"type": "boolean",
"default": null,
"description": "Muted value for set_muted."
},
"speed": {
"type": "number",
"default": null,
"maximum": 4,
"minimum": 0.25,
"description": "Playback speed multiplier for set_speed."
},
"prompt": {
"type": "string",
"default": null,
"description": "Motion prompt for set_prompt."
},
"end_time": {
"type": "number",
"default": null,
"description": "Trim end time in seconds for set_trim_range.",
"exclusiveMinimum": 0
},
"start_time": {
"type": "number",
"default": null,
"minimum": 0,
"description": "Trim start time in seconds for set_trim_range."
},
"clip_number": {
"type": "integer",
"default": null,
"minimum": 1,
"description": "1-based clip number target."
},
"video_model": {
"type": "string",
"default": null,
"description": "Video model for set_video_model."
},
"apply_to_all": {
"type": "boolean",
"default": false,
"description": "Apply this operation to every clip in the current montage proposal."
},
"aspect_ratio": {
"type": "string",
"default": null,
"description": "Aspect ratio value for set_aspect_ratio."
},
"clip_numbers": {
"type": "array",
"items": {
"type": "integer"
},
"default": null,
"description": "Optional list of 1-based clip numbers to target together."
},
"generate_audio": {
"type": "boolean",
"default": null,
"description": "Generate-audio value for set_generate_audio."
},
"last_frame_url": {
"type": "string",
"default": null,
"description": "Last-frame URL for set_last_frame."
},
"base_resolution": {
"type": "integer",
"default": null,
"maximum": 4320,
"minimum": 360,
"description": "Resolution value for set_base_resolution."
},
"target_duration": {
"type": "number",
"default": null,
"description": "Desired final clip length in seconds for set_duration.",
"exclusiveMinimum": 0
}
},
"description": "A typed montage patch operation applied in order."
}
},
"required": [],
"properties": {
"muted": {
"type": "boolean",
"default": null,
"description": "Mute or unmute the selected clip(s)."
},
"speed": {
"type": "number",
"default": null,
"maximum": 4,
"minimum": 0.25,
"description": "Playback speed multiplier."
},
"prompt": {
"type": "string",
"default": null,
"description": "Update the motion prompt for image-to-video montage items."
},
"remove": {
"type": "boolean",
"default": false,
"description": "Remove the selected clip(s) from the proposal."
},
"board_id": {
"type": "string",
"description": "The open Shoot Board's board_id, from Open Shoot Board or your context."
},
"end_time": {
"type": "number",
"default": null,
"description": "Trim end time in seconds for legacy trim-range updates.",
"exclusiveMinimum": 0
},
"clear_trim": {
"type": "boolean",
"default": false,
"description": "For video clips, remove trim bounds and restore the full clip length in the proposal."
},
"operations": {
"type": "array",
"items": {
"$ref": "#/$defs/MontagePatchOpInput"
},
"default": null,
"description": "Ordered montage patch operations. Preferred over the legacy flat fields below."
},
"start_time": {
"type": "number",
"default": null,
"minimum": 0,
"description": "Trim start time in seconds for legacy trim-range updates."
},
"clip_number": {
"type": "integer",
"default": null,
"minimum": 1,
"description": "1-based clip number to update. Omit when apply_to_all=true."
},
"video_model": {
"type": "string",
"default": null,
"description": "Update the video model for image-to-video montage items."
},
"apply_to_all": {
"type": "boolean",
"default": false,
"description": "Apply changes to every clip in the current montage proposal."
},
"aspect_ratio": {
"type": "string",
"default": null,
"description": "Update the montage output aspect ratio."
},
"clip_numbers": {
"type": "array",
"items": {
"type": "integer"
},
"default": null,
"description": "Optional list of 1-based clip numbers to update together."
},
"generate_audio": {
"type": "boolean",
"default": null,
"description": "Enable or disable generated audio for image-to-video montage items."
},
"last_frame_url": {
"type": "string",
"default": null,
"description": "Optional last-frame URL for image-to-video montage items."
},
"base_resolution": {
"type": "integer",
"default": null,
"maximum": 4320,
"minimum": 360,
"description": "Update the montage output resolution height."
},
"target_duration": {
"type": "number",
"default": null,
"description": "Desired final clip length in seconds.",
"exclusiveMinimum": 0
}
},
"description": "Patch the latest montage proposal shown in the UI."
}| mime_type | string | Single recovered MIME/content type, e.g. image/png |
| description | object | Single recovered avatar metadata |
| image_file_1 | object | Host-provided uploaded file reference for the matching item index when it has no image_url. Use the file object supplied by the host, not a bare file_... ID. |
| image_file_2 | object | Host-provided uploaded file reference for the matching item index when it has no image_url. Use the file object supplied by the host, not a bare file_... ID. |
| image_file_3 | object | Host-provided uploaded file reference for the matching item index when it has no image_url. Use the file object supplied by the host, not a bare file_... ID. |
| image_file_4 | object | Host-provided uploaded file reference for the matching item index when it has no image_url. Use the file object supplied by the host, not a bare file_... ID. |
| image_file_5 | object | Host-provided uploaded file reference for the matching item index when it has no image_url. Use the file object supplied by the host, not a bare file_... ID. |
| image_file_6 | object | Host-provided uploaded file reference for the matching item index when it has no image_url. Use the file object supplied by the host, not a bare file_... ID. |
| image_file_7 | object | Host-provided uploaded file reference for the matching item index when it has no image_url. Use the file object supplied by the host, not a bare file_... ID. |
| image_file_8 | object | Host-provided uploaded file reference for the matching item index when it has no image_url. Use the file object supplied by the host, not a bare file_... ID. |
| image_file_9 | object | Host-provided uploaded file reference for the matching item index when it has no image_url. Use the file object supplied by the host, not a bare file_... ID. |
| image_file_10 | object | Host-provided uploaded file reference for the matching item index when it has no image_url. Use the file object supplied by the host, not a bare file_... ID. |
{
"type": "object",
"$defs": {
"AvatarChatFileUploadItem": {
"type": "object",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"description": "Name for the avatar/model"
},
"build": {
"type": "string",
"default": null,
"maxLength": 100,
"description": "Optional concrete physical build. Never inferred."
},
"age_range": {
"type": "string",
"default": null,
"maxLength": 20,
"description": "Optional concrete age or age range. Never inferred."
},
"file_name": {
"type": "string",
"default": null,
"description": "Original file name"
},
"height_cm": {
"type": "integer",
"default": null,
"maximum": 220,
"minimum": 40,
"description": "Optional height in centimeters. Never inferred."
},
"image_url": {
"type": "string",
"default": null,
"description": "Resolved download URL. Used by the Uwear app when recovering a chat file ID."
},
"mime_type": {
"type": "string",
"default": null,
"description": "MIME/content type, e.g. image/png"
},
"description": {
"type": "object",
"default": null,
"description": "Avatar metadata: {gender, age, body, ethnicity, hair_color, etc.}",
"additionalProperties": true
}
},
"description": "One avatar/model upload item for chat-file batch upload.",
"additionalProperties": false
}
},
"required": [],
"properties": {
"name": {
"type": "string",
"default": null,
"description": "Single recovered avatar/model name"
},
"build": {
"type": "string",
"default": null,
"maxLength": 100,
"description": "Optional concrete physical build. Never inferred."
},
"avatars": {
"type": "array",
"items": {
"$ref": "#/$defs/AvatarChatFileUploadItem"
},
"default": null,
"maxItems": 10,
"description": "Avatar/model metadata in the same order as image_file_1, image_file_2, etc. No base64."
},
"board_id": {
"type": "string",
"description": "The open Shoot Board's board_id, from Open Shoot Board or your context."
},
"age_range": {
"type": "string",
"default": null,
"maxLength": 20,
"description": "Optional concrete age or age range. Never inferred."
},
"file_name": {
"type": "string",
"default": null,
"description": "Single recovered original file name"
},
"height_cm": {
"type": "integer",
"default": null,
"maximum": 220,
"minimum": 40,
"description": "Optional height in centimeters. Never inferred."
},
"image_url": {
"type": "string",
"default": null,
"description": "Single resolved download URL used by automatic opaque-file recovery."
},
"mime_type": {
"type": "string",
"default": null,
"description": "Single recovered MIME/content type, e.g. image/png"
},
"description": {
"type": "object",
"default": null,
"description": "Single recovered avatar metadata",
"additionalProperties": true
},
"image_file_1": {
"type": "object",
"required": [
"download_url",
"file_id"
],
"properties": {
"file_id": {
"type": "string"
},
"file_name": {
"type": "string"
},
"mime_type": {
"type": "string"
},
"download_url": {
"type": "string"
}
},
"description": "Host-provided uploaded file reference for the matching item index when it has no image_url. Use the file object supplied by the host, not a bare file_... ID.",
"additionalProperties": false
},
"image_file_2": {
"type": "object",
"required": [
"download_url",
"file_id"
],
"properties": {
"file_id": {
"type": "string"
},
"file_name": {
"type": "string"
},
"mime_type": {
"type": "string"
},
"download_url": {
"type": "string"
}
},
"description": "Host-provided uploaded file reference for the matching item index when it has no image_url. Use the file object supplied by the host, not a bare file_... ID.",
"additionalProperties": false
},
"image_file_3": {
"type": "object",
"required": [
"download_url",
"file_id"
],
"properties": {
"file_id": {
"type": "string"
},
"file_name": {
"type": "string"
},
"mime_type": {
"type": "string"
},
"download_url": {
"type": "string"
}
},
"description": "Host-provided uploaded file reference for the matching item index when it has no image_url. Use the file object supplied by the host, not a bare file_... ID.",
"additionalProperties": false
},
"image_file_4": {
"type": "object",
"required": [
"download_url",
"file_id"
],
"properties": {
"file_id": {
"type": "string"
},
"file_name": {
"type": "string"
},
"mime_type": {
"type": "string"
},
"download_url": {
"type": "string"
}
},
"description": "Host-provided uploaded file reference for the matching item index when it has no image_url. Use the file object supplied by the host, not a bare file_... ID.",
"additionalProperties": false
},
"image_file_5": {
"type": "object",
"required": [
"download_url",
"file_id"
],
"properties": {
"file_id": {
"type": "string"
},
"file_name": {
"type": "string"
},
"mime_type": {
"type": "string"
},
"download_url": {
"type": "string"
}
},
"description": "Host-provided uploaded file reference for the matching item index when it has no image_url. Use the file object supplied by the host, not a bare file_... ID.",
"additionalProperties": false
},
"image_file_6": {
"type": "object",
"required": [
"download_url",
"file_id"
],
"properties": {
"file_id": {
"type": "string"
},
"file_name": {
"type": "string"
},
"mime_type": {
"type": "string"
},
"download_url": {
"type": "string"
}
},
"description": "Host-provided uploaded file reference for the matching item index when it has no image_url. Use the file object supplied by the host, not a bare file_... ID.",
"additionalProperties": false
},
"image_file_7": {
"type": "object",
"required": [
"download_url",
"file_id"
],
"properties": {
"file_id": {
"type": "string"
},
"file_name": {
"type": "string"
},
"mime_type": {
"type": "string"
},
"download_url": {
"type": "string"
}
},
"description": "Host-provided uploaded file reference for the matching item index when it has no image_url. Use the file object supplied by the host, not a bare file_... ID.",
"additionalProperties": false
},
"image_file_8": {
"type": "object",
"required": [
"download_url",
"file_id"
],
"properties": {
"file_id": {
"type": "string"
},
"file_name": {
"type": "string"
},
"mime_type": {
"type": "string"
},
"download_url": {
"type": "string"
}
},
"description": "Host-provided uploaded file reference for the matching item index when it has no image_url. Use the file object supplied by the host, not a bare file_... ID.",
"additionalProperties": false
},
"image_file_9": {
"type": "object",
"required": [
"download_url",
"file_id"
],
"properties": {
"file_id": {
"type": "string"
},
"file_name": {
"type": "string"
},
"mime_type": {
"type": "string"
},
"download_url": {
"type": "string"
}
},
"description": "Host-provided uploaded file reference for the matching item index when it has no image_url. Use the file object supplied by the host, not a bare file_... ID.",
"additionalProperties": false
},
"image_file_10": {
"type": "object",
"required": [
"download_url",
"file_id"
],
"properties": {
"file_id": {
"type": "string"
},
"file_name": {
"type": "string"
},
"mime_type": {
"type": "string"
},
"download_url": {
"type": "string"
}
},
"description": "Host-provided uploaded file reference for the matching item index when it has no image_url. Use the file object supplied by the host, not a bare file_... ID.",
"additionalProperties": false
}
},
"description": "Input schema for uploading avatars/models from chat file references.",
"additionalProperties": false
}| string |
| Single MIME/content type, e.g. image/png |
| description | string | Single item-level garment description hint |
| back_image_url | string | Single optional public HTTP(S) back image URL |
| side_image_url | string | Single optional public HTTP(S) side image URL |
| processing_mode | string | Optional image processing. 'background_removal' removes the background (the platform upload default); 'none' stores the image as-is. Omit to use background removal. |
| detail_image_urls | array | Single optional public HTTP(S) detail image URLs |
{
"type": "object",
"$defs": {
"GarmentPublicUrlAssetInput": {
"type": "object",
"properties": {
"asset_url": {
"type": "string",
"default": null,
"description": "Public HTTP(S) image URL for this asset"
},
"file_name": {
"type": "string",
"default": null,
"description": "Original file name for this asset"
},
"image_url": {
"type": "string",
"default": null,
"description": "Alias for asset_url"
},
"mime_type": {
"type": "string",
"default": null,
"description": "MIME/content type for this asset, e.g. image/png"
},
"asset_kind": {
"enum": [
"full",
"detail"
],
"type": "string",
"default": null,
"description": "Asset kind: full garment view or detail crop."
},
"asset_role": {
"enum": [
"front",
"back",
"side",
"detail"
],
"type": "string",
"default": null,
"deprecated": true,
"description": "Deprecated role-only adapter. Prefer asset_kind and asset_view."
},
"asset_view": {
"enum": [
"front",
"back",
"side",
"unspecified"
],
"type": "string",
"default": null,
"description": "Visible garment view. New detail uploads require front, back, or side."
}
},
"description": "One classified garment asset for public URL upload."
},
"GarmentPublicUrlUploadItem": {
"type": "object",
"properties": {
"name": {
"type": "string",
"default": null,
"description": "Name for the garment. If omitted, derived from the image filename."
},
"assets": {
"type": "array",
"items": {
"$ref": "#/$defs/GarmentPublicUrlAssetInput"
},
"default": null,
"description": "Full garment asset set using asset_kind/asset_view. Exactly one full front is required; full views are unique and detail views can repeat."
},
"gender": {
"type": "string",
"default": null,
"description": "Target gender: male, female, unisex"
},
"file_name": {
"type": "string",
"default": null,
"description": "Original file name"
},
"image_url": {
"type": "string",
"default": null,
"description": "Legacy shortcut: public HTTP(S) front image URL"
},
"mime_type": {
"type": "string",
"default": null,
"description": "MIME/content type, e.g. image/png"
},
"description": {
"type": "string",
"default": null,
"description": "Optional item-level garment description hint"
},
"back_image_url": {
"type": "string",
"default": null,
"description": "Legacy shortcut: optional public HTTP(S) back image URL"
},
"side_image_url": {
"type": "string",
"default": null,
"description": "Legacy shortcut: optional public HTTP(S) side image URL"
},
"processing_mode": {
"type": "string",
"default": null,
"description": "Optional image processing. 'background_removal' removes the background (the platform upload default); 'none' stores the image as-is. Omit to use background removal."
},
"detail_image_urls": {
"type": "array",
"items": {
"type": "string"
},
"default": null,
"description": "Legacy shortcut: optional public HTTP(S) detail image URLs"
}
},
"description": "One garment upload item for public URL batch upload."
}
},
"required": [],
"properties": {
"name": {
"type": "string",
"default": null,
"description": "Single garment name"
},
"assets": {
"type": "array",
"items": {
"$ref": "#/$defs/GarmentPublicUrlAssetInput"
},
"default": null,
"description": "Single garment full asset set. Use asset_kind/asset_view. Exactly one full front is required; full views are unique and detail views can repeat."
},
"gender": {
"type": "string",
"default": null,
"description": "Single garment gender: male, female, unisex"
},
"board_id": {
"type": "string",
"description": "The open Shoot Board's board_id, from Open Shoot Board or your context."
},
"garments": {
"type": "array",
"items": {
"$ref": "#/$defs/GarmentPublicUrlUploadItem"
},
"default": null,
"maxItems": 50,
"description": "Garments to upload from public HTTP(S) URLs. No chat file objects and no base64."
},
"file_name": {
"type": "string",
"default": null,
"description": "Single original file name"
},
"image_url": {
"type": "string",
"default": null,
"description": "Single public HTTP(S) front image URL"
},
"mime_type": {
"type": "string",
"default": null,
"description": "Single MIME/content type, e.g. image/png"
},
"description": {
"type": "string",
"default": null,
"description": "Single item-level garment description hint"
},
"back_image_url": {
"type": "string",
"default": null,
"description": "Single optional public HTTP(S) back image URL"
},
"side_image_url": {
"type": "string",
"default": null,
"description": "Single optional public HTTP(S) side image URL"
},
"processing_mode": {
"type": "string",
"default": null,
"description": "Optional image processing. 'background_removal' removes the background (the platform upload default); 'none' stores the image as-is. Omit to use background removal."
},
"detail_image_urls": {
"type": "array",
"items": {
"type": "string"
},
"default": null,
"description": "Single optional public HTTP(S) detail image URLs"
}
},
"description": "Input schema for uploading garments from public URLs."
}