> ## 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.

# Reserve a Creative Reference Upload

> Reserve one workspace image or video upload with a stable caller idempotency key. MCP returns a relative first-party PUT path for the declared file; resolve it against the MCP endpoint origin and transfer bytes outside MCP with the same creator’s separately authenticated browser session or Customer API write key and exact content length. An MCP OAuth grant alone cannot authenticate that transfer. The PUT verifies storage and schedules internal paid analysis; finalizeUpload is an idempotent verification/recovery step. MCP does not fetch caller URLs, read local files, return signed storage credentials, or create an ad.



## OpenAPI

````yaml /openapi.json post /creative-intelligence/{storeUrl}/uploads
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:
    post:
      tags:
        - Creative library
      summary: Reserve a Creative Reference Upload
      description: >-
        Reserve one workspace image or video upload with a stable caller
        idempotency key. MCP returns a relative first-party PUT path for the
        declared file; resolve it against the MCP endpoint origin and transfer
        bytes outside MCP with the same creator’s separately authenticated
        browser session or Customer API write key and exact content length. An
        MCP OAuth grant alone cannot authenticate that transfer. The PUT
        verifies storage and schedules internal paid analysis; finalizeUpload is
        an idempotent verification/recovery step. MCP does not fetch caller
        URLs, read local files, return signed storage credentials, or create an
        ad.
      operationId: ads-create-creative-upload
      parameters:
        - name: storeUrl
          in: path
          required: true
          description: Exact workspace URL returned by GET /context.
          schema:
            type: string
        - $ref: '#/components/parameters/OrganizationId'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AdsCreateCreativeUploadInput'
      responses:
        '200':
          description: >-
            Request completed. Inspect the returned state and any verification
            fields.
          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'
                  uploadUrl:
                    type: string
                  reused:
                    type: boolean
                required:
                  - upload
        '201':
          description: >-
            Request completed. Inspect the returned state and any verification
            fields.
          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'
                  uploadUrl:
                    type: string
                  reused:
                    type: boolean
                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:
    AdsCreateCreativeUploadInput:
      type: object
      additionalProperties: false
      required:
        - idempotencyKey
        - fileName
        - contentType
        - sizeBytes
      properties:
        idempotencyKey:
          type: string
          minLength: 1
          maxLength: 256
          pattern: ^[A-Za-z0-9._~-]+$
        fileName:
          type: string
          minLength: 1
          maxLength: 240
        contentType:
          enum:
            - image/jpeg
            - image/png
            - image/webp
            - video/mp4
            - video/quicktime
            - video/webm
          type: string
        sizeBytes:
          type: integer
          minimum: 1
          maximum: 99614720
      allOf:
        - if:
            required:
              - contentType
            properties:
              contentType:
                enum:
                  - image/jpeg
                  - image/png
                  - image/webp
                type: string
          then:
            properties:
              sizeBytes:
                maximum: 15728640
    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.