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

# Get media buy

> Get a single media buy with its why-visibility fields: pendingReason (why it is not delivering yet and since when), buyer-safe errorCode with ownership, the sanitized source message, forwardedAt, and the buyerReference support handle. One call answers "why is my buy stuck". Use GET /campaigns/{campaignId} for packages, products, and delivery.



## OpenAPI

````yaml /v2/buyer-api-v2.yaml get /media-buys/{mediaBuyId}
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:
  /media-buys/{mediaBuyId}:
    get:
      tags:
        - Campaigns
      summary: Get media buy
      description: >-
        Get a single media buy with its why-visibility fields: pendingReason
        (why it is not delivering yet and since when), buyer-safe errorCode with
        ownership, the sanitized source message, forwardedAt, and the
        buyerReference support handle. One call answers "why is my buy stuck".
        Use GET /campaigns/{campaignId} for packages, products, and delivery.
      operationId: getMediaBuy
      parameters:
        - in: path
          name: mediaBuyId
          schema:
            description: Buyer media buy ID
            example: mb_ETBn4gJ9Wu
            type: string
            minLength: 1
          required: true
          description: Buyer media buy ID
      responses:
        '200':
          description: Get media buy
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BuyerMediaBuyResponse'
        '400':
          description: Bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '403':
          description: >-
            Caller is not a buyer — the route is mounted behind the buyer role
            guard.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '404':
          description: No media buy with this id owned by the caller.
          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:
    BuyerMediaBuyResponse:
      description: Response containing a single media buy with why-visibility
      type: object
      properties:
        mediaBuy:
          $ref: '#/components/schemas/BuyerMediaBuy'
      required:
        - mediaBuy
      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
    BuyerMediaBuy:
      description: >-
        A single media buy with its why-visibility annotation (pendingReason,
        errorCode, forwardedAt, buyerReference). Use get_campaign for packages,
        products, and delivery.
      type: object
      properties:
        mediaBuyId:
          description: Buyer media buy ID
          example: mb_ETBn4gJ9Wu
          type: string
        name:
          description: Media buy name
          type: string
        status:
          description: >-
            Interchange media buy status (DRAFT, PENDING_APPROVAL, ACTIVE,
            PAUSED, COMPLETED, CANCELED, FAILED, REJECTED).
          example: PENDING_APPROVAL
          type: string
        pendingAt:
          description: >-
            Which layer the buy is parked at; only present while status is
            PENDING_APPROVAL. Use pendingReason for the specific wait.
          type: string
          enum:
            - storefront
            - salesagent
            - unknown
        pendingChange:
          description: >-
            A submitted change that has not yet reached the delivering buy.
            Every other field on this object describes what is LIVE, so this is
            the only place a queued change surfaces. Absent when there is
            nothing pending.
          allOf:
            - $ref: '#/components/schemas/MediaBuyPendingChange'
        pendingReason:
          description: >-
            Why the buy is not delivering yet, rolled up to the most-blocking
            wait across its legs. An annotation derived from persisted
            forwarding state — never a status. Absent when the buy is
            delivering, terminal, or not storefront-routed.
          allOf:
            - $ref: '#/components/schemas/MediaBuyPendingReason'
        pendingSince:
          description: >-
            When the current wait began (ISO 8601). Present when pendingReason
            is set and the start of the wait is known.
          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))$
        errorCode:
          description: >-
            Buyer-safe structured error code when forwarding failed or the buy
            was rejected. Internal platform codes are mapped to this set and
            never emitted raw.
          allOf:
            - $ref: '#/components/schemas/BuyerMediaBuyErrorCode'
        errorOwner:
          description: >-
            Which party owns fixing the error. Present whenever errorCode is
            present.
          allOf:
            - $ref: '#/components/schemas/MediaBuyErrorOwner'
        sourceMessage:
          description: >-
            The source's rejection or moderation message, when one was provided
            — whitespace-collapsed, truncated, and known upstream identifiers
            removed.
          type: string
        forwardedAt:
          description: >-
            When the buy was forwarded to its inventory source(s) (ISO 8601).
            Absent when it has not been forwarded.
          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))$
        buyerReference:
          description: >-
            Support reference for this buy (`sf:<storefrontId>:<mediaBuyId>`).
            Quote it with the request timestamp when contacting the seller or
            Scope3 support.
          example: sf:42:sf_mb_1783031864469_8pbc8mmr
          type: string
        startTime:
          description: 'When this media buy starts: "asap" or an ISO 8601 date-time.'
          type: string
        endTime:
          description: When this media buy ends (ISO 8601).
          type: string
        createdAt:
          description: When the media buy was created (ISO 8601)
          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))$
        updatedAt:
          description: When the media buy was last updated (ISO 8601)
          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:
        - mediaBuyId
        - name
        - status
        - createdAt
        - updatedAt
      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
    MediaBuyPendingChange:
      description: >-
        A buyer-submitted change that has been accepted by Interchange but has
        NOT yet taken effect on the delivering buy. Its presence is the signal
        that this buy has an unapplied change; absence means everything reported
        is live. Never treat these values as delivering.
      type: object
      properties:
        status:
          description: >-
            Lifecycle status of the pending change itself, typically
            PENDING_APPROVAL. This is NOT the status of the buy: the buy keeps
            its own top-level status, which reflects what is delivering now.
          example: PENDING_APPROVAL
          type: string
        pendingAt:
          description: >-
            Which layer the pending change is parked at. 'storefront' = waiting
            on the storefront operator's manual approval, 'salesagent' = the
            inventory source is still processing it, 'unknown' = indeterminate.
          type: string
          enum:
            - storefront
            - salesagent
            - unknown
        reason:
          description: >-
            Reason recorded when the change was submitted, when one was
            supplied.
          example: Extended to 8/11 with W5+W6 gross budget
          type: string
        differences:
          description: >-
            Only the fields whose pending value differs from live appear here.
            An empty object means a pending change exists whose comparable
            fields already match live.
          type: object
          properties:
            endTime:
              description: Flight end date change (ISO 8601).
              type: object
              properties:
                live:
                  description: The value currently in effect on the delivering buy.
                  type: string
                proposed:
                  description: The value the pending change would set.
                  type: string
              additionalProperties: false
            budget:
              description: >-
                Total budget change in the buy's currency, summed across its
                packages.
              type: object
              properties:
                live:
                  description: The value currently in effect on the delivering buy.
                  type: number
                proposed:
                  description: The value the pending change would set.
                  type: number
              additionalProperties: false
          additionalProperties: false
      required:
        - status
        - differences
      additionalProperties: false
    MediaBuyPendingReason:
      description: >-
        Why a not-yet-delivering media buy is waiting, and implicitly whose side
        owns the wait. A platform-derived annotation — never a status value.
        awaiting_storefront_approval / awaiting_source_moderation /
        creative_processing_at_source / awaiting_creative_approval = the seller
        side owns the wait; no_creatives_attached / source_rejected_creatives =
        the buyer owns it (attach or fix creatives); forward_failed_retrying /
        forward_failed_needs_correction = the platform owns it;
        accepted_awaiting_trafficking / scheduled_not_started = nothing is
        wrong, the buy is queued or scheduled.
      type: string
      enum:
        - forward_failed_needs_correction
        - forward_failed_retrying
        - awaiting_storefront_approval
        - awaiting_source_moderation
        - no_creatives_attached
        - source_rejected_creatives
        - creative_processing_at_source
        - awaiting_creative_approval
        - accepted_awaiting_trafficking
        - scheduled_not_started
    BuyerMediaBuyErrorCode:
      description: >-
        Buyer-safe structured error code for a media buy that failed to forward
        or was rejected. Paired with errorOwner (who owns the fix) and, when the
        source provided one, a sanitized human-readable message.
      type: string
      enum:
        - product_no_longer_available
        - source_rejected
        - storefront_rejected
        - source_unavailable
        - invalid_request
        - quote_expired
        - platform_error
    MediaBuyErrorOwner:
      description: >-
        Which party owns fixing the error: buyer_input (the request needs a
        correction from the buyer), platform (Scope3 owns the fault), seller
        (the storefront or its source made the decision or is unavailable).
      type: string
      enum:
        - buyer_input
        - platform
        - seller
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: API key or access token

````