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:

  • designerCollectionId UUID! required
  • designerInstanceId UUID! required

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:

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:

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:

  • placementId UUID! required
  • mediaPlanSourceId UUID! required

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:

  • designerCollectionId UUID! required
  • patternRevisionId UUID! required

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:

  • designerInstanceId UUID! required
  • patternRevisionId UUID! required

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:

  • productStudioId UUID! required
  • batchInputImageId UUID! required
  • isHero Boolean
  • productTitle String

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:

  • groupShotId UUID! required
  • campaignImageId UUID! required

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:

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:

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:

  • sizeChartId UUID! required
  • designerInstanceRevisionId UUID! required

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:

  • placementId UUID! required
  • cardId UUID
  • slot MediaCopySlot! required
  • locale String! required
  • approved Boolean! required
  • text String: 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:

  • placementId UUID! required
  • approved Boolean! 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:

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:

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:

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:

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:

  • campaignImageId UUID! required
  • campaignId UUID! required

Example:

mutation AssignCampaignImageToCampaign($campaignImageId: UUID!, $campaignId: UUID!) {
  assignCampaignImageToCampaign(campaignImageId: $campaignImageId, campaignId: $campaignId) {
    id
    aspectRatio
    createdAt
    errorMessage
    guidanceImageKey
    guidanceImageUrl
  }
}

attachPlateToPerspective

Returns: ProductStudioPerspective!

Arguments:

  • perspectiveId UUID! required
  • plateKey String! 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.
  • guideKey String: 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:

  • campaignImageId UUID! required
  • wardrobeItemId UUID! required

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:

  • productStudioId UUID! required
  • wardrobeItemId UUID! required

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:

  • campaignImageId UUID! 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:

  • campaignImageId UUID! 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:

  • campaignImageId UUID! 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:

  • sourceResourceId UUID! required
  • targetDesignerInstanceId UUID! required

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:

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:

  • returnUrl String! required

Example:

mutation CreateBillingPortalSession($returnUrl: String!) {
  createBillingPortalSession(returnUrl: $returnUrl) {
    url
  }
}

createBrandMemory

Returns: BrandMemory!

Arguments:

  • brandName String! required
  • brandIdentity String! required
  • fashionModelInstructions String
  • photoStyleInstructions String
  • targetGroupInstructions String
  • copywritingInstructions String

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:

  • name String! required
  • shootingLocationRevisionId UUID

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:

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:

  • campaignImageId UUID! required
  • name String! required
  • content String! required
  • purpose String! 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:

  • title String! required
  • season String
  • brief String

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:

  • designerInstanceId UUID! required
  • sourcePatternRevisionId UUID! required
  • baseFabricId UUID
  • reinterpretation Float

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:

  • title String! 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:

  • designerInstanceId UUID! required
  • sourceSizeChartId UUID! required: Any chart in the team's library: a matcher candidate, another chart the designer picked, or a previous design's chart.
  • matchRunId UUID: 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:

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:

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:

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:

  • name String
  • instructions String
  • locales [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:

  • name String! required
  • repeatHorizontal Boolean
  • repeatVertical Boolean

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:

  • name String! required
  • prompt String! required
  • qaPrompt String: 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!]
  • aspectRatio AspectRatio
  • targetRatioW Int: 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.
  • targetRatioH Int: Optional free-form target ratio height (e.g. 9 in 7:9). Must be sent together with targetRatioW.
  • backgroundHexColor String: Optional 6-character hex color for the studio backdrop (e.g. 'ff0077'). Pass null to clear.
  • specCrop String: 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.
  • isProductOnly Boolean: When true, generates product-only pack shots without a fashion model.
  • useHeroOnly Boolean: When true, generation uses only inputs marked as hero. Use for fabric samples and similar focused shots.
  • aiModel AiModel: Which AI model renders this perspective. Defaults to GEMINI_3_PRO if omitted.
  • shootingLocationRevisionId UUID: Optional scene (shooting location revision id) to render into. When set it overrides backgroundHexColor as the backdrop. Pass null for a plain studio backdrop.
  • exportCode String: 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:

  • name String! 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.
  • purpose String: 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:

  • instructions String
  • scanInstructions String

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:

  • productStudioId UUID! required
  • productStudioPerspectiveId UUID! required
  • stylingInstructions String! 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:

  • productId String
  • productTitle String
  • productImage String
  • productImageId String
  • videoUrl String
  • status ContentGenerationStatus! required
  • prompt String

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:

  • title String! 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:

  • amountCents Int! required
  • returnUrl String! 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:

  • title String! required
  • body String! 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:

  • amountCents Int! required
  • returnUrl String! 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:

  • amountCents Int! 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:

  • title String! required
  • category WardrobeCategory! required
  • usageNote String: What the piece is for and when not to use it. Read by the planner.
  • styleReference String: 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:

  • name String! required
  • instructions String! 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:

