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

# Get one offer



## OpenAPI

````yaml /openapi-v1.json get /v1/channels/{channelId}/offers/{offerId}
openapi: 3.1.0
info:
  title: Aggrefine API
  version: '1'
  description: >-
    Every offer your channels may show, from all your affiliate networks, in one
    schema: the merchant's values as its feed sent them, with typed values
    (price, availability, GTIN) parsed and the feed's original text beside them.
    Only merchants the channel is approved for are included; nothing is left out
    for missing data.


    Start with `GET /v1/channels`, then page through one channel's offers, and
    keep your copy fresh with its changes. Every request needs your API key as a
    bearer token: `Authorization: Bearer <key>`. Create keys in Aggrefine under
    Settings → Team → API keys. Errors are `{ "error": "message" }`.
servers:
  - url: https://api.aggrefine.com
    description: Production
security:
  - apiKey: []
paths:
  /v1/channels/{channelId}/offers/{offerId}:
    get:
      tags:
        - Offers
      summary: Get one offer
      operationId: getOffer
      parameters:
        - schema:
            type: string
            format: uuid
            description: From GET /v1/channels.
          required: true
          description: From GET /v1/channels.
          name: channelId
          in: path
        - schema:
            type: string
            format: uuid
            description: An offer's `id`.
          required: true
          description: An offer's `id`.
          name: offerId
          in: path
      responses:
        '200':
          description: The offer
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Offer'
        '400':
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '401':
          description: Missing, wrong or revoked API key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '403':
          description: The channel is over your plan's limit
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '404':
          description: No such channel or offer
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '429':
          description: >-
            Too many requests: more than 5 a second (bursts of 10), or the
            plan's daily request limit, which resets at 00:00 UTC. Retry-After
            says when to try again.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
