## Quality Gate

**post** `/generate/quality-gate`

Verify an image against the applicable brand/style/campaign briefs and generic AI-quality checks; returns a combined score, verdict, reasons, and suggested fixes. The verdict is stored on the asset: pass an asset id to re-score it in place (for example after the brief changed), or a data URL to upload the image as an asset (deduplicated on content) and score it.

### Query Parameters

- `dryRun: optional "true" or "api"`

  Estimate the operation instead of running it: the call returns a 269 response carrying the creative units cost. `api` estimates at the API tier.

  - `"true"`

  - `"api"`

- `originalAssets: optional boolean`

  If set to true, returns the original asset without transformation

- `projectId: optional string`

  The projectId used for ownership resource management. Either to assert ownership or to set the owner of the resource(s)

### Body Parameters

- `image: string`

  Image to verify: an asset id ("asset_...") or a data URL. A data URL is
  uploaded into the project as an asset (deduplicated on content, so the
  same bytes always resolve to the same asset), and the verdict is stored on
  that asset — re-verifying an already-scored asset replaces its result.

- `sensitivity: optional "high" or "low" or "medium"`

  Threshold strictness for this call. Overrides the scope's stored
  sensitivity when set; otherwise the resolved scope setting (or "medium")
  is used.

  - `"high"`

  - `"low"`

  - `"medium"`

### Returns

- `aiQuality: object { reasons, score, suggestions }`

  Always-on generic AI-quality dimension

  - `reasons: array of string`

    Why the image scored as it did

  - `score: number`

    0–100; higher is better (more compliant / less AI-looking)

  - `suggestions: array of string`

    Actionable suggestions to improve the score

- `appliedBriefs: array of object { id, level }`

  Briefs that contributed to this verdict

  - `id: string`

    The brief's id

  - `level: "project" or "team"`

    The brief's scope

    - `"project"`

    - `"team"`

