> ## Documentation Index
> Fetch the complete documentation index at: https://docs.bily.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Verify a Transferred Creative Reference

> Finalize the exact original creator’s upload after transferring its bytes to the returned PUT transport. Bily verifies the reserved storage object, MIME, size, signature and image metadata before marking it ready, then schedules existing paid creative analysis. A ready upload with analysisScheduled:false is a partial scheduling outcome; retain the receipt and retry only analysis. Repeating finalize never overwrites media or creates a second upload.



## OpenAPI

````yaml /openapi.json post /creative-intelligence/{storeUrl}/uploads/{uploadId}/finalize
openapi: 3.1.0
info:
  title: Bily API
  version: 1.0.0
  description: >-
    Discover stores, read analytics and commerce data, inspect connections, and
    run explicitly authorized actions with the Bily API.
  contact:
    name: Bily support
    email: support@bily.ai
servers:
  - url: https://app.bily.ai/api/customer/v1
    description: Production
security:
  - ApiKeyAuth: []
  - BearerAuth: []
tags:
  - name: Identity
    description: Discover the identity and organizations attached to a key.
  - name: Stores
    description: Discover stores within an organization.
  - name: Store data
    description: Read store profiles, readiness, catalogs, and connected accounts.
  - name: Commerce
    description: Run scoped commerce reads and explicitly approved GraphQL mutations.
  - name: Analytics
    description: >-
      Read normalized advertising, attribution, product, customer, and cohort
      metrics.
  - name: Analytics SQL
    description: Run constrained read-only SQL over store-scoped Bily datasets.
  - name: Customer journeys
    description: Read customer touchpoints within an authenticated store scope.
  - name: Connections
    description: Inspect available connections, support, and advertising assets.
  - name: Supported actions
    description: Synchronize connections and update supported advertising assets.
  - name: Campaign actions
    description: Create or clone supported advertising campaign resources.
  - name: Ad drafts and jobs
    description: Save, review, publish and reconcile immutable advertising changes.
  - name: Creative library
    description: >-
      Analyze references and retain generated images separately from ad
      publication.
  - name: Tracking connections
    description: >-
      List and manage store-scoped tracking connections without returning
      credential secrets.
  - name: Tracking evidence
    description: >-
      Inspect installation, incoming receipts, reviewed events and destination
      evidence within one workspace.
paths:
  /creative-intelligence/{storeUrl}/uploads/{uploadId}/finalize:
    post:
      tags:
        - Creative library
      summary: Verify a Transferred Creative Reference
      description: >-
        Finalize the exact original creator’s upload after transferring its
        bytes to the returned PUT transport. Bily verifies the reserved storage
        object, MIME, size, signature and image metadata before marking it
        ready, then schedules existing paid creative analysis. A ready upload
        with analysisScheduled:false is a partial scheduling outcome; retain the
        receipt and retry only analysis. Repeating finalize never overwrites
        media or creates a second upload.
      operationId: ads-finalize-creative-upload
      parameters:
        - name: storeUrl
          in: path
          required: true
          description: Exact workspace URL returned by GET /context.
          schema:
            type: string
        - name: uploadId
          in: path
          required: true
          description: Identifier returned by the matching Bily read or creation operation.
          schema:
            type: string
        - $ref: '#/components/parameters/OrganizationId'
      responses:
        '200':
          description: >-
            Read the returned identifier until processing reaches a terminal
            state. Acceptance alone does not confirm completion.
          headers:
            x-request-id:
              schema:
                type: string
              description: Keep this identifier for diagnostics.
          content:
            application/json:
              schema:
                type: object
                properties:
                  upload:
                    $ref: '#/components/schemas/UploadedAdCreative'
                required:
                  - upload
        '202':
          description: >-
            Read the returned identifier until processing reaches a terminal
            state. Acceptance alone does not confirm completion.
          headers:
            x-request-id:
              schema:
                type: string
              description: Keep this identifier for diagnostics.
          content:
            application/json:
              schema:
                type: object
                properties:
                  upload:
                    $ref: '#/components/schemas/UploadedAdCreative'
                required:
                  - upload
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '409':
          $ref: '#/components/responses/Conflict'
        '429':
          $ref: '#/components/responses/TooManyRequests'
        '500':
          $ref: '#/components/responses/ServerError'
        '502':
          $ref: '#/components/responses/BadGateway'
        '503':
          $ref: '#/components/responses/ServiceUnavailable'
