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

# Promote advertiser creatives into the library shelf

> Buyer-creative-v2 (feature-flagged). Promotes advertiser creatives into the durable creative library ("the shelf") with a role — `evergreen` (serve-ready, reusable across campaigns) or `reference` (a generation input, not served). Identify the creatives by `creative_ids` or by `collection_id`. No campaign is required. Returns 404 for callers not enrolled in the flag.



## OpenAPI

````yaml /v2/buyer-api-v2.yaml post /advertisers/{advertiserId}/creatives/save-to-library
openapi: 3.0.0
info:
  title: Scope3 Buyer API
  version: 2.0.0
  description: |-
    REST API for advertisers to manage advertisers, campaigns, and reporting.

    ## Authentication

    All endpoints require a Bearer token in the Authorization header:
    ```
    Authorization: Bearer your-api-key
    ```

    ## Base URL

    `https://api.interchange.io/api/v2/buyer`

    ## For AI Agents

    AI agents can use the MCP endpoint at `/mcp/v2/buyer` with three tools:
    - `initialize`: Start an MCP session
    - `api_call`: Make REST API calls
    - `ask_about_capability`: Learn about API features
servers:
  - url: https://api.interchange.io/api/v2/buyer
    description: Production server
security: []
tags:
  - name: Account
    description: Account management, service tokens, and preferences
  - name: Advertisers
    description: Manage advertisers
  - name: Product Discovery
    description: Discover and select products
  - name: Campaigns
    description: Manage advertising campaigns
  - name: Creatives
    description: Build, manage, and sync campaign creatives via AdCP Creative Protocol
  - name: Reporting
    description: Access performance metrics
  - name: Event Sources
    description: >-
      Manage event source configurations and log conversion/marketing events for
      attribution
  - name: Property Lists
    description: Validate property lists against AAO registry
  - name: Sales Agents
    description: View and connect sales agents
  - name: Measurement
    description: Measurement sources, records, context, and freshness
  - name: Syndication
    description: Syndicate resources to ADCP agents
  - name: Tasks
    description: Track async operation status
  - name: Planning Briefs
    description: >-
      Share prospective briefs with publishers and collect their
      fit/quote/clarify/decline/book responses (gated by the
      demand-supply-signals flag).
  - name: Buyer Billing
    description: >-
      Consolidated invoicing for buyers — invoices and pending invoice items
      issued by Scope3 across the buyer customer.
  - name: MCP
    description: Model Context Protocol endpoints for AI agents
paths:
  /advertisers/{advertiserId}/creatives/save-to-library:
    post:
      tags:
        - Creatives
      summary: Promote advertiser creatives into the library shelf
      description: >-
        Buyer-creative-v2 (feature-flagged). Promotes advertiser creatives into
        the durable creative library ("the shelf") with a role — `evergreen`
        (serve-ready, reusable across campaigns) or `reference` (a generation
        input, not served). Identify the creatives by `creative_ids` or by
        `collection_id`. No campaign is required. Returns 404 for callers not
        enrolled in the flag.
      operationId: saveCreativesToLibrary
      parameters:
        - in: path
          name: advertiserId
          schema:
            description: Advertiser ID
            type: string
            minLength: 1
          required: true
          description: Advertiser ID
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SaveCreativesToLibraryBody'
      responses:
        '200':
          description: Promote advertiser creatives into the library shelf
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SaveCreativesToLibraryResponse'
        '400':
          description: Bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
      security:
        - bearerAuth: []
