Offers API

The Offers API is in a closed, invite-only Beta program. Please work with your Meta representative to get access if you have been invited to the program.


Using this API, you can add offer information to your product catalog to enable merchandising your offers on Facebook and Instagram. For sellers with Facebook or Instagram checkout enabled, buyers will be able to redeem your offers directly within the Meta family of apps.

Create Offers

You can create offers via an offer feed or manually via Commerce Manager.

Feed

To create a new Offer Feed, make a POST request to the /{product_catalog_id}/product_feeds edge and set feed_type to OFFER. When posting to this edge, a Product Feed of type Offer is created for the catalog specified in the product_catalog_id field.

Once the Offer Feed is created, you can upload your offer data via a POST request to the /{product_feed_id}/uploads edge.

Feed Columns

You can set most of the available fields listed below as columns in your feed file. Only the fields marked as Read-Only cannot be set during creation.

Glossary

Product Sets

A product set is a group of related items within a product catalog.

Offer Target Items

These are the products for which an offer is valid.

Offer Prerequisites

These are the prerequisites that need to be met for the offer to apply. For example, you can determine that the offer is only valid when people buy at least a specific amount of products or reach at least a specific subtotal quantity or value of those products. Currently, the prerequisite products are derived from the target products. For example, an offer of 20% off all shoes means the minimum subtotal/quantity requirements must be met with shoes in the cart.

Offer Application Type

The Offer's application type specifies how an offer is applied at checkout either on your own website or within Facebook checkout. For instance, application type can be used to determine whether an offer is automatically applied at checkout or requires a coupon code to be redeemed. The application type also informs an offer's combination behavior with other offers. For more details see Combining Offers.

Basic Fields

The below fields can be used to configure all offer types.

FieldDescription

id

type: numeric string

Read-Only.

A unique identifier (Facebook ID) for this item.

offer_id

type: string

Required.

A seller provided identifier for the offer.


This field is used to uniquely identify an offer within a catalog.

title

type: string

Optional.

A title for the offer item.


Currently this title is only used to help identify offers within Commerce Manager and is not shown to buyers.

description

type: string

Read-Only.

The auto-generated description of the offer.

application_type

type: enum{SALE, AUTOMATIC_AT_CHECKOUT, BUYER_APPLIED}

Required.

Determines how and when an offer is applied. Available options are:

  • SALE: Items are directly marked down, reflected as strikethrough pricing for buyers. These offers require no prerequisites from the buyer and are not affected by other items at checkout. The sale producing the lowest price of an item is always chosen, as sales are never combined. Sales can be combined with other offer types but are always applied first. If a product already has the sale_price field set then the final price is computed using sale_price as the base price.
  • AUTOMATIC_AT_CHECKOUT: The offer is automatically applied at checkout when the buyer meets the necessary redemption criteria. This offer has some configuration which prevents it from qualifying as a sale. It can only be combined with sale offers. Up to 25 of such offers may be active at a time.
  • BUYER_APPLIED: This offer is applied at checkout based on an action taken by the buyer, such as entering a promo code. These offers cannot currently be combined with each other or offers applied automatically at checkout. Requires one of [public_coupon_code, coupon_codes] to be provided.

coupon_codes

type: Array<string>

List of case-insensitive coupon codes that customers use at checkout to redeem the offer. Maximum of 100 coupon codes allowed. For example: ["10OFF", "HOLIDAY_SALE"]


Coupon codes may only be specified when the application_type is BUYER_APPLIED.


If this field is set, public_coupon_code must be null.

public_coupon_code

type: string

Optional.

A single case-insensitive coupon code that will be merchandised with the offer and will be prefilled at checkout if the buyer meets the offer prerequisites.


By default offers with coupon codes are not visibly merchandised to buyers on Facebook or Instagram shopping surfaces such as a product details page. This is to prevent private or secret codes from leaking to buyers unintentionally. You can change this behavior by specifying a public coupon code to use for merchandising your offer. Offers with public codes will display the same as offers with an application_type of AUTOMATIC_AT_CHECKOUT but will also feature the code text.


A public coupon code cannot exceed 20 characters in length and your catalog may only contain at most 10 active offers with public coupon codes at a time.