- `asset: object { id, authorId, collectionIds, 26 more }`

  - `id: string`

    The asset ID (example: "asset_GTrL3mq4SXWyMxkOHRxlpw")

  - `authorId: string`

    The author user ID (example: "dcf121faaa1a0a0bbbd9ca1b73d62aea")

  - `collectionIds: array of string`

    A list of CollectionId this asset belongs to

  - `createdAt: string`

    The asset creation date as an ISO string (example: "2023-02-03T11:19:41.579Z")

  - `editCapabilities: array of "DETECTION" or "GENERATIVE_FILL" or "PIXELATE" or 8 more`

    List of edit capabilities

    - `"DETECTION"`

    - `"GENERATIVE_FILL"`

    - `"PIXELATE"`

    - `"PROMPT_EDITING"`

    - `"REFINE"`

    - `"REFRAME"`

    - `"REMOVE_BACKGROUND"`

    - `"SEGMENTATION"`

    - `"UPSCALE"`

    - `"UPSCALE_360"`

    - `"VECTORIZATION"`

  - `kind: "3d" or "audio" or "document" or 5 more`

    The kind of asset

    - `"3d"`

    - `"audio"`

    - `"document"`

    - `"image"`

    - `"image-hdr"`

    - `"json"`

    - `"text"`

    - `"video"`

  - `metadata: object { kind, type, angular, 108 more }`

    Metadata of the asset with some additional information

    - `kind: "3d" or "audio" or "document" or 5 more`

      - `"3d"`

      - `"audio"`

      - `"document"`

      - `"image"`

      - `"image-hdr"`

      - `"json"`

      - `"text"`

      - `"video"`

    - `type: "3d-texture" or "3d-texture-albedo" or "3d-texture-metallic" or 77 more`

      The type of the asset. Ex: 'inference-txt2img' will represent an asset generated from a text to image model

      - `"3d-texture"`

      - `"3d-texture-albedo"`

      - `"3d-texture-metallic"`

      - `"3d-texture-mtl"`

      - `"3d-texture-normal"`

      - `"3d-texture-roughness"`

      - `"3d23d"`

      - `"3d23d-texture"`

      - `"audio2audio"`

      - `"audio2txt"`

      - `"audio2video"`

      - `"background-removal"`

      - `"canvas"`

      - `"canvas-drawing"`

      - `"canvas-export"`

      - `"detection"`

      - `"generative-fill"`

      - `"image-prompt-editing"`

      - `"img23d"`

      - `"img2img"`

      - `"img2splat"`

      - `"img2txt"`

      - `"img2video"`

      - `"inference-controlnet"`

      - `"inference-controlnet-img2img"`

      - `"inference-controlnet-inpaint"`

      - `"inference-controlnet-inpaint-ip-adapter"`

      - `"inference-controlnet-ip-adapter"`

      - `"inference-controlnet-reference"`

      - `"inference-controlnet-texture"`

      - `"inference-img2img"`

      - `"inference-img2img-ip-adapter"`

      - `"inference-img2img-texture"`

      - `"inference-inpaint"`

      - `"inference-inpaint-ip-adapter"`

      - `"inference-reference"`

      - `"inference-reference-texture"`

      - `"inference-txt2img"`

      - `"inference-txt2img-ip-adapter"`

      - `"inference-txt2img-texture"`

      - `"patch"`

      - `"pixelization"`

      - `"reframe"`

      - `"restyle"`

      - `"segment"`

      - `"segmentation-image"`

      - `"segmentation-mask"`

      - `"skybox-3d"`

      - `"skybox-base-360"`

      - `"skybox-hdri"`

      - `"texture"`

      - `"texture-albedo"`

      - `"texture-ao"`

      - `"texture-edge"`

      - `"texture-height"`

      - `"texture-metallic"`

      - `"texture-normal"`

      - `"texture-smoothness"`

      - `"txt23d"`

      - `"txt2audio"`

      - `"txt2img"`

      - `"txt2txt"`

      - `"txt2video"`

      - `"unknown"`

      - `"uploaded"`

      - `"uploaded-3d"`

      - `"uploaded-audio"`

      - `"uploaded-avatar"`

      - `"uploaded-text"`

      - `"uploaded-video"`

      - `"upscale"`

      - `"upscale-skybox"`

      - `"upscale-texture"`

      - `"upscale-video"`

      - `"vectorization"`

      - `"video23d"`

      - `"video2audio"`

      - `"video2img"`

      - `"video2video"`

      - `"voice-clone"`

    - `angular: optional number`

      How angular is the surface? 0 is like a sphere, 1 is like a mechanical object

    - `aspectRatio: optional string`

      The optional aspect ratio given for the generation, only applicable for some models

    - `backgroundOpacity: optional number`

    - `baseModelId: optional string`

      The baseModelId that maybe changed at inference time

    - `bbox: optional array of number`

      A bounding box around the object of interest, in the format [x1, y1, x2, y2].

    - `betterQuality: optional boolean`

    - `cannyStructureImage: optional string`

      The control image already processed by canny detector. Must reference an existing AssetId.

    - `clustering: optional boolean`

      Activate clustering.

    - `colorCorrection: optional boolean`

      Ensure upscaled tile have the same color histogram as original tile.

    - `colorMode: optional string`

    - `colorPrecision: optional number`

    - `concepts: optional array of object { modelId, scale, modelEpoch }`

      Flux Kontext LoRA to style the image.
      For Flux Kontext Prompt Editing.

      - `modelId: string`

        The model ID (example: "model_eyVcnFJcR92BxBkz7N6g5w")

      - `scale: number`

        The scale of the model (example: 1.0)
        For Flux Kontext Prompt Editing, the scale is between 0 and 2.

      - `modelEpoch: optional string`

        The epoch of the model (example: "000001")
        Only available for Flux Lora Trained models

    - `contours: optional array of array of array of array of number`

    - `controlEnd: optional number`

      End step for control.

    - `copiedAt: optional string`

      The date when the asset was copied to a project

    - `cornerThreshold: optional number`

    - `creativity: optional number`

      Allow the generation of "hallucinations" during the upscale process, which adds additional details and deviates from the original image. Default: optimized for your preset and style.

    - `creativityDecay: optional number`

      Amount of decay in creativity over the upscale process. The lowest the value, the less the creativity will be preserved over the upscale process.

    - `defaultParameters: optional boolean`

      If true, use the default parameters

    - `depthFidelity: optional number`

      The depth fidelity if a depth image provided

    - `depthImage: optional string`

      The control image processed by depth estimator. Must reference an existing AssetId.

    - `detailsLevel: optional number`

      Amount of details to remove or add

    - `dilate: optional number`

    - `factor: optional number`

      Contrast factor for Grayscale detector

    - `fileName: optional string`

      The name its parent's files reference it by (an OBJ's MTL, an MTL's texture), kept as delivered.

    - `filterSpeckle: optional number`

    - `fractality: optional number`

      Determine the scale at which the upscale process works.

      - With a small value, the upscale works at the largest scale, resulting in fewer added details and more coherent images. Ideal for portraits, for example.
      - With a large value, the upscale works at the smallest scale, resulting in more added details and more hallucinations. Ideal for landscapes, for example.

      (info): A small value is slower and more expensive to run.

    - `geometryEnforcement: optional number`

      Apply extra control to the Skybox 360 geometry.
      The higher the value, the more the 360 geometry will influence the generated skybox image.

      Use with caution. Default is adapted to the other parameters.

    - `guidance: optional number`

      The guidance used to generate this asset

    - `halfMode: optional boolean`

    - `hdr: optional number`

    - `height: optional number`

    - `highThreshold: optional number`

      High threshold for Canny detector

    - `horizontalExpansionRatio: optional number`

      (deprecated) Horizontal expansion ratio.

    - `image: optional string`

      The input image to process. Must reference an existing AssetId or be a data URL.

    - `imageFidelity: optional number`

      Strengthen the similarity to the original image during the upscale. Default: optimized for your preset and style.

    - `imageType: optional "seamfull" or "skybox" or "texture"`

      Preserve the seamless properties of skybox or texture images. Input has to be of same type (seamless).

      - `"seamfull"`

      - `"skybox"`

      - `"texture"`

    - `inferenceId: optional string`

      The id of the Inference describing how this image was generated

    - `inputFidelity: optional "high" or "low"`

      When set to `high`, allows to better preserve details from the input images in the output.
      This is especially useful when using images that contain elements like faces or logos that
      require accurate preservation in the generated image.

      You can provide multiple input images that will all be preserved with high fidelity, but keep
      in mind that the first image will be preserved with richer textures and finer details, so if
      you include elements such as faces, consider placing them in the first image.

      Only available for the `gpt-image-1` model.

      - `"high"`

      - `"low"`

    - `inputLocation: optional "bottom" or "left" or "middle" or 2 more`

      Location of the input image in the output.

      - `"bottom"`

      - `"left"`

      - `"middle"`

      - `"right"`

      - `"top"`

    - `invert: optional boolean`

      To invert the relief

    - `keepsFileNames: optional boolean`

      Its own references (an OBJ's `mtllib`, an MTL's maps) were kept as delivered.

    - `keypointThreshold: optional number`

      How polished is the surface? 0 is like a rough surface, 1 is like a mirror

    - `layerDifference: optional number`

    - `lengthThreshold: optional number`

    - `lockExpiresAt: optional string`

      The ISO timestamp when the lock on the canvas will expire

    - `lowThreshold: optional number`

      Low threshold for Canny detector

    - `mask: optional string`

      The mask used for the asset generation or editing

    - `maxIterations: optional number`

    - `maxThreshold: optional number`

      Maximum threshold for Grayscale conversion

    - `minThreshold: optional number`

      Minimum threshold for Grayscale conversion

    - `modality: optional "canny" or "depth" or "grayscale" or 7 more`

      Modality to detect

      - `"canny"`

      - `"depth"`

      - `"grayscale"`

      - `"lineart_anime"`

      - `"mlsd"`

      - `"normal"`

      - `"pose"`

      - `"scribble"`

      - `"segmentation"`

      - `"sketch"`

    - `mode: optional string`

    - `modelId: optional string`

      The modelId used to generate this asset

    - `modelType: optional "custom" or "elevenlabs-voice" or "flux.1" or 28 more`

      The type of the generator used

      - `"custom"`

      - `"elevenlabs-voice"`

      - `"flux.1"`

      - `"flux.1-composition"`

      - `"flux.1-kontext-dev"`

      - `"flux.1-kontext-lora"`

      - `"flux.1-krea-dev"`

      - `"flux.1-krea-lora"`

      - `"flux.1-lora"`

      - `"flux.1-pro"`

      - `"flux.1.1-pro-ultra"`

      - `"flux.2-dev-edit-lora"`

      - `"flux.2-dev-lora"`

      - `"flux.2-klein-4b-edit-lora"`

      - `"flux.2-klein-4b-lora"`

      - `"flux.2-klein-9b-edit-lora"`

      - `"flux.2-klein-9b-lora"`

      - `"flux.2-klein-base-4b-edit-lora"`

      - `"flux.2-klein-base-4b-lora"`

      - `"flux.2-klein-base-9b-edit-lora"`

      - `"flux.2-klein-base-9b-lora"`

      - `"flux1.1-pro"`

      - `"gpt-image-1"`

      - `"qwen-image-2512-lora"`

      - `"qwen-image-edit-2509-lora"`

      - `"qwen-image-edit-2511-lora"`

      - `"qwen-image-edit-lora"`

      - `"qwen-image-lora"`

      - `"zimage-de-turbo-lora"`

      - `"zimage-lora"`

      - `"zimage-turbo-lora"`

    - `name: optional string`

    - `nbMasks: optional number`

    - `negativePrompt: optional string`

      The negative prompt used to generate this asset

    - `negativePromptStrength: optional number`

      Controls the influence of the negative prompt. Default 0 means the negative prompt has no effect. Higher values increase negative prompt influence.
      Must be > 0 if negativePrompt is provided.

    - `numInferenceSteps: optional number`

      The number of denoising steps for each image generation.

    - `numOutputs: optional number`

      The number of outputs to generate.

    - `originalAssetId: optional string`

    - `outputIndex: optional number`

    - `overlapPercentage: optional number`

      Overlap percentage for the output image.

    - `overrideEmbeddings: optional boolean`

      Override the embeddings of the model. Only your prompt and negativePrompt will be used. Use with caution.

    - `parentId: optional string`

    - `parentJobId: optional string`

    - `pathPrecision: optional number`

    - `points: optional array of array of number`

      List of points (label, x, y) in the image where label = 0 for background and 1 for object.

    - `polished: optional number`

      How polished is the surface? 0 is like a rough surface, 1 is like a mirror

    - `preset: optional string`

    - `progressPercent: optional number`

    - `prompt: optional string`

      The prompt that guided the asset generation or editing

    - `promptFidelity: optional number`

      Increase the fidelity to the prompt during upscale. Default: optimized for your preset and style.

    - `raised: optional number`

      How raised is the surface? 0 is flat like water, 1 is like a very rough rock

    - `referenceImages: optional array of string`

      The reference images used for the asset generation or editing

    - `refinementSteps: optional number`

      Additional refinement steps before scaling.

      If scalingFactor == 1, the refinement process will be applied (1 + refinementSteps) times.
      If scalingFactor > 1, the refinement process will be applied refinementSteps times.

    - `removeBackground: optional boolean`

      Remove background for Grayscale detector

    - `resizeOption: optional number`

      Size proportion of the input image in the output.

    - `resultContours: optional boolean`

      Boolean to output the contours.

    - `resultImage: optional boolean`

      Boolean to return the source image with the mask applied as alpha channel
      (RGBA PNG, transparent background) instead of the binary mask.
      Mutually exclusive with `resultMask` — passing both as `true` returns a 400 error.
      Note: `backgroundOpacity` is no longer honored — alpha is binary (0/255) only.

    - `resultMask: optional boolean`

      Boolean to return the binary masks in the response.
      Mutually exclusive with `resultImage` — passing both as `true` returns a 400 error.

    - `rootParentId: optional string`

    - `saveFlipbook: optional boolean`

      Save a flipbook of the texture. Deactivated when the input texture is larger than 2048x2048px

    - `scalingFactor: optional number`

      Scaling factor (when `targetWidth` not specified)

    - `scheduler: optional string`

      The scheduler used to generate this asset

    - `seed: optional string`

      The seed used to generate this asset. <!> Can be a string or a number in some cases <!>.

    - `sharpen: optional boolean`

      Sharpen tiles.

    - `shiny: optional number`

      How shiny is the surface? 0 is like a matte surface, 1 is like a diamond

    - `size: optional number`

    - `sketch: optional boolean`

      Activate sketch detection instead of canny.

    - `sourceProjectId: optional string`

    - `spliceThreshold: optional number`

    - `strength: optional number`

      The strength

      Only available for the `flux-kontext` LoRA model.

    - `structureFidelity: optional number`

      Strength for the input image structure preservation

    - `structureImage: optional string`

      The control image for structure. A canny detector will be applied to this image. Must reference an existing AssetId.

    - `style: optional "3d-cartoon" or "3d-rendered" or "anime" or 23 more`

      - `"3d-cartoon"`

      - `"3d-rendered"`

      - `"anime"`

      - `"cartoon"`

      - `"cinematic"`

      - `"claymation"`

      - `"cloud-skydome"`

      - `"comic"`

      - `"cyberpunk"`

      - `"enchanted"`

      - `"fantasy"`

      - `"ink"`

      - `"manga"`

      - `"manga-color"`

      - `"minimalist"`

      - `"neon-tron"`

      - `"oil-painting"`

      - `"pastel"`

      - `"photo"`

      - `"photography"`

      - `"psychedelic"`

      - `"retro-fantasy"`

      - `"scifi-concept-art"`

      - `"space"`

      - `"standard"`

      - `"whimsical"`

    - `styleFidelity: optional number`

      The higher the value the more it will look like the style image(s)

    - `styleImages: optional array of string`

      List of style images. Most of the time, only one image is enough. It must be existing AssetIds.

    - `styleImagesFidelity: optional number`

      Condition the influence of the style image(s). The higher the value, the more the style images will influence the upscaled image.

    - `targetHeight: optional number`

      The target height of the output image.

    - `targetWidth: optional number`

      Target width for the upscaled image, take priority over scaling factor

    - `text: optional string`

      A textual description / keywords describing the object of interest.

    - `texture: optional string`

      The asset to convert in texture maps. Must reference an existing AssetId.

    - `thumbnail: optional object { assetId, url }`

      The thumbnail of the canvas

      - `assetId: string`

        The AssetId of the image used as a thumbnail for the canvas (example: "asset_GTrL3mq4SXWyMxkOHRxlpw")

      - `url: string`

        The url of the image used as a thumbnail for the canvas

    - `tileStyle: optional boolean`

      If set to true, during the upscaling process, the model will match tiles of the source image with tiles of the style image(s). This will result in a more coherent restyle. Works best with style images that have a similar composition.

    - `trainingImage: optional boolean`

    - `verticalExpansionRatio: optional number`

      (deprecated) Vertical expansion ratio.

    - `width: optional number`

      The width of the rendered image.

  - `mimeType: string`

    The mime type of the asset (example: "image/png")

  - `ownerId: string`

    The owner (project) ID (example: "proj_23tlk332lkht3kl2" or "team_dlkhgs23tlk3hlkth32lkht3kl2" for old teams)

  - `privacy: "private" or "public" or "unlisted"`

    The privacy of the asset

    - `"private"`

    - `"public"`

    - `"unlisted"`

  - `properties: object { size, animationFrameCount, bitrate, 26 more }`

    The properties of the asset, content may depend on the kind of asset returned

    - `size: number`

    - `animationFrameCount: optional number`

      Number of animation frames if animations exist

    - `bitrate: optional number`

      Bitrate of the media in bits per second

    - `boneCount: optional number`

      Number of bones if skeleton exists

    - `cameraMode: optional "aerial" or "interior" or "turntable"`

      Recommended preview camera mode emitted by the generator (gsplat route);
      passed through to mesh-rendering verbatim.

      - `"aerial"`

      - `"interior"`

      - `"turntable"`

    - `cameraTrajectory: optional array of object { position, target, fov }`

      Recommended preview camera path emitted by the generator (gsplat route);
      passed through to mesh-rendering verbatim.

      - `position: array of number`

        Camera eye position in the splat's world frame.

      - `target: array of number`

        Look-at point in the splat's world frame.

      - `fov: optional number`

        Vertical field of view in degrees (defaults to 50 in the renderer).

    - `channels: optional number`

      Number of channels of the audio

    - `charCount: optional number`

      Number of Unicode code points in the text. Code-point-aware (so a non-BMP
      emoji counts as 1) but not full grapheme-cluster aware (a ZWJ sequence
      still counts as several).

    - `classification: optional "effect" or "interview" or "music" or 5 more`

      Classification of the audio

      - `"effect"`

      - `"interview"`

      - `"music"`

      - `"other"`

      - `"sound"`

      - `"speech"`

      - `"text"`

      - `"unknown"`

    - `codecName: optional string`

      Codec name of the media

    - `description: optional string`

      Description of the audio

    - `dimensions: optional array of number`

      Bounding box dimensions [width, height, depth]

    - `duration: optional number`

      Duration of the media in seconds

    - `faceCount: optional number`

      Number of faces/triangles in the mesh

    - `format: optional string`

      Format of the mesh file (e.g. 'glb', etc.)

    - `frameRate: optional number`

      Frame rate of the video in frames per second

    - `hasAnimations: optional boolean`

      Whether the mesh has animations

    - `hasFullPreview: optional boolean`

      True when `preview` holds the entire content unmodified — consumers can
      use it directly without fetching `asset.url`. False or undefined means
      the content exceeds the preview budget and consumers must fetch the
      full body from S3 to read past the preview.

    - `hasNormals: optional boolean`

      Whether the mesh has normal vectors

    - `hasSkeleton: optional boolean`

      Whether the mesh has bones/skeleton

    - `hasUVs: optional boolean`

      Whether the mesh has UV coordinates

    - `height: optional number`

    - `nbFrames: optional number`

      Number of frames in the video

    - `preview: optional string`

      Leading slice of the content used for inline UI display and as a search
      shortcut. Capped at TEXT_PREVIEW_MAX_BYTES (UTF-8) and always cut on a
      code-point boundary so no character is split. Number of characters in the
      preview varies by script (around 1024 for ASCII, ~340 for CJK, ~256 for
      emoji-heavy text at the default 1 KB budget).

    - `sampleRate: optional number`

      Sample rate of the media in Hz

    - `transcription: optional object { text }`

      Transcription of the audio

      - `text: string`

    - `vertexCount: optional number`

      Number of vertices in the mesh

    - `width: optional number`

    - `wordCount: optional number`

      Number of whitespace-separated words in the text

  - `source: "3d23d" or "3d23d:texture" or "3d:texture" or 77 more`

    source of the asset

    - `"3d23d"`

    - `"3d23d:texture"`

    - `"3d:texture"`

    - `"3d:texture:albedo"`

    - `"3d:texture:metallic"`

    - `"3d:texture:mtl"`

    - `"3d:texture:normal"`

    - `"3d:texture:roughness"`

    - `"audio2audio"`

    - `"audio2txt"`

    - `"audio2video"`

    - `"background-removal"`

    - `"canvas"`

    - `"canvas-drawing"`

    - `"canvas-export"`

    - `"detection"`

    - `"generative-fill"`

    - `"image-prompt-editing"`

    - `"img23d"`

    - `"img2img"`

    - `"img2splat"`

    - `"img2txt"`

    - `"img2video"`

    - `"inference-control-net"`

    - `"inference-control-net-img"`

    - `"inference-control-net-inpainting"`

    - `"inference-control-net-inpainting-ip-adapter"`

    - `"inference-control-net-ip-adapter"`

    - `"inference-control-net-reference"`

    - `"inference-control-net-texture"`

    - `"inference-img"`

    - `"inference-img-ip-adapter"`

    - `"inference-img-texture"`

    - `"inference-in-paint"`

    - `"inference-in-paint-ip-adapter"`

    - `"inference-reference"`

    - `"inference-reference-texture"`

    - `"inference-txt"`

    - `"inference-txt-ip-adapter"`

    - `"inference-txt-texture"`

    - `"patch"`

    - `"pixelization"`

    - `"reframe"`

    - `"restyle"`

    - `"segment"`

    - `"segmentation-image"`

    - `"segmentation-mask"`

    - `"skybox-3d"`

    - `"skybox-base-360"`

    - `"skybox-hdri"`

    - `"texture"`

    - `"texture:albedo"`

    - `"texture:ao"`

    - `"texture:edge"`

    - `"texture:height"`

    - `"texture:metallic"`

    - `"texture:normal"`

    - `"texture:smoothness"`

    - `"txt23d"`

    - `"txt2audio"`

    - `"txt2img"`

    - `"txt2txt"`

    - `"txt2video"`

    - `"unknown"`

    - `"uploaded"`

    - `"uploaded-3d"`

    - `"uploaded-audio"`

    - `"uploaded-avatar"`

    - `"uploaded-text"`

    - `"uploaded-video"`

    - `"upscale"`

    - `"upscale-skybox"`

    - `"upscale-texture"`

    - `"upscale-video"`

    - `"vectorization"`

    - `"video23d"`

    - `"video2audio"`

    - `"video2img"`

    - `"video2video"`

    - `"voice-clone"`

  - `status: "error" or "pending" or "success"`

    The actual status

    - `"error"`

    - `"pending"`

    - `"success"`

  - `tags: array of string`

    The associated tags (example: ["sci-fi", "landscape"])

  - `updatedAt: string`

    The asset last update date as an ISO string (example: "2023-02-03T11:19:41.579Z")

  - `url: string`

    Signed URL to get the asset content

  - `automaticCaptioning: optional string`

    Automatic captioning of the asset

  - `description: optional string`

    The description, it will contain in priority:

    - the manual description
    - the advanced captioning when the asset is used in training flow
    - the automatic captioning

  - `embedding: optional array of number`

    The embedding of the asset when requested.

    Only available when an asset can be embedded (ie: not Detection maps)

  - `firstFrame: optional object { assetId, url }`

    The video asset's first frame.

    Contains the assetId and the url of the first frame.

    - `assetId: string`

    - `url: string`

  - `isHidden: optional boolean`

    Whether the asset is hidden.

  - `lastFrame: optional object { assetId, url }`

    The video asset's last frame.

    Contains the assetId and the url of the last frame.

    - `assetId: string`

    - `url: string`

  - `nsfw: optional array of string`

    The NSFW labels

  - `originalFileUrl: optional string`

    The original file url.

    Contains the url of the original file. without any conversion. Only available for some specific video, audio and threeD assets.
    Is only specified if the given asset data has been replaced with a new file during the creation of the asset.

  - `originalMimeType: optional "application/gzip" or "application/json" or "application/octet-stream" or 47 more`

    The mime type of the original file url.

    The original file is stored under a key that carries no extension, so this
    is the only way to know which format `originalFileUrl` serves (e.g. an HDRi
    skybox exposes a JPEG preview as `url` and its `.exr` or `.hdr` file as the
    original). Omitted when the stored format could not be determined.

    - `"application/gzip"`

    - `"application/json"`

    - `"application/octet-stream"`

    - `"application/pdf"`

    - `"application/safetensors"`

    - `"application/vnd.autodesk.fbx"`

    - `"application/x-authorware-bin"`

    - `"application/x-zip-compressed"`

    - `"application/x.autodesk.fbx"`

    - `"application/zip"`

    - `"audio/flac"`

    - `"audio/m4a"`

    - `"audio/mpeg"`

    - `"audio/ogg"`

    - `"audio/wav"`

    - `"image/aces"`

    - `"image/avif"`

    - `"image/bmp"`

    - `"image/gif"`

    - `"image/heic"`

    - `"image/jpeg"`

    - `"image/png"`

    - `"image/svg+xml"`

    - `"image/tiff"`

    - `"image/vnd.radiance"`

    - `"image/webp"`

    - `"image/x-exr"`

    - `"model/glb"`

    - `"model/gltf+json"`

    - `"model/gltf-binary"`

    - `"model/ksplat"`

    - `"model/mtl"`

    - `"model/obj"`

    - `"model/ply"`

    - `"model/sog"`

    - `"model/splat"`

    - `"model/spz"`

    - `"model/stl"`

    - `"model/vnd.collada+xml"`

    - `"model/vnd.ms-package.3dmanufacturing-3dmodel+xml"`

    - `"model/x-3d-vox"`

    - `"model/x-blender"`

    - `"model/x-fbx"`

    - `"model/x-maya-ascii"`

    - `"model/x-maya-binary"`

    - `"model/x3d+xml"`

    - `"text/plain"`

    - `"video/mp4"`

    - `"video/quicktime"`

    - `"video/webm"`

  - `outputIndex: optional number`

    The output index of the asset within a job
    This index is an positive integer that starts at 0
    It is used to differentiate between multiple outputs of the same job
    If the job has only one output, this index is 0

  - `preview: optional object { assetId, url }`

    The asset's preview.

    Contains the assetId and the url of the preview.

    - `assetId: string`

    - `url: string`

  - `qualityGate: optional object { computedAt, status, version, 8 more }`

    Quality Gate result, computed asynchronously after generation.

    `details` (the per-dimension reasons and suggestions) is returned only when
    the asset is read with `withQualityGateDetails=true`.

    - `computedAt: string`

      ISO-8601 timestamp of when scoring ran

    - `status: "error" or "scored"`

      Whether scoring succeeded or errored

      - `"error"`

      - `"scored"`

    - `version: string`

      Rubric/model version that produced this result

    - `aiQualityScore: optional number`

      Generic AI-quality sub-score

    - `appliedBriefIds: optional array of string`

      Ids of briefs that contributed

    - `briefComplianceScore: optional number`

      Brief-compliance sub-score (omitted when no brief applied)

    - `details: optional object { aiQuality, briefCompliance }`

      Per-dimension reasons and suggestions, as produced by the detector.

      Returned only when the asset is read with `withQualityGateDetails=true` by
      the project that owns it — the brief-compliance text paraphrases that
      project's brief, so a cross-project read of a public asset gets the summary
      alone. Also omitted when the archived verdict is unavailable (asset scored
      by an older version, or an unreadable archive).

      - `aiQuality: object { reasons, score, suggestions }`

        Always-on generic AI-quality dimension

        - `reasons: array of string`

          Why the image scored as it did

        - `score: number`

          0–100; higher is better (more compliant / less AI-looking)

        - `suggestions: array of string`

          Actionable suggestions to improve the score

      - `briefCompliance: optional object { reasons, score, suggestions }`

        Brief-compliance dimension; omitted when no brief applied

        - `reasons: array of string`

          Why the image scored as it did

        - `score: number`

          0–100; higher is better (more compliant / less AI-looking)

        - `suggestions: array of string`

          Actionable suggestions to improve the score

    - `error: optional string`

      Error message when status is 'error' (truncated)

    - `overallScore: optional number`

      0–100 composite score (present when status is 'scored')

    - `sensitivity: optional "high" or "low" or "medium"`

      Sensitivity used for the verdict

      - `"high"`

      - `"low"`

      - `"medium"`

    - `verdict: optional "fail" or "pass" or "warn"`

      pass / warn / fail (present when status is 'scored')

      - `"fail"`

      - `"pass"`

      - `"warn"`

  - `thumbnail: optional object { assetId, url }`

    The asset's thumbnail.

    Contains the assetId and the url of the thumbnail.

    - `assetId: string`

    - `url: string`

