Types

All GraphQL object types available in the API.

ApiTokenResponse

API token for machine-to-machine authentication

Fields:

  • createdAt: Date
  • fullToken: String
  • lastUsedAt: Date
  • shopDomain: String!
  • tokenPreview: String!

Batch

A unit of work grouping images, skills, and a plan for batch creation

Fields:

  • createdAt: Date
  • id: UUID
  • inputImages: [BatchInputImage!]!
  • instructions: String
  • skills: [Skill!]! - Skills referenced by this batch
  • status: BatchStatus!
  • teamDomain: String!
  • updatedAt: Date

BatchInputImage

Uploaded input image for a batch, scanned via Gemini pipeline

Fields:

  • batchId: UUID!
  • createdAt: Date
  • fileName: String!
  • id: UUID
  • imageUrl: String!
  • productDescription: String
  • productTitle: String
  • updatedAt: Date
  • viewType: ViewType

BatchSkill

Pivot linking a batch to a skill

Fields:

  • batchId: UUID!
  • createdAt: Date
  • id: UUID
  • skill: Skill!
  • skillId: UUID!

BillingCostSummary

Aggregated cost breakdown for the requesting team over a date range; powers the cost-overview chart.

Fields:

  • byFeature: [BillingFeatureCostBucket!]!
  • fromDate: Date!
  • generationCents: Int!
  • releaseCents: Int!
  • toDate: Date!
  • totalCents: Int!

BillingFeatureCostBucket

Per-feature cost slice within a BillingCostSummary; one bar in the cost-overview chart.

Fields:

  • feature: String!
  • generationCents: Int!
  • releaseCents: Int!
  • totalCents: Int!

BillingLedgerEntry

One entry in the billing ledger.

Fields:

  • balanceAfterCents: Int!
  • costCents: Int!
  • createdAt: Date!
  • deltaCents: Int!
  • entryDescription: String
  • id: UUID!
  • kind: String!
  • pricingVersion: String
  • usageType: String

BrandMemory

Core content model for the Brand Identity feature.

Fields:

  • brandIdentity: String!
  • brandName: String!
  • createdAt: Date
  • fashionModelInstructions: String
  • id: UUID
  • photoStyleInstructions: String
  • targetGroupInstructions: String
  • teamDomain: String!
  • updatedAt: Date

Campaign

Named container for organizing single shots and group shots

Fields:

  • campaignImages: [CampaignImage!]!
  • createdAt: Date
  • groupShots: [GroupShot!]!
  • id: UUID
  • name: String!
  • shootingLocationRevision: ShootingLocationRevision - Default location used by campaign images at generation time. Group shots fall back to this if they don't set their own.
  • teamDomain: String!
  • updatedAt: Date

CampaignImage

Campaign image for marketing content creation

Fields:

  • aspectRatio: AspectRatio
  • batch: Batch - Parent batch if this is a draft campaign image (non-null means part of a plan)
  • campaign: Campaign
  • createdAt: Date
  • errorMessage: String
  • fashionModelRevision: FashionModelRevision
  • generatedImages: [CampaignImageResult!]!
  • id: UUID
  • iterations: [CampaignImageIteration!]!
  • products: [CampaignImageProduct!]!
  • prompt: String
  • resources: [CampaignImageResource!]!
  • shootingLocationRevision: ShootingLocationRevision
  • status: ContentGenerationStatus!
  • teamDomain: String!
  • thumbnailUrl: String
  • title: String!
  • updatedAt: Date

CampaignImageIteration

Campaign image iteration with feedback loop

Fields:

  • campaignImageId: UUID!
  • createdAt: Date
  • feedback: String
  • id: UUID
  • prompt: String!
  • results: [CampaignImageResult!]!

CampaignImageProduct

Product associated with campaign image

Fields:

  • campaignImageId: UUID!
  • createdAt: Date
  • id: UUID
  • productDescription: String
  • productId: String
  • productImage: String!
  • productImageId: String!
  • productTitle: String