A public coupon code may only be set when the application_type is BUYER_APPLIED.


If this field is set, coupon_codes must be null.

start_date_time

type: timestamp

Required.

Unix timestamp, in seconds, of when the offer starts.


The input may either be a Unix timestamp, in seconds, or an ISO-8601 formatted date string (e.g. 2021-09-25T12:34:56Z).

end_date_time

type: timestamp

Optional. Defaults to null.

Unix timestamp, in seconds, of when the offer ends. If left empty or null, the offer has no end date.


The input may either be a Unix timestamp, in seconds, or an ISO-8601 formatted date string (e.g. 2021-09-25T12:34:56Z).

min_quantity

type: int64

Optional. Defaults to 0.


Use this field if your offer is only valid when the customer buys a minimum number of products.


This field represents the number of products the customer needs to buy for the offer to be valid. For example: “Buy 5 shirts, Get 20% discount”.


Only one of either min_quantity or min_subtotal can be set.

min_subtotal

type: string

Optional. Defaults to null.


Use this field if your offer is only valid when the customer’s order meets a specific subtotal value.


The subtotal of the prerequisite products must be equal to or greater than this value for the offer to apply. If no explicit prerequisite products are set then the target products are used as prerequisite products.


This field should be formatted as the amount, followed by the 3-digit ISO currency code, with a space between amount and currency. For example: the string "30.99 USD" represents a $30.99 prerequisite subtotal for the offer to apply.


Only one of either min_quantity or min_subtotal can be set.

redeem_limit_per_user

type: int64

Optional. Defaults to 0 (unlimited).

The maximum number of times the offer can be used by a single user.


Set this field to 1 to create a single use coupon code.


This field should only be set if application_type is BUYER_APPLIED.

value_type

type: enum {FIXED_AMOUNT, PERCENTAGE}

Required.

The type of discount provided by the offer.


Available options are:

  • FIXED_AMOUNT: applies a discount with the value taken from fixed_amount_off.
  • PERCENTAGE: applies a percentage discount with the value taken from percent_off.

fixed_amount_off

type: string

Required, if value_type is set to FIXED_AMOUNT.

The discount amount of the offer. Should be formatted as the amount, followed by the 3-digit ISO currency code, with a space between amount and currency. For example, the string "30.99 USD" represents a $30.99 discount.


This field should only be set if value_type is FIXED_AMOUNT.

percent_off

type: int64

Required, if value_type is set to PERCENTAGE.

The percentage discount of the offer. Should be an integer between 0 and 100. For example, "30" represents a 30% discount.


The field should only be set if value_type is PERCENTAGE.

target_granularity

type: enum {ITEM_LEVEL, ORDER_LEVEL}

Required.

The granularity at which the offer's discount is applied.


Available options are:

  • ITEM_LEVEL: represents a discount applied to each of the target items in the cart.
  • ORDER_LEVEL: represents a discount applied across all of the target items in the cart. For example, if you have a "$30 off shoes" offer with 3 pairs of shoes in the cart, ITEM_LEVEL will apply $30 off each pair of shoes ($90 value), while ORDER_LEVEL will apply $30 off the sum of all 3 pairs of shoes (max $30 value).

Note that offers with ORDER_LEVEL granularity may result in discount allocations at purchase that do not divide evenly across items in an order. Handling these uneven discount allocations may result in added complexity at fulfillment time or in case of refunds.

offer_terms

type: string

Optional.

Any additional terms and conditions which dictate a buyer's use of the offer. Max 2500 characters.


Facebook will auto-generate terms describing the offer based on the offer configuration. In addition to these terms you can use offer_terms to add language describing your own terms for the offer. These terms will appear below Facebook's offer terms.


The content must follow our content policies.

Specifying Eligible Products

Both the target items for which an offer is valid and the prerequisite items a buyer much purchase to redeem the offer are defined by product sets. The Offers API supports multiple ways to specify these product sets but only one method may be used per product set type per offer.

FieldDescription

target_selection

type: enum{ALL_CATALOG_PRODUCTS, SPECIFIC_PRODUCTS}

Required.

