This is a multi-page printable view. Click here to print.

Or, return to the page.

Offer Service

Get currently active offers from AIRMILES.
Table of contents

Offer Service

The purpose of this document is to prvide a guide on how to integrate with the Offer Service API. This documentation will include use cases, request/response

High level

The Offer Service allows for a client to get offers available on the AIR MILES platform. There are two streams the Offer Service can flow, Authenticated and Public. Depending on the flow new functionality is provided by the Offer Service.

These are the API’s avaliable to clients from the Offer Service:

x Authenticated Public
/offers
/offers/{id}
/offers/{id}/state

There are more differences between Authenticated and Public, which we will get to when going more in-depth about each of the above API

API Overview

GET /offers

GET a list of offers, with applying filters, sorting, pagination and limits. The Offer API will return all the offers details that are needed to display the offer to the collector.

GET /offers/{id}

GET offer details for a specific offer, same offer object retuned as /offers. This API will also return the offer details for targeted offers without authorization as well as offers not in region.

PUT /offers/{id}/state

PUT offer states at collector-level, which tracking when a collector saved or unsaved an offer, or when a collector opted in to an offer.

Auth vs. Public

Two ways to integrate with any Offer Service API, depending on header.

  1. Authentication - This allows for partners to request offers that are avaliable to specific collectors (targeted offers), also allows for showing collector their state (saved/opted) for an offers, and allows collector to update the state of an offer.
  2. NO Authentication- This allows viewing of public offers (mass offers), also allows to get details of public offers.

1 - Mapping

Refrence UUID with partner, category and promotions.

This document contains the mappings of UUID’s to Partners, Categories, SubCategories, Promotions. We can discuss later how Offer Service /offers API can be used to get some of these mappings aswell.

Region

Code Name
BC British Columbia
AB Alberta
SK Saskatchewan
MB Manitoba
ON Ontario
QC Quebec
TB Thunder Bay
NB New Brunswick
NS Nova Scotia
PE Prince Edward Island
NL Newfoundland and Labrador
NT Northwest Territories
NU Nunavut
YT Yukon
ZZ for automated tests

Promotion

Id Name
784bbe95-5299-475b-b03b-5fb274e206c6 Our Top Picks
6ba6a652-b4d0-47bb-a431-146389cedb3b New Partner
7058d38e-b8db-4fd4-b66b-9ab8cb73544f THE MAGIC OF ONYX
8ccb04b6-e2fd-4eb6-8ca1-dc28652cca38 Flash Offers
93ae1d3b-f9b0-44cd-92d3-f5bfa617ad59 MORE WEEKEND MORE MILES
1930dd14-d3a7-418f-847c-cc4e56c38387 GOLDEN DAYS OF SUMMER
285b4858-3165-4041-a937-b01ee2e3e4ec Unwrap the App
27924c2-0942-4483-ab42-3f0b1772c840 TAKEOFF TO TASTES
905350da-27a4-11ec-9621-0242ac130002 BONUS BOOM Boost
1f0d2275-b289-4f7f-b72d-da76650ba1cf Offer Hub
26dd100d-9cb8-43cd-965e-b7b284ae8a92 BAG-A-BONUS
924ad367-f930-439c-93eb-823952d4228d Shop the Block
4db99143-1768-4f85-a44a-d6fa16011f7b Mega Miles

Partner

Id Name
5058f22a-1f5c-4625-b8ff-ffe116756722 TIMBER MART
33d0cf88-5eae-4186-be03-05092061eed9 HP
63e8543d-fbf7-458e-8712-d25332da3614 AIR MILES Travel
22a2cdfd-ff82-45f6-bc94-c14a3a533922 BMO Bank of Montreal
e914624c-9676-4287-8ce9-04de68dd0507 airmilesshops.ca
87ab4dd0-65b5-41a3-acd2-b97540dc1aff United Van Lines
ef73e58a-db63-4b27-baae-bd1e1d2ae86c Peter & Paul’s Gifts
0c988dcd-b2a9-4391-b2c4-48f0294d5658 Canadian Appliance Source
fbdc481f-3fa4-40e9-b1ca-d4dab4c36c30 All Purpose Realty
11892e84-a87e-48b0-bf13-fcd0be389588 Additional AIR MILES Partners
c13f2e1b-f828-4781-9369-fde0581c400d Onlia Insurance
19e1bb2b-88d4-4b37-be72-262a694ae58d National Car Rental
4a755252-876b-478e-9440-42961525e307 Metro
1563e943-25fd-480b-b77d-94aedc7202af LG Electronics
cbfcd38f-b1c0-4443-881c-c342833649a0 Fresh
91adc45f-0037-4fa8-9424-2e6e8f999467 SMASH + TESS
b90e694d-3510-4cc2-84be-f9b6f61bd31b Shell Mobility
27568f1b-c48d-4c27-8d9b-7c67666308c2 Dollarama
98d43a31-1c04-4db7-bfd3-b9a4a0ced034 Mayflower
9ab6f70f-588e-4460-b14c-ad4ad8c9a524 La Vie en Rose
1b36212c-87a6-448c-82a7-c2f28c8b6d52 HelloFresh
5a92c696-cddd-4255-920e-1f74b121e7ea Kernels
40786f15-10e1-490f-a4bf-38003770ad73 redtag.ca
38178928-9281-42aa-9f70-8c39c453baf1 Alamo Rent a Car

There are many partners not listed in this list.

Mapping from Offer Service

We can make a call to the Offer Service API to get these extended_metedata values.

Request

/offers?region=ON&extended_metadata=true

Response

{
    "offers":[],
    "metadata":{
        "total": N,
        "partners": [...],
        "categories": [...],
    }
}

The field partners in the response has id and labels. Region Dependent

The field categories in the response contains id and labels for categories and subcategories. Region agnostic

2 - API Library

This section provides information on the 3 API’s provided by the Offer Service.

Common Use Case

  • Get Offers By Province

    Request Response
    /offers?region=ON Get all offers in Ontario

  • Get Offers By Partner

    Request Response
    /offers?region=ON&partner_id=ID_1,ID_2 Get all offers related to partner with ID_1 OR ID_2, in Ontario

    ID_1 & ID_2 are UUID’s for partners. To get partner id for a specific partner check Mapping -> Partner documentation


Filter Combination

When multiple request parameters are passed, and/or multiple values are passed, the offers that satisfy the following logic are returned in the response.

(param1.valueA OR param1.valueB OR ...) AND (param2.valueX OR param2.valueY OR ...) AND (...)

For example, if request:

  • partner_id = A, B, C
  • category_id = X

/offers?region=ON&partner_id=A,B,C&category_id=X

Then the /offers response will return offers that satisfy: Offers where (partner=A OR partner=B OR partner=C) AND (category=X).

2.1 - GET /offers

Used to get multiple offers based on parametes.

GET /offers

This is the core API for Offer Service. API to get all details for displaying offers to collectors and the general public. This API has multiple query paramenter and headers that can change the response of the offers returned in varios ways.

Query Parameters

Name Rquired Type Discription
region ✔️ String (single value) Will only show offers from a single region
partner_id UUID (multiple value) Will return offers with only the provided parters
category_id UUID (multiple value) Will return offers with only the provided category
subcategory_id UUID (multiple value) Will return offers with only the provided subcategory
promotion_id UUID (single value) Will return offers with only the provided promotion
type String (multiple value) Specify offer types. ie: buy, spend
program_type String (multiple value) Specify offer program types. allowed values: traditionalcore, cardlinked, airmilesshops, bmopreapp
availability String (multiple value) Specify where offer is avaliable. allowed values: online, in-store
sort String (multiple value) Specify the order of the offers returned, check allowed values list.
offset Number (int) Specify how many offers to skip at the begining and then start showing the offers.
limit Number (int, min = 1, max = 96) Specify the number of offers to return

Authenticated

When calling /offers with a token (as a collector), a few more query paramaters are available to use in addition to all the ones metioned above.

Name Rquired Type Discription
states String (single value) Specify offers that have been interacted in some way by the collector. allowed values: SAVED, OPTED_IN
mass_offer Boolean Specify to show offers that are targeted, when mass_offer = false

Sort Value and Behaviours

Behaviour Sort Value Need Authentication? Discription
Default [promotionId,massOffer,…] Offers are grouped and sorted by promotion id, mass offer, and then ranked by partner priority, and then sorted by offer priority. This is the default sort used on the AirMiles website and mobile.
Ending soon [..] Offers are sorted by End Date first, grouped and sorted by partner priority second, and finally sorted by offer priority.
Collector Relevance [collectorRelevance] ✔️ This is sorting based on Collector prefrences powered by magic.
Region Relevance [regionRelevance] This is sorting based on most popular offers in the region powered by more magic.

Headers

Name Rquired Type Discription
X-Correlation-Id UUID This is used to track the request through the logs, if not provided it will be auto generated by API and returned in the header response
X-Origin-Client ✔️ String This field is to let us know where the request is coming from. ie: internal:amrp:postman, external:web:bmo
Accept-Language String - Locale This is let API know if you want the response back in some supported language. Allowed value: en-US, fr-CA

Authenticated

To make authenticated request you need an additional header. The tokens that are supported are member tokens, these tokens have an associated collecter specification.

Name Rquired Type Discription
Authorization Bearer {token} Specifies a collector when making call to this api. This will give the ability to see the offers tarrgeted for that collector and the states of offers

Response

The response has two main section offers and metadata. The latter is very simple just containing total count of offers that match the given filters in the query parameter.

lets focus on the offers:[] list which is a list of offer objects, lets talk about some key information thats returned to us in these offer objects (for full list of values retuned, check out Sample Response) :

Name Type Discription
id UUID Offer object ID
partnerId UUID Associated partner id
categoryId UUID Associated category id
awardShort String description of the award associated with offer
qualifierShort String Short description of what is needed to qualify for offer award
displayDate LocalDateTime When can this offer show up for collectors
startDate LocalDateTime When can this offer be avalilable for use by collectors. Usually same as displayDate
endDate LocalDateTime When can this offer be marked as expired so that no more collectors are able to see/use it
massOffer Boolean true = Offer is publicly avaliable, false = Offer is targeted to specific collectors.
tiers List<tier> Offers can have multiple qualifers and each can have a different award
mechanisms List How to qualify for the offer
states List<States> Authenticated Request Only Will give a list of states which are object showing the name, value and when it was updated
legalText String Legal copy for offer

Sample

Request

GET /offers?region=ON&limit=1 HTTP/1.1
Host: cdn.airmilesapis.ca
X-Origin-Client: internal:amrp:postman
Authorization: Bearer `TOKEN`

Response Body