CampaignImageResource

Analyzed resource content for campaign images

Fields:

  • campaignImageId: UUID!
  • content: String!
  • createdAt: Date
  • id: UUID
  • name: String!
  • purpose: CampaignImageResourcePurpose!

CampaignImageResult

AI-generated campaign image result

Fields:

  • aspectRatio: AspectRatio
  • campaignImage: CampaignImage!
  • campaignImageId: UUID!
  • createdAt: Date
  • downloadableImageUrl: String - Direct URL for the latest media release (frontend handles download)
  • editedImageUrl: String - URL for user-edited image from photo editor (if exists)
  • favorite: Boolean! - Whether the user has marked this result as a favorite
  • id: UUID
  • imageKey: String! - Cloudflare R2 key for the generated image
  • iterations: [CampaignImageIteration!]!
  • latestMediaRelease: MediaRelease - Most recent media release for this result
  • mediaGenerationTask: MediaGenerationTask - The media generation task that produced this result
  • mediaReleases: [MediaRelease!]! - All media releases for this result
  • model: String
  • prompt: String!
  • updatedAt: Date
  • url: String! - DEPRECATED: Use 'imageKey' instead. Returns the Cloudflare R2 key for the generated image.

CampaignSetting

Per-team selection of which AI models to use for Campaign generation. Both enabled = mixed mode (parallel FAL calls, 2 + 2 outputs).

Fields:

  • createdAt: Date
  • id: UUID
  • teamDomain: String!
  • updatedAt: Date
  • useGemini3Pro: Boolean!
  • useGptImage2: Boolean!

CreateBillingPortalSessionResponse

Stripe Customer Portal session for invoice and billing management. Frontend redirects the top window to url.

Fields:

  • url: String!

CreateShopifyTopUpChargeResponse

Shopify one-time charge for a top-up. Frontend redirects the merchant to confirmationUrl.

Fields:

  • confirmationUrl: String!
  • purchaseId: String!

CreateTopUpCheckoutSessionResponse

Stripe Checkout session for a VAT-compliant top-up. Frontend redirects the top window to url.

Fields:

  • sessionId: String!
  • url: String!

CreateTopUpIntentResponse

[Deprecated] Stripe PaymentIntent for a PAYG top-up. Frontend confirms with clientSecret. Replaced by CreateTopUpCheckoutSessionResponse.

Fields:

  • clientSecret: String!
  • paymentIntentId: String!

CreditBalanceResponse

Current PAYG credit balance for a team.

Fields:

  • balanceCents: Int!
  • currency: String!

CurrentTeamResponse

Identity + billing-routing flags for the requesting team.

Fields:

  • id: UUID!
  • isPAYG: Boolean!
  • teamDomain: String!

DesignerInstance

Brandmachine Designer instance: owns inspiration resources, revisions, selected patterns, and the chosen fashion model used across the whole instance

Fields:

  • createdAt: Date
  • description: String - Agent-authored garment description, injected into every generation prompt as a stable anchor. Null until the agent and designer settle on one.
  • fashionModelRevisionId: UUID
  • id: UUID
  • resources: [DesignerInstanceResource!]!
  • revisions: [DesignerInstanceRevision!]!
  • selectedPatternRevisions: [PatternRevision!]! - PatternRevisions this instance has selected. Multi-select by design; the agent disambiguates by Pattern.name.
  • teamDomain: String!
  • thumbnailUrl: String
  • title: String!
  • updatedAt: Date

DesignerInstanceResource

Typed inspiration resource scoped to a DesignerInstance

Fields:

  • analysis: String
  • createdAt: Date
  • designerInstanceId: UUID!
  • id: UUID
  • imageKey: String
  • label: String!
  • text: String
  • type: DesignerResourceType!

DesignerInstanceRevision