This field is used to differentiate between offers which apply to an entire product catalog and offers restricted to a specific subset of items within a catalog.


Available options are:

  • ALL_CATALOG_PRODUCTS: offer can be applied to any product in the catalog.
  • SPECIFIC_PRODUCTS: offer can only be applied to the target products specified by target_filter, target_product_retailer_ids, target_product_group_retailer_ids, or target_product_set_retailer_ids.

If target_selection is SPECIFIC_PRODUCTS, exactly one of the following is required: target_filter, target_product_retailer_ids, target_product_group_retailer_ids, or target_product_set_retailer_ids.

target_filter

type: JSON-encoded string

Optional.


Filter rule to identify products that the offer can be applied to. Uses the same filter rule logic used for adding products to a product set.


If the specified filter rule matches the filter of an existing product set then this offer will target that product set, otherwise a new product set will be created.


This field should only be set if target_selection is set to SPECIFIC_PRODUCTS.

target_product_retailer_ids

type: Array<product_retailer_id>

Optional.


List of product item retailer IDs for products that the offer can be applied to.


This field should only be set if target_selection is set to SPECIFIC_PRODUCTS.

target_product_group_retailer_ids

type: Array<product_group_retailer_id>

Optional.


List of product group retailer IDs for products that the offer can be applied to.


All product variants included in the product group will be eligible for the offer.


This field should only be set if target_selection is set to SPECIFIC_PRODUCTS.

target_product_set_retailer_ids

type: Array<product_set_retailer_id>

Optional.


List of retailer IDs of product sets that contain products that the offer can be applied to. The offer will apply to the union of all products yielded by evaluating the specified product sets.

prerequisite_filter

type: JSON-encoded string

Optional.


Filter rule to identify products that must be purchased for the buyer to redeem the offer. Uses the same filter rule logic used for adding products to a product set. Typically used in "Buy X get Y" style offers.


If the specified filter rule matches the filter of an existing product set then this offer will use that product set to define the prerequisite products, otherwise a new product set will be created.


If this field is set, prerequisite_product_retailer_ids, prerequisite_product_group_retailer_ids, and prerequisite_product_set_retailer_ids must be null.

prerequisite_product_retailer_ids

type: Array<product_retailer_id>

Optional.


Retailer IDs for product items that the buyer must purchase to redeem the offer. Any items included in the list are eligible for the buyer to use as a prerequisite towards redeeming the offer. Typically used in "Buy X get Y" style offers.


If this field is set, prerequisite_filter, prerequisite_product_group_retailer_ids, and prerequisite_product_set_retailer_ids must be null.

prerequisite_product_group_retailer_ids

type: Array<product_group_retailer_id>

Optional.


Retailer IDs for product groups that the buyer must purchase to redeem the offer. All product variants included in each group are eligible for the buyer to use as a prerequisite towards redeeming the offer. Typically used in "Buy X get Y" style offers.


If this field is set, prerequisite_filter, prerequisite_product_retailer_ids, and prerequisite_product_set_retailer_ids must be null.

prerequisite_product_set_retailer_ids

type: Array<product_set_retailer_id>

Optional.


Retailer IDs for product sets containing items that the buyer must purchase to redeem the offer. Any items yielded from the union of evaluating the product sets are eligible for the buyer to use as a prerequisite towards redeeming the offer. Typically used in "Buy X get Y" style offers.


If this field is set, prerequisite_filter, prerequisite_product_retailer_ids, and prerequisite_product_group_retailer_ids must be null.

exclude_sale_priced_products

type: bool enum {YES, NO}

Optional.

Whether the offer applies to products which already have a reduced price set in catalog, as specified by the sale_price field of product item.


Set this field to YES to avoid potentially double discounting products. Omit this field or set it to NO to include products with a lower sale_price set in your catalog.


When set, this field applies to both the target products and prerequisite products of an offer.

Shipping Offers

The Offers API supports both offers that discount the price of products in a buyer's purchase as well as offers that discount the shipping costs for those products. Just like offers for products, shipping offers may be applied with a coupon code or automatically with or without additional buyer prerequisites.