{
  "offers": [
    {
      "id": "4a80ad4a-de28-4c77-8180-0a89a71f4a55",
      "partnerId": "3267588b-791d-49bc-a321-d85d5f818480",
      "partnerLabel": "AIR MILES",
      "partnerLogo": {
        "url": "https://dev.cdn.airmilesapis.ca/partner-logo/7m10wxejlkq7/69ZErUapt6c8WQioe6iYSS/5107f862d6a2b238ff6f7739c5a90992/AIRMILES_PLANE_ELECTRIC_BLUE_RGB_E.png"
      },
      "partnerProfileURL": "https://www.airmiles.ca/en/offers/partners/air-miles-reward-program-bonus-offers.html",
      "categoryId": "121fa2dd-1fab-4492-8c5d-fb34624f4dda",
      "categoryLabel": "Travel",
      "awardShort": "You could win a Walt Disney World vacation from AIR MILES®",
      "qualifierShort": "Enter with your Collector info. Plus, earn 4 extra entries when you book any trip with AIR MILES® Travel.*",
      "image": {
        "url": "https://s3.amazonaws.com/prod-l1-amrpwl-post-images/processed-images/4008e08c-cd46-4429-bdc6-ce763cf4731a"
      },
      "displayDate": "2024-05-07T00:00:00",
      "startDate": "2024-05-07T00:00:00",
      "endDate": "2024-05-26T23:59:59",
      "description": "Contest ends May 26, 2024. Must be 18 years or older to enter. No purchase necessary. Contest Rules apply. ",
      "programType": "traditionalcore",
      "massOffer": true,
      "displayPriority": 1000,
      "tiers": [
        {
          "awardLong": "You could win a Walt Disney World vacation from AIR MILES®",
          "qualifierLong": "Enter with your Collector info. Plus, earn 4 extra entries when you book any trip with AIR MILES® Travel.*"
        }
      ],
      "mechanisms": [
        {
          "mechanismType": "button",
          "mechanismLabel": "Enter now",
          "mechanismValue": "https://www.airmiles.ca/arrow/Splash?splashId=26100080&changeLocale=en_CA"
        }
      ],
      "states": [
        {
          "name": "OPT_IN",
          "value": "OPTED_IN",
          "updatedAt": "2024-04-29T13:56:09.083363Z"
        },
        {
          "name": "SAVE",
          "value": "SAVED",
          "updatedAt": "2024-04-29T13:56:09.082147Z"
        }
      ],
      "legalText": "The Contest runs from May 6, 2024 to May 26, 2024 and is open to Canadian resident AIR MILES® collectors who have reached the age of 18. *NO PURCHASE NECESSARY Collectors can visit https://airmiles.ca/magicalmemories\nto complete and submit the form and get 1x entry. To get 4 additional entries collectors must book any trip on AIR MILES Travel during the contest period and complete their trip by July 31, 2024 (or complete the alternative bonus entry method outlined in the full contest rules). Limit one (1) base entry and four (4) bonus entries per collector number. One (1) prize is available to be won consisting of a vacation for four (4) to the Walt Disney World Resort in Florida. Approximate Prize value is $10,219.00 USD ($13,285.00 CDN). Correctly answered math skill-testing question required upon selection as a potential winner. Odds of winning depend on the number of eligible entries received. For full contest rules and details, visit https://airmiles.ca/magicalmemories\n\n®™ Trademarks of AM Royalties Limited Partnership used under license by AIR MILES Loyalty Inc.\n"
    }
  ],
  "metadata": {
    "total": 265
  }
}

Response Header

X-Correlation-Id a0ccb3a7-2b19-4916-8b7e-d3059ccc17bb

For support its best to keep track of the X-Correlation-Id value, as that can be used to track down logs for this request.

2.2 - GET /offers/{id}

Used to get single offer detail.

GET /offers/{id}

API to get all details for displaying a specific offer to collectors and the general public. This API has limited query paramenter as this is accessing a specific offer resource.

Path Parameter

Name Rquired Type Discription
id ✔️ UUID (single value) Returns the offer detail associated with this id

Query Parameter

Name Rquired Type Discription
region ✔️ String (single value) Will only show offers from a single region

Headers

Name Rquired Type Discription
X-Correlation-Id UUID This is used to track the request through the logs, if not provided it will be auto generated by API and returned in the header response
X-Origin-Client ✔️ String This field is to let us know where the request is coming from. ie: internal:amrp:postman, external:web:bmo
Accept-Language String - Locale This is let API know if you want the response back in some supported language. Allowed value: en-US, fr-CA

Authenticated

To make authenticated request you need an additional header. The tokens that are supported are member tokens, these tokens have an associated collecter specification.

Name Rquired Type Discription
Authorization Bearer {token} Specifies a collector when making call to this api. This will give the ability to see the offers states for the collector

Response

The response has two main section offers and warning.

The warning object has two states depending on region query parameter, authentication header and offer id passed:

  "warning":null

OR

  "warning": {
        "errorCode": "String - errCodes",
        "message": "String"
    }

Error Code

name Offer Returned description
err-login-required YES When viewing a targetted offer without any authorization header
err-region YES When viewing an offer that does not match the region query parameter in the request
err-not-found NO Offer Id does not exist, Offer Id not valid
err-expired NO Offer is expired
err-not-live NO Future offer, Not live yet (current date < display start date)
err-exclusive NO Targeted Offer - Collector is not eligible for the Offer

lets talk about some key information thats returned to us in the offer objects (for full list of values retuned, check out Sample Response) :

Name Type Discription
id UUID Offer object ID
partnerId UUID Associated partner id
categoryId UUID Associated category id
awardShort String description of the award associated with offer
qualifierShort String Short description of what is needed to qualify for offer award
displayDate LocalDateTime When can this offer show up for collectors
startDate LocalDateTime When can this offer be avalilable for use by collectors. Usually same as displayDate
endDate LocalDateTime When can this offer be marked as expired so that no more collectors are able to see/use it
massOffer Boolean true = Offer is publicly avaliable, false = Offer is targeted to specific collectors.
tiers List<tier> Offers can have multiple qualifers and each can have a different award
mechanisms List How to qualify for the offer
states List<States> Authenticated Request Only, Will give a list of states which are object showing the name, value and when it was updated
legalText String Legal copy for offer

Sample

Request

GET /offers/4a80ad4a-de28-4c77-8180-0a89a71f4a55?region=ON HTTP/1.1
Host: cdn.airmilesapis.ca
X-Origin-Client: internal:amrp:postman
Authorization: Bearer `TOKEN`

Response Body

{
  "offer": {
    "id": "4a80ad4a-de28-4c77-8180-0a89a71f4a55",
    "partnerId": "3267588b-791d-49bc-a321-d85d5f818480",
    "partnerLabel": "AIR MILES",
    "partnerLogo": {
      "url": "https://dev.cdn.airmilesapis.ca/partner-logo/7m10wxejlkq7/69ZErUapt6c8WQioe6iYSS/5107f862d6a2b238ff6f7739c5a90992/AIRMILES_PLANE_ELECTRIC_BLUE_RGB_E.png"
    },
    "partnerProfileURL": "https://www.airmiles.ca/en/offers/partners/air-miles-reward-program-bonus-offers.html",
    "categoryId": "121fa2dd-1fab-4492-8c5d-fb34624f4dda",
    "categoryLabel": "Travel",
    "awardShort": "You could win a Walt Disney World vacation from AIR MILES®",
    "qualifierShort": "Enter with your Collector info. Plus, earn 4 extra entries when you book any trip with AIR MILES® Travel.*",
    "image": {
      "url": "https://s3.amazonaws.com/prod-l1-amrpwl-post-images/processed-images/4008e08c-cd46-4429-bdc6-ce763cf4731a"
    },
    "displayDate": "2024-05-07T00:00:00",
    "startDate": "2024-05-07T00:00:00",
    "endDate": "2024-05-26T23:59:59",
    "description": "Contest ends May 26, 2024. Must be 18 years or older to enter. No purchase necessary. Contest Rules apply. ",
    "programType": "traditionalcore",
    "massOffer": true,
    "eventBasedOffer": false,
    "displayPriority": 1000,
    "tiers": [
      {
        "awardLong": "You could win a Walt Disney World vacation from AIR MILES®",
        "qualifierLong": "Enter with your Collector info. Plus, earn 4 extra entries when you book any trip with AIR MILES® Travel.*"
      }
    ],
    "mechanisms": [
      {
        "mechanismType": "button",
        "mechanismLabel": "Enter now",
        "mechanismValue": "https://www.airmiles.ca/arrow/Splash?splashId=26100080&changeLocale=en_CA"
      }
    ],
    "states": [
      {
        "name": "OPT_IN",
        "value": "OPTED_IN",
        "updatedAt": "2024-04-29T13:56:09.083363Z"
      },
      {
        "name": "SAVE",
        "value": "SAVED",
        "updatedAt": "2024-04-29T13:56:09.082147Z"
      }
    ],
    "legalText": "The Contest runs from May 6, 2024 to May 26, 2024 and is open to Canadian resident AIR MILES® collectors who have reached the age of 18. *NO PURCHASE NECESSARY Collectors can visit https://airmiles.ca/magicalmemories\nto complete and submit the form and get 1x entry. To get 4 additional entries collectors must book any trip on AIR MILES Travel during the contest period and complete their trip by July 31, 2024 (or complete the alternative bonus entry method outlined in the full contest rules). Limit one (1) base entry and four (4) bonus entries per collector number. One (1) prize is available to be won consisting of a vacation for four (4) to the Walt Disney World Resort in Florida. Approximate Prize value is $10,219.00 USD ($13,285.00 CDN). Correctly answered math skill-testing question required upon selection as a potential winner. Odds of winning depend on the number of eligible entries received. For full contest rules and details, visit https://airmiles.ca/magicalmemories\n\n®™ Trademarks of AM Royalties Limited Partnership used under license by AIR MILES Loyalty Inc.\n"
  },
  "warning": null
}

Response Header

X-Correlation-Id a7b3b6a8-f033-4e78-804e-f1990f317515

For support its best to keep track of the X-Correlation-Id value, as that can be used to track down logs for this request.

2.3 - PUT /offers/{id}/states

Used to update single offer state for a collector.

PUT /offers/{id}/states

API to update the state of an offer for a given collector. This API can only be used with a Authorization token, as thats how the API knows which collector should be associated with the action.

Path Parameter

Name Rquired Type Discription
id ✔️ UUID (single value) Identify the offer to updated its state

Request Body

required

{
  "states": [
    {
      "name": "name1",
      "value": "value1"
    }
  ]
}

The request body contains a states: [] list which can contain multiple state objects.

Name Rquired Type Discription
name ✔️ String This specifies the type of state to update, as of now we support SAVE and OPT_IN
value ✔️ String The values associated with the state to update. For name equals SAVE valid value is SAVED OR UNSAVED, for name equals OPT_IN valid value is OPTED_IN

Headers

Name Rquired Type Discription
X-Correlation-Id UUID This is used to track the request through the logs, if not provided it will be auto generated by API and returned in the header response
X-Origin-Client ✔️ String This field is to let us know where the request is coming from. ie: internal:amrp:postman, external:web:bmo
Authorization ✔️ Bearer {token} Specifies a collector when making call to this api.

Response

As this is a PUT request there is no response body. Check for status code 204 No Content for successful request.

Sample

Request

PUT /offers/e6528c38-6642-497d-85ca-f71cc5a74583/states HTTP/1.1
Host: cdn.airmilesapis.ca
Authorization: Bearer {JWT_TOKEN}
x-origin-client: internal:amrp:postman
Content-Type: application/json
Content-Length: 102

{
    "states": [
        {
            "name": "SAVE",
            "value": "SAVED"
        }
    ]
}

Response

Body

Status Code

Status-Code: 204 No Content
X-Correlation-Id a7b3b6a8-f033-4e78-804e-f1990f317515

For support its best to keep track of the X-Correlation-Id value, as that can be used to track down logs for this request.

3 - Example Requests and Responses