Immutable snapshot of one generation cycle (front photo, back photo, front flat, back flat) for a DesignerInstance

Fields:

  • backFlatKey: String
  • backPhotoKey: String
  • baseRevisionId: UUID
  • createdAt: Date
  • designerInstanceId: UUID!
  • errorMessage: String
  • favorite: Boolean!
  • frontFlatKey: String
  • frontPhotoKey: String
  • id: UUID
  • intentTag: String
  • label: String
  • measurement: DesignerRevisionMeasurement - v2 Phase 2 measurement pass, if the designer has taken one on this revision. Null otherwise.
  • snapshot: DesignerInstanceRevisionSnapshot
  • status: ContentGenerationStatus!
  • userRequest: String

DesignerInstanceRevisionSlotSnapshot

Per-slot frozen record of prompt + input files for a revision

Fields:

  • inputKeys: [String!]!
  • prompt: String!
  • resourceIDs: [UUID!]!
  • slot: OutputSlot!

DesignerInstanceRevisionSnapshot

Frozen inputs + per-slot prompts for a DesignerInstanceRevision

Fields:

  • resourceIDs: [UUID!]!
  • slots: [DesignerInstanceRevisionSlotSnapshot!]!

DesignerMeasurement

One measurement entry: label + numeric value + unit (cm in v1).

Fields:

  • label: String!
  • unit: String!
  • value: Float!

DesignerMeasurementGeminiTrace

Raw Gemini trace, kept for debugging.

Fields:

  • back: String
  • front: String

DesignerMeasurementsBlob

Per-view measurement lists.

Fields:

  • back: [DesignerMeasurement!]!
  • front: [DesignerMeasurement!]!

DesignerRevisionMeasurement

Measurements pass for a DesignerInstanceRevision: composites, Gemini result, annotated flats. One record per revision; overwritten on re-run.

Fields:

  • backAnnotatedKey: String
  • backCompositeKey: String!
  • backReferenceCm: Float!
  • backReferenceLabel: String
  • createdAt: Date
  • designerInstanceRevision: DesignerInstanceRevision! - Parent DesignerInstanceRevision. Exposed so callers (e.g. the tasks view) can reach designerInstanceId without a second query.
  • designerInstanceRevisionId: UUID!
  • errorMessage: String
  • frontAnnotatedKey: String
  • frontCompositeKey: String!
  • frontReferenceCm: Float!
  • frontReferenceLabel: String
  • geminiResponse: DesignerMeasurementGeminiTrace
  • id: UUID
  • measurements: DesignerMeasurementsBlob
  • status: ContentGenerationStatus!
  • updatedAt: Date

FashionModel

Fashion model for AI-generated content creation

Fields:

  • createdAt: Date
  • gender: FashionModelGender!
  • id: UUID
  • name: String!
  • revisions: [FashionModelRevision!]!
  • status: ContentGenerationStatus!
  • teamDomain: String!
  • updatedAt: Date

FashionModelCasting

Casting session that generates fashion model candidates

Fields:

  • createdAt: Date
  • gender: FashionModelGender!
  • id: UUID
  • prompt: String!
  • results: [FashionModelCastingResult!]!
  • teamDomain: String!
  • updatedAt: Date

FashionModelCastingResult

Single image result from a fashion model casting

Fields:

  • createdAt: Date
  • fashionModelCastingId: UUID!
  • id: UUID
  • imageKey: String!

FashionModelRevision

Immutable snapshot of an iterative edit on a fashion model

Fields:

  • createdAt: Date
  • fashionModel: FashionModel!
  • fashionModelId: UUID!
  • favorite: Boolean!
  • fullPortraitKey: String
  • generationModel: String
  • id: UUID
  • label: String
  • resources: FashionModelRevisionResources
  • setCardKey: String
  • userInput: String!

FashionModelRevisionResources

Structured resources for a fashion model revision

Fields:

  • beard: String
  • bodyShape: String
  • description: String
  • hairstyle: String
  • makeup: String