components:
  parameters:
    OrganizationId:
      name: x-bily-organization-id
      in: header
      required: false
      description: >-
        An organization ID returned by GET /context or GET /organizations. Omit
        it when a scoped key supplies the organization. Otherwise provide it
        when no organization is selected.
      schema:
        type: string
        example: org_01J8W7T9G3E6ZQ4M2K5N8P1R0S
  schemas:
    UploadedAdCreative:
      type: object
      properties:
        id:
          type: string
        status:
          enum:
            - pending
            - ready
            - error
          type: string
        fileName:
          type: string
        contentType:
          type: string
        sizeBytes:
          type: integer
          minimum: 0
        mediaUrl:
          type:
            - string
            - 'null'
        expiresAt:
          type: integer
        pinnedAt:
          type:
            - integer
            - 'null'
        lastError:
          type:
            - string
            - 'null'
        analysisStatus:
          type:
            - string
            - 'null'
      required:
        - id
        - status
        - fileName
        - contentType
        - sizeBytes
        - mediaUrl
        - expiresAt
        - pinnedAt
      example:
        id: 00000000-0000-4000-8000-000000000001
        status: pending
        fileName: product.png
        contentType: image/png
        sizeBytes: 1024
        mediaUrl: null
        expiresAt: 1800000000
        pinnedAt: null
    Error:
      type: object
      required:
        - error
      properties:
        error:
          type: string
          example: Store not found
        requestId:
          type: string
          description: Present on some server errors.
        details:
          description: Optional safe details for an action failure.
        retryAfter:
          type:
            - string
            - 'null'
      additionalProperties: true
  responses:
    BadRequest:
      description: The request path, query, or body is invalid.
      headers:
        x-request-id:
          description: The request identifier selected or generated by Bily.
          schema:
            type: string
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    Unauthorized:
      description: Authentication is missing or invalid.
      headers:
        x-request-id:
          description: The request identifier selected or generated by Bily.
          schema:
            type: string
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    Forbidden:
      description: The identity or API key is not allowed to perform this request.
      headers:
        x-request-id:
          description: The request identifier selected or generated by Bily.
          schema:
            type: string
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    NotFound:
      description: The resource was not found in the caller's accessible scope.
      headers:
        x-request-id:
          description: The request identifier selected or generated by Bily.
          schema:
            type: string
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    Conflict:
      description: The request conflicts with the current resource state.
      headers:
        x-request-id:
          description: The request identifier selected or generated by Bily.
          schema:
            type: string
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    TooManyRequests:
      description: The request rate is too high.
      headers:
        x-request-id:
          description: The request identifier selected or generated by Bily.
          schema:
            type: string
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    ServerError:
      description: Bily could not complete the request.
      headers:
        x-request-id:
          description: The request identifier selected or generated by Bily.
          schema:
            type: string
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    BadGateway:
      description: A dependent Bily operation was temporarily unavailable.
      headers:
        x-request-id:
          description: The request identifier selected or generated by Bily.
          schema:
            type: string
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    ServiceUnavailable:
      description: >-
        Authentication or a required data source is temporarily unavailable.
        Honor Retry-After when present; do not interpret this as an invalid key
        or an empty dataset.
      headers:
        x-request-id:
          description: The request identifier selected or generated by Bily.
          schema:
            type: string
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: x-api-key
      description: >-
        A server-side Bily API key created under Settings > AI tools > Access
        keys. Select the intended workspace before creating it.
    BearerAuth:
      type: http
      scheme: bearer
      bearerFormat: Bily API key
      description: An alternative way to send the same server-side Bily API key.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.