- `overallScore: number`

  0–100 combined score

- `verdict: "fail" or "pass" or "warn"`

  pass / warn / fail: the worse of overallScore and aiQuality.score, each read against sensitivity

  - `"fail"`

  - `"pass"`

  - `"warn"`

- `briefCompliance: optional object { reasons, score, suggestions }`

  Brief-compliance dimension; omitted when no brief applied

  - `reasons: array of string`

    Why the image scored as it did

  - `score: number`

    0–100; higher is better (more compliant / less AI-looking)

  - `suggestions: array of string`

    Actionable suggestions to improve the score

- `costDetails: optional object { "assistant-message", caption, "custom-generation", 20 more }`

  Compute Units cost per billing action for this request, after discount.
  Values sum to `creativeUnitsCost`. Only Compute-Units-consuming actions
  with a non-zero charge appear. Lets clients split the total (e.g.
  generation vs `quality-gate`) — including on dryRun estimates.

  - `"assistant-message": optional number`

  - `caption: optional number`

  - `"custom-generation": optional number`

  - `"describe-style": optional number`

  - `detection: optional number`

  - `embed: optional number`

  - `"image-prompt-editing": optional number`

  - `"inference-images": optional number`

  - `"ip-detection": optional number`

  - `pixelate: optional number`

  - `prompt: optional number`

  - `"quality-gate": optional number`

  - `"remove-background": optional number`

  - `repaint: optional number`

  - `restyle: optional number`

  - `segmentation: optional number`

  - `"skybox-base-360": optional number`

  - `"skybox-upscale-360": optional number`

  - `texture: optional number`

  - `"train-model": optional number`

  - `translate: optional number`

  - `upscale: optional number`

  - `vectorization: optional number`