This section provides examples of requests and responses for the Offer Service API.

    Authenticated Calls

    This document will show the use case for when and how to use a machine to machine token with collector number to get collector data. Collector-Number header is usually set by us decoding the member token but this process wont work for when clients want to use the m2m token, so client would have to send Collector-Number header ONLY when using m2m.

    Collector-Number header should not be passed when using a member token, we have auth rules that will fail the request when this happens

    Feed mapping

    Feed mapping

    There are a lot of filters and sort combinitions in Offer Service. This gives clients a lot of flexibility in how to use /offers but can get combursome to keep specifing the same query parameter in every request across multiple places. To solve for this issue we have feed mapping. Feed mapping is a way to predefine a set of query parameters and their values. Each of this feed mapping is mapped to a specific X-Origin-Client. This way the client can just specify the X-Origin-Client and the feed mapping will be applied.

    Offer API Use Case Examples

    This document will dicuss specific use cases for the Offer API. How to make a request and what the response will look like.

    Our Top Picks

    This is a simple request to get the top offers for a specific region. This is not paginated and will return the first 20 offers. To limit the number of offers you can use the limit query parameter. The limit query parameter can be used to limit the number of offers returned. The max value for limit is 96. The default value is 20.

Metadata Information

The only api that supports extended_metadata is the /offers api. This will return a list of partners and categories. The id field in the response can be used to filter the offers by partner or category or subcategory. By default this field is set as false and can be enabled by passing extended_metadata=true in the query params.

The metadata can also be effected by other filters such as partner_id, category_id, subcategory_id, promotion_id, type, program_type, states, availability, mass_offer, event_based, experiment, exclude_partner_id. As those will change the counts of total offers.

Request

GET /offers?region=ON&extended_metadata=true&limit=1

Response

{
    "offers": [
        {
            "id": "6fdb76f3-fa1c-47d7-858e-ceec5ee53542",
            "partnerId": "60d672dd-c9a0-40c7-bd76-b68fc8ef536a",
            "partnerLabel": "AIR MILES Receipts",
            "partnerLogo": {
                "url": "https://cdn.airmilesapis.ca/partner-logo/7m10wxejlkq7/7LdqxL861Z8azcZ1tRvwJ7/85a924af5bc68c70b8fa147abdf48ed2/RECI-logo.png"
            },
            "partnerProfileURL": "https://www.airmiles.ca/en/offers/partners/air-miles-receipts.html",
            "categoryId": "0a889711-9ab8-4972-a0b5-b9eafc8fa312",
            "categoryLabel": "Retail",
            "promotionId": "6ba6a652-b4d0-47bb-a431-146389cedb3b",
            "promotionLabel": "New Partner",
            "awardShort": "50 Bonus Miles",
            "qualifierShort": "when you scan a MEC receipt through AIR MILES® Receipts with a spend of at least $120 (before taxes) on your favourite products.*",
            "image": {
                "url": "https://cdn.airmilesapis.ca/offer-image/processed-images/e9c4e1cc-0281-4912-b040-44a147fea1da.jpg"
            },
            "displayDate": "2025-05-15T00:00:00",
            "startDate": "2025-05-15T00:00:00",
            "endDate": "2025-08-27T23:59:59",
            "description": "limit 1 per collector per week period",
            "programType": "traditionalcore",
            "massOffer": true,
            "displayPriority": 1000,
            "tiers": [
                {
                    "awardValue": 50.0,
                    "awardLong": "50 Bonus Miles",
                    "qualifierLong": "when you scan a MEC receipt through AIR MILES® Receipts with a spend of at least $120 (before taxes) on your favourite products.*"
                }
            ],
            "mechanisms": [
                {
                    "mechanismType": "button",
                    "mechanismLabel": "Scan A Receipt",
                    "mechanismValue": "https://mobileapp.airmiles.ca/D2Ua/a7qlaw2q"
                }
            ],
            "legalText": "Offer valid from May 15 to 11:59 p.m. August 27, 2025 in Alberta, British Columbia, Manitoba, New Brunswick, Newfoundland and Labrador, Northwest Territories, Nova Scotia, Nunavut, Ontario, Prince Edward Island, Québec, Saskatchewan, Thunder Bay, Yukon. \n\nMinimum qualifying spend of $120 must be made in-person at the retailer, in a single transaction, during the offer period. The minimum qualifying spend is calculated before taxes and after all discounts and exclusions are applied. Only receipts printed in-store are eligible for this offer. While quantities of 50 Miles last. \n\nWe reserve the right to limit or make changes to the offer and to terminate the offer at any time, for any reason and without notice. Personal purchases only. To qualify, original receipt must be scanned within 14 days of eligible purchase. No duplicates. Click “Qualifying Details” for receipt verification requirements. Limit of 1 offer uses per AIR MILES collector number. This offer can be combined with other offers, including AIR MILES offers. Void where prohibited. Please allow up to 120 days for receipts to be verified and Bonus Miles to be posted to your collector account. \n\n®™ Trademarks of AM Royalties Limited Partnership used under license by AIR MILES Loyalty Inc. and Mountain Equipment Company Ltd. Partner, supplier and retailer trademarks are owned by the respective partner, supplier and retailer or authorized for their use in Canada",
            "eventBasedOffer": false
        }
    ],
    "metadata": {
        "total": 138,
        "partners": [
            {
                "id": "7b99e1e8-704f-450b-ac15-62c7ae842223",
                "count": 1,
                "label": "Airalo"
            },
            {
                "id": "c0475571-73af-4a7e-a716-fafe5852dd5f",
                "count": 1,
                "label": "Robert Barakett"
            },
            {
                "id": "33d0cf88-5eae-4186-be03-05092061eed9",
                "count": 1,
                "label": "HP"
            },
            {
                "id": "5058f22a-1f5c-4625-b8ff-ffe116756722",
                "count": 2,
                "label": "TIMBER MART"
            },
            {
                "id": "4c736b45-3e3c-4561-95de-6fc0f8d9356f",
                "count": 1,
                "label": "Ever New"
            },
            {
                "id": "1c8a5a98-d880-4dee-a409-76bb18dc6bd1",
                "count": 1,
                "label": "OLG"
            },
            {
                "id": "22a2cdfd-ff82-45f6-bc94-c14a3a533922",
                "count": 2,
                "label": "BMO Bank of Montreal"
            },
            {
                "id": "e914624c-9676-4287-8ce9-04de68dd0507",
                "count": 26,
                "label": "airmilesshops.ca"
            },
            {
                "id": "1d5c3094-8c71-4815-a15e-412dfd99c7c3",
                "count": 1,
                "label": "Adidas"
            },
            {
                "id": "b6ff0d3b-dd58-43ae-a004-7db06eee13ee",
                "count": 1,
                "label": "Fit4Less"
            },
            {
                "id": "ec97d51a-1041-47f0-a1ff-255e082d11b9",
                "count": 1,
                "label": "Nardini Specialties"
            },
            {
                "id": "ef73e58a-db63-4b27-baae-bd1e1d2ae86c",
                "count": 1,
                "label": "Peter & Paul's Gifts"
            },
            {
                "id": "e0a072dd-f9f3-41e0-9f9b-c47efd099d4f",
                "count": 1,
                "label": "Shiseido"
            },
            {
                "id": "60d672dd-c9a0-40c7-bd76-b68fc8ef536a",
                "count": 1,
                "label": "AIR MILES Receipts"
            },
            {
                "id": "50540031-46c9-4ade-a3bb-1805844118df",
                "count": 1,
                "label": "Baskits"
            },
            {
                "id": "4c06d824-61f0-4876-ada0-ada98902917c",
                "count": 1,
                "label": "Budget Car Rental"
            },
            {
                "id": "200bf1dc-15bc-4e63-8e47-1df3b3f320dc",
                "count": 1,
                "label": "Drunk Elephant"
            },
            {
                "id": "6a8231fb-5d17-44c5-b4e4-05baffc1f7e1",
                "count": 1,
                "label": "Clé de Peau Beauté"
            },
            {
                "id": "10def07d-bae9-463c-bf88-28169a1fa922",
                "count": 1,
                "label": "NARS"
            },
            {
                "id": "235ede29-8dfc-40ad-984b-e8d4d9261a09",
                "count": 1,
                "label": "Avis"
            },
            {
                "id": "0c2b557f-ae1c-4e3f-b78e-d013b22217d0",
                "count": 1,
                "label": "Emma Sleep"
            },
            {
                "id": "1563e943-25fd-480b-b77d-94aedc7202af",
                "count": 1,
                "label": "LG Electronics"
            },
            {
                "id": "b90e694d-3510-4cc2-84be-f9b6f61bd31b",
                "count": 20,
                "label": "Shell Mobility"
            },
            {
                "id": "43328b82-e107-48d6-8026-552ca67c14cd",
                "count": 1,
                "label": "United Beans Coffee Roastery"
            },
            {
                "id": "26bc9e95-fbe2-49df-aafe-1943ef326b80",
                "count": 1,
                "label": "Asus"
            },
            {
                "id": "337e5aea-f67d-41fa-aef3-f628d1dd280b",
                "count": 1,
                "label": "Sephora"
            },
            {
                "id": "63e8543d-fbf7-458e-8712-d25332da3614",
                "count": 37,
                "label": "AIR MILES Travel"
            },
            {
                "id": "cdcb2cc9-6720-4c34-aa59-02af5a7088f5",
                "count": 3,
                "label": "Pharmasave"
            },
            {
                "id": "cd1647ac-14d1-4e25-bd6b-b9ee874e9fa2",
                "count": 1,
                "label": "Factor"
            },
            {
                "id": "78e7d401-012a-46a5-aeba-8e88726a905b",
                "count": 1,
                "label": "Flash Offers"
            },
            {
                "id": "8d26fb71-ef30-47cc-904e-49e3f877271d",
                "count": 1,
                "label": "Rewarding Your Opinions by Dynata"
            },
            {
                "id": "0a9e595d-18c9-4f42-a8e0-bc3a45e96856",
                "count": 1,
                "label": "Jiffy Lube"
            },
            {
                "id": "6cfbad8d-946a-460c-b181-702f518a68da",
                "count": 1,
                "label": "Moroccanoil"
            },
            {
                "id": "3267588b-791d-49bc-a321-d85d5f818480",
                "count": 4,
                "label": "AIR MILES"
            },
            {
                "id": "967907ee-fcc9-4610-8301-908c4728eeda",
                "count": 2,
                "label": "Super Channel"
            },
            {
                "id": "8dd859c1-55d1-4157-8afc-7607297bdfeb",
                "count": 2,
                "label": "Global Pet Foods"
            },
            {
                "id": "19e1bb2b-88d4-4b37-be72-262a694ae58d",
                "count": 1,
                "label": "National Car Rental"
            },
            {
                "id": "cbfcd38f-b1c0-4443-881c-c342833649a0",
                "count": 1,
                "label": "Fresh"
            },
            {
                "id": "024e36c1-aedf-47d4-a3dc-426ce790d81c",
                "count": 1,
                "label": "Lyft"
            },
            {
                "id": "3c09f903-7334-4d2b-82ba-22f178c8b96f",
                "count": 1,
                "label": "Mini Mioche"
            },
            {
                "id": "1b36212c-87a6-448c-82a7-c2f28c8b6d52",
                "count": 1,
                "label": "HelloFresh"
            },
            {
                "id": "ca4bf2db-2bd4-43c1-9d25-de31c04597a8",
                "count": 1,
                "label": "Dell"
            },
            {
                "id": "03b4f3f7-f5cd-4840-b2e8-474057e686fc",
                "count": 5,
                "label": "AIR MILES Local Partners"
            },
            {
                "id": "5a92c696-cddd-4255-920e-1f74b121e7ea",
                "count": 1,
                "label": "Kernels"
            },
            {
                "id": "38178928-9281-42aa-9f70-8c39c453baf1",
                "count": 1,
                "label": "Alamo Rent a Car"
            }
        ],
        "categories": [
            {
                "id": "22b666ae-97c2-4e57-a437-e977de6beef4",
                "label": "Grocery",
                "count": 3,
                "subCategories": [
                    {
                        "id": "4683cd1f-bba8-4dd0-b960-4324a246960b",
                        "label": "Baby",
                        "count": 0
                    },
                    {
                        "id": "873c7bfa-745e-4bdd-afe2-55425821d721",
                        "label": "Bakery",
                        "count": 0
                    },
                    {
                        "id": "d614fed9-8c17-4c20-a179-2351e54679c1",
                        "label": "Beverages",
                        "count": 0
                    },
                    {
                        "id": "eab2662b-bfc5-4457-8cbf-33d9e10f9bb6",
                        "label": "Dairy and Eggs",
                        "count": 0
                    },
                    {
                        "id": "f1f75e01-8b8f-460c-bc89-8bdb40060e7c",
                        "label": "Deli and Prepared Food",
                        "count": 0
                    },
                    {
                        "id": "da4cdf1b-e2f0-4b1c-99b7-c0ce4696292f",
                        "label": "Frozen Foods",
                        "count": 0
                    },
                    {
                        "id": "37485ad6-07ad-4145-80f1-fbecdd46a26a",
                        "label": "Fruits and Vegetables",
                        "count": 0
                    },
                    {
                        "id": "0d3245ac-9812-4bc3-9020-16b1349f1531",
                        "label": "Meat and Seafood",
                        "count": 0
                    },
                    {
                        "id": "be58904e-4ae9-49fc-ac6d-0e966dc193bb",
                        "label": "Pantry",
                        "count": 0
                    },
                    {
                        "id": "d295e726-8205-4a41-8207-a6e31714dde3",
                        "label": "Snacks",
                        "count": 0
                    },
                    {
                        "id": "53a177af-b923-43ea-ac7d-0230ea0db805",
                        "label": "Vegan and Vegetarian",
                        "count": 0
                    },
                    {
                        "id": "3c4b099b-061c-493b-8bc4-4ced119949c4",
                        "label": "Organic Groceries",
                        "count": 0
                    },
                    {
                        "id": "e9c77b08-a3e5-4846-90e5-9e9ad0f34de1",
                        "label": "Other Grocery",
                        "count": 0
                    }
                ]
            },
            {
                "id": "1ba636e3-799d-44c3-9c84-42a3df6430b0",
                "label": "Household Supplies",
                "count": 0,
                "subCategories": [
                    {
                        "id": "279ecbd8-b81b-4d46-9726-8fdd4dee8af8",
                        "label": "Cleaning",
                        "count": 0
                    },
                    {
                        "id": "43cf7742-601f-43ef-9934-3a461493eb4e",
                        "label": "Laundry",
                        "count": 0
                    },
                    {
                        "id": "0b9d187d-bbf2-4884-9e10-2df4c97bcd3f",
                        "label": "Paper and Plastics",
                        "count": 0
                    }
                ]
            },
            {
                "id": "0f597ee1-16b8-4a4f-beb7-4654cfd0b45a",
                "label": "Pharmacy",
                "count": 3,
                "subCategories": [
                    {
                        "id": "4683cd1f-bba8-4dd0-b960-4324a246960b",
                        "label": "Baby",
                        "count": 0
                    },
                    {
                        "id": "dc725f55-1c70-4088-8108-cc199bd2ca32",
                        "label": "Beauty",
                        "count": 0
                    },
                    {
                        "id": "ef1ff9bd-6032-4c14-8c51-8b1f43dd0970",
                        "label": "Medicine and Health",
                        "count": 0
                    },
                    {
                        "id": "d871a234-93f3-47f0-991a-b230cb797d74",
                        "label": "Personal Care",
                        "count": 0
                    }
                ]
            },
            {
                "id": "c7a208f3-8f94-4460-b76c-3c75ae53417d",
                "label": "Liquor",
                "count": 1,
                "subCategories": [
                    {
                        "id": "0dd2f52d-af4a-45f9-aa1c-c66cd13f16e6",
                        "label": "Beer and Cider",
                        "count": 0
                    },
                    {
                        "id": "6cad2024-2bc8-47f5-b563-53f97c1f7205",
                        "label": "Coolers",
                        "count": 0
                    },
                    {
                        "id": "b3962476-bb50-47c2-af54-3bdec43fa499",
                        "label": "Spirits",
                        "count": 0
                    },
                    {
                        "id": "8b618c88-cd2c-47fa-9de7-677fe1d3737f",
                        "label": "Wine",
                        "count": 0
                    }
                ]
            },
            {
                "id": "38d878d7-c3e0-4ea1-8e6c-d4759f307042",
                "label": "Pets",
                "count": 2
            },
            {
                "id": "77c6067e-bd25-43a9-826c-7a4788581952",
                "label": "Home and Garden",
                "count": 5
            },
            {
                "id": "0333d0e5-68be-4833-939f-3a20d0cc9806",
                "label": "Fuel and Auto",
                "count": 21
            },
            {
                "id": "0cbc9203-2811-4eae-9dc1-68da692658b8",
                "label": "Financial",
                "count": 3
            },
            {
                "id": "0a889711-9ab8-4972-a0b5-b9eafc8fa312",
                "label": "Retail",
                "count": 20
            },
            {
                "id": "0387d04b-2736-48e4-b804-ac50f4222b79",
                "label": "Office",
                "count": 0
            },
            {
                "id": "121fa2dd-1fab-4492-8c5d-fb34624f4dda",
                "label": "Travel",
                "count": 43
            },
            {
                "id": "17180943-4cef-4fb8-833d-9919e359e4f3",
                "label": "Gift Cards",
                "count": 0
            },
            {
                "id": "e10dea41-3aee-4a24-bc8d-0d8de8c3e5ae",
                "label": "airmilesshops.ca",
                "count": 27
            },
            {
                "id": "cc1b19d6-72e0-47bc-8b81-2b1fbb49d050",
                "label": "Other",
                "count": 10
            }
        ]
    }
}