GroupShot

Multi-model composite image assembled from single shots

Fields:

  • aspectRatio: AspectRatio
  • campaign: Campaign!
  • campaignId: UUID!
  • createdAt: Date
  • errorMessage: String
  • id: UUID
  • intermediateRenders: [GroupShotIntermediateRender!]!
  • prompt: String
  • results: [GroupShotResult!]!
  • shootingLocationRevision: ShootingLocationRevision
  • singleShots: [GroupShotSingleShot!]!
  • status: ContentGenerationStatus!
  • thumbnailUrl: String
  • updatedAt: Date

GroupShotIntermediateRender

Per-person intermediate render for group shot pipeline

Fields:

  • campaignImage: CampaignImage!
  • campaignImageId: UUID!
  • createdAt: Date
  • errorMessage: String
  • groupShotId: UUID!
  • id: UUID
  • imageKey: String
  • status: ContentGenerationStatus!
  • updatedAt: Date

GroupShotResult

Final composite image from the group shot pipeline

Fields:

  • aspectRatio: AspectRatio
  • createdAt: Date
  • downloadableImageUrl: String
  • editedImageKey: String
  • favorite: Boolean! - Whether the user has marked this result as a favorite
  • groupShotId: UUID!
  • hiddenAt: Date
  • id: UUID
  • imageKey: String!
  • latestMediaRelease: MediaRelease
  • mediaReleases: [MediaRelease!]!
  • model: String
  • updatedAt: Date

GroupShotSingleShot

Link between a group shot and one of its single shots

Fields:

  • campaignImage: CampaignImage!
  • campaignImageId: UUID!
  • createdAt: Date
  • groupShotId: UUID!
  • id: UUID

MaterializePlanResult

Result of materializePlan — counts of created draft records

Fields:

  • campaignImagesCreated: Int!
  • productStudiosCreated: Int!

MediaGenerationTask

Tracks media generation tasks for notification center

Fields:

  • campaignImage: CampaignImage - Parent CampaignImage (non-null only for CampaignImage tasks)
  • campaignImageId: UUID - FK to the parent CampaignImage
  • campaignImageResults: [CampaignImageResult!]! - CampaignImage results produced by this task
  • completedAt: Date
  • createdAt: Date
  • designerInstanceRevision: DesignerInstanceRevision - Parent DesignerInstanceRevision (non-null only for DesignerRevisionSlot tasks; one task per slot, up to four tasks point at the same revision)
  • designerInstanceRevisionId: UUID - FK to the parent DesignerInstanceRevision
  • designerRevisionMeasurement: DesignerRevisionMeasurement - Parent DesignerRevisionMeasurement (non-null only for DesignerMeasurementAnnotation tasks; one per annotated view, up to two per record)
  • designerRevisionMeasurementId: UUID - FK to the parent DesignerRevisionMeasurement
  • errorMessage: String
  • fashionModelCasting: FashionModelCasting - Parent FashionModelCasting (non-null only for FashionModelCasting tasks)
  • fashionModelCastingId: UUID - FK to the parent FashionModelCasting
  • fashionModelRevision: FashionModelRevision - Parent FashionModelRevision (non-null only for FashionModelRevision tasks)
  • fashionModelRevisionId: UUID - FK to the parent FashionModelRevision
  • groupShot: GroupShot - Parent GroupShot (non-null only for GroupShot tasks)
  • groupShotId: UUID - FK to the parent GroupShot
  • id: UUID
  • patternRevision: PatternRevision - Parent PatternRevision (non-null only for PatternRevision tasks)
  • patternRevisionId: UUID - FK to the parent PatternRevision
  • phase: String - Optional sub-state for multi-stage flows (e.g. REMOVING_BACKGROUND, CORRECTING_COLOR). Status stays IN_PROGRESS while phase transitions; phase is for UX granularity only.
  • productSpotlight: ProductSpotlight - Parent ProductSpotlight (non-null only for ProductSpotlight tasks)
  • productSpotlightId: UUID - FK to the parent ProductSpotlight
  • productStudio: ProductStudio - Parent ProductStudio (non-null only for ProductStudio tasks)
  • productStudioId: UUID - FK to the parent ProductStudio (non-null only for ProductStudio tasks)
  • productStudioOutputs: [ProductStudioOutput!]! - ProductStudio outputs produced by this task
  • productStudioPerspective: ProductStudioPerspective - ProductStudio perspective being generated (non-null only for ProductStudio tasks)
  • productStudioPerspectiveId: UUID - FK to the ProductStudio perspective being generated
  • productVideo: ProductVideo - Parent ProductVideo (non-null only for ProductVideo tasks)
  • productVideoId: UUID - FK to the parent ProductVideo
  • shootingLocation: ShootingLocation - Parent ShootingLocation (non-null only for ShootingLocation tasks)
  • shootingLocationId: UUID - FK to the parent ShootingLocation
  • status: ContentGenerationStatus!
  • teamDomain: String!
  • title: String!
  • type: TaskType!
  • updatedAt: Date