- `creativeUnitsCost: optional number`

  The Compute Units cost for the request billed

- `creativeUnitsDiscount: optional number`

  The Compute Units discount for the request billed

- `ipDetection: optional object { action, analyzedImagesCount, creativeUnitsCharged, 4 more }`

  IP detection findings, when detection ran for this request.

  - `action: "allowed" or "blocked" or "flagged"`

    Whether and how detection affected the request.

    - `"allowed"`

    - `"blocked"`

    - `"flagged"`

  - `analyzedImagesCount: number`

    Number of images the detectors actually analyzed — a video counts as each
    of its extracted frames, and an image that could not be read is excluded
    (and not billed). Each of them is priced once per enabled filter.

  - `creativeUnitsCharged: number`

    IP-detection CU fee, separate from creativeUnitsCost: it follows the
    provider tokens the run sends — the prompt plus every analyzed image, once
    per enabled filter — with a 1 CU minimum per run.

  - `evaluatedFilters: number`

    Number of enabled filters evaluated for this request.

  - `findings: array of object { category, confidence, filterId, 4 more }`

    Per-filter verdicts gathered for this request.

    - `category: "artist-style" or "brand-trademark" or "celebrity-likeness" or 2 more`

      Category of the filter that produced this verdict.

      - `"artist-style"`

      - `"brand-trademark"`

      - `"celebrity-likeness"`

      - `"custom"`

      - `"fictional-character"`

    - `confidence: number`

      Confidence score from 0 (low) to 1 (high).

    - `filterId: string`

      Identifier of the filter that produced this verdict.

    - `filterName: string`

      Display name of the filter that produced this verdict.

    - `flagged: boolean`

      Whether this filter considered the request an IP risk.

    - `reason: string`

      Short, user-facing explanation of the verdict.

    - `entities: optional array of string`

      Named entities the filter recognized (e.g. characters, brands, people).

  - `flagged: boolean`

    Whether a filter considered the inputs an IP risk. Independent of `action`:
    a request blocked because a detector errored is `blocked` and NOT flagged.

  - `hasDetectorError: optional boolean`

    True if one or more detectors errored while evaluating this request.