components:
  schemas:
    SaveCreativesToLibraryBody:
      description: >-
        Promote advertiser creatives into the library ("the shelf") with a role.
        Identify the creatives by creative_ids or by collection_id.
      type: object
      properties:
        creative_ids:
          description: >-
            Creative manifest IDs to promote into the advertiser library.
            Provide this or collection_id.
          type: array
          items:
            type: string
            minLength: 1
        collection_id:
          description: >-
            A saved collection (e.g. the one grouped at creative-intent time)
            whose creative members are all promoted. Provide this or
            creative_ids — collection_id scales to any number of creatives.
          type: string
          minLength: 1
        role:
          description: >-
            Library role to assign: evergreen (serve-ready) or reference
            (generation input).
          allOf:
            - $ref: '#/components/schemas/CreativeRole'
      required:
        - role
    SaveCreativesToLibraryResponse:
      description: Result of promoting creatives into the advertiser library.
      type: object
      properties:
        role:
          $ref: '#/components/schemas/CreativeRole'
        updated:
          description: Creative manifest IDs whose role was set.
          type: array
          items:
            type: string
        manifests:
          description: >-
            The advertiser library after the save (promoted creatives only), so
            the result can render the shelf.
          type: array
          items:
            $ref: '#/components/schemas/CreativeManifestSummary'
        total:
          description: Total promoted creatives in the advertiser library.
          type: integer
          minimum: 0
          maximum: 9007199254740991
      required:
        - role
        - updated
        - manifests
        - total
      additionalProperties: false
    ErrorResponse:
      description: Standard error response
      type: object
      properties:
        data:
          type: string
          nullable: true
          enum:
            - null
        error:
          $ref: '#/components/schemas/ApiError'
      required:
        - data
        - error
      additionalProperties: false
    CreativeRole:
      description: >-
        Advertiser creative-library role: evergreen (serve-ready, reusable
        across campaigns) or reference (a generation input, not served). Absent
        for flight-specific creatives.
      type: string
      enum:
        - evergreen
        - reference
    CreativeManifestSummary:
      description: >-
        Compact creative-manifest view returned by list endpoints. Use
        `get_creative` for the full resource.
      type: object
      properties:
        creative_id:
          description: Creative manifest ID
          type: string
        campaign_id:
          description: Campaign ID (omitted for advertiser-level masters)
          type: string
        name:
          description: Manifest name
          type: string
        format_id:
          description: ADCP format identifier
          type: object
          properties:
            id:
              type: string
            agent_url:
              type: string
            width:
              type: number
            height:
              type: number
            duration_ms:
              type: number
          required:
            - id
            - agent_url
          additionalProperties: {}
        format_kind:
          description: AdCP 3.1 canonical format kind (e.g. image_carousel, video_hosted)
          type: string
        template_id:
          description: Creative template used for this manifest
          type: string
        brand_domain:
          description: Brand domain (auto-resolved)
          type: string
        preview_url:
          description: URL to preview the processed creative (processed HTML hosted in GCS)
          type: string
          format: uri
        requires_upgrade:
          description: >-
            True when this creative has no format_kind and must be upgraded
            before it can be assigned to new media buys. Call POST .../upgrade
            to set format_kind and clear this flag.
          type: boolean
        reuse_count:
          description: >-
            Number of campaigns this creative is actively attached to. A reuse
            signal for the advertiser library (returned on the advertiser-scoped
            list); omitted on single-manifest reads.
          type: integer
          minimum: 0
          maximum: 9007199254740991
        creative_role:
          description: >-
            Advertiser-library role (evergreen or reference). Absent for
            flight-specific creatives that live on their campaign.
          allOf:
            - $ref: '#/components/schemas/CreativeRole'
        creative_source:
          description: >-
            Provenance of the creative (uploaded/generated/connected). Today
            always "uploaded".
          allOf:
            - $ref: '#/components/schemas/CreativeSource'
        platform_links:
          description: >-
            Provider/sales-agent creative identifiers captured from
            sync_creatives for round-trip comparison.
          type: array
          items:
            $ref: '#/components/schemas/CreativeManifestPlatformLink'
        created_at:
          description: Created timestamp
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
        updated_at:
          description: Updated timestamp
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
        asset_count:
          description: >-
            Number of uploaded assets in this manifest. Replaces the embedded
            `assets[]` array on summary rows.
          example: 3
          type: integer
          minimum: 0
          maximum: 9007199254740991
        primary_asset_type:
          description: >-
            The dominant media asset type (VIDEO > AUDIO > IMAGE/HTML) — lets
            clients classify a creative by medium even when format_kind is
            absent (e.g. a bare upload). Omitted when the manifest has no media
            asset.
          type: string
          enum:
            - IMAGE
            - VIDEO
            - AUDIO
            - HTML
            - JAVASCRIPT
            - CSS
            - TEXT
            - URL
            - VAST
            - FONT
            - LOGO
            - DOCUMENT
        sync_status:
          description: >-
            Compact sync status across sales agents. Use `get_creative` for the
            full sync metadata (including `last_synced_at`).
          type: object
          properties:
            synced:
              description: True when the manifest is synced with at least one agent
              type: boolean
            agent_count:
              description: Number of sales agents the manifest is synced with
              type: integer
              minimum: -9007199254740991
              maximum: 9007199254740991
          required:
            - synced
            - agent_count
          additionalProperties: false
        target_format_ids:
          description: >-
            Additional format IDs this creative covers beyond its primary
            format_id.
          type: array
          items:
            type: object
            properties:
              id:
                type: string
              agent_url:
                type: string
              width:
                type: number
              height:
                type: number
              duration_ms:
                type: number
            required:
              - id
              - agent_url
            additionalProperties: {}
        placements:
          description: >-
            Resolved placements this creative maps to (primary + target
            formats), named against the campaign's required placements.
            Populated by the campaign creative-manifest list.
          type: array
          items:
            type: object
            properties:
              placement_id:
                type: string
              placement_name:
                type: string
            required:
              - placement_id
              - placement_name
            additionalProperties: false
      required:
        - creative_id
        - name
        - created_at
        - updated_at
        - asset_count
      additionalProperties: false
    ApiError:
      description: Structured error object
      type: object
      properties:
        code:
          description: Machine-readable error code
          type: string
        message:
          description: Human-readable error message
          type: string
        field:
          description: Field path associated with the error
          type: string
        details:
          description: Additional error context
          type: object
          additionalProperties: {}
      required:
        - code
        - message
      additionalProperties: false
    CreativeSource:
      description: >-
        Origin of the creative: uploaded (bring-your-own), generated (by a
        creative agent), or connected (from a 3p platform).
      type: string
      enum:
        - uploaded
        - generated
        - connected
    CreativeManifestPlatformLink:
      description: >-
        Readback linkage between a campaign creative and the sales
        agent/provider creative created during sync.
      type: object
      properties:
        agent_id:
          description: Stable ADCP sales-agent identifier used for the sync.
          type: string
        agent_name:
          description: Human-readable sales-agent or platform adapter name.
          type: string
        platform_id:
          description: >-
            Provider-assigned creative identifier returned by sync_creatives,
            when available.
          type: string
        status:
          description: Latest sync status reported for this agent.
          type: string
        approval_status:
          description: Latest provider or seller approval status, when available.
          type: string
        synced_at:
          description: Timestamp of the latest completed sync.
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
      required:
        - agent_id
        - agent_name
        - status
      additionalProperties: false
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: API key or access token

````