MediaRelease

A media release of a generated asset (ProductStudioOutput, CampaignImageResult, etc.)

Fields:

  • createdAt: Date
  • id: UUID
  • objectKey: String!
  • teamDomain: String!
  • upscaleFactor: Float

OnboardingSampleDataResult

Response for onboarding sample data creation

Fields:

  • created: Boolean!

Pattern

Shop-level, agent-iterable pattern asset used by Designer Instances. Produces a single image per revision.

Fields:

  • createdAt: Date
  • id: UUID
  • inputReferences: [PatternInputReference!]! - Pattern-level reference library. Persistent; the agent flattens these into PatternRevision.inputs on every generation call.
  • name: String!
  • repeatHorizontal: Boolean!
  • repeatVertical: Boolean!
  • revisions: [PatternRevision!]!
  • status: ContentGenerationStatus!
  • teamDomain: String!
  • updatedAt: Date

PatternInputReference

Persistent inspiration reference attached to a Pattern. Label + image. Uploaded via POST /api/patterns/references.

Fields:

  • createdAt: Date
  • id: UUID
  • imageKey: String!
  • label: String!
  • patternId: UUID!

PatternRevision

Immutable output of one iteration on a Pattern.

Fields:

  • baseRevisionId: UUID
  • createdAt: Date
  • errorMessage: String
  • favorite: Boolean!
  • generationModel: String
  • id: UUID
  • imageKey: String
  • inputs: [PatternRevisionInput!]
  • label: String
  • pattern: Pattern!
  • patternId: UUID!
  • prompt: String
  • status: ContentGenerationStatus!
  • userInput: String

PatternRevisionInput

One labelled reference snapshotted onto a PatternRevision at generation time.

Fields:

  • imageKey: String!
  • label: String!

Plan

Fields:

  • createdAt: Date
  • handle: String!
  • id: UUID
  • name: String!
  • productShortQuota: Int!
  • spotlightQuota: Int!
  • updatedAt: Date

PricelistEntry

One row of the public PAYG pricelist.

Fields:

  • chargeCents: Int!
  • currency: String!
  • pricingVersion: String!
  • usageType: String!

ProductSpotlight

Core content model for the Spotlight feature.