Category Filtering

Just like partner_id, category_id can also be used to filter the offers either by single or multiple values. The same way subcategory_id can be used to filter the offers by subcategory.

Request

GET /offers?limit=1&extended_metadata=true&region=ON&category_id=22b666ae-97c2-4e57-a437-e977de6beef4,0f597ee1-16b8-4a4f-beb7-4654cfd0b45a

Response

{
    "offers": [
        {
            "id": "240ac0c9-7376-4e1d-82f6-580d7caa26da",
            "partnerId": "ec97d51a-1041-47f0-a1ff-255e082d11b9",
            "partnerLabel": "Nardini Specialties",
            "partnerLogo": {
                "url": "https://cdn.airmilesapis.ca/partner-logo/7m10wxejlkq7/2nmfnRx8NuWlN0Q6CDRXva/fc20f42a74915de46d23f8dd9783023d/NARDINI_LOGO_-_jpg.jpg"
            },
            "partnerProfileURL": "https://www.airmiles.ca/en/offers/partners/nardini-specialties.html",
            "categoryId": "22b666ae-97c2-4e57-a437-e977de6beef4",
            "categoryLabel": "Grocery",
            "promotionId": "6ba6a652-b4d0-47bb-a431-146389cedb3b",
            "promotionLabel": "New Partner",
            "awardShort": "10 Bonus Miles",
            "qualifierShort": "Get 10 Bonus Miles for every $40 spent online at https://www.nardinispecialties.ca/ or in store at Nardini Specialties in a single transaction.*",
            "image": {
                "url": "https://cdn.airmilesapis.ca/offer-image/processed-images/0df97dd2-ff40-45de-b4b2-580070f1d5ca.jpg"
            },
            "displayDate": "2025-07-01T00:00:00",
            "startDate": "2025-07-01T00:00:00",
            "endDate": "2025-09-30T23:59:59",
            "programType": "cardlinked",
            "massOffer": true,
            "displayPriority": 0,
            "tiers": [
                {
                    "awardValue": 10.0,
                    "awardLong": "10 Bonus Miles",
                    "qualifierLong": "Get 10 Bonus Miles for every $40 spent online at https://www.nardinispecialties.ca/ or in store at Nardini Specialties in a single transaction.*"
                }
            ],
            "mechanisms": [
                {
                    "mechanismType": "noAction"
                }
            ],
            "legalText": "Offer valid for all linked cards.\n\n* Offer available to AIR MILES collectors with an eligible Canadian-issued Mastercard credit card or an eligible Bank of Montreal (BMO) issued debit card associated with a BMO Personal Banking account that is linked to their AIR MILES Collector Account (a “Linked Card”). Offer valid from July 1, 2025 to September 30, 2025. Valid at https://www.nardinispecialties.ca and Nardini Specialties store location in Canada while quantity of AIR MILES Bonus Miles last.  \nThere is no offer limit. This offer can be combined with other offers.  \nThe minimum qualifying purchase or spend amount is calculated based on the total transaction amount charged to your Linked Card, including taxes, shipping and handling, as applicable. To qualify for the offer, the eligible purchase transaction(s) must be posted to your Linked Card account by the offer end date. For example, in the case of an online purchase made during the offer period, it may not qualify if the transaction is processed on the shipping date and that date occurs after the offer ends. Please allow up to 30 days after the offer end date for Bonus Miles to be posted to your AIR MILES collector account. Your Linked Card account must be in good standing at the time the Bonus Miles are awarded. Additionally, your AIR MILES Collector Account must be active at the time you make the qualifying purchase. \nNeither Mastercard International Incorporated nor Interac Corp. are responsible for the fulfillment of any offer. Purchases made by an authorized user of a supplementary card linked to the Linked Card do not qualify, unless the supplementary card is also linked to the AIR MILES collector number. AIR MILES reserves the right to make changes to this offer and to withdraw the offer at any time, for any reason and without notice. Before you make a purchase, make sure the offer still actively appears on airmiles.ca/cardlinkedoffers and/or in your AIR MILES offers feed. All offers are subject to the AIR MILES Card Linked Offers Terms and Conditions found online at airmilescardlink.ca/terms, which includes information about how to unlink your AIR MILES Collector account if you no longer wish to participate in Card Linked Offers.",
            "cardType": [
                "NonBmoMastercard",
                "BmoMastercard",
                "BmoDebit",
                "BmoVisa"
            ],
            "eventBasedOffer": false,
            "ctaLabel": {
                "en-US": "SHOP NOW "
            },
            "ctaUrl": {
                "en-US": "https://www.nardinispecialties.ca/"
            }
        }
    ],
    "metadata": {
        "total": 6,
        "partners": [
            {
                "id": "cdcb2cc9-6720-4c34-aa59-02af5a7088f5",
                "count": 3,
                "label": "Pharmasave"
            },
            {
                "id": "cd1647ac-14d1-4e25-bd6b-b9ee874e9fa2",
                "count": 1,
                "label": "Factor"
            },
            {
                "id": "ec97d51a-1041-47f0-a1ff-255e082d11b9",
                "count": 1,
                "label": "Nardini Specialties"
            },
            {
                "id": "1b36212c-87a6-448c-82a7-c2f28c8b6d52",
                "count": 1,
                "label": "HelloFresh"
            }
        ],
        "categories": [
            {
                "id": "22b666ae-97c2-4e57-a437-e977de6beef4",
                "label": "Grocery",
                "count": 3,
                "subCategories": [
                    {
                        "id": "4683cd1f-bba8-4dd0-b960-4324a246960b",
                        "label": "Baby",
                        "count": 0
                    },
                    {
                        "id": "873c7bfa-745e-4bdd-afe2-55425821d721",
                        "label": "Bakery",
                        "count": 0
                    },
                    {
                        "id": "d614fed9-8c17-4c20-a179-2351e54679c1",
                        "label": "Beverages",
                        "count": 0
                    },
                    {
                        "id": "eab2662b-bfc5-4457-8cbf-33d9e10f9bb6",
                        "label": "Dairy and Eggs",
                        "count": 0
                    },
                    {
                        "id": "f1f75e01-8b8f-460c-bc89-8bdb40060e7c",
                        "label": "Deli and Prepared Food",
                        "count": 0
                    },
                    {
                        "id": "da4cdf1b-e2f0-4b1c-99b7-c0ce4696292f",
                        "label": "Frozen Foods",
                        "count": 0
                    },
                    {
                        "id": "37485ad6-07ad-4145-80f1-fbecdd46a26a",
                        "label": "Fruits and Vegetables",
                        "count": 0
                    },
                    {
                        "id": "0d3245ac-9812-4bc3-9020-16b1349f1531",
                        "label": "Meat and Seafood",
                        "count": 0
                    },
                    {
                        "id": "be58904e-4ae9-49fc-ac6d-0e966dc193bb",
                        "label": "Pantry",
                        "count": 0
                    },
                    {
                        "id": "d295e726-8205-4a41-8207-a6e31714dde3",
                        "label": "Snacks",
                        "count": 0
                    },
                    {
                        "id": "53a177af-b923-43ea-ac7d-0230ea0db805",
                        "label": "Vegan and Vegetarian",
                        "count": 0
                    },
                    {
                        "id": "3c4b099b-061c-493b-8bc4-4ced119949c4",
                        "label": "Organic Groceries",
                        "count": 0
                    },
                    {
                        "id": "e9c77b08-a3e5-4846-90e5-9e9ad0f34de1",
                        "label": "Other Grocery",
                        "count": 0
                    }
                ]
            },
            {
                "id": "1ba636e3-799d-44c3-9c84-42a3df6430b0",
                "label": "Household Supplies",
                "count": 0,
                "subCategories": [
                    {
                        "id": "279ecbd8-b81b-4d46-9726-8fdd4dee8af8",
                        "label": "Cleaning",
                        "count": 0
                    },
                    {
                        "id": "43cf7742-601f-43ef-9934-3a461493eb4e",
                        "label": "Laundry",
                        "count": 0
                    },
                    {
                        "id": "0b9d187d-bbf2-4884-9e10-2df4c97bcd3f",
                        "label": "Paper and Plastics",
                        "count": 0
                    }
                ]
            },
            {
                "id": "0f597ee1-16b8-4a4f-beb7-4654cfd0b45a",
                "label": "Pharmacy",
                "count": 3,
                "subCategories": [
                    {
                        "id": "4683cd1f-bba8-4dd0-b960-4324a246960b",
                        "label": "Baby",
                        "count": 0
                    },
                    {
                        "id": "dc725f55-1c70-4088-8108-cc199bd2ca32",
                        "label": "Beauty",
                        "count": 0
                    },
                    {
                        "id": "ef1ff9bd-6032-4c14-8c51-8b1f43dd0970",
                        "label": "Medicine and Health",
                        "count": 0
                    },
                    {
                        "id": "d871a234-93f3-47f0-991a-b230cb797d74",
                        "label": "Personal Care",
                        "count": 0
                    }
                ]
            },
            {
                "id": "c7a208f3-8f94-4460-b76c-3c75ae53417d",
                "label": "Liquor",
                "count": 0,
                "subCategories": [
                    {
                        "id": "0dd2f52d-af4a-45f9-aa1c-c66cd13f16e6",
                        "label": "Beer and Cider",
                        "count": 0
                    },
                    {
                        "id": "6cad2024-2bc8-47f5-b563-53f97c1f7205",
                        "label": "Coolers",
                        "count": 0
                    },
                    {
                        "id": "b3962476-bb50-47c2-af54-3bdec43fa499",
                        "label": "Spirits",
                        "count": 0
                    },
                    {
                        "id": "8b618c88-cd2c-47fa-9de7-677fe1d3737f",
                        "label": "Wine",
                        "count": 0
                    }
                ]
            },
            {
                "id": "38d878d7-c3e0-4ea1-8e6c-d4759f307042",
                "label": "Pets",
                "count": 0
            },
            {
                "id": "77c6067e-bd25-43a9-826c-7a4788581952",
                "label": "Home and Garden",
                "count": 0
            },
            {
                "id": "0333d0e5-68be-4833-939f-3a20d0cc9806",
                "label": "Fuel and Auto",
                "count": 0
            },
            {
                "id": "0cbc9203-2811-4eae-9dc1-68da692658b8",
                "label": "Financial",
                "count": 0
            },
            {
                "id": "0a889711-9ab8-4972-a0b5-b9eafc8fa312",
                "label": "Retail",
                "count": 0
            },
            {
                "id": "0387d04b-2736-48e4-b804-ac50f4222b79",
                "label": "Office",
                "count": 0
            },
            {
                "id": "121fa2dd-1fab-4492-8c5d-fb34624f4dda",
                "label": "Travel",
                "count": 0
            },
            {
                "id": "17180943-4cef-4fb8-833d-9919e359e4f3",
                "label": "Gift Cards",
                "count": 0
            },
            {
                "id": "e10dea41-3aee-4a24-bc8d-0d8de8c3e5ae",
                "label": "airmilesshops.ca",
                "count": 0
            },
            {
                "id": "cc1b19d6-72e0-47bc-8b81-2b1fbb49d050",
                "label": "Other",
                "count": 0
            }
        ]
    }
}