Example:

mutation DeleteBatch($id: UUID!) {
  deleteBatch(id: $id)
}

deleteBatchInputImage

Delete an uploaded input image from a batch (also removes from R2)

Returns: Boolean!

Arguments:

Example:

mutation DeleteBatchInputImage($id: UUID!) {
  deleteBatchInputImage(id: $id)
}

deleteCampaign

Delete a campaign and all its children

Returns: Campaign!

Arguments:

Example:

mutation DeleteCampaign($id: UUID!) {
  deleteCampaign(id: $id) {
    id
    createdAt
    name
    teamDomain
    updatedAt
  }
}

deleteCampaignImage

Delete a campaign image

Returns: CampaignImage!

Arguments:

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:

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:

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:

Example:

mutation DeleteDesignerInstanceResource($id: UUID!) {
  deleteDesignerInstanceResource(id: $id)
}

deleteDesignerRevision

Delete a Designer Instance Revision

Returns: Boolean!

Arguments:

  • revisionId UUID! required

Example:

mutation DeleteDesignerRevision($revisionId: UUID!) {
  deleteDesignerRevision(revisionId: $revisionId)
}

deleteFashionModel

Delete a fashion model

Returns: Boolean!

Arguments:

Example:

mutation DeleteFashionModel($id: UUID!) {
  deleteFashionModel(id: $id)
}

deleteFashionModelRevision

Delete a fashion model revision

Returns: Boolean!

Arguments:

  • revisionId UUID! required

Example:

mutation DeleteFashionModelRevision($revisionId: UUID!) {
  deleteFashionModelRevision(revisionId: $revisionId)
}

deleteGroupShot

Delete a group shot

Returns: GroupShot!

Arguments:

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:

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:

Example:

mutation DeletePatternInputReference($id: UUID!) {
  deletePatternInputReference(id: $id)
}

deletePatternRevision

Delete a PatternRevision.

Returns: Boolean!

Arguments:

  • revisionId UUID! required

Example:

mutation DeletePatternRevision($revisionId: UUID!) {
  deletePatternRevision(revisionId: $revisionId)
}

deleteProductStudio

Delete a ProductStudio session

Returns: ProductStudio!

Arguments:

Example:

mutation DeleteProductStudio($id: UUID!) {
  deleteProductStudio(id: $id) {
    id
    createdAt
    isGenerated
    status
    teamDomain
    title
  }
}

deleteProductStudioPerspective

Delete a product studio perspective

Returns: ProductStudioPerspective!

Arguments:

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:

Example:

mutation DeleteProductStudioPerspectiveGroup($id: UUID!) {
  deleteProductStudioPerspectiveGroup(id: $id)
}

deleteProductVideo

Returns: Boolean!

Arguments:

Example:

mutation DeleteProductVideo($id: UUID!) {
  deleteProductVideo(id: $id)
}

deleteShootingLocation

Delete a shootingLocation

Returns: Boolean!

Arguments:

Example:

mutation DeleteShootingLocation($id: UUID!) {
  deleteShootingLocation(id: $id)
}

deleteShootingLocationRevision

Delete a shooting location revision

Returns: Boolean!

Arguments:

  • revisionId UUID! 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:

Example:

mutation DeleteSizeChart($id: UUID!) {
  deleteSizeChart(id: $id)
}

deleteSkill

Delete a skill

Returns: Boolean!

Arguments:

Example:

mutation DeleteSkill($id: UUID!) {
  deleteSkill(id: $id)
}

deleteWardrobeItem

Delete a wardrobe article and its photographs outright

Returns: Boolean!

Arguments:

Example:

mutation DeleteWardrobeItem($id: UUID!) {
  deleteWardrobeItem(id: $id)
}

deleteWardrobeItemImage

Delete one photograph of a wardrobe article

Returns: Boolean!