Fields:

  • createdAt: Date
  • ctaText: String - Call-to-action button text
  • errorMessage: String - Error message if generation fails
  • id: UUID
  • objectType: String - The type of object detected (e.g., 'clothing', 'shoe')
  • optimizedPrompt: String - AI-optimized prompt for image generation
  • pickerResult: String! - The entire Shopify picker result as JSON
  • productId: String!
  • productImage: String! - The Shopify product image URL
  • productImageId: String! - The Shopify product image ID
  • productTitle: String!
  • progress: Progress! - Current progress information for the spotlight generation flow
  • sceneImage: String - URL to the generated scene image
  • sceneSuggestions: [SceneProposalButtons!] - AI-generated scene suggestions for the product
  • status: ContentGenerationStatus!
  • subtitle: String - Subtitle text for the spotlight widget
  • teamDomain: String! - The Shopify team domain this spotlight belongs to
  • title: String - Title text for the spotlight widget
  • tryonImage: String - The final try-on image generated by VTON model
  • updatedAt: Date
  • userPrompt: String - User-defined prompt for image generation
  • variant: String - The variant of the widget the spotlight will be shown in

ProductStudio

Core content model for the ProductStudio feature.

Fields:

  • batch: Batch - Parent batch if this is a draft studio (non-null means part of a plan)
  • createdAt: Date
  • fashionModelRevision: FashionModelRevision - The selected fashion model revision for this studio session
  • id: UUID
  • inputs: [ProductStudioInput!]! - Product inputs for this studio session, sorted by creation date (newest first)
  • outputs: [ProductStudioOutput!]! - Generated outputs from this studio session
  • status: ContentGenerationStatus!
  • stylingResources: [ProductStudioStylingResource!]! - Styling instructions per perspective for this studio session
  • teamDomain: String! - The Shopify team domain this studio belongs to
  • title: String
  • updatedAt: Date

ProductStudioHomeCard

A single card on the Home view, carrying everything the UI renders for one studio.

Fields:

  • perspectivesGenerated: Int! - Distinct perspectives this studio has at least one output for.
  • perspectivesPicked: Int! - Subset of perspectivesGenerated where at least one output is favorited.
  • reviewState: StudioReviewState!
  • studio: ProductStudio!
  • thumbnailUrl: String - Full Cloudflare URL. TODO: oldest input image. IN_PROGRESS/DONE: most recently favorited output. Null if no inputs and no outputs exist.

ProductStudioHomeDigest

Aggregated Home view payload: 'needs your attention' plus 'recently generated'.

Fields:

  • needsAttention: [ProductStudioHomeCard!]! - TODO and IN_PROGRESS studios, most-recently-active first, capped at 10.
  • recentlyGenerated: [ProductStudioHomeCard!]! - DONE studios whose last activity is within the past 7 days, most-recent first, capped at 10.

ProductStudioInpaintResult

Pivot model representing the many-to-many relationship between inputs and outputs with sequential inpainting.

Fields:

  • createdAt: Date
  • id: UUID
  • inpaintedResult: String - Final inpainted image URL for this combination
  • inputId: UUID! - The ProductStudioInput this result belongs to
  • isComplete: Boolean! - Whether this inpaint result is complete
  • isReadyForInpainting: Boolean! - Whether this record is ready for inpainting
  • outputId: UUID! - The ProductStudioOutput this result belongs to
  • sceneMask: String - Scene mask URL for this input in this specific scene

ProductStudioInput

Individual product input within a ProductStudio session.

Fields:

  • createdAt: Date
  • id: UUID
  • inpaintResults: [ProductStudioInpaintResult!]! - Inpaint results for this input across all outputs
  • isHero: Boolean! - Marks this input as a focus / hero product. Perspectives with useHeroOnly=true filter generation down to hero inputs only.
  • productDescription: String - Detailed product description
  • productDetailPrompt: String - Guidance prompt to guide AI image generation
  • productId: String - Optional Shopify product ID if attached to a product
  • productImage: String! - The uploaded image URL (stored in Shopify after upload)
  • productImageId: String! - The Shopify file ID (GID) for the uploaded image
  • productStudioId: UUID! - The ProductStudio this input belongs to
  • productTitle: String - User-provided title/description for this input
  • viewType: ViewType! - View type of this product input (front, back, other, or cropped)

ProductStudioOutput

