Mutations
All GraphQL mutations for creating, changing and deleting data, in alphabetical order.
Each example selects a few fields of the returned type. Select the fields you need instead: the linked type lists all of them. Operations marked as not available with API tokens return an error when called with an API token.
addDesignerInstanceToDesignerCollection
Attach a DesignerInstance to a DesignerCollection. Idempotent.
Returns: DesignerCollection!
Arguments:
Example:
mutation AddDesignerInstanceToDesignerCollection($designerCollectionId: UUID!, $designerInstanceId: UUID!) {
addDesignerInstanceToDesignerCollection(designerCollectionId: $designerCollectionId, designerInstanceId: $designerInstanceId) {
id
brief
createdAt
season
status
teamDomain
}
}
addFashionModelToLibrary
Add a fashion model to your team's library (quota dependent)
Returns: Boolean!
Arguments:
idUUID!required
Example:
mutation AddFashionModelToLibrary($id: UUID!) {
addFashionModelToLibrary(id: $id)
}
addMarketplacePreset
Install a marketplace preset (e.g. BREUNINGER) for the team: copies the preset's perspectives in as team-owned rows. Locked slots come back frozen (only aiModel editable, no archive/delete); the detail slot is a regular editable perspective. Idempotent: existing copies are returned instead of duplicated. Returns the preset's perspectives.
Returns: [ProductStudioPerspective!]!
Arguments:
marketplaceMarketplacePreset!required
Example:
mutation AddMarketplacePreset($marketplace: MarketplacePreset!) {
addMarketplacePreset(marketplace: $marketplace) {
id
acceptedViewTypes
aiModel
archivedAt
aspectRatio
backgroundHexColor
}
}
addMediaPlanCard
Add an image already in the plan to a carousel as another card, scored immediately. Refused for a single-image unit, past the unit's maximum, or for an image already in it.
Returns: PlannedPlacement!
Arguments:
Example:
mutation AddMediaPlanCard($placementId: UUID!, $mediaPlanSourceId: UUID!) {
addMediaPlanCard(placementId: $placementId, mediaPlanSourceId: $mediaPlanSourceId) {
id
approvedAt
approvedBy
brandAssetsOverridden
headlineTreatmentId
mediaPlacementId
}
}
addMediaPlanSources
Add finished campaign outputs to an existing plan. Each gets its own single-image ads in the units the plan still has, and joins each carousel as a card. Spends what creating a plan spends per image (copy, measurement, two SAM calls); new cards return at PENDING.
Returns: MediaPlan!
Arguments:
Example:
mutation AddMediaPlanSources($planId: UUID!, $campaignImageResultIds: [UUID!]!) {
addMediaPlanSources(planId: $planId, campaignImageResultIds: $campaignImageResultIds) {
id
copyGeneratingSince
copyGenerationError
createdAt
headlineTreatmentId
instructions
}
}
addPatternRevisionToDesignerCollection
Attach a PatternRevision to a DesignerCollection. Idempotent.
Returns: DesignerCollection!
Arguments:
Example:
mutation AddPatternRevisionToDesignerCollection($designerCollectionId: UUID!, $patternRevisionId: UUID!) {
addPatternRevisionToDesignerCollection(designerCollectionId: $designerCollectionId, patternRevisionId: $patternRevisionId) {
id
brief
createdAt
season
status
teamDomain
}
}
addPatternRevisionToDesignerInstance
Select (connect) a PatternRevision on a Designer Instance. Idempotent. The pattern becomes available to materialise into a fabric swatch via createDesignerFabric.
Returns: DesignerInstance!
Arguments:
Example:
mutation AddPatternRevisionToDesignerInstance($designerInstanceId: UUID!, $patternRevisionId: UUID!) {
addPatternRevisionToDesignerInstance(designerInstanceId: $designerInstanceId, patternRevisionId: $patternRevisionId) {
id
activeFabricId
archivedAt
createdAt
description
fashionModelRevisionId
}
}
addProductStudioInput
Add an existing batch input image as a new input on a ProductStudio (planner support-product edit)
Returns: ProductStudioInput!
Arguments:
Example:
mutation AddProductStudioInput($productStudioId: UUID!, $batchInputImageId: UUID!, $isHero: Boolean, $productTitle: String) {
addProductStudioInput(productStudioId: $productStudioId, batchInputImageId: $batchInputImageId, isHero: $isHero, productTitle: $productTitle) {
id
createdAt
fileName
filenameView
isHero
isStylingPiece
}
}
addSingleShotToGroupShot
Add a single shot to a group shot (max 3)
Returns: GroupShotSingleShot!
Arguments:
Example:
mutation AddSingleShotToGroupShot($groupShotId: UUID!, $campaignImageId: UUID!) {
addSingleShotToGroupShot(groupShotId: $groupShotId, campaignImageId: $campaignImageId) {
id
campaignImageId
createdAt
groupShotId
}
}
addSkillToBatch
Add a skill to a batch
Returns: Batch!
Arguments:
Example:
mutation AddSkillToBatch($batchId: UUID!, $skillId: UUID!) {
addSkillToBatch(batchId: $batchId, skillId: $skillId) {
id
campaignImageCount
createdAt
instructions
isGenerated
mediaGenerationTaskIds
}
}
amendMediaPlan
Bulk-edit a plan by handle (look-1, stories, stories-9x16, 4:5, band-bottom-white, logo slugs), never by id. Operations apply in order, all or nothing. An unknown handle is rejected with the valid set named, and every error in a call is reported at once. A known handle that matches nothing succeeds with a note; a call where every operation matched nothing is rejected. Rejection wording is a contract with the agent: do not change it casually.
Returns: AmendMediaPlanResult!
Arguments:
planIdUUID!requiredoperations[MediaPlanOperation!]!required
Example:
mutation AmendMediaPlan($planId: UUID!, $operations: [MediaPlanOperation!]!) {
amendMediaPlan(planId: $planId, operations: $operations) {
adsAdded
adsApproved
adsUnapproved
approvalsWithdrawn
cardsChanged
cardsRemoved
}
}
amendPlan
Surgically amend a batch plan: update, add, or remove individual draft items; untouched items are never modified
Returns: AmendPlanResult!
Arguments:
batchIdUUID!requiredupdateStudios[AmendStudioInput!]updateCampaigns[AmendCampaignInput!]addStudios[PlanStudioItemInput!]addCampaigns[PlanCampaignItemInput!]removeItemIds[UUID!]
Example:
mutation AmendPlan($batchId: UUID!, $updateStudios: [AmendStudioInput!], $updateCampaigns: [AmendCampaignInput!], $addStudios: [PlanStudioItemInput!], $addCampaigns: [PlanCampaignItemInput!], $removeItemIds: [UUID!]) {
amendPlan(batchId: $batchId, updateStudios: $updateStudios, updateCampaigns: $updateCampaigns, addStudios: $addStudios, addCampaigns: $addCampaigns, removeItemIds: $removeItemIds) {
added
removed
updated
}
}
annotateSizeChart
Draw the design chart's base-size values onto the revision's front and back technical drawings. Needs the drawings to exist. Billed per view. Replaces the chart's previous annotation.
Returns: SizeChartAnnotation!
Arguments:
Example:
mutation AnnotateSizeChart($sizeChartId: UUID!, $designerInstanceRevisionId: UUID!) {
annotateSizeChart(sizeChartId: $sizeChartId, designerInstanceRevisionId: $designerInstanceRevisionId) {
id
backUrl
createdAt
designerInstanceRevisionId
errorMessage
frontUrl
}
}
approveMediaPlanCopy
Approve or un-approve one line in one language.
Returns: PlannedPlacement!
Arguments:
placementIdUUID!requiredcardIdUUIDslotMediaCopySlot!requiredlocaleString!requiredapprovedBoolean!requiredtextString: The text shown to the reviewer. When given, approval only lands on exactly that text and returns 409 if the line changed.
Example:
mutation ApproveMediaPlanCopy($placementId: UUID!, $cardId: UUID, $slot: MediaCopySlot!, $locale: String!, $approved: Boolean!, $text: String) {
approveMediaPlanCopy(placementId: $placementId, cardId: $cardId, slot: $slot, locale: $locale, approved: $approved, text: $text) {
id
approvedAt
approvedBy
brandAssetsOverridden
headlineTreatmentId
mediaPlacementId
}
}
approveMediaPlanPlacement
Approve or un-approve one ad unit. The unit, never the card: approving three of five carousel cards is not a state that means anything. Un-approving keeps the previous approver on the row.
Returns: PlannedPlacement!
Arguments:
placementIdUUID!requiredapprovedBoolean!required
Example:
mutation ApproveMediaPlanPlacement($placementId: UUID!, $approved: Boolean!) {
approveMediaPlanPlacement(placementId: $placementId, approved: $approved) {
id
approvedAt
approvedBy
brandAssetsOverridden
headlineTreatmentId
mediaPlacementId
}
}
archiveBrandAsset
Hide a brand asset from pickers. Ads already carrying it keep it.
Returns: BrandAsset!
Arguments:
idUUID!required
Example:
mutation ArchiveBrandAsset($id: UUID!) {
archiveBrandAsset(id: $id) {
id
archivedAt
createdAt
darkGroundImageKey
defaultSize
height
}
}
archiveDesignerInstance
Archive a Designer Instance: it disappears from designerInstances and from its collections, still opens by id (old links and its revisions keep working), and refuses every change until it is unarchived — generating, resource uploads, pattern changes, fabrics, technical drawings and releases all 400. Generations already in progress continue, including dependent image calls, and delivered outputs charge normally. Idempotent; this is what the product offers instead of deleting a design.
Returns: DesignerInstance!
Arguments:
idUUID!required
Example:
mutation ArchiveDesignerInstance($id: UUID!) {
archiveDesignerInstance(id: $id) {
id
activeFabricId
archivedAt
createdAt
description
fashionModelRevisionId
}
}
archiveProductStudioPerspective
Archive a product studio perspective (soft hide from default list)
Returns: ProductStudioPerspective!
Arguments:
idUUID!required
Example:
mutation ArchiveProductStudioPerspective($id: UUID!) {
archiveProductStudioPerspective(id: $id) {
id
acceptedViewTypes
aiModel
archivedAt
aspectRatio
backgroundHexColor
}
}
archiveWardrobeItem
Hide a wardrobe article from pickers and from the planner, keeping it and its photographs intact
Returns: WardrobeItem!
Arguments:
idUUID!required
Example:
mutation ArchiveWardrobeItem($id: UUID!) {
archiveWardrobeItem(id: $id) {
id
archivedAt
category
createdAt
styleReference
teamDomain
}
}
assignCampaignImageToCampaign
Assign an existing campaign image to a campaign
Returns: CampaignImage!
Arguments:
Example:
mutation AssignCampaignImageToCampaign($campaignImageId: UUID!, $campaignId: UUID!) {
assignCampaignImageToCampaign(campaignImageId: $campaignImageId, campaignId: $campaignId) {
id
aspectRatio
createdAt
errorMessage
guidanceImageKey
guidanceImageUrl
}
}
attachPlateToPerspective
Returns: ProductStudioPerspective!
Arguments:
perspectiveIdUUID!requiredplateKeyString!required: Storage key of an already-uploaded plate: a photograph of the empty set with the person replaced by a flat grey silhouette. It pins where the model stands and how large they are in the frame.guideKeyString: OPTIONAL. Storage key of a shadow guide for this plate: the SAME photograph with a magenta dashed outline marking the region the model's shadow may occupy. Authored alongside the plate by whoever made it, never derived here. Omit it and the plate is used on its own, which is the ordinary case: a guide is a refinement for a partner who wants the shadow constrained precisely, and measurement found it changes neither the shadow's direction nor its extent. Three-state: send a key to set the guide, null to remove it, or omit it to keep whatever guide is already stored. Omitting it while ALSO changing the plate is refused rather than guessed, because a guide is positioned against its own plate's silhouette and one drawn for a different plate marks the wrong floor.
Example:
mutation AttachPlateToPerspective($perspectiveId: UUID!, $plateKey: String!, $guideKey: String) {
attachPlateToPerspective(perspectiveId: $perspectiveId, plateKey: $plateKey, guideKey: $guideKey) {
id
acceptedViewTypes
aiModel
archivedAt
aspectRatio
backgroundHexColor
}
}
attachWardrobeItemToCampaignImage
Style a campaign look with a wardrobe article. Takes one photograph per article, front where there is one, since this arc has no view types. At most 3 per look.
Returns: CampaignImage!
Arguments:
Example:
mutation AttachWardrobeItemToCampaignImage($campaignImageId: UUID!, $wardrobeItemId: UUID!) {
attachWardrobeItemToCampaignImage(campaignImageId: $campaignImageId, wardrobeItemId: $wardrobeItemId) {
id
aspectRatio
createdAt
errorMessage
guidanceImageKey
guidanceImageUrl
}
}
attachWardrobeItemToProductStudio
Style a product studio look with a wardrobe article. At most 3 per look.
Returns: ProductStudio!
Arguments:
Example:
mutation AttachWardrobeItemToProductStudio($productStudioId: UUID!, $wardrobeItemId: UUID!) {
attachWardrobeItemToProductStudio(productStudioId: $productStudioId, wardrobeItemId: $wardrobeItemId) {
id
createdAt
isGenerated
status
teamDomain
title
}
}
clearCampaignImageFashionModel
Clear fashion model from a campaign image
Returns: CampaignImage!
Arguments:
campaignImageIdUUID!required
Example:
mutation ClearCampaignImageFashionModel($campaignImageId: UUID!) {
clearCampaignImageFashionModel(campaignImageId: $campaignImageId) {
id
aspectRatio
createdAt
errorMessage
guidanceImageKey
guidanceImageUrl
}
}
clearCampaignImageGuidance
Remove the guidance reference image from a campaign image
Returns: CampaignImage!
Arguments:
campaignImageIdUUID!required
Example:
mutation ClearCampaignImageGuidance($campaignImageId: UUID!) {
clearCampaignImageGuidance(campaignImageId: $campaignImageId) {
id
aspectRatio
createdAt
errorMessage
guidanceImageKey
guidanceImageUrl
}
}
clearCampaignImageShootingLocation
Clear shooting location revision from a campaign image
Returns: CampaignImage!
Arguments:
campaignImageIdUUID!required
Example:
mutation ClearCampaignImageShootingLocation($campaignImageId: UUID!) {
clearCampaignImageShootingLocation(campaignImageId: $campaignImageId) {
id
aspectRatio
createdAt
errorMessage
guidanceImageKey
guidanceImageUrl
}
}
copyDesignerInstanceResource
Clone a DesignerInstanceResource onto a target DI. Shares the underlying image_key; label and description are copied verbatim and the rows are independent thereafter. Powers the cross-DI resource browse pull-in.
Returns: DesignerInstanceResource!
Arguments:
Example:
mutation CopyDesignerInstanceResource($sourceResourceId: UUID!, $targetDesignerInstanceId: UUID!) {
copyDesignerInstanceResource(sourceResourceId: $sourceResourceId, targetDesignerInstanceId: $targetDesignerInstanceId) {
id
createdAt
description
designerInstanceId
imageKey
label
}
}
createBatch
Create a new batch
Returns: Batch!
Arguments:
instructionsStringshootTypeShootType
Example:
mutation CreateBatch($instructions: String, $shootType: ShootType) {
createBatch(instructions: $instructions, shootType: $shootType) {
id
campaignImageCount
createdAt
instructions
isGenerated
mediaGenerationTaskIds
}
}
createBillingPortalSession
Create a Stripe Customer Portal session for invoice and billing management.
Returns: CreateBillingPortalSessionResponse!
Arguments:
returnUrlString!required
Example:
mutation CreateBillingPortalSession($returnUrl: String!) {
createBillingPortalSession(returnUrl: $returnUrl) {
url
}
}
createBrandMemory
Returns: BrandMemory!
Arguments:
brandNameString!requiredbrandIdentityString!requiredfashionModelInstructionsStringphotoStyleInstructionsStringtargetGroupInstructionsStringcopywritingInstructionsString
Example:
mutation CreateBrandMemory($brandName: String!, $brandIdentity: String!, $fashionModelInstructions: String, $photoStyleInstructions: String, $targetGroupInstructions: String, $copywritingInstructions: String) {
createBrandMemory(brandName: $brandName, brandIdentity: $brandIdentity, fashionModelInstructions: $fashionModelInstructions, photoStyleInstructions: $photoStyleInstructions, targetGroupInstructions: $targetGroupInstructions, copywritingInstructions: $copywritingInstructions) {
id
brandIdentity
brandName
copywritingInstructions
createdAt
fashionModelInstructions
}
}
createCampaign
Create a new campaign
Returns: Campaign!
Arguments:
nameString!requiredshootingLocationRevisionIdUUID
Example:
mutation CreateCampaign($name: String!, $shootingLocationRevisionId: UUID) {
createCampaign(name: $name, shootingLocationRevisionId: $shootingLocationRevisionId) {
id
createdAt
name
teamDomain
updatedAt
}
}
createCampaignImage
Create a new campaign image, optionally assigned to a campaign
Returns: CampaignImage!
Arguments:
titleString!requiredpromptStringcampaignIdUUIDaspectRatioAspectRatio
Example:
mutation CreateCampaignImage($title: String!, $prompt: String, $campaignId: UUID, $aspectRatio: AspectRatio) {
createCampaignImage(title: $title, prompt: $prompt, campaignId: $campaignId, aspectRatio: $aspectRatio) {
id
aspectRatio
createdAt
errorMessage
guidanceImageKey
guidanceImageUrl
}
}
createCampaignImageResource
Create a resource with pre-analyzed content
Returns: CampaignImageResource!
Arguments:
campaignImageIdUUID!requirednameString!requiredcontentString!requiredpurposeString!required
Example:
mutation CreateCampaignImageResource($campaignImageId: UUID!, $name: String!, $content: String!, $purpose: String!) {
createCampaignImageResource(campaignImageId: $campaignImageId, name: $name, content: $content, purpose: $purpose) {
id
campaignImageId
content
createdAt
name
purpose
}
}
createDesignerCollection
Create a new DesignerCollection (named parent that groups Designer Instances and Pattern Revisions).
Returns: DesignerCollection!
Arguments:
titleString!requiredseasonStringbriefString
Example:
mutation CreateDesignerCollection($title: String!, $season: String, $brief: String) {
createDesignerCollection(title: $title, season: $season, brief: $brief) {
id
brief
createdAt
season
status
teamDomain
}
}
createDesignerFabric
Designer v4 fabric layer: materialise a frozen fabric swatch from a connected PatternRevision (tiled via Ideogram, tiling mode driven by the Pattern's repeat flags) and set it as the instance's active fabric when the tiling completes. Pass baseFabricId to iterate from an existing fabric. reinterpretation (0 to 1, default 0.3) is how far the tiling model may travel from the source print: low reproduces the designer's print, high lets the model reinterpret it; out-of-range is rejected. Fabric materialisation is backend-owned; the agent routes but does not compose the tiling prompt.
Returns: DesignerFabric!
Arguments:
designerInstanceIdUUID!requiredsourcePatternRevisionIdUUID!requiredbaseFabricIdUUIDreinterpretationFloat
Example:
mutation CreateDesignerFabric($designerInstanceId: UUID!, $sourcePatternRevisionId: UUID!, $baseFabricId: UUID, $reinterpretation: Float) {
createDesignerFabric(designerInstanceId: $designerInstanceId, sourcePatternRevisionId: $sourcePatternRevisionId, baseFabricId: $baseFabricId, reinterpretation: $reinterpretation) {
id
baseFabricId
createdAt
designerInstanceId
errorMessage
generationModel
}
}
createDesignerInstance
Create a new Designer Instance
Returns: DesignerInstance!
Arguments:
titleString!required
Example:
mutation CreateDesignerInstance($title: String!) {
createDesignerInstance(title: $title) {
id
activeFabricId
archivedAt
createdAt
description
fashionModelRevisionId
}
}
createDesignerSizeChart
Create the design's size chart by copying every row of the source chart. Replaces the design's existing chart.
Returns: SizeChart!
Arguments:
designerInstanceIdUUID!requiredsourceSizeChartIdUUID!required: Any chart in the team's library: a matcher candidate, another chart the designer picked, or a previous design's chart.matchRunIdUUID: The run this pick resolves, if it came from the matcher. Pass it even when the pick is outside the shortlist.
Example:
mutation CreateDesignerSizeChart($designerInstanceId: UUID!, $sourceSizeChartId: UUID!, $matchRunId: UUID) {
createDesignerSizeChart(designerInstanceId: $designerInstanceId, sourceSizeChartId: $sourceSizeChartId, matchRunId: $matchRunId) {
id
baseSize
code
createdAt
department
derivedFromChartId
}
}
createFashionModelCasting
Create a new fashion model casting session
Returns: FashionModelCasting!
Arguments:
genderFashionModelGender!requiredpromptString!required
Example:
mutation CreateFashionModelCasting($gender: FashionModelGender!, $prompt: String!) {
createFashionModelCasting(gender: $gender, prompt: $prompt) {
id
createdAt
gender
prompt
teamDomain
updatedAt
}
}
createFashionModelFromCastingResult
Create a fashion model from a selected casting result
Returns: FashionModel!
Arguments:
castingResultIdUUID!requiredmodelNameString!requiredgenderFashionModelGender!required
Example:
mutation CreateFashionModelFromCastingResult($castingResultId: UUID!, $modelName: String!, $gender: FashionModelGender!) {
createFashionModelFromCastingResult(castingResultId: $castingResultId, modelName: $modelName, gender: $gender) {
id
createdAt
gender
name
status
teamDomain
}
}
createGroupShot
Create a new group shot within a campaign
Returns: GroupShot!
Arguments:
campaignIdUUID!requiredshootingLocationRevisionIdUUIDpromptStringaspectRatioAspectRatio
Example:
mutation CreateGroupShot($campaignId: UUID!, $shootingLocationRevisionId: UUID, $prompt: String, $aspectRatio: AspectRatio) {
createGroupShot(campaignId: $campaignId, shootingLocationRevisionId: $shootingLocationRevisionId, prompt: $prompt, aspectRatio: $aspectRatio) {
id
aspectRatio
campaignId
createdAt
errorMessage
prompt
}
}
createMediaPlan
An empty plan: no images and no ads. Add images with addMediaPlanSources, then ads on the board or through amendMediaPlan. Languages start from the team's default when omitted. Spends nothing.
Returns: MediaPlan!
Arguments:
nameStringinstructionsStringlocales[String!]
Example:
mutation CreateMediaPlan($name: String, $instructions: String, $locales: [String!]) {
createMediaPlan(name: $name, instructions: $instructions, locales: $locales) {
id
copyGeneratingSince
copyGenerationError
createdAt
headlineTreatmentId
instructions
}
}
createOnboardingSampleData
Create initial sample data for onboarding (idempotent)
Returns: OnboardingSampleDataResult!
Example:
mutation CreateOnboardingSampleData {
createOnboardingSampleData {
created
}
}
createPattern
Create a new Pattern (shop-level, scoped to the current team).
Returns: Pattern!
Arguments:
nameString!requiredrepeatHorizontalBooleanrepeatVerticalBoolean
Example:
mutation CreatePattern($name: String!, $repeatHorizontal: Boolean, $repeatVertical: Boolean) {
createPattern(name: $name, repeatHorizontal: $repeatHorizontal, repeatVertical: $repeatVertical) {
id
createdAt
name
repeatHorizontal
repeatVertical
status
}
}
createProductStudio
Create a new ProductStudio session
Returns: ProductStudio!
Example:
mutation CreateProductStudio {
createProductStudio {
id
createdAt
isGenerated
status
teamDomain
title
}
}
createProductStudioPerspective
Create a new product studio perspective
Returns: ProductStudioPerspective!
Arguments:
nameString!requiredpromptString!requiredqaPromptString: Whether this perspective is quality-checked, and what extra it is checked for. Null means it is not scored at all; an empty string means scored on the standard rubric with nothing added; text means scored on the standard rubric plus that text. Not a render instruction.acceptedViewTypes[ViewType!]aspectRatioAspectRatiotargetRatioWInt: Optional free-form target ratio width (e.g. 7 in 7:9). Must be sent together with targetRatioH. When set, renders generate at the closest native ratio and are cropped down to this exact ratio; it takes precedence over aspectRatio. Pass null (both) for no crop.targetRatioHInt: Optional free-form target ratio height (e.g. 9 in 7:9). Must be sent together with targetRatioW.backgroundHexColorString: Optional 6-character hex color for the studio backdrop (e.g. 'ff0077'). Pass null to clear.specCropString: How outputs are cropped, as the JSON crop object: placement (anchored | fitted | frame), anchors or margin, aspect and sizing. Null means outputs are not cropped. Marketplace slots ignore this and use their own. Sent as JSON rather than a typed input so the one shape the container reads is not redefined a third time here.isProductOnlyBoolean: When true, generates product-only pack shots without a fashion model.useHeroOnlyBoolean: When true, generation uses only inputs marked as hero. Use for fabric samples and similar focused shots.aiModelAiModel: Which AI model renders this perspective. Defaults to GEMINI_3_PRO if omitted.shootingLocationRevisionIdUUID: Optional scene (shooting location revision id) to render into. When set it overrides backgroundHexColor as the backdrop. Pass null for a plain studio backdrop.exportCodeString: Token representing this perspective in delivered filenames ("001", "FRONT"). Free-form and never interpreted. Renders of a perspective with no code get no computed filename.
Example:
mutation CreateProductStudioPerspective($name: String!, $prompt: String!, $qaPrompt: String, $acceptedViewTypes: [ViewType!], $aspectRatio: AspectRatio, $targetRatioW: Int, $targetRatioH: Int, $backgroundHexColor: String, $specCrop: String, $isProductOnly: Boolean, $useHeroOnly: Boolean, $aiModel: AiModel, $shootingLocationRevisionId: UUID, $exportCode: String) {
createProductStudioPerspective(name: $name, prompt: $prompt, qaPrompt: $qaPrompt, acceptedViewTypes: $acceptedViewTypes, aspectRatio: $aspectRatio, targetRatioW: $targetRatioW, targetRatioH: $targetRatioH, backgroundHexColor: $backgroundHexColor, specCrop: $specCrop, isProductOnly: $isProductOnly, useHeroOnly: $useHeroOnly, aiModel: $aiModel, shootingLocationRevisionId: $shootingLocationRevisionId, exportCode: $exportCode) {
id
acceptedViewTypes
aiModel
archivedAt
aspectRatio
backgroundHexColor
}
}
createProductStudioPerspectiveGroup
Create a perspective rail tab for the current team
Returns: ProductStudioPerspectiveGroup!
Arguments:
nameString!required: Display name of the tab. Not required to be unique: the rail creates the group on drop and only then opens the name field.purposeString: OPTIONAL. What this group is for, in your own words ("the perspectives we ship to our own webshop"). The agent reads it to match a phrase like "add my ecommerce options" to this group. It never reaches a render prompt.
Example:
mutation CreateProductStudioPerspectiveGroup($name: String!, $purpose: String) {
createProductStudioPerspectiveGroup(name: $name, purpose: $purpose) {
id
createdAt
name
purpose
sortOrder
teamDomain
}
}
createProductStudioSetting
Returns: ProductStudioSetting!
Arguments:
instructionsStringscanInstructionsString
Example:
mutation CreateProductStudioSetting($instructions: String, $scanInstructions: String) {
createProductStudioSetting(instructions: $instructions, scanInstructions: $scanInstructions) {
id
createdAt
instructions
scanInstructions
teamDomain
updatedAt
}
}
createProductStudioStylingResource
Create styling instructions for a ProductStudio session and perspective
Returns: ProductStudioStylingResource!
Arguments:
productStudioIdUUID!requiredproductStudioPerspectiveIdUUID!requiredstylingInstructionsString!required
Example:
mutation CreateProductStudioStylingResource($productStudioId: UUID!, $productStudioPerspectiveId: UUID!, $stylingInstructions: String!) {
createProductStudioStylingResource(productStudioId: $productStudioId, productStudioPerspectiveId: $productStudioPerspectiveId, stylingInstructions: $stylingInstructions) {
id
createdAt
productStudioId
productStudioPerspectiveId
stylingInstructions
}
}
createProductVideo
Returns: ProductVideo!
Arguments:
productIdStringproductTitleStringproductImageStringproductImageIdStringvideoUrlStringstatusContentGenerationStatus!requiredpromptString
Example:
mutation CreateProductVideo($productId: String, $productTitle: String, $productImage: String, $productImageId: String, $videoUrl: String, $status: ContentGenerationStatus!, $prompt: String) {
createProductVideo(productId: $productId, productTitle: $productTitle, productImage: $productImage, productImageId: $productImageId, videoUrl: $videoUrl, status: $status, prompt: $prompt) {
id
createdAt
durationSeconds
modelType
productId
productImage
}
}
createShootingLocation
Create a new shootingLocation
Returns: ShootingLocation!
Arguments:
titleString!required
Example:
mutation CreateShootingLocation($title: String!) {
createShootingLocation(title: $title) {
id
createdAt
teamDomain
thumbnailUrl
title
updatedAt
}
}
createShopifyTopUpCharge
Create a Shopify one-time charge to top up the team's credit balance.
Returns: CreateShopifyTopUpChargeResponse!
Arguments:
amountCentsInt!requiredreturnUrlString!required
Example:
mutation CreateShopifyTopUpCharge($amountCents: Int!, $returnUrl: String!) {
createShopifyTopUpCharge(amountCents: $amountCents, returnUrl: $returnUrl) {
confirmationUrl
purchaseId
}
}
createSkill
Create a new skill for the current team
Returns: Skill!
Arguments:
titleString!requiredbodyString!required
Example:
mutation CreateSkill($title: String!, $body: String!) {
createSkill(title: $title, body: $body) {
id
body
createdAt
teamDomain
title
updatedAt
}
}
createTopUpCheckoutSession
Create a Stripe Checkout session to top up the team's credit balance with VAT-compliant invoicing.
Returns: CreateTopUpCheckoutSessionResponse!
Arguments:
amountCentsInt!requiredreturnUrlString!required
Example:
mutation CreateTopUpCheckoutSession($amountCents: Int!, $returnUrl: String!) {
createTopUpCheckoutSession(amountCents: $amountCents, returnUrl: $returnUrl) {
sessionId
url
}
}
createTopUpIntent
[Deprecated] Create a raw Stripe PaymentIntent. Use createTopUpCheckoutSession instead.
Returns: CreateTopUpIntentResponse!
Arguments:
amountCentsInt!required
Example:
mutation CreateTopUpIntent($amountCents: Int!) {
createTopUpIntent(amountCents: $amountCents) {
clientSecret
paymentIntentId
}
}
createWardrobeItem
Create a wardrobe article. The title is free text, duplicates and all: the planner references an article by id, so nothing depends on it being unique.
Returns: WardrobeItem!
Arguments:
titleString!requiredcategoryWardrobeCategory!requiredusageNoteString: What the piece is for and when not to use it. Read by the planner.styleReferenceString: The team's own style name or number. Display and search only; never links the article into product grouping or export.
Example:
mutation CreateWardrobeItem($title: String!, $category: WardrobeCategory!, $usageNote: String, $styleReference: String) {
createWardrobeItem(title: $title, category: $category, usageNote: $usageNote, styleReference: $styleReference) {
id
archivedAt
category
createdAt
styleReference
teamDomain
}
}
createWorkflow
Create a workflow definition (name + Markdown instructions)
Returns: Workflow!
Arguments:
nameString!requiredinstructionsString!required
Example:
mutation CreateWorkflow($name: String!, $instructions: String!) {
createWorkflow(name: $name, instructions: $instructions) {
id
createdAt
instructions
name
teamDomain
updatedAt
}
}
deleteBatch
Delete a batch and all its children
Returns: Boolean!
Arguments:
idUUID!required
Example:
mutation DeleteBatch($id: UUID!) {
deleteBatch(id: $id)
}
deleteBatchInputImage
Delete an uploaded input image from a batch (also removes from R2)
Returns: Boolean!
Arguments:
idUUID!required
Example:
mutation DeleteBatchInputImage($id: UUID!) {
deleteBatchInputImage(id: $id)
}
deleteCampaign
Delete a campaign and all its children
Returns: Campaign!
Arguments:
idUUID!required
Example:
mutation DeleteCampaign($id: UUID!) {
deleteCampaign(id: $id) {
id
createdAt
name
teamDomain
updatedAt
}
}
deleteCampaignImage
Delete a campaign image
Returns: CampaignImage!
Arguments:
idUUID!required
Example:
mutation DeleteCampaignImage($id: UUID!) {
deleteCampaignImage(id: $id) {
id
aspectRatio
createdAt
errorMessage
guidanceImageKey
guidanceImageUrl
}
}
deleteDesignerCollection
Delete a DesignerCollection. Does not cascade-delete its DIs or PatternRevisions; pivot rows go away, members survive.
Returns: DesignerCollection!
Arguments:
idUUID!required
Example:
mutation DeleteDesignerCollection($id: UUID!) {
deleteDesignerCollection(id: $id) {
id
brief
createdAt
season
status
teamDomain
}
}
deleteDesignerInstance
Delete a Designer Instance and all its resources and revisions. Not offered in the frontend: a design's revisions record work that was generated and charged for, so archiveDesignerInstance is the affordance. Kept for support and cleanup.
Returns: Boolean!
Arguments:
idUUID!required
Example:
mutation DeleteDesignerInstance($id: UUID!) {
deleteDesignerInstance(id: $id)
}
deleteDesignerInstanceResource
Delete an inspiration resource (upload happens via REST POST /api/designer-instances/resources)
Returns: Boolean!
Arguments:
idUUID!required
Example:
mutation DeleteDesignerInstanceResource($id: UUID!) {
deleteDesignerInstanceResource(id: $id)
}
deleteDesignerRevision
Delete a Designer Instance Revision
Returns: Boolean!
Arguments:
revisionIdUUID!required
Example:
mutation DeleteDesignerRevision($revisionId: UUID!) {
deleteDesignerRevision(revisionId: $revisionId)
}
deleteFashionModel
Delete a fashion model
Returns: Boolean!
Arguments:
idUUID!required
Example:
mutation DeleteFashionModel($id: UUID!) {
deleteFashionModel(id: $id)
}
deleteFashionModelRevision
Delete a fashion model revision
Returns: Boolean!
Arguments:
revisionIdUUID!required
Example:
mutation DeleteFashionModelRevision($revisionId: UUID!) {
deleteFashionModelRevision(revisionId: $revisionId)
}
deleteGroupShot
Delete a group shot
Returns: GroupShot!
Arguments:
idUUID!required
Example:
mutation DeleteGroupShot($id: UUID!) {
deleteGroupShot(id: $id) {
id
aspectRatio
campaignId
createdAt
errorMessage
prompt
}
}
deletePattern
Delete a Pattern and all its revisions.
Returns: Boolean!
Arguments:
idUUID!required
Example:
mutation DeletePattern($id: UUID!) {
deletePattern(id: $id)
}
deletePatternInputReference
Delete a pattern-level input reference. Does not affect revisions that already froze it into their snapshot.
Returns: Boolean!
Arguments:
idUUID!required
Example:
mutation DeletePatternInputReference($id: UUID!) {
deletePatternInputReference(id: $id)
}
deletePatternRevision
Delete a PatternRevision.
Returns: Boolean!
Arguments:
revisionIdUUID!required
Example:
mutation DeletePatternRevision($revisionId: UUID!) {
deletePatternRevision(revisionId: $revisionId)
}
deleteProductStudio
Delete a ProductStudio session
Returns: ProductStudio!
Arguments:
idUUID!required
Example:
mutation DeleteProductStudio($id: UUID!) {
deleteProductStudio(id: $id) {
id
createdAt
isGenerated
status
teamDomain
title
}
}
deleteProductStudioPerspective
Delete a product studio perspective
Returns: ProductStudioPerspective!
Arguments:
idUUID!required
Example:
mutation DeleteProductStudioPerspective($id: UUID!) {
deleteProductStudioPerspective(id: $id) {
id
acceptedViewTypes
aiModel
archivedAt
aspectRatio
backgroundHexColor
}
}
deleteProductStudioPerspectiveGroup
Delete a perspective rail tab. Its members return to the ungrouped rail; no perspective is deleted. There is no archive counterpart, because an archived tab would leave its members pointing at something the rail no longer shows.
Returns: Boolean!
Arguments:
idUUID!required
Example:
mutation DeleteProductStudioPerspectiveGroup($id: UUID!) {
deleteProductStudioPerspectiveGroup(id: $id)
}
deleteProductVideo
Returns: Boolean!
Arguments:
idUUID!required
Example:
mutation DeleteProductVideo($id: UUID!) {
deleteProductVideo(id: $id)
}
deleteShootingLocation
Delete a shootingLocation
Returns: Boolean!
Arguments:
idUUID!required
Example:
mutation DeleteShootingLocation($id: UUID!) {
deleteShootingLocation(id: $id)
}
deleteShootingLocationRevision
Delete a shooting location revision
Returns: Boolean!
Arguments:
revisionIdUUID!required
Example:
mutation DeleteShootingLocationRevision($revisionId: UUID!) {
deleteShootingLocationRevision(revisionId: $revisionId)
}
deleteSizeChart
Delete a size chart. Design charts derived from it keep their copied rows.
Returns: Boolean!
Arguments:
idUUID!required
Example:
mutation DeleteSizeChart($id: UUID!) {
deleteSizeChart(id: $id)
}
deleteSkill
Delete a skill
Returns: Boolean!
Arguments:
idUUID!required
Example:
mutation DeleteSkill($id: UUID!) {
deleteSkill(id: $id)
}
deleteWardrobeItem
Delete a wardrobe article and its photographs outright
Returns: Boolean!
Arguments:
idUUID!required
Example:
mutation DeleteWardrobeItem($id: UUID!) {
deleteWardrobeItem(id: $id)
}
deleteWardrobeItemImage
Delete one photograph of a wardrobe article
Returns: Boolean!
Arguments:
idUUID!required
Example:
mutation DeleteWardrobeItemImage($id: UUID!) {
deleteWardrobeItemImage(id: $id)
}
detachPlateFromPerspective
Clear a perspective's plate and guide together. The stored files are kept: a queued render already resolved these keys.
Returns: ProductStudioPerspective!
Arguments:
perspectiveIdUUID!required
Example:
mutation DetachPlateFromPerspective($perspectiveId: UUID!) {
detachPlateFromPerspective(perspectiveId: $perspectiveId) {
id
acceptedViewTypes
aiModel
archivedAt
aspectRatio
backgroundHexColor
}
}
detachWardrobeItemFromCampaignImage
Stop styling a campaign look with a wardrobe article
Returns: CampaignImage!
Arguments:
Example:
mutation DetachWardrobeItemFromCampaignImage($campaignImageId: UUID!, $wardrobeItemId: UUID!) {
detachWardrobeItemFromCampaignImage(campaignImageId: $campaignImageId, wardrobeItemId: $wardrobeItemId) {
id
aspectRatio
createdAt
errorMessage
guidanceImageKey
guidanceImageUrl
}
}
detachWardrobeItemFromProductStudio
Stop styling a product studio look with a wardrobe article
Returns: ProductStudio!
Arguments:
Example:
mutation DetachWardrobeItemFromProductStudio($productStudioId: UUID!, $wardrobeItemId: UUID!) {
detachWardrobeItemFromProductStudio(productStudioId: $productStudioId, wardrobeItemId: $wardrobeItemId) {
id
createdAt
isGenerated
status
teamDomain
title
}
}
executeBatch
Execute a batch — triggers generation on draft ProductStudios and CampaignImages. Optional itemIds runs a subset only.
Returns: Batch!
Arguments:
Example:
mutation ExecuteBatch($id: UUID!, $preview: Boolean, $itemIds: [UUID!]) {
executeBatch(id: $id, preview: $preview, itemIds: $itemIds) {
id
campaignImageCount
createdAt
instructions
isGenerated
mediaGenerationTaskIds
}
}
exportMediaPlan
Render cards as finished images, one per card per language, with their image copy and logos. Runs in the background: poll the plan's renders. Cards and languages default to all of the plan's. An image still rendering from an earlier export is skipped; an unchanged image reuses its file.
Returns: ExportMediaPlanResult!
Arguments:
Example:
mutation ExportMediaPlan($planId: UUID!, $cardIds: [UUID!], $locales: [String!]) {
exportMediaPlan(planId: $planId, cardIds: $cardIds, locales: $locales) {
alreadyRendering
failed
queued
}
}
generateBrandMemory
Returns: BrandMemory!
Arguments:
storeNameString!required
Example:
mutation GenerateBrandMemory($storeName: String!) {
generateBrandMemory(storeName: $storeName) {
id
brandIdentity
brandName
copywritingInstructions
createdAt
fashionModelInstructions
}
}
generateCampaignImages
Generate images for a campaign image with optional feedback
Returns: CampaignImage!
Arguments:
campaignImageIdUUID!requiredfeedbackStringpreviewBoolean
Example:
mutation GenerateCampaignImages($campaignImageId: UUID!, $feedback: String, $preview: Boolean) {
generateCampaignImages(campaignImageId: $campaignImageId, feedback: $feedback, preview: $preview) {
id
aspectRatio
createdAt
errorMessage
guidanceImageKey
guidanceImageUrl
}
}
generateDesignerRevision
Generate a new Designer Instance Revision (plan-then-compose, designer.md 5.0). Pass a changeSet (what the user wants to change, relative to baseRevisionId) and prompts (the composer's authored SHAPE/RENDER prompts). The backend re-derives the plan authoritatively from the changeSet — which slots regenerate, whether the person base rebuilds (derived: the outfit differs from the base's frozen value, or the base has no frozen setup) — and validates that prompts covers exactly the plan's needFromComposer: a missing or extra slot 400s (person and flat slots are backend-composed and must NOT appear in prompts). The effective setup (base's frozen setup overlaid with the changeSet) is frozen onto the new revision. Use planDesignerChange first to learn which prompts to author. Preconditions: the effective description must be non-empty; a rebuild needs the instance's fashion model to have a portrait (else 400); baseRevisionId must belong to designerInstanceId; a garment/paint change needs non-empty views. Placed details: the effective detail set is frozen onto the new revision (a details change replaces it, otherwise the base's set carries), and every render prompt for a view that has details must contain each detail's label and marker colour word (see the plan's viewDetails), else 400. rebuildPersonBase is an optional force override (the backend derives it; this can only force it on). Flats are ordered separately via generateDesignerRevisionTechnicalDrawings.
Returns: DesignerInstanceRevision!
Arguments:
recoverySourceRevisionIdUUIDrequestIdUUID!requiredexpectedPlanFingerprintString!requiredprovenanceString!requireddesignerInstanceIdUUID!requiredbaseRevisionIdUUIDchangeSetDesignerChangeSet!requiredpromptsDesignerComposedPrompts!requireduserRequestString!requiredintentTagStringrebuildPersonBaseBoolean
Example:
mutation GenerateDesignerRevision($recoverySourceRevisionId: UUID, $requestId: UUID!, $expectedPlanFingerprint: String!, $provenance: String!, $designerInstanceId: UUID!, $baseRevisionId: UUID, $changeSet: DesignerChangeSet!, $prompts: DesignerComposedPrompts!, $userRequest: String!, $intentTag: String, $rebuildPersonBase: Boolean) {
generateDesignerRevision(recoverySourceRevisionId: $recoverySourceRevisionId, requestId: $requestId, expectedPlanFingerprint: $expectedPlanFingerprint, provenance: $provenance, designerInstanceId: $designerInstanceId, baseRevisionId: $baseRevisionId, changeSet: $changeSet, prompts: $prompts, userRequest: $userRequest, intentTag: $intentTag, rebuildPersonBase: $rebuildPersonBase) {
id
annotationOverlayKey
annotationOverlaySourceSlot
annotationOverlayUrl
backFlatKey
backFlatUrl
}
}
generateDesignerRevisionTechnicalDrawings
Generate the front-flat and back-flat technical drawings for an existing revision once the design is settled. Requires both photo slots to be present. Charges separately from the initial revision (v3 Cluster A).
Returns: DesignerInstanceRevision!
Arguments:
revisionIdUUID!required
Example:
mutation GenerateDesignerRevisionTechnicalDrawings($revisionId: UUID!) {
generateDesignerRevisionTechnicalDrawings(revisionId: $revisionId) {
id
annotationOverlayKey
annotationOverlaySourceSlot
annotationOverlayUrl
backFlatKey
backFlatUrl
}
}
generateFashionModelCastingImages
Trigger async image generation for a fashion model casting
Returns: FashionModelCasting!
Arguments:
castingIdUUID!requireduseBrandIdentityBooleanoptimizedPromptString
Example:
mutation GenerateFashionModelCastingImages($castingId: UUID!, $useBrandIdentity: Boolean, $optimizedPrompt: String) {
generateFashionModelCastingImages(castingId: $castingId, useBrandIdentity: $useBrandIdentity, optimizedPrompt: $optimizedPrompt) {
id
createdAt
gender
prompt
teamDomain
updatedAt
}
}
generateFashionModelResources
Auto-generate resources by analyzing portrait, creates a new revision
Returns: FashionModelRevision!
Arguments:
fashionModelIdUUID!required
Example:
mutation GenerateFashionModelResources($fashionModelId: UUID!) {
generateFashionModelResources(fashionModelId: $fashionModelId) {
id
createdAt
fashionModelId
favorite
fullPortraitKey
generationModel
}
}
generateFashionModelRevision
Generate a new revision from an existing one. Takes sourceRevisionId (not fashionModelId) because the user iterates from a specific revision whose portrait is used as the reference image. prompt is the caller-authored edit instruction and reaches the image model verbatim: the backend adds no framing, lighting or identity text of its own, and never renders resources into it. resources is a three-state patch over the source revision: omit a field to keep it, send null to clear it.
Returns: FashionModelRevision!
Arguments:
sourceRevisionIdUUID!requiredpromptString!requireduserInputString!requiredresourcesFashionModelResourceInput!required
Example:
mutation GenerateFashionModelRevision($sourceRevisionId: UUID!, $prompt: String!, $userInput: String!, $resources: FashionModelResourceInput!) {
generateFashionModelRevision(sourceRevisionId: $sourceRevisionId, prompt: $prompt, userInput: $userInput, resources: $resources) {
id
createdAt
fashionModelId
favorite
fullPortraitKey
generationModel
}
}
generateGroupShot
Trigger group shot generation pipeline (Phase 1 renders + Phase 2 composite)
Returns: GroupShot!
Arguments:
groupShotIdUUID!required
Example:
mutation GenerateGroupShot($groupShotId: UUID!) {
generateGroupShot(groupShotId: $groupShotId) {
id
aspectRatio
campaignId
createdAt
errorMessage
prompt
}
}
generateImages
Generate a new shooting location revision. Takes shootingLocationId because the first revision is created by this mutation (text-to-image, no prior revision needed as reference).
Returns: ShootingLocationRevision!
Arguments:
shootingLocationIdUUID!requiredresourcesShootingLocationResourceInput!requireduserInputString
Example:
mutation GenerateImages($shootingLocationId: UUID!, $resources: ShootingLocationResourceInput!, $userInput: String) {
generateImages(shootingLocationId: $shootingLocationId, resources: $resources, userInput: $userInput) {
id
createdAt
favorite
imageKey
label
model
}
}
generateMediaPlanCopy
Generate text on the images, written natively per language from the brief. Runs in the background: poll the plan's copyGeneratingSince. Never overwrites a line a person edited or approved unless regenerate is true. Only IMAGE_ slots so far.
Returns: MediaPlan!
Arguments:
planIdUUID!requiredplacementIds[UUID!]cardIds[UUID!]slots[MediaCopySlot!]locales[String!]regenerateBoolean
Example:
mutation GenerateMediaPlanCopy($planId: UUID!, $placementIds: [UUID!], $cardIds: [UUID!], $slots: [MediaCopySlot!], $locales: [String!], $regenerate: Boolean) {
generateMediaPlanCopy(planId: $planId, placementIds: $placementIds, cardIds: $cardIds, slots: $slots, locales: $locales, regenerate: $regenerate) {
id
copyGeneratingSince
copyGenerationError
createdAt
headlineTreatmentId
instructions
}
}
generatePatternRevision
Generate a new PatternRevision via Fal. Agent composes the prompt; backend does not inspect it.
Returns: PatternRevision!
Arguments:
patternIdUUID!requiredbaseRevisionIdUUIDuserInputStringpromptString!requiredinputs[PatternRevisionInputArg!]!required
Example:
mutation GeneratePatternRevision($patternId: UUID!, $baseRevisionId: UUID, $userInput: String, $prompt: String!, $inputs: [PatternRevisionInputArg!]!) {
generatePatternRevision(patternId: $patternId, baseRevisionId: $baseRevisionId, userInput: $userInput, prompt: $prompt, inputs: $inputs) {
id
baseRevisionId
createdAt
errorMessage
favorite
generationModel
}
}
generateProductVideo
Returns: ProductVideo!
Arguments:
idUUID!requiredpromptStringmodelTypeVideoModelType: Ignored. Every video generates with Kling; the field remains so older clients keep working.durationSecondsInt: Length of the video in seconds, 3 to 15. Omit to reuse the length this video last generated with. Billed per second.
Example:
mutation GenerateProductVideo($id: UUID!, $prompt: String, $modelType: VideoModelType, $durationSeconds: Int) {
generateProductVideo(id: $id, prompt: $prompt, modelType: $modelType, durationSeconds: $durationSeconds) {
id
createdAt
durationSeconds
modelType
productId
productImage
}
}
generateVideoButtons
Generate interactive buttons for a product video using Gemini AI
Returns: ProductVideo!
Arguments:
idUUID!required
Example:
mutation GenerateVideoButtons($id: UUID!) {
generateVideoButtons(id: $id) {
id
createdAt
durationSeconds
modelType
productId
productImage
}
}
hideCampaignImageResult
Hide a campaign image result (soft delete)
Returns: CampaignImageResult!
Arguments:
idUUID!required
Example:
mutation HideCampaignImageResult($id: UUID!) {
hideCampaignImageResult(id: $id) {
id
aspectRatio
campaignImageId
createdAt
downloadableImageUrl
editedImageUrl
}
}
hideGroupShotResult
Hide a group shot result (soft delete)
Returns: GroupShotResult!
Arguments:
idUUID!required
Example:
mutation HideGroupShotResult($id: UUID!) {
hideGroupShotResult(id: $id) {
id
aspectRatio
createdAt
downloadableImageUrl
editedImageKey
exportImageUrl
}
}
hideProductStudioOutput
Hide a product studio output (soft delete)
Returns: ProductStudioOutput!
Arguments:
idUUID!required
Example:
mutation HideProductStudioOutput($id: UUID!) {
hideProductStudioOutput(id: $id) {
id
completionPercentage
correctedImageUrl
createdAt
downloadableImageUrl
editedImageUrl
}
}
matchSizeChart
Shortlist the department's standard specs for this revision's design description. Returns two or three candidates; resolve the run with createDesignerSizeChart (passing matchRunId) or rejectSizeChartMatch.
Returns: SizeChartMatchRun!
Arguments:
designerInstanceRevisionIdUUID!requireddepartmentString!required: Chosen by the designer, never inferred. Only uploaded charts in this department are considered.
Example:
mutation MatchSizeChart($designerInstanceRevisionId: UUID!, $department: String!) {
matchSizeChart(designerInstanceRevisionId: $designerInstanceRevisionId, department: $department) {
id
createdAt
department
designerInstanceId
designerInstanceRevisionId
garmentTypeConfident
}
}
materializeMediaPlan
Build a media plan from finished campaign outputs: owns a copy of each, measures its tone, fans it across the units of the chosen channels (Meta when omitted) into placements and cards, and fires segmentation. Cards return at PENDING and fill in when segmentation lands, so this does not hold the request open for model calls.
Returns: MediaPlan!
Arguments:
campaignImageResultIds[UUID!]!requirednameStringinstructionsStringlocales[String!]channels[MediaChannel!]
Example:
mutation MaterializeMediaPlan($campaignImageResultIds: [UUID!]!, $name: String, $instructions: String, $locales: [String!], $channels: [MediaChannel!]) {
materializeMediaPlan(campaignImageResultIds: $campaignImageResultIds, name: $name, instructions: $instructions, locales: $locales, channels: $channels) {
id
copyGeneratingSince
copyGenerationError
createdAt
headlineTreatmentId
instructions
}
}
materializePlan
Create draft ProductStudios and CampaignImages from grouped plan inputs
Returns: MaterializePlanResult!
Arguments:
batchIdUUID!requiredstudioItems[PlanStudioItemInput!]!requiredcampaignItems[PlanCampaignItemInput!]!requiredcampaignIdUUID
Example:
mutation MaterializePlan($batchId: UUID!, $studioItems: [PlanStudioItemInput!]!, $campaignItems: [PlanCampaignItemInput!]!, $campaignId: UUID) {
materializePlan(batchId: $batchId, studioItems: $studioItems, campaignItems: $campaignItems, campaignId: $campaignId) {
campaignImagesCreated
productStudiosCreated
}
}
moveMediaPlanBrandAsset
Put a logo in a slot on one ad; every card of the ad shares it. A slot another logo holds is swapped. Refused, naming the format, when the slot does not fit one of the ad's cards. Null hands the logo back to the scorer; slot is required, and leaving it out is refused.
Returns: PlannedPlacement!
Arguments:
placementIdUUID!requiredbrandAssetIdUUID!requiredslotBrandAssetSlot
Example:
mutation MoveMediaPlanBrandAsset($placementId: UUID!, $brandAssetId: UUID!, $slot: BrandAssetSlot) {
moveMediaPlanBrandAsset(placementId: $placementId, brandAssetId: $brandAssetId, slot: $slot) {
id
approvedAt
approvedBy
brandAssetsOverridden
headlineTreatmentId
mediaPlacementId
}
}
rejectSizeChartMatch
Record that none of the shortlisted charts fits. Creates no chart.
Returns: SizeChartMatchRun!
Arguments:
matchRunIdUUID!requiredreasonSizeChartNoneFitReason!requirednotesString
Example:
mutation RejectSizeChartMatch($matchRunId: UUID!, $reason: SizeChartNoneFitReason!, $notes: String) {
rejectSizeChartMatch(matchRunId: $matchRunId, reason: $reason, notes: $notes) {
id
createdAt
department
designerInstanceId
designerInstanceRevisionId
garmentTypeConfident
}
}
releaseCampaignImageResult
Release a campaign image result. Quota relevant
Returns: CampaignImageResult!
Arguments:
idUUID!required
Example:
mutation ReleaseCampaignImageResult($id: UUID!) {
releaseCampaignImageResult(id: $id) {
id
aspectRatio
campaignImageId
createdAt
downloadableImageUrl
editedImageUrl
}
}
releaseDesignerRevision
Release a completed designer revision. Quota relevant.
Returns: DesignerInstanceRevision!
Arguments:
idUUID!required
Example:
mutation ReleaseDesignerRevision($id: UUID!) {
releaseDesignerRevision(id: $id) {
id
annotationOverlayKey
annotationOverlaySourceSlot
annotationOverlayUrl
backFlatKey
backFlatUrl
}
}
releaseGroupShotResult
Release a group shot result. Quota relevant
Returns: GroupShotResult!
Arguments:
idUUID!required
Example:
mutation ReleaseGroupShotResult($id: UUID!) {
releaseGroupShotResult(id: $id) {
id
aspectRatio
createdAt
downloadableImageUrl
editedImageKey
exportImageUrl
}
}
releasePatternRevision
Release a completed pattern revision. Quota relevant.
Returns: PatternRevision!
Arguments:
idUUID!required
Example:
mutation ReleasePatternRevision($id: UUID!) {
releasePatternRevision(id: $id) {
id
baseRevisionId
createdAt
errorMessage
favorite
generationModel
}
}
releaseProductStudioOutput
Release a product studio output
Returns: ProductStudioOutput!
Arguments:
idUUID!required
Example:
mutation ReleaseProductStudioOutput($id: UUID!) {
releaseProductStudioOutput(id: $id) {
id
completionPercentage
correctedImageUrl
createdAt
downloadableImageUrl
editedImageUrl
}
}
releaseProductVideo
Release a product video. Quota relevant.
Returns: ProductVideo!
Arguments:
idUUID!required
Example:
mutation ReleaseProductVideo($id: UUID!) {
releaseProductVideo(id: $id) {
id
createdAt
durationSeconds
modelType
productId
productImage
}
}
removeCampaignImageProduct
Remove a product from a campaign image
Returns: CampaignImageProduct!
Arguments:
idUUID!required
Example:
mutation RemoveCampaignImageProduct($id: UUID!) {
removeCampaignImageProduct(id: $id) {
id
campaignImageId
createdAt
isStylingPiece
productDescription
productId
}
}
removeCampaignImageResource
Remove a resource from a campaign image
Returns: CampaignImageResource!
Arguments:
idUUID!required
Example:
mutation RemoveCampaignImageResource($id: UUID!) {
removeCampaignImageResource(id: $id) {
id
campaignImageId
content
createdAt
name
purpose
}
}
removeDesignerInstanceFromDesignerCollection
Detach a DesignerInstance from a DesignerCollection. The DI itself is not deleted.
Returns: DesignerCollection!
Arguments:
Example:
mutation RemoveDesignerInstanceFromDesignerCollection($designerCollectionId: UUID!, $designerInstanceId: UUID!) {
removeDesignerInstanceFromDesignerCollection(designerCollectionId: $designerCollectionId, designerInstanceId: $designerInstanceId) {
id
brief
createdAt
season
status
teamDomain
}
}
removeMediaPlanCard
Drop one card. The placement stays even if this leaves it under its minimum, and says it is short rather than vanishing.
Returns: PlannedPlacement!
Arguments:
cardIdUUID!required
Example:
mutation RemoveMediaPlanCard($cardId: UUID!) {
removeMediaPlanCard(cardId: $cardId) {
id
approvedAt
approvedBy
brandAssetsOverridden
headlineTreatmentId
mediaPlacementId
}
}
removeMediaPlanPlacement
Drop a whole ad unit from the plan. Its cards and copy cascade.
Returns: MediaPlan!
Arguments:
placementIdUUID!required
Example:
mutation RemoveMediaPlanPlacement($placementId: UUID!) {
removeMediaPlanPlacement(placementId: $placementId) {
id
copyGeneratingSince
copyGenerationError
createdAt
headlineTreatmentId
instructions
}
}
removePatternRevisionFromDesignerCollection
Detach a PatternRevision from a DesignerCollection.
Returns: DesignerCollection!
Arguments:
Example:
mutation RemovePatternRevisionFromDesignerCollection($designerCollectionId: UUID!, $patternRevisionId: UUID!) {
removePatternRevisionFromDesignerCollection(designerCollectionId: $designerCollectionId, patternRevisionId: $patternRevisionId) {
id
brief
createdAt
season
status
teamDomain
}
}
removePatternRevisionFromDesignerInstance
Remove a selected PatternRevision from a Designer Instance.
Returns: DesignerInstance!
Arguments:
Example:
mutation RemovePatternRevisionFromDesignerInstance($designerInstanceId: UUID!, $patternRevisionId: UUID!) {
removePatternRevisionFromDesignerInstance(designerInstanceId: $designerInstanceId, patternRevisionId: $patternRevisionId) {
id
activeFabricId
archivedAt
createdAt
description
fashionModelRevisionId
}
}
removeProductStudioInput
Remove an input from a ProductStudio session
Returns: ProductStudioInput!
Arguments:
idUUID!required
Example:
mutation RemoveProductStudioInput($id: UUID!) {
removeProductStudioInput(id: $id) {
id
createdAt
fileName
filenameView
isHero
isStylingPiece
}
}
removeProductStudioStylingResource
Remove styling instructions from a ProductStudio session
Returns: ProductStudioStylingResource!
Arguments:
idUUID!required
Example:
mutation RemoveProductStudioStylingResource($id: UUID!) {
removeProductStudioStylingResource(id: $id) {
id
createdAt
productStudioId
productStudioPerspectiveId
stylingInstructions
}
}
removeSingleShotFromGroupShot
Remove a single shot from a group shot
Returns: GroupShot!
Arguments:
Example:
mutation RemoveSingleShotFromGroupShot($groupShotId: UUID!, $campaignImageId: UUID!) {
removeSingleShotFromGroupShot(groupShotId: $groupShotId, campaignImageId: $campaignImageId) {
id
aspectRatio
campaignId
createdAt
errorMessage
prompt
}
}
removeSkillFromBatch
Remove a skill from a batch
Returns: Batch!
Arguments:
Example:
mutation RemoveSkillFromBatch($batchId: UUID!, $skillId: UUID!) {
removeSkillFromBatch(batchId: $batchId, skillId: $skillId) {
id
campaignImageCount
createdAt
instructions
isGenerated
mediaGenerationTaskIds
}
}
rescoreMediaPlan
Lay out every card of the plan's unapproved ads again from the current catalog and treatments, for example after a format correction. Approved ads are never touched. Cards a person adjusted keep their layout unless discardHandEdits is true.
Returns: MediaPlan!
Arguments:
planIdUUID!requireddiscardHandEditsBoolean
Example:
mutation RescoreMediaPlan($planId: UUID!, $discardHandEdits: Boolean) {
rescoreMediaPlan(planId: $planId, discardHandEdits: $discardHandEdits) {
id
copyGeneratingSince
copyGenerationError
createdAt
headlineTreatmentId
instructions
}
}
restoreCampaignImageResult
Restore a hidden campaign image result
Returns: CampaignImageResult!
Arguments:
idUUID!required
Example:
mutation RestoreCampaignImageResult($id: UUID!) {
restoreCampaignImageResult(id: $id) {
id
aspectRatio
campaignImageId
createdAt
downloadableImageUrl
editedImageUrl
}
}
restoreGroupShotResult
Restore a hidden group shot result
Returns: GroupShotResult!
Arguments:
idUUID!required
Example:
mutation RestoreGroupShotResult($id: UUID!) {
restoreGroupShotResult(id: $id) {
id
aspectRatio
createdAt
downloadableImageUrl
editedImageKey
exportImageUrl
}
}
restoreProductStudioOutput
Restore a hidden product studio output
Returns: ProductStudioOutput!
Arguments:
idUUID!required
Example:
mutation RestoreProductStudioOutput($id: UUID!) {
restoreProductStudioOutput(id: $id) {
id
completionPercentage
correctedImageUrl
createdAt
downloadableImageUrl
editedImageUrl
}
}
restoreProductStudioPerspective
Restore an archived product studio perspective
Returns: ProductStudioPerspective!
Arguments:
idUUID!required
Example:
mutation RestoreProductStudioPerspective($id: UUID!) {
restoreProductStudioPerspective(id: $id) {
id
acceptedViewTypes
aiModel
archivedAt
aspectRatio
backgroundHexColor
}
}
restoreWardrobeItem
Return an archived wardrobe article to use
Returns: WardrobeItem!
Arguments:
idUUID!required
Example:
mutation RestoreWardrobeItem($id: UUID!) {
restoreWardrobeItem(id: $id) {
id
archivedAt
category
createdAt
styleReference
teamDomain
}
}
setCampaignImageFashionModel
Set fashion model for a campaign image
Returns: CampaignImage!
Arguments:
Example:
mutation SetCampaignImageFashionModel($campaignImageId: UUID!, $fashionModelRevisionId: UUID!) {
setCampaignImageFashionModel(campaignImageId: $campaignImageId, fashionModelRevisionId: $fashionModelRevisionId) {
id
aspectRatio
createdAt
errorMessage
guidanceImageKey
guidanceImageUrl
}
}
setCampaignImageGuidance
Point a campaign image at an existing image (a Studio output, a batch pool image) as its guidance reference. The image is copied into the look's own storage, so the source is never affected. Replaces any existing guidance image. To upload a new file instead, POST /api/campaign-images/:campaignImageId/guidance/upload
Returns: CampaignImage!
Arguments:
campaignImageIdUUID!requiredimageKeyString!required
Example:
mutation SetCampaignImageGuidance($campaignImageId: UUID!, $imageKey: String!) {
setCampaignImageGuidance(campaignImageId: $campaignImageId, imageKey: $imageKey) {
id
aspectRatio
createdAt
errorMessage
guidanceImageKey
guidanceImageUrl
}
}
setCampaignImageProducts
Set products for a campaign image with smart merging
Returns: CampaignImage!
Arguments:
campaignImageIdUUID!requiredproducts[CampaignImageProductInput!]!required
Example:
mutation SetCampaignImageProducts($campaignImageId: UUID!, $products: [CampaignImageProductInput!]!) {
setCampaignImageProducts(campaignImageId: $campaignImageId, products: $products) {
id
aspectRatio
createdAt
errorMessage
guidanceImageKey
guidanceImageUrl
}
}
setCampaignImageShootingLocation
Set shooting location revision for a campaign image
Returns: CampaignImage!
Arguments:
Example:
mutation SetCampaignImageShootingLocation($campaignImageId: UUID!, $shootingLocationRevisionId: UUID!) {
setCampaignImageShootingLocation(campaignImageId: $campaignImageId, shootingLocationRevisionId: $shootingLocationRevisionId) {
id
aspectRatio
createdAt
errorMessage
guidanceImageKey
guidanceImageUrl
}
}
setFileNameConvention
Replace this team's filename convention. Validated and written as one unit; a set with problems writes nothing and returns them. Upserts by team, so no settings row is needed first.
Returns: SetFileNameConventionResult!
Arguments:
conventionFileNameConventionInput!required
Example:
mutation SetFileNameConvention($convention: FileNameConventionInput!) {
setFileNameConvention(convention: $convention) {
convention {
exportPattern
isDefault
}
}
}
setHeadlineTreatmentImageCopyLines
Which lines images using this treatment carry: HEADLINE, HEADLINE_SUBHEADLINE or HEADLINE_SUBHEADLINE_CTA (default).
Returns: BrandHeadlineTreatment!
Arguments:
idUUID!requiredimageCopyLinesImageCopyLines!required
Example:
mutation SetHeadlineTreatmentImageCopyLines($id: UUID!, $imageCopyLines: ImageCopyLines!) {
setHeadlineTreatmentImageCopyLines(id: $id, imageCopyLines: $imageCopyLines) {
id
bandPosition
bandSize
copySurface
fillColor
ground
}
}
setMediaPlanBrandAssets
Set the plan's default logo set, in order. Every ad that has not chosen its own set follows it; logos that stay keep their positions.
Returns: MediaPlan!
Arguments:
planIdUUID!requiredassets[MediaPlanBrandAssetInput!]!required
Example:
mutation SetMediaPlanBrandAssets($planId: UUID!, $assets: [MediaPlanBrandAssetInput!]!) {
setMediaPlanBrandAssets(planId: $planId, assets: $assets) {
id
copyGeneratingSince
copyGenerationError
createdAt
headlineTreatmentId
instructions
}
}
setMediaPlanCopy
Set one line in one language as a person wrote it. Empty text removes it. Changing the text clears its approval. Image slots need a card.
Returns: PlannedPlacement!
Arguments:
placementIdUUID!requiredcardIdUUIDslotMediaCopySlot!requiredlocaleString!requiredtextString!required
Example:
mutation SetMediaPlanCopy($placementId: UUID!, $cardId: UUID, $slot: MediaCopySlot!, $locale: String!, $text: String!) {
setMediaPlanCopy(placementId: $placementId, cardId: $cardId, slot: $slot, locale: $locale, text: $text) {
id
approvedAt
approvedBy
brandAssetsOverridden
headlineTreatmentId
mediaPlacementId
}
}
setMediaPlanHeadlineTreatment
Set the headline treatment every placement in the plan uses unless it has its own; null makes the plan plain, and leaving the argument out is refused. Re-lays the affected cards and discards their hand edits, since a band changes the crop. Never refused: cards on a format the band does not fit are flagged BAND_OUTSIDE_SAFE_AREA instead.
Returns: MediaPlan!
Arguments:
Example:
mutation SetMediaPlanHeadlineTreatment($planId: UUID!, $headlineTreatmentId: UUID) {
setMediaPlanHeadlineTreatment(planId: $planId, headlineTreatmentId: $headlineTreatmentId) {
id
copyGeneratingSince
copyGenerationError
createdAt
headlineTreatmentId
instructions
}
}
setMediaPlanLocales
A plan's languages, the first being the main one. Removing a language hides its copy rather than deleting it.
Returns: MediaPlan!
Arguments:
planIdUUID!requiredlocales[String!]!required
Example:
mutation SetMediaPlanLocales($planId: UUID!, $locales: [String!]!) {
setMediaPlanLocales(planId: $planId, locales: $locales) {
id
copyGeneratingSince
copyGenerationError
createdAt
headlineTreatmentId
instructions
}
}
setMediaPlanPlacementBrandAssets
Give one ad its own logo set and sizes. Null inherits the plan's set again; an empty list means no logos on this ad. assets is required: leaving it out is refused.
Returns: PlannedPlacement!
Arguments:
placementIdUUID!requiredassets[MediaPlanBrandAssetInput!]
Example:
mutation SetMediaPlanPlacementBrandAssets($placementId: UUID!, $assets: [MediaPlanBrandAssetInput!]) {
setMediaPlanPlacementBrandAssets(placementId: $placementId, assets: $assets) {
id
approvedAt
approvedBy
brandAssetsOverridden
headlineTreatmentId
mediaPlacementId
}
}
setMediaPlanPlacementHeadlineTreatment
Give one ad its own headline treatment; null inherits the plan's default again, and leaving the argument out is refused. Re-lays its cards and discards their hand edits. Refused, naming the format, when the band cannot hold the headline on one of the ad's formats.
Returns: PlannedPlacement!
Arguments:
Example:
mutation SetMediaPlanPlacementHeadlineTreatment($placementId: UUID!, $headlineTreatmentId: UUID) {
setMediaPlanPlacementHeadlineTreatment(placementId: $placementId, headlineTreatmentId: $headlineTreatmentId) {
id
approvedAt
approvedBy
brandAssetsOverridden
headlineTreatmentId
mediaPlacementId
}
}
setProductStudioPerspectiveGroup
File a perspective under a rail tab, or ungroup it. Allowed on locked marketplace slots: locking protects the render configuration, not where a team files it.
Returns: ProductStudioPerspective!
Arguments:
perspectiveIdUUID!requiredgroupIdUUID: The tab to file this perspective under, or null to return it to the ungrouped rail. A group belonging to another team is refused with a 404.
Example:
mutation SetProductStudioPerspectiveGroup($perspectiveId: UUID!, $groupId: UUID) {
setProductStudioPerspectiveGroup(perspectiveId: $perspectiveId, groupId: $groupId) {
id
acceptedViewTypes
aiModel
archivedAt
aspectRatio
backgroundHexColor
}
}
setProductStudioPerspectiveGroupOrder
Set the order of the perspective rail's tabs in one call.
Returns: [ProductStudioPerspectiveGroup!]!
Arguments:
ids[UUID!]!required: The COMPLETE ordered list of group ids. Same contract as setProductStudioPerspectiveOrder: unlisted groups are reset to unplaced and sort last in creation order.
Example:
mutation SetProductStudioPerspectiveGroupOrder($ids: [UUID!]!) {
setProductStudioPerspectiveGroupOrder(ids: $ids) {
id
createdAt
name
purpose
sortOrder
teamDomain
}
}
setProductStudioPerspectiveOrder
Set the team's perspective rail order in one call. Team-wide: last writer wins for the whole list. Returns the team's unarchived perspectives in the new order, so a client can replace its state from the response. Allowed on locked marketplace slots.
Returns: [ProductStudioPerspective!]!
Arguments:
ids[UUID!]!required: The COMPLETE ordered list of perspective ids. Listed rows are placed 0..n-1; every other perspective on the team is reset to unplaced and sorts last in creation order, so a perspective dropped from the list cannot keep a stale position. Send an empty list to reset the whole rail to creation order. Duplicate ids, or ids belonging to another team, are refused before anything is written.
Example:
mutation SetProductStudioPerspectiveOrder($ids: [UUID!]!) {
setProductStudioPerspectiveOrder(ids: $ids) {
id
acceptedViewTypes
aiModel
archivedAt
aspectRatio
backgroundHexColor
}
}
setSizeChartAdjustments
Set base-size changes on a design chart, all or none. Every other size follows by its grade step. Uploaded charts and increment rows refuse.
Returns: SizeChart!
Arguments:
sizeChartIdUUID!requiredadjustments[SizeChartAdjustmentInput!]!required
Example:
mutation SetSizeChartAdjustments($sizeChartId: UUID!, $adjustments: [SizeChartAdjustmentInput!]!) {
setSizeChartAdjustments(sizeChartId: $sizeChartId, adjustments: $adjustments) {
id
baseSize
code
createdAt
department
derivedFromChartId
}
}
setTeamAdLocales
The languages this team normally writes ads in, as BCP-47 tags. New media plans start from these. Any real language is accepted; malformed tags are refused.
Returns: CurrentTeamResponse!
Arguments:
locales[String!]!required
Example:
mutation SetTeamAdLocales($locales: [String!]!) {
setTeamAdLocales(locales: $locales) {
id
adLocales
isPAYG
teamDomain
}
}
startProductStudioFlow
Start the AI generation flow for a ProductStudio session with optional perspective
Returns: ProductStudio!
Arguments:
Example:
mutation StartProductStudioFlow($id: UUID!, $productStudioPerspectiveId: UUID!, $preview: Boolean) {
startProductStudioFlow(id: $id, productStudioPerspectiveId: $productStudioPerspectiveId, preview: $preview) {
id
createdAt
isGenerated
status
teamDomain
title
}
}
startWorkflowRun
Trigger a workflow run; optionally scoped to a batch (UC1). Pass maxOutputs to run it as a capped "test drive" that runs at most that many generation calls across all steps (a call can emit more than one image; see autonomous-workflows.md). Returns the run after it parks, completes, or halts.
Returns: WorkflowRun!
Arguments:
Example:
mutation StartWorkflowRun($workflowId: UUID!, $batchId: UUID, $maxOutputs: Int) {
startWorkflowRun(workflowId: $workflowId, batchId: $batchId, maxOutputs: $maxOutputs) {
id
awaitingStepId
batchId
completedStepIds
createdAt
lastError
}
}
swapMediaPlanCardSource
Point a card at a different source in the same plan and re-score just that card.
Returns: PlannedAsset!
Arguments:
Example:
mutation SwapMediaPlanCardSource($cardId: UUID!, $mediaPlanSourceId: UUID!) {
swapMediaPlanCardSource(cardId: $cardId, mediaPlanSourceId: $mediaPlanSourceId) {
id
cropH
cropW
cropX
cropY
faceFullyInside
}
}
toggleCampaignImageResultFavorite
Toggle favorite status on a campaign image result
Returns: CampaignImageResult!
Arguments:
idUUID!required
Example:
mutation ToggleCampaignImageResultFavorite($id: UUID!) {
toggleCampaignImageResultFavorite(id: $id) {
id
aspectRatio
campaignImageId
createdAt
downloadableImageUrl
editedImageUrl
}
}
toggleDesignerRevisionFavorite
Toggle favorite on a Designer Instance Revision
Returns: DesignerInstanceRevision!
Arguments:
revisionIdUUID!required
Example:
mutation ToggleDesignerRevisionFavorite($revisionId: UUID!) {
toggleDesignerRevisionFavorite(revisionId: $revisionId) {
id
annotationOverlayKey
annotationOverlaySourceSlot
annotationOverlayUrl
backFlatKey
backFlatUrl
}
}
toggleFashionModelRevisionFavorite
Toggle favorite status on a fashion model revision
Returns: FashionModelRevision!
Arguments:
revisionIdUUID!required
Example:
mutation ToggleFashionModelRevisionFavorite($revisionId: UUID!) {
toggleFashionModelRevisionFavorite(revisionId: $revisionId) {
id
createdAt
fashionModelId
favorite
fullPortraitKey
generationModel
}
}
toggleGroupShotResultFavorite
Toggle favorite status on a group shot result
Returns: GroupShotResult!
Arguments:
idUUID!required
Example:
mutation ToggleGroupShotResultFavorite($id: UUID!) {
toggleGroupShotResultFavorite(id: $id) {
id
aspectRatio
createdAt
downloadableImageUrl
editedImageKey
exportImageUrl
}
}
togglePatternRevisionFavorite
Toggle favorite on a PatternRevision.
Returns: PatternRevision!
Arguments:
revisionIdUUID!required
Example:
mutation TogglePatternRevisionFavorite($revisionId: UUID!) {
togglePatternRevisionFavorite(revisionId: $revisionId) {
id
baseRevisionId
createdAt
errorMessage
favorite
generationModel
}
}
toggleProductStudioOutputFavorite
Toggle favorite status on a product studio output
Returns: ProductStudioOutput!
Arguments:
idUUID!required
Example:
mutation ToggleProductStudioOutputFavorite($id: UUID!) {
toggleProductStudioOutputFavorite(id: $id) {
id
completionPercentage
correctedImageUrl
createdAt
downloadableImageUrl
editedImageUrl
}
}
toggleShootingLocationRevisionFavorite
Toggle favorite status on a shooting location revision
Returns: ShootingLocationRevision!
Arguments:
revisionIdUUID!required
Example:
mutation ToggleShootingLocationRevisionFavorite($revisionId: UUID!) {
toggleShootingLocationRevisionFavorite(revisionId: $revisionId) {
id
createdAt
favorite
imageKey
label
model
}
}
unarchiveDesignerInstance
Unarchive a Designer Instance: it returns to the lists and accepts changes again. Idempotent.
Returns: DesignerInstance!
Arguments:
idUUID!required
Example:
mutation UnarchiveDesignerInstance($id: UUID!) {
unarchiveDesignerInstance(id: $id) {
id
activeFabricId
archivedAt
createdAt
description
fashionModelRevisionId
}
}
updateBatch
Update a batch
Returns: Batch!
Arguments:
idUUID!requiredinstructionsStringstatusBatchStatusshootTypeShootType
Example:
mutation UpdateBatch($id: UUID!, $instructions: String, $status: BatchStatus, $shootType: ShootType) {
updateBatch(id: $id, instructions: $instructions, status: $status, shootType: $shootType) {
id
campaignImageCount
createdAt
instructions
isGenerated
mediaGenerationTaskIds
}
}
updateBatchInputImage
Update a batch input image (e.g. correct the detected view type)
Returns: BatchInputImage!
Arguments:
Example:
mutation UpdateBatchInputImage($id: UUID!, $viewType: ViewType) {
updateBatchInputImage(id: $id, viewType: $viewType) {
id
batchId
createdAt
fileName
filenameView
imageUrl
}
}
updateBrandAsset
Rename a brand asset or change its default and minimum size. Sizes are fractions of the frame's shorter edge taken by the logo's longer side. An absent argument is left unchanged.
Returns: BrandAsset!
Arguments:
idUUID!requiredtitleStringdefaultSizeFloatminimumSizeFloat
Example:
mutation UpdateBrandAsset($id: UUID!, $title: String, $defaultSize: Float, $minimumSize: Float) {
updateBrandAsset(id: $id, title: $title, defaultSize: $defaultSize, minimumSize: $minimumSize) {
id
archivedAt
createdAt
darkGroundImageKey
defaultSize
height
}
}
updateBrandMemory
Returns: BrandMemory!
Arguments:
idUUID!requiredbrandNameString!requiredbrandIdentityString!requiredfashionModelInstructionsStringphotoStyleInstructionsStringtargetGroupInstructionsStringcopywritingInstructionsString: How the brand writes: tone of voice, form of address, words to avoid, language-specific rules. Omit to leave unchanged, null to clear.
Example:
mutation UpdateBrandMemory($id: UUID!, $brandName: String!, $brandIdentity: String!, $fashionModelInstructions: String, $photoStyleInstructions: String, $targetGroupInstructions: String, $copywritingInstructions: String) {
updateBrandMemory(id: $id, brandName: $brandName, brandIdentity: $brandIdentity, fashionModelInstructions: $fashionModelInstructions, photoStyleInstructions: $photoStyleInstructions, targetGroupInstructions: $targetGroupInstructions, copywritingInstructions: $copywritingInstructions) {
id
brandIdentity
brandName
copywritingInstructions
createdAt
fashionModelInstructions
}
}
updateCampaign
Update an existing campaign
Returns: Campaign!
Arguments:
Example:
mutation UpdateCampaign($id: UUID!, $name: String, $shootingLocationRevisionId: UUID) {
updateCampaign(id: $id, name: $name, shootingLocationRevisionId: $shootingLocationRevisionId) {
id
createdAt
name
teamDomain
updatedAt
}
}
updateCampaignImage
Update an existing campaign image
Returns: CampaignImage!
Arguments:
idUUID!requiredtitleStringaspectRatioAspectRatio
Example:
mutation UpdateCampaignImage($id: UUID!, $title: String, $aspectRatio: AspectRatio) {
updateCampaignImage(id: $id, title: $title, aspectRatio: $aspectRatio) {
id
aspectRatio
createdAt
errorMessage
guidanceImageKey
guidanceImageUrl
}
}
updateCampaignImageResource
Update an existing campaign image resource
Returns: CampaignImageResource!
Arguments:
idUUID!requirednameStringcontentStringpurposeString
Example:
mutation UpdateCampaignImageResource($id: UUID!, $name: String, $content: String, $purpose: String) {
updateCampaignImageResource(id: $id, name: $name, content: $content, purpose: $purpose) {
id
campaignImageId
content
createdAt
name
purpose
}
}
updateCampaignSetting
Updates which AI models are enabled for Campaign generation. Both enabled = mixed mode. At least one must stay enabled. Omit gptImage25Quality to leave the team's existing tier alone; it is never defaulted on an existing row. useGptImage2 and gptImage2Quality are retired: GPT Image 2 was replaced by GPT Image 2.5 on 2026-09-10 and sending either is an error.
Returns: CampaignSetting!
Arguments:
useGptImage25BooleanuseGemini3ProBoolean!requiredgptImage25QualityGptImage25QualityuseGptImage2BooleangptImage2QualityGptImage2Quality
Example:
mutation UpdateCampaignSetting($useGptImage25: Boolean, $useGemini3Pro: Boolean!, $gptImage25Quality: GptImage25Quality, $useGptImage2: Boolean, $gptImage2Quality: GptImage2Quality) {
updateCampaignSetting(useGptImage25: $useGptImage25, useGemini3Pro: $useGemini3Pro, gptImage25Quality: $gptImage25Quality, useGptImage2: $useGptImage2, gptImage2Quality: $gptImage2Quality) {
id
createdAt
gptImage25Quality
teamDomain
updatedAt
useGemini3Pro
}
}
updateDesignerCollection
Update a DesignerCollection's title, season, or status. Use updateDesignerCollectionBrief to set the brief.
Returns: DesignerCollection!
Arguments:
idUUID!requiredtitleStringseasonStringstatusDesignerCollectionStatus
Example:
mutation UpdateDesignerCollection($id: UUID!, $title: String, $season: String, $status: DesignerCollectionStatus) {
updateDesignerCollection(id: $id, title: $title, season: $season, status: $status) {
id
brief
createdAt
season
status
teamDomain
}
}
updateDesignerCollectionBrief
Set or clear the long-form DesignerCollection brief. Agent-authorable. Empty / null clears.
Returns: DesignerCollection!
Arguments:
idUUID!requiredbriefString: Omit to leave the brief unchanged, send null to clear it.
Example:
mutation UpdateDesignerCollectionBrief($id: UUID!, $brief: String) {
updateDesignerCollectionBrief(id: $id, brief: $brief) {
id
brief
createdAt
season
status
teamDomain
}
}
updateDesignerInstance
Update a Designer Instance (title or chosen fashion model)
Returns: DesignerInstance!
Arguments:
Example:
mutation UpdateDesignerInstance($id: UUID!, $title: String, $fashionModelRevisionId: UUID) {
updateDesignerInstance(id: $id, title: $title, fashionModelRevisionId: $fashionModelRevisionId) {
id
activeFabricId
archivedAt
createdAt
description
fashionModelRevisionId
}
}
updateDesignerRevisionLabel
Update the label on a Designer Instance Revision
Returns: DesignerInstanceRevision!
Arguments:
revisionIdUUID!requiredlabelString: Omit to leave the label unchanged, send null to clear it.
Example:
mutation UpdateDesignerRevisionLabel($revisionId: UUID!, $label: String) {
updateDesignerRevisionLabel(revisionId: $revisionId, label: $label) {
id
annotationOverlayKey
annotationOverlaySourceSlot
annotationOverlayUrl
backFlatKey
backFlatUrl
}
}
updateFashionModel
Update an existing fashion model
Returns: FashionModel!
Arguments:
idUUID!requirednameString
Example:
mutation UpdateFashionModel($id: UUID!, $name: String) {
updateFashionModel(id: $id, name: $name) {
id
createdAt
gender
name
status
teamDomain
}
}
updateFashionModelRevisionLabel
Update the label on a fashion model revision
Returns: FashionModelRevision!
Arguments:
revisionIdUUID!requiredlabelString: Omit to leave the label unchanged, send null to clear it.
Example:
mutation UpdateFashionModelRevisionLabel($revisionId: UUID!, $label: String) {
updateFashionModelRevisionLabel(revisionId: $revisionId, label: $label) {
id
createdAt
fashionModelId
favorite
fullPortraitKey
generationModel
}
}
updateGroupShot
Update a group shot
Returns: GroupShot!
Arguments:
idUUID!requiredshootingLocationRevisionIdUUIDpromptStringaspectRatioAspectRatio
Example:
mutation UpdateGroupShot($id: UUID!, $shootingLocationRevisionId: UUID, $prompt: String, $aspectRatio: AspectRatio) {
updateGroupShot(id: $id, shootingLocationRevisionId: $shootingLocationRevisionId, prompt: $prompt, aspectRatio: $aspectRatio) {
id
aspectRatio
campaignId
createdAt
errorMessage
prompt
}
}
updateMediaPlan
Rename a plan or change its brief. Changing the brief rewrites no copy; generate again to apply it.
Returns: MediaPlan!
Arguments:
planIdUUID!requirednameString: Omit to leave unchanged; null or an empty string clears it, and the plan shows its derived name. At most 200 characters.instructionsString: The campaign brief copy generation follows. Omit to leave unchanged; null or an empty string clears it. At most 2000 characters.
Example:
mutation UpdateMediaPlan($planId: UUID!, $name: String, $instructions: String) {
updateMediaPlan(planId: $planId, name: $name, instructions: $instructions) {
id
copyGeneratingSince
copyGenerationError
createdAt
headlineTreatmentId
instructions
}
}
updateMediaPlanCardLayout
Move a card's crop or headline zone by hand. Marks the card hand-edited so later re-scoring skips it; pass reset:true to discard the edit and take the computed layout back. All values are normalised fractions.
Returns: PlannedAsset!
Arguments:
cardIdUUID!requiredcropXFloatcropYFloatcropWFloatcropHFloatzoneX0FloatzoneY0FloatzoneX1FloatzoneY1FloatresetBoolean
Example:
mutation UpdateMediaPlanCardLayout($cardId: UUID!, $cropX: Float, $cropY: Float, $cropW: Float, $cropH: Float, $zoneX0: Float, $zoneY0: Float, $zoneX1: Float, $zoneY1: Float, $reset: Boolean) {
updateMediaPlanCardLayout(cardId: $cardId, cropX: $cropX, cropY: $cropY, cropW: $cropW, cropH: $cropH, zoneX0: $zoneX0, zoneY0: $zoneY0, zoneX1: $zoneX1, zoneY1: $zoneY1, reset: $reset) {
id
cropH
cropW
cropX
cropY
faceFullyInside
}
}
updatePattern
Update a Pattern's name or repeatability flags.
Returns: Pattern!
Arguments:
idUUID!requirednameStringrepeatHorizontalBooleanrepeatVerticalBoolean
Example:
mutation UpdatePattern($id: UUID!, $name: String, $repeatHorizontal: Boolean, $repeatVertical: Boolean) {
updatePattern(id: $id, name: $name, repeatHorizontal: $repeatHorizontal, repeatVertical: $repeatVertical) {
id
createdAt
name
repeatHorizontal
repeatVertical
status
}
}
updatePatternInputReference
Rename a pattern-level input reference.
Returns: PatternInputReference!
Arguments:
idUUID!requiredlabelString!required
Example:
mutation UpdatePatternInputReference($id: UUID!, $label: String!) {
updatePatternInputReference(id: $id, label: $label) {
id
createdAt
imageKey
label
patternId
}
}
updatePatternRevisionLabel
Update the label on a PatternRevision.
Returns: PatternRevision!
Arguments:
revisionIdUUID!requiredlabelString: Omit to leave the label unchanged, send null to clear it.
Example:
mutation UpdatePatternRevisionLabel($revisionId: UUID!, $label: String) {
updatePatternRevisionLabel(revisionId: $revisionId, label: $label) {
id
baseRevisionId
createdAt
errorMessage
favorite
generationModel
}
}
updateProductStudio
Update a ProductStudio session
Returns: ProductStudio!
Arguments:
Example:
mutation UpdateProductStudio($id: UUID!, $title: String, $fashionModelRevisionId: UUID) {
updateProductStudio(id: $id, title: $title, fashionModelRevisionId: $fashionModelRevisionId) {
id
createdAt
isGenerated
status
teamDomain
title
}
}
updateProductStudioInput
Update metadata for a ProductStudio input (all fields optional)
Returns: ProductStudioInput!
Arguments:
idUUID!requiredproductTitleStringproductDescriptionStringproductDetailPromptStringviewTypeViewTypeproductIdStringisHeroBoolean: Marks this input as a focus / hero product. Perspectives with useHeroOnly=true filter generation down to hero inputs only.fileNameString: Corrects the uploaded filename this input is read as. Whitespace is trimmed; "" clears the name. Rejects names over 256 characters, and names containing "/", "" or control characters, since this value feeds the delivered download filename. Does not change viewType. Re-read ProductStudio.exportFileNames afterwards: a correction can resolve or create a disagreement between inputs.
Example:
mutation UpdateProductStudioInput($id: UUID!, $productTitle: String, $productDescription: String, $productDetailPrompt: String, $viewType: ViewType, $productId: String, $isHero: Boolean, $fileName: String) {
updateProductStudioInput(id: $id, productTitle: $productTitle, productDescription: $productDescription, productDetailPrompt: $productDetailPrompt, viewType: $viewType, productId: $productId, isHero: $isHero, fileName: $fileName) {
id
createdAt
fileName
filenameView
isHero
isStylingPiece
}
}
updateProductStudioPerspective
Update an existing product studio perspective. Every optional argument is three-state: omit it to leave the stored value alone, send null to clear it. Omitting a field never erases it.
Returns: ProductStudioPerspective!
Arguments:
idUUID!requirednameString!requiredpromptString!requiredqaPromptString: Whether this perspective is quality-checked, and what extra it is checked for. Omit to leave unchanged. Null turns scoring OFF entirely, it does not fall back to the standard rubric; send an empty string for scored-with-nothing-added. Text is scored on the standard rubric plus that text. Frozen on locked marketplace presets.acceptedViewTypes[ViewType!]: Which input view types this perspective accepts. Omit to leave unchanged.aspectRatioAspectRatio: Generation aspect ratio. Omit to leave unchanged, null to clear.targetRatioWInt: Optional free-form target ratio width (e.g. 7 in 7:9). Must be sent together with targetRatioH, and the pair must agree: omit both to leave the target ratio unchanged, send null for both to clear it, send both to set it. When set, it takes precedence over aspectRatio for generation and crop.targetRatioHInt: Optional free-form target ratio height (e.g. 9 in 7:9). Must be sent together with targetRatioW.backgroundHexColorString: Optional 6-character hex color for the studio backdrop (e.g. 'ff0077'). Omit to leave unchanged, null to clear.specCropString: How outputs are cropped, as the JSON crop object: placement (anchored | fitted | frame), anchors or margin, aspect and sizing. Omit to leave unchanged, null to stop cropping outputs. Marketplace slots ignore this and use their own. Sent as JSON rather than a typed input so the one shape the container reads is not redefined a third time here.isProductOnlyBoolean: When true, generates product-only pack shots without a fashion model. Omit to leave unchanged.useHeroOnlyBoolean: When true, generation uses only inputs marked as hero. Use for fabric samples and similar focused shots. Omit to leave unchanged.aiModelAiModel: Which AI model renders this perspective. Omit to leave unchanged.shootingLocationRevisionIdUUID: Optional scene (shooting location revision id) to render into. When set it overrides backgroundHexColor as the backdrop. Omit to leave unchanged, null to detach the scene and fall back to a plain studio backdrop.exportCodeString: Token representing this perspective in delivered filenames ("001", "FRONT"). Omit to leave unchanged, null to clear. Settable even on locked marketplace presets, since it concerns delivery rather than rendering.
Example:
mutation UpdateProductStudioPerspective($id: UUID!, $name: String!, $prompt: String!, $qaPrompt: String, $acceptedViewTypes: [ViewType!], $aspectRatio: AspectRatio, $targetRatioW: Int, $targetRatioH: Int, $backgroundHexColor: String, $specCrop: String, $isProductOnly: Boolean, $useHeroOnly: Boolean, $aiModel: AiModel, $shootingLocationRevisionId: UUID, $exportCode: String) {
updateProductStudioPerspective(id: $id, name: $name, prompt: $prompt, qaPrompt: $qaPrompt, acceptedViewTypes: $acceptedViewTypes, aspectRatio: $aspectRatio, targetRatioW: $targetRatioW, targetRatioH: $targetRatioH, backgroundHexColor: $backgroundHexColor, specCrop: $specCrop, isProductOnly: $isProductOnly, useHeroOnly: $useHeroOnly, aiModel: $aiModel, shootingLocationRevisionId: $shootingLocationRevisionId, exportCode: $exportCode) {
id
acceptedViewTypes
aiModel
archivedAt
aspectRatio
backgroundHexColor
}
}
updateProductStudioPerspectiveGroup
Rename a perspective rail tab or change its purpose text. Both arguments are three-state: omitting one leaves the stored value alone.
Returns: ProductStudioPerspectiveGroup!
Arguments:
idUUID!requirednameString: New display name. Omit to leave unchanged. Null is refused: a tab with no name is unusable in the rail.purposeString: What this group is for, read by the agent when matching a user's words to a group. Omit to leave unchanged, null (or an empty string) to clear it.
Example:
mutation UpdateProductStudioPerspectiveGroup($id: UUID!, $name: String, $purpose: String) {
updateProductStudioPerspectiveGroup(id: $id, name: $name, purpose: $purpose) {
id
createdAt
name
purpose
sortOrder
teamDomain
}
}
updateProductStudioSetting
Returns: ProductStudioSetting!
Arguments:
idUUID!requiredinstructionsStringscanInstructionsString
Example:
mutation UpdateProductStudioSetting($id: UUID!, $instructions: String, $scanInstructions: String) {
updateProductStudioSetting(id: $id, instructions: $instructions, scanInstructions: $scanInstructions) {
id
createdAt
instructions
scanInstructions
teamDomain
updatedAt
}
}
updateProductStudioStylingResource
Update styling instructions for a ProductStudio resource
Returns: ProductStudioStylingResource!
Arguments:
idUUID!requiredstylingInstructionsString!required
Example:
mutation UpdateProductStudioStylingResource($id: UUID!, $stylingInstructions: String!) {
updateProductStudioStylingResource(id: $id, stylingInstructions: $stylingInstructions) {
id
createdAt
productStudioId
productStudioPerspectiveId
stylingInstructions
}
}
updateProductVideo
Returns: ProductVideo!
Arguments:
idUUID!requiredproductIdStringproductTitleStringproductImageStringproductImageIdStringvideoUrlStringstatusContentGenerationStatuspromptStringmodelTypeVideoModelType
Example:
mutation UpdateProductVideo($id: UUID!, $productId: String, $productTitle: String, $productImage: String, $productImageId: String, $videoUrl: String, $status: ContentGenerationStatus, $prompt: String, $modelType: VideoModelType) {
updateProductVideo(id: $id, productId: $productId, productTitle: $productTitle, productImage: $productImage, productImageId: $productImageId, videoUrl: $videoUrl, status: $status, prompt: $prompt, modelType: $modelType) {
id
createdAt
durationSeconds
modelType
productId
productImage
}
}
updateShootingLocation
Update an existing shootingLocation
Returns: ShootingLocation!
Arguments:
idUUID!requiredtitleString
Example:
mutation UpdateShootingLocation($id: UUID!, $title: String) {
updateShootingLocation(id: $id, title: $title) {
id
createdAt
teamDomain
thumbnailUrl
title
updatedAt
}
}
updateShootingLocationRevisionLabel
Update the label on a shooting location revision
Returns: ShootingLocationRevision!
Arguments:
revisionIdUUID!requiredlabelString: Omit to leave the label unchanged, send null to clear it.
Example:
mutation UpdateShootingLocationRevisionLabel($revisionId: UUID!, $label: String) {
updateShootingLocationRevisionLabel(revisionId: $revisionId, label: $label) {
id
createdAt
favorite
imageKey
label
model
}
}
updateSkill
Update an existing skill
Returns: Skill!
Arguments:
idUUID!requiredtitleStringbodyString
Example:
mutation UpdateSkill($id: UUID!, $title: String, $body: String) {
updateSkill(id: $id, title: $title, body: $body) {
id
body
createdAt
teamDomain
title
updatedAt
}
}
updateWardrobeItem
Update a wardrobe article. Renaming is safe for an article looks already use: each look keeps the title it was styled with.
Returns: WardrobeItem!
Arguments:
idUUID!requiredtitleStringcategoryWardrobeCategoryusageNoteStringstyleReferenceString
Example:
mutation UpdateWardrobeItem($id: UUID!, $title: String, $category: WardrobeCategory, $usageNote: String, $styleReference: String) {
updateWardrobeItem(id: $id, title: $title, category: $category, usageNote: $usageNote, styleReference: $styleReference) {
id
archivedAt
category
createdAt
styleReference
teamDomain
}
}
uploadProductVideoToShopify
Upload a generated product video to Shopify and attach it to the product
Returns: ProductVideo!
Arguments:
idUUID!requiredvideoNameString
Example:
mutation UploadProductVideoToShopify($id: UUID!, $videoName: String) {
uploadProductVideoToShopify(id: $id, videoName: $videoName) {
id
createdAt
durationSeconds
modelType
productId
productImage
}
}