To create a shipping offer the target_type must be set to SHIPPING. Currently, only free shipping offers are supported and thus value_type must always be PERCENTAGE with percent_off set to 100.

FieldDescription

target_type

type: enum{LINE_ITEM, SHIPPING}

Required.

The type of object that the offer applies to:

  • LINE_ITEM: offer is applied to the product items themselves.
  • SHIPPING: offer is applied to the shipping costs. This option is only valid when target_granularity is ITEM_LEVEL.

target_shipping_option_types

type: Array<shipping_service_tier>

Required, if the target_type is SHIPPING.

A list of shipping service tiers (e.g. STANDARD, RUSH, EXPEDITED) which the offer is valid for.


For example to specify a shipping offer which applies to standard and rush shipping speeds but not overnight shipping, use:

  • target_type of SHIPPING
  • target_shipping_option_types of ["STANDARD", "RUSH"]

For sellers with Facebook or Instagram checkout enabled, you can use the Shipping Profiles API to manage the shipping profiles on your commerce account.

Buy X Get Y Offers

"Buy X Get Y" style offers allow buyers to purchase a specific quantity of select "X products" to get 1 or more of "Y products" at a reduced price or free. Spend X get Y offers where the buyer must reach a minimum spend threshold for a set of X products to receive a discount are also supported. You create a buy X get Y offer by setting the target_quantity field as well as either the min_quantity or min_subtotal fields.

In some cases such as the common "buy one get one free" offer, X and Y may refer to the same set of products. However you can also use the prerequisite_filter, prerequisite_product_retailer_ids, prerequisite_product_group_retailer_ids, and prerequisite_product_set_retailer_ids to specify a set of X products distinct from the target Y products. See Specify Eligible Products for how to configure these fields.

FieldDescription

target_quantity

type: int64

Optional. Defaults to 0 (unlimited).

The number of products that will be discounted for each redemption of the offer. Setting target_quantity > 0 constitutes a Buy X get Y style offer.


Use this field to control how many products are discounted when a buyer meets the redemption prerequisites. For instance in a "buy 2 get 1 50% off" offer the target quantity is 1 and in a "buy 5 get 2 free" offer the target quantity is 2.

redemption_limit_per_order

type: int64

Optional. Defaults to 0 (unlimited).

The number of times this offer can be redeemed per order.


Use this field to limit the number of times an offer can be applied to the products in a buyer's purchase. For instance in a "buy one shirt get one free" offer by default a buyer who purchases 6 shirts would receive 3 at full price and 3 for free. However in the same example if redemption_limit_per_order is set to 2 then the buyer would receive 2 shirts for free and 4 at full price.


If this field is set, target_quantity must be greater than 0.

Combining Offers

For sellers with checkout on Facebook or Instagram enabled there is limited support for combining multiple offers within a single transaction. An offer's ability to be combined with other offers is primarily determined by its application type and target type. Currently this behavior is not configurable by sellers. The below rules summarize offer stacking behavior:

  • For a given product, if there are any offers which would result in strikethrough pricing (application_type = SALE) the offer resulting in the lowest product price is applied. This is repeated for all items in a buyer's cart. The item's new discounted price is used in all future offer prerequisite calculations.
  • In a single order, the buyer may redeem either 1 BUYER_APPLIED or 1 AUTOMATIC_AT_CHECKOUT offer per target_type (LINE_ITEM or SHIPPING). For instance, a buyer may apply a free shipping coupon and a buy one get one coupon but may not redeem 2 offers which both discount product prices.
  • Meta may sometimes fund offers to attract new and returning customers at no cost to sellers. Offers funded by Meta can always be combined with offers funded by sellers.

Restricting User Eligibility for Offers

At present, offers created via the Offers API cannot be selectively merchandised to specific cohorts of users. Offers created in Commerce Manager can be configured with user eligibility restrictions. A merchandised offer created via the Offers API will be shown to all buyers and any buyer who meets an offer's prerequisites (including entering any coupon codes) in Facebook or Instagram checkout may redeem the offer.

In the future, the Offers API may support limiting offers to specific countries for multinational sellers as well as restricting offer eligibility to specific groups of users such as first time buyers or followers of a seller's Facebook Page.