Generated image from a ProductStudio session. Each output passes through an additive pipeline of up to three stages: (1) raw AI generation → imageKey; (2) optional background color correction, only when the perspective carries a backgroundHexColorcorrectedImageUrl; (3) optional user edit from the photo editor → editedImageUrl. Each stage persists independently, so older stages remain queryable for before/after views and reverts. latestImage returns the most recent stage by priority edited > corrected > raw.

Fields:

  • completionPercentage: Float! - Returns progress based on which images are available
  • correctedImageUrl: String - URL for the auto-corrected variant (stage 2 of the pipeline): the raw AI output run through the background-color-correction pipeline so the backdrop matches the perspective's backgroundHexColor exactly. Set only when the perspective carries a backgroundHexColor and correction has completed. Built on top of imageKey and remains populated even after a subsequent user edit, so the frontend can show pre-edit state or revert.
  • createdAt: Date
  • downloadableImageUrl: String - Direct URL for the latest media release (frontend handles download)
  • editedImageUrl: String - URL for the user-edited variant (stage 3 of the pipeline). Produced when the user opens the photo editor and saves on top of whichever earlier stage was current at the time (corrected if present, otherwise raw). Set only after the user actually edits.
  • favorite: Boolean! - Whether the user has marked this output as a favorite
  • finalImageUrl: String - DEPRECATED: Use 'imageKey' instead. Returns the Cloudflare R2 key for the final composed image.
  • id: UUID
  • imageKey: String - Cloudflare R2 key for the raw AI output (stage 1 of the pipeline). Set once generation completes and remains populated even after later stages run, so the frontend can show the pre-correction / pre-edit state or revert.
  • inpaintResults: [ProductStudioInpaintResult!]! - Inpaint results for this output across all inputs
  • latestImage: String - Server-side resolution of the most recent stage. Priority: edited > corrected > raw. Use this when you just want 'the current image'; use the per-variant fields when you need to know which stages ran or show before/after.
  • latestMediaRelease: MediaRelease - Most recent media release for this output
  • mediaGenerationTask: MediaGenerationTask - The media generation task that produced this output
  • mediaReleases: [MediaRelease!]! - All media releases for this output
  • productStudio: ProductStudio! - Parent ProductStudio session
  • productStudioId: UUID! - The ProductStudio this output belongs to
  • productStudioPerspectiveId: UUID! - The perspective this output was generated for. Read this directly when you only need the perspective ID; avoid walking through mediaGenerationTask.productStudioPerspective.id which fires per-output N+1 queries.
  • updatedAt: Date

ProductStudioPerspective

Perspective configuration for Product Studio Outputs.

Fields:

  • acceptedViewTypes: [ViewType!]! - Which view types this perspective accepts (e.g., [front], [front, back], or all)
  • aiModel: AiModel! - Which AI model renders this perspective: NANO_BANANA_2 (fast pack shots), GEMINI_3_PRO (balanced), or GPT_IMAGE_2 (best for logos and prints).
  • archivedAt: Date - When set, the perspective is archived and hidden from the default list.
  • aspectRatio: AspectRatio
  • backgroundHexColor: String - 6-character hex color for the studio backdrop (e.g. 'ff0077'), without # prefix. Null means no specific backdrop color.
  • createdAt: Date
  • id: UUID
  • isDefault: Boolean!
  • isProductOnly: Boolean! - When true, generates product-only pack shots without a fashion model.
  • name: String!
  • outputs: [ProductStudioOutput!]!
  • prompt: String!
  • teamDomain: String!
  • updatedAt: Date
  • useHeroOnly: Boolean! - When true, generation uses only inputs marked as hero. Use for perspectives like fabric samples where accessories would dilute the output.

ProductStudioSetting

Settings for Product Studio feature customization.

Fields:

  • createdAt: Date
  • id: UUID
  • instructions: String
  • scanInstructions: String
  • teamDomain: String!
  • updatedAt: Date

ProductStudioStylingResource

Styling instructions for a specific ProductStudio session and perspective