Pagination

The /offers api is paginated. The default page size is 20 and can be changed using the limit query parameter (max of 96). The offset query parameter can be used to navigate the offers. The total field in the response can be used to determine the total number of offers available.

The offset is by offer so offset=2 will skip the first 2 offers and start showing from the 3rd offer.

Example: lets say you make an /offers?region=ON call then you get 20 offers returned, now if your total is 50 in the metadata then to get to page 2 of the offers you would make a call to /offers?region=ON&offset=20 and you would get the next 20 offers.

Request

GET /offers?offset=1&region=ON&category_id=22b666ae-97c2-4e57-a437-e977de6beef4,0f597ee1-16b8-4a4f-beb7-4654cfd0b45a&limit=1

Response

{
    "offers": [
        {
            "id": "df82055b-6549-4334-b999-ad84122a251b",
            "partnerId": "1b36212c-87a6-448c-82a7-c2f28c8b6d52",
            "partnerLabel": "HelloFresh",
            "partnerLogo": {
                "url": "https://cdn.airmilesapis.ca/partner-logo/7m10wxejlkq7/YhYngmCYU2riJa9h7W7mg/41129364e77b3e1e663befbbc9b8f14e/HELLOFRESH_RGB_720.png"
            },
            "partnerProfileURL": "https://www.airmiles.ca/en/offers/partners/hellofresh.html",
            "categoryId": "22b666ae-97c2-4e57-a437-e977de6beef4",
            "categoryLabel": "Grocery",
            "awardShort": "Get up to 1000 Bonus Miles",
            "qualifierShort": "when you order HelloFresh for the first time*",
            "image": {
                "url": "https://cdn.airmilesapis.ca/offer-image/processed-images/104976a1-08a3-4ecd-b86f-a0c7b8db0c19.jpg"
            },
            "displayDate": "2024-12-26T00:00:00",
            "startDate": "2024-12-26T00:00:00",
            "endDate": "2025-12-31T23:59:59",
            "programType": "traditionalcore",
            "massOffer": true,
            "displayPriority": 1000,
            "tiers": [
                {
                    "awardLong": "Get up to 1000 Bonus Miles",
                    "qualifierLong": "when you order HelloFresh for the first time*"
                }
            ],
            "mechanisms": [
                {
                    "mechanismType": "couponCode",
                    "mechanismValue": "AIRML2025"
                }
            ],
            "legalText": "* 1.Get 500 AIR MILES® Bonus MilesTM on your first order of a HelloFresh Meal Kit box between September 20, 2023 and December 31, 2025. \n1. Use promo code AIRML2025 at checkout and ensure that your email with HelloFresh is the same email in your AIR MILES account profile.\n\n2.Then, get 100 AIR MILES Bonus MilesTM on each of your next 5 orders of HelloFresh Meal Kit Box2,. Ends December 31, 2025. \n\n\n1. Offer is valid September 20, 2023 to December  31, 2025 to Canadian resident AIR MILES collectors who purchase their first HelloFresh Meal Kit Box at hellofresh.ca. For clarification, offer is not valid to collectors who have purchased any HelloFresh Meal Kit Box prior to September 20, 2023, as determined by HelloFresh in its sole discretion. To qualify for this offer, i) the email address used to make the first HelloFresh purchase must be the same email address that appears in the AIR MILES collector profile, ii) eligible Collectors must purchase at least one HelloFresh Meal Kit box in a single transaction, and iii) Promo Code AIRML2025 must be entered at the time of checkout. Offer does not apply to Customers who have previously purchased Meal Kits from HelloFresh. Offer cannot be combined with other HelloFresh AIR MILES offers, including any offers available on airmilesshops.ca. Offer may be combined with other HelloFresh offers as determined by HelloFresh in their sole discretion. Limit of one offer per collector number. Please allow up to 75 days from the date of qualifying purchase for Bonus Miles to be posted to your collector account.\n\n\n2. Offer is valid September 20, 2023 to December  31, 2025 to Canadian resident AIR MILES collectors who i) first meet the criteria and qualify for the 500 Bonus Miles offer, as outlined above, and ii) then proceed to purchase up to 5 additional HelloFresh boxes during the offer period. Offer does not apply to Customers who have previously purchased Meal Kits from HelloFresh. Offer cannot be combined with other HelloFresh AIR MILES offers, including any offers available on airmilesshops.ca. Offer may be combined with other HelloFresh offers as determined by HelloFresh in their sole discretion. Limit of 500 Bonus Miles in connection with this offer per collector number. Please allow up to 75 days from the date of qualifying purchase for Bonus Miles to be posted to your collector account.",
            "eventBasedOffer": false
        }
    ],
    "metadata": {
        "total": 6
    }
}

Comparing this response with the previous response we can see that the first offer is skipped and the second offer is returned.

Saved Offers

Now saved offer filter do not work with any other filtering or sorting options. They are just a list of offers saved by the user. But region is still required, along with Authorization header.

Request

GET /offers?region=ON&states=SAVED HTTP/1.1
GET /offers?region=ON&states=SAVED&extended_metadata=true
GET /offers?region=ON&states=SAVED&extended_metadata=true&partner_id=e914624c-9676-4287-8ce9-04de68dd0507&sort=collectorrelevance

All above request result in the same response. The filters such as partner_id, category_id, subcategory_id, promotion_id, type, program_type, availability, mass_offer, event_based, experiment, exclude_partner_id are ignored. The sort is also ignored.

limit and offset are still supported. but are not advised to be used.

Response