components:
  schemas:
    Offer:
      type: object
      properties:
        id:
          type: string
          format: uuid
          description: >-
            Aggrefine's id for the offer: one product in one merchant feed.
            Stable across calls and imports; use it to track the offer.
        network:
          type: string
          example: awin
          description: >-
            The affiliate network the offer comes from, and that `link` earns
            through. Always set.
        merchant:
          type: object
          properties:
            id:
              type: string
              example: '10240'
              description: >-
                The network's own id for the merchant (its advertiser or program
                id on `network`), as a string: the same on every offer of it,
                for every Aggrefine customer. Not unique on its own: merchants
                on different networks may have the same id, so pair it with
                `network`.
            name:
              type: string
              example: Example Shop
              description: The merchant's name, as its network lists it.
            market:
              type:
                - string
                - 'null'
              example: SE
              description: >-
                The merchant's market (country) on its network, as the network
                gives it (usually an ISO 3166-1 alpha-2 code); the same as
                Aggrefine's merchant pages show. Null when the network gives
                none.
            domain:
              type:
                - string
                - 'null'
              example: zooplus.se
              description: >-
                The shop's domain, read from this offer's `product_url`: its
                host in lowercase, without a leading `www.`. Use it to group
                offers by shop across networks. Null when the offer has no
                `product_url`.
          required:
            - id
            - name
            - market
            - domain
          description: The shop selling the offer. Always set.
        feed:
          type: object
          properties:
            id:
              type: string
              example: '12345'
              description: The network's id of the merchant's feed.
            name:
              type:
                - string
                - 'null'
              example: Example Shop SE
              description: >-
                The feed's name, as the network lists it; null when it gives
                none.
          required:
            - id
            - name
          description: >-
            The merchant feed the offer comes from. Always set. A merchant with
            several feeds (other markets, a member price list) has an offer in
            each.
        sku:
          type:
            - string
            - 'null'
          example: SKU-1
          description: >-
            The merchant's own product id, as its feed sent it. Null when the
            feed sent none.
        mpn:
          type:
            - string
            - 'null'
          example: RC-2551
          description: >-
            The manufacturer's part number (MPN), as the feed sent it. Null when
            the feed sent none.
        gtin:
          type:
            - object
            - 'null'
          properties:
            as_sent:
              type:
                - string
                - 'null'
              description: >-
                The barcode (EAN, UPC, GTIN or ISBN) exactly as the merchant's
                feed sent it, unchanged. Null when the feed sent none, or when
                the offer hasn't been imported since Aggrefine began keeping it
                (each feed's next import fills it).
            gtin14:
              type:
                - string
                - 'null'
              example: '07310865004703'
              description: >-
                The barcode as a valid GTIN, 14 digits, zero-padded: what
                `gtin=` filters on. Null when what the feed sent isn't a valid
                GTIN (wrong length or check digit).
          required:
            - as_sent
            - gtin14
          description: The product's barcode. Null when the feed sent none.
        title:
          type:
            - string
            - 'null'
          example: Dry dog food 8 kg
          description: The product's name, as the feed sent it. Null when it sent none.
        description:
          type:
            - object
            - 'null'
          properties:
            text:
              type: string
              description: >-
                The feed's description. Text as sent; HTML (see `has_html`)
                keeps only simple formatting (p, ul, b, a…), so it is safe to
                render as HTML.
            has_html:
              type: boolean
              description: Whether the feed sent the description as HTML.
          required:
            - text
            - has_html
          description: The product's description. Null when the feed sent none.
        short_description:
          type:
            - string
            - 'null'
          description: >-
            The feed's short description, on its own (never in place of
            `description`). Text as sent; HTML keeps only simple formatting.
            Null when the feed sent none.
        brand:
          type:
            - string
            - 'null'
          example: Northpaw
          description: The brand, as the feed sent it. Null when it sent none.
        category:
          type:
            - object
            - 'null'
          properties:
            as_sent:
              type:
                - string
                - 'null'
              example: Hund > Torrfoder
              description: >-
                The merchant's category exactly as its feed sent it (its
                category path when the feed has one). A feed that sends a
                category and a sub-category apart has them joined with ` > `.
                Null when the feed sent none.
            path:
              type:
                - array
                - 'null'
              items:
                type: string
              example:
                - Hund
                - Torrfoder
              description: >-
                `as_sent` split into its steps, broadest first: on `>`, else
                `|`, else ` / ` (with spaces); one step when it has none of
                them. Null when the feed sent no category.
            google_id:
              type:
                - integer
                - 'null'
              example: 3530
              description: >-
                The Google product category id the feed sent
                (google_product_category). Null when the feed sent none:
                Aggrefine never adds one.
          required:
            - as_sent
            - path
            - google_id
          description: >-
            The merchant's own category for the product: its words, never
            Aggrefine's taxonomy. Null when the feed sent no category.
        price:
          type: object
          properties:
            amount:
              type:
                - string
                - 'null'
              example: '499.00'
              description: >-
                The price parsed from the feed's text to a decimal string (never
                a float), in `currency`; at least two decimals. Null when the
                feed sent none or it couldn't be read as a number.
            as_sent:
              type:
                - string
                - 'null'
              description: >-
                The price exactly as the merchant's feed sent it, unchanged.
                Null when the feed sent none, or when the offer hasn't been
                imported since Aggrefine began keeping it (each feed's next
                import fills it).
          required:
            - amount
            - as_sent
          description: >-
            The price the merchant sells at now. Always an object; its fields
            may be null.
        old_price:
          type: object
          properties:
            amount:
              type:
                - string
                - 'null'
              example: '499.00'
              description: >-
                The price before a discount parsed from the feed's text to a
                decimal string (never a float), in `currency`; at least two
                decimals. Null when the feed sent none or it couldn't be read as
                a number.
            as_sent:
              type:
                - string
                - 'null'
              description: >-
                The price before a discount exactly as the merchant's feed sent
                it, unchanged. Null when the feed sent none, or when the offer
                hasn't been imported since Aggrefine began keeping it (each
                feed's next import fills it).
          required:
            - amount
            - as_sent
          description: >-
            The price before a discount, when the feed gives one: as sent, also
            when it isn't above `price`. Always an object; its fields may be
            null.
        currency:
          type:
            - string
            - 'null'
          example: SEK
          description: >-
            The currency of `price` and `old_price` (ISO 4217), as the feed
            gives it. Null when the feed gives none: never guessed from the
            merchant or the market.
        availability:
          type: object
          properties:
            value:
              type: string
              enum:
                - in_stock
                - out_of_stock
                - unknown
              description: >-
                Read from the feed's stock value: `unknown` when it sent none or
                it can't be read.
            as_sent:
              type:
                - string
                - 'null'
              description: >-
                The stock value ("1", "in stock", "Ja"…) exactly as the
                merchant's feed sent it, unchanged. Null when the feed sent
                none, or when the offer hasn't been imported since Aggrefine
                began keeping it (each feed's next import fills it).
          required:
            - value
            - as_sent
          description: Whether the merchant has the product in stock.
        shipping:
          type:
            - object
            - 'null'
          properties:
            cost:
              type:
                - string
                - 'null'
              example: '49.00'
              description: >-
                The shipping cost the feed sent, parsed to a decimal string
                (never a float), in `currency`: `0.00` only when the feed says
                shipping is free. Null when the feed sent no cost or it couldn't
                be read as a number: unknown, never 0.
            delivery_time:
              type:
                - string
                - 'null'
              example: 1-3 dagar
              description: >-
                The delivery time exactly as the feed sent it, unchanged (its
                own words and units). Null when the feed sent none.
            source:
              type: string
              example: feed
              description: >-
                Where `cost` and `delivery_time` come from. Today always `feed`:
                the merchant's feed. Later also `merchant_policy` (the
                merchant's own shipping terms, for offers whose feed sends
                none): accept values you don't know.
          required:
            - cost
            - delivery_time
            - source
          description: >-
            Shipping as the merchant's feed gives it. Null when the feed sent
            neither a shipping cost nor a delivery time: unknown, never free.
        color:
          type:
            - string
            - 'null'
          description: The colour, as the feed sent it. Null when it sent none.
        size:
          type:
            - string
            - 'null'
          example: 8 kg
          description: The size, as the feed sent it. Null when it sent none.
        pack_quantity:
          type:
            - string
            - 'null'
          description: >-
            How many items the offer is for (a multipack), as the feed sent it.
            Null when it sent none.
        item_group_id:
          type:
            - string
            - 'null'
          description: >-
            The merchant's id for the group of variants (sizes, colours) the
            product belongs to, as the feed sent it. Null when it sent none.
        images:
          type: array
          items:
            type: string
          description: >-
            The product's image URLs as the feed sent them, main image first:
            http(s) only. Hosted by the merchant or its network, not by
            Aggrefine. Empty when the feed sent none.
        product_url:
          type:
            - string
            - 'null'
          description: >-
            The product's page on the merchant's site (http(s)), as the feed
            gives it: not a tracking link, you earn nothing from it. Null when
            the feed gives none.
        link:
          type:
            - string
            - 'null'
          description: >-
            Your tracking link for this channel: the feed's link with your
            channel's id in it on its network. Null when the feed's link
            couldn't be made into the channel's.
        sub_id_template:
          type:
            - string
            - 'null'
          example: https://track.adtraction.com/t/t?epi={sub_id}&a=1&as=2&t=2&tk=1
          description: >-
            `link` with a place for your own sub-id (click reference), to tell
            your clicks and sales apart in the network's reports: replace
            `{sub_id}` with your value, URL-encoded. It goes in the parameter
            the network documents for it: `epi` on Adtraction, `clickref` on
            Awin, `subId1` on impact.com. Null when `link` is null, or on a
            network that documents no such parameter (Addrevenue).
        attributes:
          type: object
          additionalProperties:
            type: string
          example:
            stock_quantity: '12'
          description: >-
            Every other field the feed sent that has no place above, key and
            value exactly as sent. Keys vary by network and merchant: this
            object is part of the contract, its keys aren't. Empty when there
            are none.
        source_updated_at:
          type:
            - string
            - 'null'
          format: date-time
          description: >-
            When the feed says the merchant last changed the product. Null when
            it doesn't say.
        first_seen_at:
          type: string
          format: date-time
          description: When Aggrefine first found the offer in the merchant's feed.
        updated_at:
          type: string
          format: date-time
          description: >-
            When Aggrefine last found a change in the offer's values in the
            merchant's feed.
      required:
        - id
        - network
        - merchant
        - feed
        - sku
        - mpn
        - gtin
        - title
        - description
        - short_description
        - brand
        - category
        - price
        - old_price
        - currency
        - availability
        - shipping
        - color
        - size
        - pack_quantity
        - item_group_id
        - images
        - product_url
        - link
        - sub_id_template
        - attributes
        - source_updated_at
        - first_seen_at
        - updated_at
      description: >-
        One product in one merchant feed, with your channel's tracking link: the
        same shape for every network. Every field is always there; only `id`,
        `network`, `merchant` and `feed` are always set, any other may be null.
    Error:
      type: object
      properties:
        error:
          type: string
      required:
        - error
  securitySchemes:
    apiKey:
      type: http
      scheme: bearer
      description: An API key from Settings → Team → API keys in Aggrefine.

````

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