Fields:

  • createdAt: Date
  • id: UUID
  • productStudioId: UUID!
  • productStudioPerspectiveId: UUID!
  • stylingInstructions: String!

ProductVideo

Core content model for the Product Shorts feature.

Fields:

  • buttons: [VideoButton!] - Array of interactive buttons with labels and descriptions
  • createdAt: Date
  • id: UUID
  • modelType: VideoModelType - The AI model used for video generation
  • productId: String
  • productImage: String
  • productImageId: String
  • productTitle: String
  • progress: Progress! - Current progress information for the video generation flow
  • prompt: String - Custom prompt for video generation
  • status: ContentGenerationStatus!
  • teamDomain: String! - The Shopify team domain this video belongs to
  • updatedAt: Date
  • videoUrl: String - The result of the genai video generation process.

Progress

Progress information for long-running flows

Fields:

  • message: String!
  • percentage: Float!

SceneProposalButtons

Interactive buttons for product spotlight scene suggestions

Fields:

  • description: String!
  • label: String!

ShootingLocation

ShootingLocation for marketing content creation

Fields:

  • createdAt: Date
  • id: UUID
  • revisions: [ShootingLocationRevision!]!
  • teamDomain: String!
  • thumbnailUrl: String
  • title: String!
  • updatedAt: Date

ShootingLocationRevision

Immutable snapshot of a shooting location generation cycle

Fields:

  • createdAt: Date
  • favorite: Boolean!
  • id: UUID
  • imageKey: String
  • label: String
  • model: String
  • resources: ShootingLocationRevisionResources
  • shootingLocation: ShootingLocation!
  • shootingLocationId: UUID!
  • userInput: String!

ShootingLocationRevisionResources

Structured resources for a shooting location revision

Fields:

  • extras: String
  • lighting: String
  • location: String
  • mood: String

ShopifyPageInfo

Pagination info for Shopify queries

Fields:

  • endCursor: String
  • hasNextPage: Boolean!

ShopifyProduct

A Shopify product from the Admin API

Fields:

  • handle: String!
  • id: String!
  • images: [ShopifyProductImage!]!
  • productType: String!
  • status: String!
  • tags: [String!]!
  • title: String!
  • totalInventory: Int
  • variants: [ShopifyProductVariant!]!
  • vendor: String!

ShopifyProductImage

A Shopify product image

Fields:

  • altText: String
  • height: Int
  • id: String!
  • url: String!
  • width: Int

ShopifyProductVariant

A Shopify product variant

Fields:

  • id: String!
  • inventoryQuantity: Int
  • price: String!
  • sku: String
  • title: String!

ShopifyProductsResult

Paginated result of Shopify product search

Fields:

  • pageInfo: ShopifyPageInfo!
  • products: [ShopifyProduct!]!

Skill

Reusable instruction that tells the agent how to approach batch work

Fields:

  • body: String!
  • createdAt: Date
  • id: UUID
  • teamDomain: String!
  • title: String!
  • updatedAt: Date

StatusResponse

Fields:

  • cancelUrl: String!
  • createdAt: Date
  • id: UUID
  • queuePosition: Int
  • requestId: String!
  • responseUrl: String!
  • status: Status!
  • statusUrl: String!
  • updatedAt: Date

SubscriptionStatus

Fields:

  • plan: String!
  • remainingCampaignImageBillableQuota: Int!
  • remainingCampaignImageGenerationQuota: Int!
  • remainingFashionModelQuota: Int!
  • remainingProductShortQuota: Int!
  • remainingProductStudioBillableQuota: Int!
  • remainingProductStudioQuota: Int!
  • remainingShootingLocationQuota: Int!
  • remainingSpotlightQuota: Int!

TrackUsageMessage

Response message for usage tracking

Fields:

  • status: Boolean!

VideoButton

Interactive button for product videos

Fields:

  • description: String!
  • label: String!