{
    "offers": [
        {
            "id": "0a824bee-5f15-4b75-9e35-7a3c0fb3fee4",
            "partnerId": "0c988dcd-b2a9-4391-b2c4-48f0294d5658",
            "partnerLabel": "Canadian Appliance Source",
            "partnerLogo": {
                "url": "https://uat.cdn.airmilesapis.ca/partner-logo/7m10wxejlkq7/6WcyNeKqlsZEmeiZ1cKxjt/788f1794ab91af196a082a09a06ec7c2/CAS---EN.jpg"
            },
            "partnerProfileURL": "https://sandbox-beta.airmiles.ca/en/offers/partners/canadian_appliance_source.html",
            "categoryId": "cc1b19d6-72e0-47bc-8b81-2b1fbb49d050",
            "categoryLabel": "Other",
            "awardShort": "1 Bonus Miles",
            "qualifierShort": "Buy 1 test in-store*",
            "image": {
                "url": "https://uat.cdn.airmilesapis.ca/offer-image/processed-images/f18c0acf-765d-4a11-9b09-20101603e594.png"
            },
            "displayDate": "2025-07-08T00:00:00",
            "startDate": "2025-07-08T00:00:00",
            "endDate": "2025-08-09T23:59:59",
            "programType": "traditionalcore",
            "massOffer": true,
            "displayPriority": 0,
            "tiers": [
                {
                    "awardValue": 1.0,
                    "qualifierValue": 1.0,
                    "awardLong": "1 Bonus Miles",
                    "qualifierLong": "Buy 1 test in-store*"
                }
            ],
            "mechanisms": [
                {
                    "mechanismType": "optIn"
                }
            ],
            "states": [
                {
                    "name": "OPT_IN",
                    "value": "OPTED_IN",
                    "updatedAt": "2025-07-08T20:54:09.800950Z"
                },
                {
                    "name": "SAVE",
                    "value": "SAVED",
                    "updatedAt": "2025-07-08T20:54:09.800932Z"
                }
            ],
            "legalText": "* Offer valid from July 8, 2025 to August 9, 2025. Valid at participating Canadian Appliance Source locations in Alberta, British Columbia, Manitoba, New Brunswick, Newfoundland and Labrador, Northwest Territories, Nova Scotia, Nunavut, Ontario, Prince Edward Island, Quebec, Saskatchewan, Thunder Bay and Yukon. Opting in to the offer is required before using the AIR MILES Card at the time of purchase. Minimum eligible purchase must be spent in a single transaction. While supplies last. Product availability may vary by store. We reserve the right to limit quantities. AIR MILES Card must be presented at the time of the purchase. Can be combined with other offers, and AIR MILES offers. ®™ Trademarks of AM Royalties Limited Partnership used under license by AIR MILES Loyalty Inc. Partner, Supplier and Retailer trademarks are owned by the respective Partner, Supplier or Retailer or authorized for their use in Canada.",
            "eventBasedOffer": false
        },
        {
            "id": "2f857209-7243-408c-aec9-8dc37235dcad",
            "partnerId": "63e8543d-fbf7-458e-8712-d25332da3614",
            "partnerLabel": "AIR MILES Travel",
            "partnerLogo": {
                "url": "https://uat.cdn.airmilesapis.ca/partner-logo/7m10wxejlkq7/26y8GPqCJuBBrbMNRXgt1/309bddd73c7eff822a195d148509e7c9/TRAVEL_ICON_EN-66-.png"
            },
            "partnerProfileURL": "https://sandbox-beta.airmiles.ca/en/offers/partners/air-miles-travel.html",
            "categoryId": "22b666ae-97c2-4e57-a437-e977de6beef4",
            "categoryLabel": "Grocery",
            "promotionId": "905350da-27a4-11ec-9621-0242ac130002",
            "promotionLabel": "BONUS BOOM Boost",
            "awardShort": "50x Miles",
            "qualifierShort": "Spend $1000+ on almost anything in-store or online*",
            "image": {
                "url": "https://uat.cdn.airmilesapis.ca/offer-image/processed-images/d8e6394f-c00a-4220-81ad-91ad748bf6bb.jpg"
            },
            "displayDate": "2025-03-12T00:00:00",
            "startDate": "2025-03-13T00:00:00",
            "endDate": "2025-11-30T23:59:59",
            "programType": "traditionalcore",
            "massOffer": true,
            "displayPriority": 1000,
            "tiers": [
                {
                    "awardValue": 50.0,
                    "qualifierValue": 1000.0,
                    "awardLong": "50x Miles",
                    "qualifierLong": "Spend $1000+ on almost anything in-store or online*"
                }
            ],
            "mechanisms": [
                {
                    "mechanismType": "optIn"
                }
            ],
            "states": [
                {
                    "name": "SAVE",
                    "value": "SAVED",
                    "updatedAt": "2025-07-08T20:46:59.785461Z"
                },
                {
                    "name": "OPT_IN",
                    "value": "OPTED_IN",
                    "updatedAt": "2025-07-08T20:46:59.785472Z"
                }
            ],
            "legalText": "* Offer valid from March 13, 2025 to November 30, 2025. Valid at participating AIR MILES Travel locations in Alberta, British Columbia, Manitoba, New Brunswick, Newfoundland and Labrador, Northwest Territories, Nova Scotia, Nunavut, Ontario, Prince Edward Island, Quebec, Saskatchewan, Thunder Bay and Yukon or on https://www.airmiles.ca/en/offers/all-offers.html. Opting in to the offer is required before using the AIR MILES Card at the time of purchase. Minimum eligible purchase must be spent in a single transaction. Multiplier offer applies to standard base offer of 1 Mile for every $20.00 purchase. AIR MILES Card must be presented at the time of the purchase. Can be combined with other offers, and AIR MILES offers. ®™ Trademarks of AM Royalties Limited Partnership used under license by AIR MILES Loyalty Inc. Partner, Supplier and Retailer trademarks are owned by the respective Partner, Supplier or Retailer or authorized for their use in Canada.",
            "eventBasedOffer": false
        },
        {
            "id": "83c1ed9c-6da4-4734-a80f-e82096f8c860",
            "partnerId": "63e8543d-fbf7-458e-8712-d25332da3614",
            "partnerLabel": "AIR MILES Travel",
            "partnerLogo": {
                "url": "https://uat.cdn.airmilesapis.ca/partner-logo/7m10wxejlkq7/26y8GPqCJuBBrbMNRXgt1/309bddd73c7eff822a195d148509e7c9/TRAVEL_ICON_EN-66-.png"
            },
            "partnerProfileURL": "https://sandbox-beta.airmiles.ca/en/offers/partners/air-miles-travel.html",
            "categoryId": "22b666ae-97c2-4e57-a437-e977de6beef4",
            "categoryLabel": "Grocery",
            "promotionId": "26dd100d-9cb8-43cd-965e-b7b284ae8a92",
            "promotionLabel": "BAG-A-BONUS",
            "awardShort": "299 Bonus Miles",
            "qualifierShort": "Spend $49+ on Products test in-store or online*",
            "image": {
                "url": "https://uat.cdn.airmilesapis.ca/offer-image/processed-images/3517aa2d-b513-4e06-90a3-bd4a66ad7d91.jpg"
            },
            "displayDate": "2025-03-12T00:00:00",
            "startDate": "2025-03-12T00:00:00",
            "endDate": "2025-11-30T23:59:59",
            "programType": "traditionalcore",
            "massOffer": true,
            "displayPriority": 1000,
            "tiers": [
                {
                    "awardValue": 299.0,
                    "qualifierValue": 49.0,
                    "awardLong": "299 Bonus Miles",
                    "qualifierLong": "Spend $49+ on Products test in-store or online*"
                }
            ],
            "mechanisms": [
                {
                    "mechanismType": "optIn"
                }
            ],
            "states": [
                {
                    "name": "SAVE",
                    "value": "SAVED",
                    "updatedAt": "2025-07-08T20:35:57.860095Z"
                },
                {
                    "name": "OPT_IN",
                    "value": "OPTED_IN",
                    "updatedAt": "2025-07-08T20:35:57.860117Z"
                }
            ],
            "legalText": "* Offer valid from March 12, 2025 to November 30, 2025. Valid at participating AIR MILES Travel locations in Alberta, British Columbia, Manitoba, New Brunswick, Newfoundland and Labrador, Northwest Territories, Nova Scotia, Nunavut, Ontario, Prince Edward Island, Quebec, Saskatchewan, Thunder Bay and Yukon or on https://www.airmiles.ca/en/offers/all-offers.html. Opting in to the offer is required before using the AIR MILES Card at the time of purchase. Minimum eligible purchase must be spent in a single transaction. AIR MILES Card must be presented at the time of the purchase. Can be combined with other offers, and AIR MILES offers. ®™ Trademarks of AM Royalties Limited Partnership used under license by AIR MILES Loyalty Inc. Partner, Supplier and Retailer trademarks are owned by the respective Partner, Supplier or Retailer or authorized for their use in Canada.",
            "eventBasedOffer": false
        },
        {
            "id": "0651b3e6-0882-4a6d-9753-6f88d39e998d",
            "partnerId": "b90e694d-3510-4cc2-84be-f9b6f61bd31b",
            "partnerLabel": "Shell Mobility",
            "partnerLogo": {
                "url": "https://uat.cdn.airmilesapis.ca/partner-logo/7m10wxejlkq7/sLgosCGl6CiU6cOOOwsmE/59835e650a4c920063d881d83b8f33a8/Shell_RGB_updated.png"
            },
            "partnerProfileURL": "https://sandbox-beta.airmiles.ca/en/offers/partners/shell-retail-canada.html",
            "categoryId": "22b666ae-97c2-4e57-a437-e977de6beef4",
            "categoryLabel": "Grocery",
            "subCategoryId": "be58904e-4ae9-49fc-ac6d-0e966dc193bb",
            "subCategoryLabel": "Pantry",
            "promotionId": "4db99143-1768-4f85-a44a-d6fa16011f7b",
            "promotionLabel": "Mega Miles",
            "awardShort": "Up to 30 Bonus Miles",
            "qualifierShort": "Buy 3 Tier 3 test in-store*",
            "image": {
                "url": "https://uat.cdn.airmilesapis.ca/offer-image/processed-images/801a30f8-02a8-498f-9178-f80bebb4a17e"
            },
            "displayDate": "2020-02-10T00:00:00",
            "startDate": "2025-08-02T00:00:00",
            "endDate": "2050-02-10T23:59:59",
            "programType": "traditionalcore",
            "massOffer": true,
            "displayPriority": 1000,
            "tiers": [
                {
                    "awardValue": 10.0,
                    "qualifierValue": 1.0,
                    "awardLong": "10 Bonus Miles",
                    "qualifierLong": "Buy 1 Single Offer Test in-store*"
                },
                {
                    "awardValue": 20.0,
                    "qualifierValue": 2.0,
                    "awardLong": "20 Bonus Miles",
                    "qualifierLong": "Buy 2 Tier 2 test in-store*"
                },
                {
                    "awardValue": 30.0,
                    "qualifierValue": 3.0,
                    "awardLong": "30 Bonus Miles",
                    "qualifierLong": "Buy 3 Tier 3 test in-store*"
                }
            ],
            "mechanisms": [
                {
                    "mechanismType": "noAction"
                }
            ],
            "states": [
                {
                    "name": "OPT_IN",
                    "value": "OPTED_IN",
                    "updatedAt": "2025-07-08T19:53:26.297883Z"
                },
                {
                    "name": "SAVE",
                    "value": "SAVED",
                    "updatedAt": "2025-07-08T19:53:26.297873Z"
                }
            ],
            "legalText": "* Offer valid from August 2, 2025 to February 10, 2050. Valid at participating ACE locations in Alberta, British Columbia, Manitoba, Ontario, Quebec, Saskatchewan and Thunder Bay. Minimum eligible purchase must be spent in a single transaction. While supplies last. Product availability may vary by store. We reserve the right to limit quantities. AIR MILES Card must be presented at the time of the purchase. Can be combined with other offers, and AIR MILES offers. ®™ Trademarks of AM Royalties Limited Partnership used under license by AIR MILES Loyalty Inc. Partner, Supplier and Retailer trademarks are owned by the respective Partner, Supplier or Retailer or authorized for their use in Canada.",
            "eventBasedOffer": false,
            "ctaLabel": {
                "en-US": "english label"
            },
            "ctaUrl": {
                "en-US": "https://testCTA.com/English"
            }
        },
        {
            "id": "70aae1b0-c31b-4f2b-9a62-76951eb20d02",
            "partnerId": "4a755252-876b-478e-9440-42961525e307",
            "partnerLabel": "Metro",
            "partnerLogo": {
                "url": "https://uat.cdn.airmilesapis.ca/partner-logo/7m10wxejlkq7/7rS32o94OWeIKE2OY0sQiu/df3202c1bd940a599d987c56e4f5d4b7/Metro.png_dl_1"
            },
            "partnerProfileURL": "https://sandbox-beta.airmiles.ca/en/offers/partners/metro.html",
            "categoryId": "0f597ee1-16b8-4a4f-beb7-4654cfd0b45a",
            "categoryLabel": "Pharmacy",
            "promotionId": "0f91f291-dc7c-45d3-9a76-fbdadc6cd836",
            "promotionLabel": "Bonus Boom",
            "awardShort": "8 Bonus Miles",
            "qualifierShort": "Buy 7 testing product 8.3 in-store*",
            "image": {
                "url": "https://uat.cdn.airmilesapis.ca/offer-image/processed-images/4c57e7a2-18d6-4c00-a92b-116e55206965.png"
            },
            "displayDate": "2025-07-07T00:00:00",
            "startDate": "2025-07-07T00:00:00",
            "endDate": "2025-09-30T23:59:59",
            "programType": "cardlinked",
            "massOffer": true,
            "displayPriority": 1000,
            "tiers": [
                {
                    "awardValue": 8.0,
                    "qualifierValue": 7.0,
                    "awardLong": "8 Bonus Miles",
                    "qualifierLong": "Buy 7 testing product 8.3 in-store*"
                }
            ],
            "mechanisms": [
                {
                    "mechanismType": "optIn"
                }
            ],
            "states": [
                {
                    "name": "SAVE",
                    "value": "SAVED",
                    "updatedAt": "2025-07-18T14:42:18.571145Z"
                },
                {
                    "name": "OPT_IN",
                    "value": "OPTED_IN",
                    "updatedAt": "2025-07-18T14:42:18.571154Z"
                }
            ],
            "legalText": "* Offer valid from July 7, 2025 to September 30, 2025. Valid at participating Metro locations in Alberta, Ontario and Prince Edward Island. Opting in to the offer is required before using the AIR MILES Card at the time of purchase. Minimum eligible purchase must be spent in a single transaction. While supplies last. Product availability may vary by store. We reserve the right to limit quantities. AIR MILES Card must be presented at the time of the purchase. Can be combined with other offers, and AIR MILES offers. ®™ Trademarks of AM Royalties Limited Partnership used under license by AIR MILES Loyalty Inc. Partner, Supplier and Retailer trademarks are owned by the respective Partner, Supplier or Retailer or authorized for their use in Canada.",
            "cardType": [
                "NonBmoMastercard",
                "BmoMastercard"
            ],
            "eventBasedOffer": false,
            "ctaLabel": {
                "en-US": "English CTA"
            },
            "ctaUrl": {
                "en-US": "https://www.google.com/?hl=co"
            }
        },
        {
            "id": "a67cbea5-f40b-4c62-9e0e-5c2b0ae14c10",
            "partnerId": "3267588b-791d-49bc-a321-d85d5f818480",
            "partnerLabel": "AIR MILES",
            "partnerLogo": {
                "url": "https://uat.cdn.airmilesapis.ca/partner-logo/7m10wxejlkq7/69ZErUapt6c8WQioe6iYSS/5107f862d6a2b238ff6f7739c5a90992/AIRMILES_PLANE_ELECTRIC_BLUE_RGB_E.png"
            },
            "partnerProfileURL": "https://sandbox-beta.airmiles.ca/en/offers/partners/air-miles-reward-program-bonus-offers.html",
            "categoryId": "0cbc9203-2811-4eae-9dc1-68da692658b8",
            "categoryLabel": "Financial",
            "promotionId": "0f91f291-dc7c-45d3-9a76-fbdadc6cd836",
            "promotionLabel": "Bonus Boom",
            "awardShort": "33 Bonus Miles",
            "qualifierShort": "Buy 3 OPT-IN TEST UAT 39 in-store*",
            "image": {
                "url": "https://uat.cdn.airmilesapis.ca/offer-image/processed-images/aa9fba90-7fc0-4a21-a790-b05dbbc8eb42"
            },
            "displayDate": "2025-01-24T00:00:00",
            "startDate": "2025-02-01T00:00:00",
            "endDate": "2025-09-26T23:59:59",
            "programType": "traditionalcore",
            "massOffer": true,
            "displayPriority": 0,
            "tiers": [
                {
                    "awardValue": 33.0,
                    "qualifierValue": 3.0,
                    "awardLong": "33 Bonus Miles",
                    "qualifierLong": "Buy 3 OPT-IN TEST UAT 39 in-store*"
                }
            ],
            "mechanisms": [
                {
                    "mechanismType": "optIn"
                }
            ],
            "states": [
                {
                    "name": "SAVE",
                    "value": "SAVED",
                    "updatedAt": "2025-07-11T14:44:12.556178Z"
                },
                {
                    "name": "OPT_IN",
                    "value": "OPTED_IN",
                    "updatedAt": "2025-07-11T14:44:12.556351Z"
                }
            ],
            "legalText": "* Offer valid from February 1, 2025 to September 26, 2025. Valid at participating AIR MILES locations in Alberta, British Columbia, Manitoba, New Brunswick, Newfoundland and Labrador, Northwest Territories, Nova Scotia, Nunavut, Ontario, Prince Edward Island, Quebec, Saskatchewan, Thunder Bay and Yukon. Opting in to the offer is required before using the AIR MILES Card at the time of purchase. Minimum eligible purchase must be spent in a single transaction. While supplies last. Product availability may vary by store. We reserve the right to limit quantities. AIR MILES Card must be presented at the time of the purchase. Can be combined with other offers, and AIR MILES offers. ®™ Trademarks of AM Royalties Limited Partnership used under license by AIR MILES Loyalty Inc. Partner, Supplier and Retailer trademarks are owned by the respective Partner, Supplier or Retailer or authorized for their use in Canada.",
            "eventBasedOffer": false
        },
        {
            "id": "bf3e4874-e012-4f47-810a-af1999cd4b97",
            "partnerId": "22a2cdfd-ff82-45f6-bc94-c14a3a533922",
            "partnerLabel": "BMO Bank of Montreal",
            "partnerLogo": {
                "url": "https://uat.cdn.airmilesapis.ca/partner-logo/7m10wxejlkq7/6b9YYxL0SiRMY7ijajn51C/3b0bd9f225bb5e48ed2db8ba258e6651/BMO-logo_2_512x512_2023.png"
            },
            "partnerProfileURL": "https://sandbox-beta.airmiles.ca/en/offers/partners/bmo-bank-of-montreal.html",
            "categoryId": "1ba636e3-799d-44c3-9c84-42a3df6430b0",
            "categoryLabel": "Household Supplies",
            "promotionId": "905350da-27a4-11ec-9621-0242ac130002",
            "promotionLabel": "BONUS BOOM Boost",
            "awardShort": "1999 Bonus Miles",
            "qualifierShort": "Buy 10 Shampoo in-store or online*",
            "image": {
                "url": "https://uat.cdn.airmilesapis.ca/offer-image/processed-images/29f1f6cc-aee8-4dda-a0d7-700d65514f55.jpg"
            },
            "displayDate": "2025-03-14T00:00:00",
            "startDate": "2025-03-14T00:00:00",
            "endDate": "2025-10-31T23:59:59",
            "programType": "bmopreapp",
            "massOffer": true,
            "displayPriority": 1000,
            "tiers": [
                {
                    "awardValue": 1999.0,
                    "qualifierValue": 10.0,
                    "awardLong": "1999 Bonus Miles",
                    "qualifierLong": "Buy 10 Shampoo in-store or online*"
                }
            ],
            "mechanisms": [
                {
                    "mechanismType": "optIn"
                }
            ],
            "states": [
                {
                    "name": "OPT_IN",
                    "value": "OPTED_IN",
                    "updatedAt": "2025-06-12T19:21:02.490746Z"
                },
                {
                    "name": "SAVE",
                    "value": "SAVED",
                    "updatedAt": "2025-06-12T19:21:02.490721Z"
                }
            ],
            "legalText": "* Offer valid from March 14, 2025 to October 31, 2025. Valid at participating BMO Bank of Montreal locations in Alberta, British Columbia, Manitoba, New Brunswick, Newfoundland and Labrador, Northwest Territories, Nova Scotia, Nunavut, Ontario, Prince Edward Island, Quebec, Saskatchewan, Thunder Bay and Yukon or on https://www.airmiles.ca/en/offers/all-offers.html. Opting in to the offer is required before using the AIR MILES Card at the time of purchase. Minimum eligible purchase must be spent in a single transaction. While supplies last. Product availability may vary by store. We reserve the right to limit quantities. AIR MILES Card must be presented at the time of the purchase. Can be combined with other offers, and AIR MILES offers. ®™ Trademarks of AM Royalties Limited Partnership used under license by AIR MILES Loyalty Inc. Partner, Supplier and Retailer trademarks are owned by the respective Partner, Supplier or Retailer or authorized for their use in Canada.",
            "eventBasedOffer": false
        },
        {
            "id": "044d1b72-8b65-4a9e-8aa6-ca0c0d7efe4e",
            "partnerId": "c5cf18fb-383c-4174-96a8-15d9cd99a7cf",
            "partnerLabel": "AIR MILES",
            "partnerLogo": {
                "url": "https://uat.cdn.airmilesapis.ca/partner-logo/7m10wxejlkq7/27DPS9oBOtIHkS0SRgwlt4/db700a6e5a84c55e6b704232e3dc6ee4/AIRMILES_PLANE_ELECTRIC_BLUE_RGB_E.PNG"
            },
            "categoryId": "22b666ae-97c2-4e57-a437-e977de6beef4",
            "categoryLabel": "Grocery",
            "awardShort": "5 Bonus Miles",
            "qualifierShort": "Buy 20 TEST PRODUCT EN in-store*",
            "image": {
                "url": "https://uat.cdn.airmilesapis.ca/offer-image/processed-images/0db2d9a4-61aa-45b9-835d-bd2d2f631cc4.jpg"
            },
            "displayDate": "2025-01-07T00:00:00",
            "startDate": "2025-01-07T00:00:00",
            "endDate": "2025-12-31T23:59:59",
            "programType": "traditionalcore",
            "massOffer": true,
            "displayPriority": 1000,
            "tiers": [
                {
                    "awardValue": 5.0,
                    "qualifierValue": 20.0,
                    "awardLong": "5 Bonus Miles",
                    "qualifierLong": "Buy 20 TEST PRODUCT EN in-store*"
                }
            ],
            "mechanisms": [
                {
                    "mechanismType": "optIn"
                }
            ],
            "states": [
                {
                    "name": "SAVE",
                    "value": "SAVED",
                    "updatedAt": "2025-07-08T20:32:35.670067Z"
                },
                {
                    "name": "OPT_IN",
                    "value": "OPTED_IN",
                    "updatedAt": "2025-07-08T20:32:35.670082Z"
                }
            ],
            "legalText": "* Offer valid from January 7, 2025 to December 31, 2025. Valid at participating AIR MILES locations in Alberta, British Columbia, Manitoba, New Brunswick, Newfoundland and Labrador, Northwest Territories, Nova Scotia, Nunavut, Ontario, Prince Edward Island, Quebec, Saskatchewan, Thunder Bay and Yukon. Opting in to the offer is required before using the AIR MILES Card at the time of purchase. Minimum eligible purchase must be spent in a single transaction. While supplies last. Product availability may vary by store. We reserve the right to limit quantities. AIR MILES Card must be presented at the time of the purchase. Can be combined with other offers, and AIR MILES offers. ®™ Trademarks of AM Royalties Limited Partnership used under license by AIR MILES Loyalty Inc. Partner, Supplier and Retailer trademarks are owned by the respective Partner, Supplier or Retailer or authorized for their use in Canada.",
            "eventBasedOffer": false
        },
        {
            "id": "879a6659-6f61-4f74-b604-edd3d3c44956",
            "partnerId": "7f0a8705-8d25-4413-b868-0849aaeb2e0a",
            "partnerLabel": "Action Car and Truck Accessories",
            "partnerLogo": {
                "url": "https://uat.cdn.airmilesapis.ca/partner-logo/7m10wxejlkq7/4hNzZVBdy6GmOIIk7829SP/c832692c293e946e269d1196b08933fd/ACTION_CAR_AND_TRUCK_4C.png_h_250_h_250"
            },
            "partnerProfileURL": "https://sandbox-beta.airmiles.ca/en/offers/partners/action-car-and-truck-accessories.html",
            "categoryId": "cc1b19d6-72e0-47bc-8b81-2b1fbb49d050",
            "categoryLabel": "Other",
            "promotionId": "784bbe95-5299-475b-b03b-5fb274e206c6",
            "promotionLabel": "Our top picks",
            "awardShort": "2 Bonus Miles",
            "qualifierShort": "Spend $2+ on almost anything in-store*",
            "image": {
                "url": "https://uat.cdn.airmilesapis.ca/offer-image/processed-images/842d404d-0494-4f98-af2d-4ab6541f2870.jpg"
            },
            "displayDate": "2025-06-24T00:00:00",
            "startDate": "2025-06-24T00:00:00",
            "endDate": "2026-06-25T23:59:59",
            "programType": "traditionalcore",
            "massOffer": true,
            "displayPriority": 0,
            "tiers": [
                {
                    "awardValue": 2.0,
                    "qualifierValue": 2.0,
                    "awardLong": "2 Bonus Miles",
                    "qualifierLong": "Spend $2+ on almost anything in-store*"
                }
            ],
            "mechanisms": [
                {
                    "mechanismType": "noAction"
                }
            ],
            "states": [
                {
                    "name": "SAVE",
                    "value": "SAVED",
                    "updatedAt": "2025-07-08T20:40:36.946769Z"
                },
                {
                    "name": "OPT_IN",
                    "value": "OPTED_IN",
                    "updatedAt": "2025-07-08T20:40:36.946801Z"
                }
            ],
            "legalText": "* Offer valid from June 24, 2025 to June 25, 2026. Valid at participating Action Car and Truck Accessories locations in Alberta, British Columbia, Manitoba, New Brunswick, Newfoundland and Labrador, Nova Scotia, Ontario, Prince Edward Island, Quebec and Saskatchewan. Minimum eligible purchase must be spent in a single transaction. AIR MILES Card must be presented at the time of the purchase. Can be combined with other offers, and AIR MILES offers. ®™ Trademarks of AM Royalties Limited Partnership used under license by AIR MILES Loyalty Inc. Partner, Supplier and Retailer trademarks are owned by the respective Partner, Supplier or Retailer or authorized for their use in Canada.",
            "eventBasedOffer": false
        },
        {
            "id": "aaa09c6e-28c5-4aba-92a7-e57dd1ff8d7a",
            "partnerId": "63e8543d-fbf7-458e-8712-d25332da3614",
            "partnerLabel": "AIR MILES Travel",
            "partnerLogo": {
                "url": "https://uat.cdn.airmilesapis.ca/partner-logo/7m10wxejlkq7/26y8GPqCJuBBrbMNRXgt1/309bddd73c7eff822a195d148509e7c9/TRAVEL_ICON_EN-66-.png"
            },
            "partnerProfileURL": "https://sandbox-beta.airmiles.ca/en/offers/partners/air-miles-travel.html",
            "categoryId": "0387d04b-2736-48e4-b804-ac50f4222b79",
            "categoryLabel": "Office",
            "awardShort": "3 Bonus Miles",
            "qualifierShort": "Buy 4 Camera in-store*",
            "image": {
                "url": "https://uat.cdn.airmilesapis.ca/offer-image/processed-images/f16dfea2-b045-45c0-aa3f-1ffc3d19f64a.jpg"
            },
            "displayDate": "2025-03-04T00:00:00",
            "startDate": "2025-03-04T00:00:00",
            "endDate": "2025-09-12T23:59:59",
            "programType": "traditionalcore",
            "massOffer": true,
            "displayPriority": 1000,
            "tiers": [
                {
                    "awardValue": 3.0,
                    "qualifierValue": 4.0,
                    "awardLong": "3 Bonus Miles",
                    "qualifierLong": "Buy 4 Camera in-store*"
                }
            ],
            "mechanisms": [
                {
                    "mechanismType": "optIn"
                }
            ],
            "states": [
                {
                    "name": "SAVE",
                    "value": "SAVED",
                    "updatedAt": "2025-07-09T18:44:12.302946Z"
                },
                {
                    "name": "OPT_IN",
                    "value": "OPTED_IN",
                    "updatedAt": "2025-07-09T18:44:12.302970Z"
                }
            ],
            "legalText": "* Offer valid from March 4, 2025 to September 12, 2025. Valid at participating AIR MILES Travel locations in Alberta, British Columbia, Manitoba, New Brunswick, Newfoundland and Labrador, Northwest Territories, Nova Scotia, Nunavut, Ontario, Prince Edward Island, Quebec, Saskatchewan, Thunder Bay and Yukon. Opting in to the offer is required before using the AIR MILES Card at the time of purchase. Minimum eligible purchase must be spent in a single transaction. While supplies last. Product availability may vary by store. We reserve the right to limit quantities. AIR MILES Card must be presented at the time of the purchase. Can be combined with other offers, and AIR MILES offers. ®™ Trademarks of AM Royalties Limited Partnership used under license by AIR MILES Loyalty Inc. Partner, Supplier and Retailer trademarks are owned by the respective Partner, Supplier or Retailer or authorized for their use in Canada.",
            "eventBasedOffer": false,
            "ctaLabel": {
                "en-US": "Buy products"
            },
            "ctaUrl": {
                "en-US": "https://testcta.com/lander"
            }
        }
    ],
    "metadata": {
        "total": 10
    }
}