Arguments:

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:

  • perspectiveId UUID! 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:

  • campaignImageId UUID! required
  • wardrobeItemId UUID! required

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:

  • productStudioId UUID! required
  • wardrobeItemId UUID! required

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:

  • storeName String! 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:

  • campaignImageId UUID! required
  • feedback String
  • preview Boolean

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:

  • recoverySourceRevisionId UUID
  • requestId UUID! required
  • expectedPlanFingerprint String! required
  • provenance String! required
  • designerInstanceId UUID! required
  • baseRevisionId UUID
  • changeSet DesignerChangeSet! required
  • prompts DesignerComposedPrompts! required
  • userRequest String! required
  • intentTag String
  • rebuildPersonBase Boolean

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:

  • revisionId UUID! 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:

  • castingId UUID! required
  • useBrandIdentity Boolean
  • optimizedPrompt String

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:

  • fashionModelId UUID! 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:

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:

  • groupShotId UUID! 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:

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:

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:

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:

  • id UUID! required
  • prompt String
  • modelType VideoModelType: Ignored. Every video generates with Kling; the field remains so older clients keep working.
  • durationSeconds Int: 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:

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:

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:

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:

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:

  • designerInstanceRevisionId UUID! required
  • department String! 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:

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:

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:

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:

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:

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:

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:

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:

Example:

mutation ReleasePatternRevision($id: UUID!) {
  releasePatternRevision(id: $id) {
    id
    baseRevisionId
    createdAt
    errorMessage
    favorite
    generationModel
  }
}

releaseProductStudioOutput

Release a product studio output

Returns: ProductStudioOutput!

Arguments:

Example:

mutation ReleaseProductStudioOutput($id: UUID!) {
  releaseProductStudioOutput(id: $id) {
    id
    completionPercentage
    correctedImageUrl
    createdAt
    downloadableImageUrl
    editedImageUrl
  }
}

releaseProductVideo

Release a product video. Quota relevant.

Returns: ProductVideo!

Arguments:

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:

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:

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:

  • designerCollectionId UUID! required
  • designerInstanceId UUID! required

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:

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:

  • placementId UUID! 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:

  • designerCollectionId UUID! required
  • patternRevisionId UUID! required

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:

  • designerInstanceId UUID! required
  • patternRevisionId UUID! required

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:

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:

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:

  • groupShotId UUID! required
  • campaignImageId UUID! required

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:

  • planId UUID! required
  • discardHandEdits Boolean

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:

Example:

mutation RestoreCampaignImageResult($id: UUID!) {
  restoreCampaignImageResult(id: $id) {
    id
    aspectRatio
    campaignImageId
    createdAt
    downloadableImageUrl
    editedImageUrl
  }
}

restoreGroupShotResult

Restore a hidden group shot result

Returns: GroupShotResult!

Arguments:

Example:

mutation RestoreGroupShotResult($id: UUID!) {
  restoreGroupShotResult(id: $id) {
    id
    aspectRatio
    createdAt
    downloadableImageUrl
    editedImageKey
    exportImageUrl
  }
}

restoreProductStudioOutput

Restore a hidden product studio output

Returns: ProductStudioOutput!

Arguments:

Example:

mutation RestoreProductStudioOutput($id: UUID!) {
  restoreProductStudioOutput(id: $id) {
    id
    completionPercentage
    correctedImageUrl
    createdAt
    downloadableImageUrl
    editedImageUrl
  }
}

restoreProductStudioPerspective

Restore an archived product studio perspective

Returns: ProductStudioPerspective!