- `sensitivity: optional "high" or "low" or "medium"`

  Sensitivity used to derive the verdict

  - `"high"`

  - `"low"`

  - `"medium"`

### Example

```http
curl https://api.cloud.scenario.com/v1/generate/quality-gate \
    -H 'Content-Type: application/json' \
    -u "$SCENARIO_SDK_API_KEY:SCENARIO_SDK_API_SECRET" \
    -d '{
          "image": "image"
        }'
```

#### Response

```json
{
  "aiQuality": {
    "reasons": [
      "string"
    ],
    "score": 0,
    "suggestions": [
      "string"
    ]
  },
  "appliedBriefs": [
    {
      "id": "id",
      "level": "project"
    }
  ],
  "asset": {
    "id": "id",
    "authorId": "authorId",
    "collectionIds": [
      "string"
    ],
    "createdAt": "createdAt",
    "editCapabilities": [
      "DETECTION"
    ],
    "kind": "3d",
    "metadata": {
      "kind": "3d",
      "type": "3d-texture",
      "angular": 0,
      "aspectRatio": "aspectRatio",
      "backgroundOpacity": 0,
      "baseModelId": "baseModelId",
      "bbox": [
        0,
        0,
        0,
        0
      ],
      "betterQuality": true,
      "cannyStructureImage": "cannyStructureImage",
      "clustering": true,
      "colorCorrection": true,
      "colorMode": "colorMode",
      "colorPrecision": 0,
      "concepts": [
        {
          "modelId": "modelId",
          "scale": -2,
          "modelEpoch": "modelEpoch"
        }
      ],
      "contours": [
        [
          [
            [
              0
            ]
          ]
        ]
      ],
      "controlEnd": 0,
      "copiedAt": "copiedAt",
      "cornerThreshold": 0,
      "creativity": 0,
      "creativityDecay": 0,
      "defaultParameters": true,
      "depthFidelity": 0,
      "depthImage": "depthImage",
      "detailsLevel": -50,
      "dilate": 0,
      "factor": 0,
      "fileName": "fileName",
      "filterSpeckle": 0,
      "fractality": 0,
      "geometryEnforcement": 0,
      "guidance": 0,
      "halfMode": true,
      "hdr": 0,
      "height": 0,
      "highThreshold": 0,
      "horizontalExpansionRatio": 1,
      "image": "image",
      "imageFidelity": 0,
      "imageType": "seamfull",
      "inferenceId": "inferenceId",
      "inputFidelity": "high",
      "inputLocation": "bottom",
      "invert": true,
      "keepsFileNames": true,
      "keypointThreshold": 0,
      "layerDifference": 0,
      "lengthThreshold": 0,
      "lockExpiresAt": "lockExpiresAt",
      "lowThreshold": 0,
      "mask": "mask",
      "maxIterations": 0,
      "maxThreshold": 0,
      "minThreshold": 0,
      "modality": "canny",
      "mode": "mode",
      "modelId": "modelId",
      "modelType": "custom",
      "name": "name",
      "nbMasks": 0,
      "negativePrompt": "negativePrompt",
      "negativePromptStrength": 0,
      "numInferenceSteps": 5,
      "numOutputs": 1,
      "originalAssetId": "originalAssetId",
      "outputIndex": 0,
      "overlapPercentage": 0,
      "overrideEmbeddings": true,
      "parentId": "parentId",
      "parentJobId": "parentJobId",
      "pathPrecision": 0,
      "points": [
        [
          0
        ],
        [
          0
        ],
        [
          0
        ]
      ],
      "polished": 0,
      "preset": "preset",
      "progressPercent": 0,
      "prompt": "prompt",
      "promptFidelity": 0,
      "raised": 0,
      "referenceImages": [
        "string"
      ],
      "refinementSteps": 0,
      "removeBackground": true,
      "resizeOption": 0.1,
      "resultContours": true,
      "resultImage": true,
      "resultMask": true,
      "rootParentId": "rootParentId",
      "saveFlipbook": true,
      "scalingFactor": 1,
      "scheduler": "scheduler",
      "seed": "seed",
      "sharpen": true,
      "shiny": 0,
      "size": 0,
      "sketch": true,
      "sourceProjectId": "sourceProjectId",
      "spliceThreshold": 0,
      "strength": 0,
      "structureFidelity": 0,
      "structureImage": "structureImage",
      "style": "3d-cartoon",
      "styleFidelity": 0,
      "styleImages": [
        "string"
      ],
      "styleImagesFidelity": 0,
      "targetHeight": 0,
      "targetWidth": 1024,
      "text": "text",
      "texture": "texture",
      "thumbnail": {
        "assetId": "assetId",
        "url": "url"
      },
      "tileStyle": true,
      "trainingImage": true,
      "verticalExpansionRatio": 1,
      "width": 1024
    },
    "mimeType": "mimeType",
    "ownerId": "ownerId",
    "privacy": "private",
    "properties": {
      "size": 0,
      "animationFrameCount": 0,
      "bitrate": 0,
      "boneCount": 0,
      "cameraMode": "aerial",
      "cameraTrajectory": [
        {
          "position": [
            0,
            0,
            0
          ],
          "target": [
            0,
            0,
            0
          ],
          "fov": 0
        }
      ],
      "channels": 0,
      "charCount": 0,
      "classification": "effect",
      "codecName": "codecName",
      "description": "description",
      "dimensions": [
        0,
        0,
        0
      ],
      "duration": 0,
      "faceCount": 0,
      "format": "format",
      "frameRate": 0,
      "hasAnimations": true,
      "hasFullPreview": true,
      "hasNormals": true,
      "hasSkeleton": true,
      "hasUVs": true,
      "height": 0,
      "nbFrames": 0,
      "preview": "preview",
      "sampleRate": 0,
      "transcription": {
        "text": "text"
      },
      "vertexCount": 0,
      "width": 0,
      "wordCount": 0
    },
    "source": "3d23d",
    "status": "error",
    "tags": [
      "string"
    ],
    "updatedAt": "updatedAt",
    "url": "url",
    "automaticCaptioning": "automaticCaptioning",
    "description": "description",
    "embedding": [
      0
    ],
    "firstFrame": {
      "assetId": "assetId",
      "url": "url"
    },
    "isHidden": true,
    "lastFrame": {
      "assetId": "assetId",
      "url": "url"
    },
    "nsfw": [
      "string"
    ],
    "originalFileUrl": "originalFileUrl",
    "originalMimeType": "application/gzip",
    "outputIndex": 0,
    "preview": {
      "assetId": "assetId",
      "url": "url"
    },
    "qualityGate": {
      "computedAt": "computedAt",
      "status": "error",
      "version": "version",
      "aiQualityScore": 0,
      "appliedBriefIds": [
        "string"
      ],
      "briefComplianceScore": 0,
      "details": {
        "aiQuality": {
          "reasons": [
            "string"
          ],
          "score": 0,
          "suggestions": [
            "string"
          ]
        },
        "briefCompliance": {
          "reasons": [
            "string"
          ],
          "score": 0,
          "suggestions": [
            "string"
          ]
        }
      },
      "error": "error",
      "overallScore": 0,
      "sensitivity": "high",
      "verdict": "fail"
    },
    "thumbnail": {
      "assetId": "assetId",
      "url": "url"
    }
  },
  "overallScore": 0,
  "verdict": "fail",
  "briefCompliance": {
    "reasons": [
      "string"
    ],
    "score": 0,
    "suggestions": [
      "string"
    ]
  },
  "costDetails": {
    "assistant-message": 0,
    "caption": 0,
    "custom-generation": 0,
    "describe-style": 0,
    "detection": 0,
    "embed": 0,
    "image-prompt-editing": 0,
    "inference-images": 0,
    "ip-detection": 0,
    "pixelate": 0,
    "prompt": 0,
    "quality-gate": 0,
    "remove-background": 0,
    "repaint": 0,
    "restyle": 0,
    "segmentation": 0,
    "skybox-base-360": 0,
    "skybox-upscale-360": 0,
    "texture": 0,
    "train-model": 0,
    "translate": 0,
    "upscale": 0,
    "vectorization": 0
  },
  "creativeUnitsCost": 0,
  "creativeUnitsDiscount": 0,
  "ipDetection": {
    "action": "allowed",
    "analyzedImagesCount": 0,
    "creativeUnitsCharged": 0,
    "evaluatedFilters": 0,
    "findings": [
      {
        "category": "artist-style",
        "confidence": 0,
        "filterId": "filterId",
        "filterName": "filterName",
        "flagged": true,
        "reason": "reason",
        "entities": [
          "string"
        ]
      }
    ],
    "flagged": true,
    "hasDetectorError": true
  },
  "sensitivity": "high"
}
```