3.1 - Authenticated Calls

This document will show the use case for when and how to use a machine to machine token with collector number to get collector data. Collector-Number header is usually set by us decoding the member token but this process wont work for when clients want to use the m2m token, so client would have to send Collector-Number header ONLY when using m2m.

Collector-Number header should not be passed when using a member token, we have auth rules that will fail the request when this happens

M2M

curl --location 'https://uat.cdn.airmilesapis.ca/offers?region=ON' \
--header 'Authorization: Bearer <M2M token>' \
--header 'x-origin-client: <CLIENT>' \
--header 'Collector-Number: <COLLECTOR>'

Member

curl --location 'https://uat.cdn.airmilesapis.ca/offers?region=ON' \
--header 'Authorization: Bearer <Member token>' \
--header 'x-origin-client: <CLIENT>'

These apply to all three of the offer service api /offers, /offers/{id}, /offers/{id}/states

3.2 - Feed mapping

Feed mapping

There are a lot of filters and sort combinitions in Offer Service. This gives clients a lot of flexibility in how to use /offers but can get combursome to keep specifing the same query parameter in every request across multiple places. To solve for this issue we have feed mapping. Feed mapping is a way to predefine a set of query parameters and their values. Each of this feed mapping is mapped to a specific X-Origin-Client. This way the client can just specify the X-Origin-Client and the feed mapping will be applied.