Arguments:

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:

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:

  • campaignImageId UUID! required
  • fashionModelRevisionId UUID! required

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:

  • campaignImageId UUID! required
  • imageKey String! 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:

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:

  • campaignImageId UUID! required
  • shootingLocationRevisionId UUID! required

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:

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:

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:

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:

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:

  • planId UUID! required
  • headlineTreatmentId UUID

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:

  • planId UUID! required
  • locales [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:

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:

  • placementId UUID! required
  • headlineTreatmentId UUID

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:

  • perspectiveId UUID! required
  • groupId UUID: 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:

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:

  • id UUID! required
  • productStudioPerspectiveId UUID! required
  • preview Boolean

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:

  • workflowId UUID! required
  • batchId UUID
  • maxOutputs Int

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:

  • cardId UUID! required
  • mediaPlanSourceId UUID! required

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:

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:

  • revisionId UUID! 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:

  • revisionId UUID! 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:

Example:

mutation ToggleGroupShotResultFavorite($id: UUID!) {
  toggleGroupShotResultFavorite(id: $id) {
    id
    aspectRatio
    createdAt
    downloadableImageUrl
    editedImageKey
    exportImageUrl
  }
}

togglePatternRevisionFavorite

Toggle favorite on a PatternRevision.

Returns: PatternRevision!

Arguments:

  • revisionId UUID! 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:

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:

  • revisionId UUID! 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:

Example:

mutation UnarchiveDesignerInstance($id: UUID!) {
  unarchiveDesignerInstance(id: $id) {
    id
    activeFabricId
    archivedAt
    createdAt
    description
    fashionModelRevisionId
  }
}

updateBatch

Update a batch

Returns: Batch!

Arguments:

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:

  • id UUID! required
  • title String
  • defaultSize Float
  • minimumSize Float

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:

  • id UUID! required
  • brandName String! required
  • brandIdentity String! required
  • fashionModelInstructions String
  • photoStyleInstructions String
  • targetGroupInstructions String
  • copywritingInstructions String: 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:

  • id UUID! required
  • name String
  • shootingLocationRevisionId UUID

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:

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:

  • id UUID! required
  • name String
  • content String
  • purpose String

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:

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:

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:

  • id UUID! required
  • brief String: 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:

  • id UUID! required
  • title String
  • fashionModelRevisionId UUID

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:

  • revisionId UUID! required
  • label String: 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:

  • id UUID! required
  • name String

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:

  • revisionId UUID! required
  • label String: 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:

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:

  • planId UUID! required
  • name String: Omit to leave unchanged; null or an empty string clears it, and the plan shows its derived name. At most 200 characters.
  • instructions String: 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:

  • cardId UUID! required
  • cropX Float
  • cropY Float
  • cropW Float
  • cropH Float
  • zoneX0 Float
  • zoneY0 Float
  • zoneX1 Float
  • zoneY1 Float
  • reset Boolean

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:

  • id UUID! required
  • name String
  • repeatHorizontal Boolean
  • repeatVertical Boolean

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:

  • id UUID! required
  • label String! 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:

  • revisionId UUID! required
  • label String: 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:

  • id UUID! required
  • title String
  • fashionModelRevisionId UUID

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:

  • id UUID! required
  • productTitle String
  • productDescription String
  • productDetailPrompt String
  • viewType ViewType
  • productId String
  • isHero Boolean: Marks this input as a focus / hero product. Perspectives with useHeroOnly=true filter generation down to hero inputs only.
  • fileName String: 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:

  • id UUID! required
  • name String! required
  • prompt String! required
  • qaPrompt String: 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.
  • aspectRatio AspectRatio: Generation aspect ratio. Omit to leave unchanged, null to clear.
  • targetRatioW Int: 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.
  • targetRatioH Int: Optional free-form target ratio height (e.g. 9 in 7:9). Must be sent together with targetRatioW.
  • backgroundHexColor String: Optional 6-character hex color for the studio backdrop (e.g. 'ff0077'). Omit to leave unchanged, null to clear.
  • specCrop String: 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.
  • isProductOnly Boolean: When true, generates product-only pack shots without a fashion model. Omit to leave unchanged.
  • useHeroOnly Boolean: When true, generation uses only inputs marked as hero. Use for fabric samples and similar focused shots. Omit to leave unchanged.
  • aiModel AiModel: Which AI model renders this perspective. Omit to leave unchanged.
  • shootingLocationRevisionId UUID: 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.
  • exportCode String: 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:

  • id UUID! required
  • name String: New display name. Omit to leave unchanged. Null is refused: a tab with no name is unusable in the rail.
  • purpose String: 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:

  • id UUID! required
  • instructions String
  • scanInstructions String

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:

  • id UUID! required
  • stylingInstructions String! required

Example:

mutation UpdateProductStudioStylingResource($id: UUID!, $stylingInstructions: String!) {
  updateProductStudioStylingResource(id: $id, stylingInstructions: $stylingInstructions) {
    id
    createdAt
    productStudioId
    productStudioPerspectiveId
    stylingInstructions
  }
}

updateProductVideo

Returns: ProductVideo!

Arguments:

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:

  • id UUID! required
  • title String

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:

  • revisionId UUID! required
  • label String: 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:

  • id UUID! required
  • title String
  • body String

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:

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:

  • id UUID! required
  • videoName String

Example:

mutation UploadProductVideoToShopify($id: UUID!, $videoName: String) {
  uploadProductVideoToShopify(id: $id, videoName: $videoName) {
    id
    createdAt
    durationSeconds
    modelType
    productId
    productImage
  }
}