Feed mapping is managed by Offer team and is not configurable via API by the client.

Example of feed mapping

Mapping file:

{
  "filterRequest": {
    "excludePartnerId": [
      "22a2cdfd-ff82-45f6-bc94-c14a3a533922"
    ]
  },
  "paginationRequest": {
    "sort": [
      "regionrelevance"
    ]
  }
}

Mapped to X-Origin-Client: external:client:test

The following requests are equvilant:

GET /offers?region=ON HTTP/1.1
Host: cdn.airmilesapis.ca
X-Origin-Client: external:client:test
Accept-Language: en-US
GET /offers?region=ON&sort=regionrelevance&exclude_partner_id=22a2cdfd-ff82-45f6-bc94-c14a3a533922 HTTP/1.1
Host: cdn.airmilesapis.ca
X-Origin-Client: external:client:other
Accept-Language: en-US

Overriding feed mapping

When a client has set up a feed and makes a request to offer service /offers, the feed mapping is applied to the request. The feed mapping can be overriden by the query parameters specified in the request. The query parameters specified in the request will take precedence over the feed mapping.

Taking the example feed setup above if we make a request with sort=collectorrelevance the response will be sorted by collectorrelevance instead of regionrelevance.

GET /offers?region=ON&sort=collectorrelevance HTTP/1.1
Host: cdn.airmilesapis.ca
X-Origin-Client: external:client:test
Accept-Language: en-US

The above request will sort the offers by collectorrelevance instead of regionrelevance even though the feed mapping has regionrelevance as the sort.

3.3 - Offer API Use Case Examples

This document will dicuss specific use cases for the Offer API. How to make a request and what the response will look like.

Our Top Picks

This is a simple request to get the top offers for a specific region. This is not paginated and will return the first 20 offers. To limit the number of offers you can use the limit query parameter. The limit query parameter can be used to limit the number of offers returned. The max value for limit is 96. The default value is 20.

Promotion Our Top Picks is a special promotion that is used to surface the top offers for a specific region. This promotion is not available in the Mapping -> Promotions documentation.

We will use our default sorting which is defined as promotionId,massOffer,partnerId,-displayPriority,endDate

Request

In this flow Authorization header is not required. But if given it will give back targetted offers aswell for that collector, also it gives us the oppertunity to use the collectorrelevance sort.

GET /offers?sort=promotionId,massOffer,partnerId,-displayPriority,endDate&region=ON&promotion_id=784bbe95-5299-475b-b03b-5fb274e206c6 HTTP/1.1
Host: cdn.airmilesapis.ca
X-Origin-Client: <REPLACE_WITH_CLIENT_ORIGIN>
Accept-Language: en-US

Card Linked Offers

We can use the filter program_type to choose the card linked offers. The value for program_type is cardlinked.

Request

In this flow Authorization header is not required. But if given it will give back targetted offers aswell for that collector, also it gives us the oppertunity to use the collectorrelevance sort.

GET /offers?sort=collectorrelevance&region=ON&program_type=cardlinked HTTP/1.1
Host: cdn.airmilesapis.ca
X-Origin-Client: <REPLACE_WITH_CLIENT_ORIGIN>
Authorization: Bearer <REPLACE_WITH_TOKEN>
Accept-Language: en-US

Offer for you

This use case is for showing the offers most relevant to the specific collector. This will use the collectorrelevance sort.

Request

GET /offers?sort=collectorrelevance&region=ON HTTP/1.1
Host: cdn.airmilesapis.ca
X-Origin-Client: <REPLACE_WITH_CLIENT_ORIGIN>
Authorization: Bearer <REPLACE_WITH_TOKEN>
Accept-Language: en-US

4 - OpenAPI (Swagger-Spec)