Feeds

Feed Specifications

The specification of the OfferFeed and all related objects.

OfferFeed definition

  // Next tag: 24 
 message 
  
 OfferFeed 
  
 { 
  
 repeated 
  
 Offer 
  
 data 
  
 = 
  
 1 
 ; 
 } 
 

Offer definition

  // Next tag: 26 
 message 
  
 Offer 
  
 { 
  
 // Unique ID of the offer. 
  
 // Required. 
  
 string 
  
 offer_id 
  
 = 
  
 1 
  
 [( 
 validator.rule 
 ) 
  
 = 
  
 { 
  
 predicate 
 : 
  
 "not empty($) ?: ERROR_MISSING_OFFER_ID" 
 , 
  
 }]; 
  
 // List of merchants who are participating in this offer. 
  
 repeated 
  
 string 
  
 entity_ids 
  
 = 
  
 2 
  
 [( 
 validator.rule 
 ) 
  
 = 
  
 { 
  
 predicate 
 : 
  
 "if($add_on_offer_applicable_to_all_entities, empty($)) ?: ERROR_OFFER_APPLICABLE_TO_ALL_ENTITIES_AND_HAS_ENTITY_IDS" 
  
 }]; 
  
 // If true, this offer is applicable to all entities under the aggregator. 
  
 // Only applicable for add on offers. 
  
 bool 
  
 add_on_offer_applicable_to_all_entities 
  
 = 
  
 17 
  
 [( 
 validator.rule 
 ) 
  
 = 
  
 { 
  
 predicate 
 : 
  
 "if(empty($entity_ids), $ == true) ?: ERROR_OFFER_APPLICABLE_TO_ALL_ENTITIES_AND_HAS_ENTITY_IDS" 
  
 }]; 
  
 // An offer can be provided by the aggregator, an individual merchant, or even 
  
 // a third party as an add on. 
  
 // Required. 
  
 OfferSource 
  
 offer_source 
  
 = 
  
 3 
  
 [( 
 validator.rule 
 ) 
  
 = 
  
 { 
  
 predicate 
 : 
  
 "$ == OFFER_SOURCE_AGGREGATOR or $ == OFFER_SOURCE_MERCHANT ?: WARNING_ILLEGAL_OFFER_SOURCE" 
  
 }]; 
  
 // The service that is providing the offer. An offer_id can belong to only one 
  
 // action_type. If an offer can be shared across multiple service types then 
  
 // duplicate offers with unique Ids are expected to be created for each 
  
 // service type. 
  
 // Required. 
  
 ActionType 
  
 action_type 
  
 = 
  
 4 
  
 [( 
 validator.rule 
 ) 
  
 = 
  
 { 
  
 predicate 
 : 
  
 "$ != ACTION_TYPE_UNSPECIFIED ?: WARNING_ILLEGAL_ACTION_TYPE" 
  
 }]; 
  
 // The methods the offer can be availed - walk in, reservation, online, etc. 
  
 // Required. 
  
 repeated 
  
 OfferMode 
  
 offer_modes 
  
 = 
  
 5 
  
 [( 
 validator.rule 
 ) 
  
 = 
  
 { 
  
 can_report_all_predicate_violations 
 : 
  
 true 
  
 predicate 
 : 
  
 "not empty($) ?: WARNING_MISSING_OFFER_MODE" 
  
 predicate 
 : 
  
 "if(contains($, OFFER_MODE_PAID_RESERVATION) and $offer_category == OFFER_CATEGORY_BASE_OFFER, has($offer_details.booking_cost) and ($offer_details.booking_cost.units > 0 or $offer_details.booking_cost.nanos > 0)) ?: ERROR_MISSING_BOOKING_COST" 
  
 predicate 
 : 
  
 "if(not contains($, OFFER_MODE_PAID_RESERVATION) and $offer_category == OFFER_CATEGORY_BASE_OFFER, not has($offer_details.booking_cost) or ($offer_details.booking_cost.units == 0 and $offer_details.booking_cost.nanos == 0)) ?: ERROR_ILLEGAL_OFFER_MODE" 
  
 predicate 
 : 
  
 "if(contains($, OFFER_MODE_GIFT_CARD_PURCHASE), len($) == 1) ?: ERROR_OFFER_MODE_GIFT_CARD_PURCHASE_MUST_BE_EXCLUSIVE" 
  
 element_predicate 
 : 
  
 "$ != OFFER_MODE_OTHER ?: WARNING_ILLEGAL_OFFER_MODE" 
  
 }]; 
  
 // The category of the offer. 
  
 // Required. 
  
 OfferCategory 
  
 offer_category 
  
 = 
  
 6 
  
 [( 
 validator.rule 
 ) 
  
 = 
  
 { 
  
 predicate 
 : 
  
 "$ != OFFER_CATEGORY_UNSPECIFIED ?: WARNING_ILLEGAL_OFFER_CATEGORY" 
  
 }]; 
  
 // Non-negative integer ([1-100], where 1 represents the highest priority) 
  
 // indicating the priority level of the offer assigned by the source. When 
  
 // multiple offers are available for the same merchant, this will be a signal 
  
 // for ranking offers. 0 would represent that the priority is not set. 
  
 int32 
  
 source_assigned_priority 
  
 = 
  
 7 
 ; 
  
 // Details of the offer such as the discount, booking cost, etc. 
  
 // Required. 
  
 OfferDetails 
  
 offer_details 
  
 = 
  
 8 
  
 [ 
  
 ( 
 validator.rule 
 ) 
  
 = 
  
 { 
  
 is_required 
 : 
  
 "true ?: WARNING_MISSING_OFFER_DETAILS" 
  
 } 
  
 ]; 
  
 // Describes how the offer is restricted i.e. whether a subscription/payment 
  
 // instrument is required, whether this offer can be combined with other 
  
 // offers (and what types), etc. 
  
 // Required. 
  
 OfferRestrictions 
  
 offer_restrictions 
  
 = 
  
 9 
  
 [( 
 validator.rule 
 ) 
  
 = 
  
 { 
  
 is_required 
 : 
  
 "true ?: WARNING_MISSING_OFFER_RESTRICTIONS" 
  
 }]; 
  
 // Details of a coupon. 
  
 // Required for offer_category: OFFER_CATEGORY_ADD_ON_COUPON_OFFER. 
  
 Coupon 
  
 coupon 
  
 = 
  
 10 
  
 [( 
 validator.rule 
 ) 
  
 = 
  
 { 
  
 is_required 
 : 
  
 "$offer_category == OFFER_CATEGORY_ADD_ON_COUPON_OFFER ?: WARNING_MISSING_COUPON" 
  
 }]; 
  
 // Details of a payment instrument. 
  
 // Required for offer_category: OFFER_CATEGORY_ADD_ON_PAYMENT_OFFER. 
  
 PaymentInstrument 
  
 payment_instrument 
  
 = 
  
 11 
  
 [( 
 validator.rule 
 ) 
  
 = 
  
 { 
  
 is_required 
 : 
  
 "$offer_category == OFFER_CATEGORY_ADD_ON_PAYMENT_OFFER ?: WARNING_MISSING_PAYMENT_INSTRUMENT" 
  
 }]; 
  
 // Details of a subscription. 
  
 // Required for offer_category: OFFER_CATEGORY_ADD_ON_SUBSCRIPTION_OFFER. 
  
 Subscription 
  
 subscription 
  
 = 
  
 12 
  
 [( 
 validator.rule 
 ) 
  
 = 
  
 { 
  
 is_required 
 : 
  
 "$offer_category == OFFER_CATEGORY_ADD_ON_SUBSCRIPTION_OFFER ?: WARNING_MISSING_SUBSCRIPTION" 
  
 }]; 
  
 // Terms and conditions of the offer. 
  
 // Required. 
  
 Terms 
  
 terms 
  
 = 
  
 13 
  
 [( 
 validator.rule 
 ) 
  
 = 
  
 { 
  
 is_required 
 : 
  
 "true ?: WARNING_MISSING_TERMS" 
  
 }]; 
  
 // The validity period of the offer. Describes what time period the offer is 
  
 // valid for including start and end times, days of the week, etc. 
  
 // Required. 
  
 repeated 
  
 ValidityPeriod 
  
 validity_periods 
  
 = 
  
 14 
  
 [( 
 validator.rule 
 ) 
  
 = 
  
 { 
  
 can_report_all_predicate_violations 
 : 
  
 true 
 , 
  
 predicate 
 : 
  
 "not empty($) ?: WARNING_MISSING_VALID_PERIOD" 
 , 
  
 element_predicate 
 : 
  
 "has($.valid_period) ?: WARNING_MISSING_VALID_PERIOD" 
 , 
  
 element_predicate 
 : 
  
 "if(contains($offer_modes, OFFER_MODE_FREE_RESERVATION) or contains($offer_modes, OFFER_MODE_PAID_RESERVATION), " 
  
 "not empty($.time_of_day)) ?: WARNING_MISSING_VALID_PERIOD_TIME_OF_DAY" 
 , 
  
 element_predicate 
 : 
  
 "if(has($.valid_period), has($.valid_period.valid_from_time)) ?: WARNING_MISSING_VALID_PERIOD_VALID_FROM_TIME" 
  
 }]; 
  
 // URL to the merchant's offer page. 
  
 // Required for offer_category: OFFER_CATEGORY_BASE_OFFER. 
  
 string 
  
 offer_url 
  
 = 
  
 15 
  
 [( 
 validator.rule 
 ) 
  
 = 
  
 { 
  
 predicate 
 : 
  
 "if($offer_category == OFFER_CATEGORY_BASE_OFFER, not empty($)) ?: ERROR_MISSING_OFFER_URL" 
  
 }]; 
  
 // URL to the merchant’s offer image. 
  
 string 
  
 image_url 
  
 = 
  
 16 
 ; 
  
 // Special tags associated with the offer. This is used to identify special 
  
 // offers like "Festive", "Top Rated", "Most booked", etc. 
  
 repeated 
  
 OfferTag 
  
 tags 
  
 = 
  
 24 
 ; 
  
 // Required for Gift Card deals to identify the brand offering the deal. 
  
 string 
  
 brand_id 
  
 = 
  
 25 
 ; 
 } 
 

OfferSource definition

  enum 
  
 OfferSource 
  
 { 
  
 OFFER_SOURCE_UNSPECIFIED 
  
 = 
  
 0 
 ; 
  
 OFFER_SOURCE_AGGREGATOR 
  
 = 
  
 1 
 ; 
 } 
 

ActionType definition

  // Represents the fulfillment mode of the offer. If an offer can be shared 
 // across multiple fulfillment modes then duplicate offers are expected to be 
 // created for each fulfillment mode. 
 enum 
  
 ActionType 
  
 { 
  
 ACTION_TYPE_UNSPECIFIED 
  
 = 
  
 0 
 ; 
  
 // The offer is applicable for food delivery services. 
  
 ACTION_TYPE_FOOD_DELIVERY 
  
 = 
  
 1 
 ; 
  
 // The offer is applicable for food takeout or pickup orders. 
  
 ACTION_TYPE_FOOD_TAKEOUT 
  
 = 
  
 2 
 ; 
  
 // The offer is for on-site dining at a restaurant. 
  
 ACTION_TYPE_DINING 
  
 = 
  
 4 
 ; 
  
 // The offer is applicable for offline, in-store shopping purchases. 
  
 ACTION_TYPE_SHOPPING_IN_STORE 
  
 = 
  
 6 
 ; 
 } 
 

OfferMode definition

  // Specifies the method or channel through which the user can avail the offer. 
 enum 
  
 OfferMode 
  
 { 
  
 // Use for fulfillment methods not covered by other specific modes. 
  
 OFFER_MODE_OTHER 
  
 = 
  
 0 
 ; 
  
 // The offer is available for on-site visits without a prior reservation. 
  
 OFFER_MODE_WALK_IN 
  
 = 
  
 1 
 ; 
  
 // The offer applies when a user makes a reservation that does not require 
  
 // an upfront fee. 
  
 OFFER_MODE_FREE_RESERVATION 
  
 = 
  
 2 
 ; 
  
 // The offer applies when a user makes a reservation that requires an 
  
 // upfront payment. 
  
 OFFER_MODE_PAID_RESERVATION 
  
 = 
  
 3 
 ; 
  
 // The offer is valid for orders placed through a website or digital platform. 
  
 OFFER_MODE_ONLINE_ORDER 
  
 = 
  
 4 
 ; 
  
 // Indicates a gift card purchase is the primary step required to acquire 
  
 // the deal. 
  
 OFFER_MODE_GIFT_CARD_PURCHASE 
  
 = 
  
 6 
 ; 
 } 
 

OfferCategory definition

  // Category of the offer. A base offer is a standard offer available to all 
 // customers such as 10% off spending over $100. A base offer restricted by a 
 // coupon or payment instrument will have the respective fields set. We also 
 // have add on x offers such as ADD_ON_PAYMENT_OFFER. Such offers can be added 
 // to other offers to gain additional discounts. 
 enum 
  
 OfferCategory 
  
 { 
  
 // The UNSPECIFIED or default enum value should not be used in feeds. 
  
 OFFER_CATEGORY_UNSPECIFIED 
  
 = 
  
 0 
 ; 
  
 OFFER_CATEGORY_BASE_OFFER 
  
 = 
  
 1 
 ; 
  
 OFFER_CATEGORY_ADD_ON_PAYMENT_OFFER 
  
 = 
  
 2 
 ; 
  
 OFFER_CATEGORY_ADD_ON_COUPON_OFFER 
  
 = 
  
 3 
 ; 
  
 OFFER_CATEGORY_ADD_ON_SUBSCRIPTION_OFFER 
  
 = 
  
 4 
 ; 
 } 
 

OfferDetails definition

  // Next tag: 15 
 message 
  
 OfferDetails 
  
 { 
  
 option 
  
 ( 
 validator.defs 
 ) 
  
 = 
  
 { 
  
 feature 
 : 
  
 "ignore_offers_with_no_monetary_value" 
  
 }; 
  
 // The offer text the offer provider wants to display to customers on the 
  
 // search results page. 
  
 // Required. 
  
 string 
  
 offer_display_text 
  
 = 
  
 1 
  
 [( 
 validator.rule 
 ) 
  
 = 
  
 { 
  
 predicate 
 : 
  
 "not empty($) ?: ERROR_MISSING_OFFER_DISPLAY_TEXT" 
  
 }]; 
  
 // The discount can be a percentage or a fixed value subtracted from the total 
  
 // value. 
  
 // For example: 
  
 // 1. 10% off the final bill. 
  
 // 2. $15 off an order. 
  
 // Merchants can also offer custom discounts such as ‘buy one get one free’ 
  
 // through the relevant specification fields. 
  
 // Required. 
  
 oneof 
  
 offer_specification 
  
 { 
  
 option 
  
 ( 
 validator.one_of 
 ) 
 . 
 is_required 
  
 = 
  
 "true ?: ERROR_MISSING_OFFER_SPECIFICATION" 
 ; 
  
 // Percentage of the bill that is discounted. 
  
 // [0, 100] 
  
 // For 1+1 or 50% off offers that are applicable to the whole meal 
  
 // (e.g. 1+1 buffet, 1+1 on entire bill, 1+1 on set menu), this value can 
  
 // be set to 50. 
  
 float 
  
 discount_percent 
  
 = 
  
 2 
  
 [( 
 validator.rule 
 ) 
  
 = 
  
 { 
  
 predicate 
 : 
  
 "if (#ignore_offers_with_no_monetary_value, $ != 0) ?: ERROR_MISSING_MONETARY_VALUE" 
  
 }]; 
  
 // Fixed value of the discount. 
  
 google.type.Money 
  
 discount_value 
  
 = 
  
 3 
  
 [( 
 validator.rule 
 ) 
  
 = 
  
 { 
  
 predicate 
 : 
  
 "if (#ignore_offers_with_no_monetary_value, $.units != 0 or $.nanos != 0) ?: ERROR_MISSING_MONETARY_VALUE" 
  
 }]; 
  
 // Free-form text to describe the discount. 
  
 // For specific 1+1 offers (e.g. 1+1 drinks, +1 main course, 1+1 
  
 // selected menu items), these details should be described here. 
  
 string 
  
 other_offer_detail_text 
  
 = 
  
 4 
  
 [( 
 validator.rule 
 ) 
  
 = 
  
 { 
  
 // Since this is a oneof the predicate will be checked only if this 
  
 // field is explicitly set. 
  
 predicate 
 : 
  
 "not #ignore_offers_with_no_monetary_value ?: ERROR_MISSING_MONETARY_VALUE" 
  
 }]; 
  
 } 
  
 // The maximum discount that can be availed. For example, 10% off up to $100. 
  
 google.type.Money 
  
 max_discount_value 
  
 = 
  
 5 
 ; 
  
 // The minimum spend value to avail the discount. 
  
 // For example, 10% off when the total price is $100 or more. 
  
 google.type.Money 
  
 min_spend_value 
  
 = 
  
 6 
 ; 
  
 // The cost to book this offer. For example, $100 off the final bill when a 
  
 // table is reserved at the cost of $15. 
  
 google.type.Money 
  
 booking_cost 
  
 = 
  
 7 
 ; 
  
 // The unit of the booking cost. For example, per person, per transaction. 
  
 FeeUnit 
  
 booking_cost_unit 
  
 = 
  
 11 
 ; 
  
 Fee 
  
 convenience_fee 
  
 = 
  
 12 
 ; 
  
 // Whether the booking cost is adjustable i.e. the booking cost is subtracted 
  
 // from the final bill. 
  
 // For example: 
  
 // 30% off dinner with reservation. Cost to reserve $15 and it will be 
  
 // applied to the final bill. 
  
 // Hence final bill: Total Spent - 30% - $15 
  
 bool 
  
 booking_cost_adjustable 
  
 = 
  
 8 
 ; 
  
 // Additional fees that are charged to the user. 
  
 // Examples: convenience, handling, delivery, packaging, service fee etc. 
  
 repeated 
  
 AdditionalFee 
  
 additional_fees 
  
 = 
  
 10 
 ; 
  
 // Details specifically for gift card deals. 
  
 GiftCardInfo 
  
 gift_card_info 
  
 = 
  
 14 
 ; 
 } 
 

OfferRestrictions definition

  // Next tag: 11 
 message 
  
 OfferRestrictions 
  
 { 
  
 // Whether this offer can be combined with other offers. 
  
 // When true, partners can specify what offers this offer can be combined 
  
 // with. If both combinable_offer_categories & combinable_offer_ids are set 
  
 // then any offer matching one of the conditions above will be combinable. 
  
 bool 
  
 combinable_with_other_offers 
  
 = 
  
 1 
 ; 
  
 // List of offer types that this offer can be combined with. For example, this 
  
 // offer may be combinable with other Coupons. If combinable_with_other_offers 
  
 // is true and this field is unset all types will be combinable. 
  
 repeated 
  
 OfferCategory 
  
 combinable_offer_categories 
  
 = 
  
 2 
 ; 
  
 // List of offer_ids that this offer can be combined with. Some offers may 
  
 // only be combined with certain specific other offer_ids (can be 
  
 // considered parent offers). If combinable_with_other_offers is true and this 
  
 // field is unset all offer ids will be combinable. 
  
 repeated 
  
 string 
  
 combinable_offer_ids 
  
 = 
  
 3 
 ; 
  
 // List of conditions that must be met for the offer to be valid (e.g., 
  
 // non-alcoholic drinks, food). 
  
 repeated 
  
 OfferCondition 
  
 inclusions 
  
 = 
  
 5 
 ; 
  
 // List of conditions that would invalidate the offer (e.g., buffet, combo 
  
 // offers, and cocktails ). 
  
 repeated 
  
 OfferCondition 
  
 exclusions 
  
 = 
  
 6 
 ; 
  
 // The minimum number of people required to avail the offer. 
  
 int32 
  
 min_guest 
  
 = 
  
 7 
 ; 
  
 // Restrictions specific to food offers. 
  
 FoodOfferRestrictions 
  
 food_offer_restrictions 
  
 = 
  
 4 
 ; 
  
 // Special conditions for this offer that must be shown to the user. 
  
 // Examples: "Only valid for payment in [area]", "Excludes online payments" 
  
 repeated 
  
 string 
  
 special_conditions 
  
 = 
  
 10 
 ; 
 } 
 

FoodOfferRestrictions definition

  message 
  
 FoodOfferRestrictions 
  
 { 
  
 // The meal types the offer can be applied to, such as lunch or dinner. 
  
 // If unset, the offer can be applied to all meal types. 
  
 repeated 
  
 MealType 
  
 meal_types 
  
 = 
  
 1 
 ; 
  
 // Whether the offer can only be applied to certain courses. 
  
 bool 
  
 restricted_to_certain_courses 
  
 = 
  
 2 
 ; 
 } 
 

MealType definition

  enum 
  
 MealType 
  
 { 
  
 // The UNSPECIFIED or default enum value should not be used in feeds. 
  
 MEAL_TYPE_UNSPECIFIED 
  
 = 
  
 0 
 ; 
  
 MEAL_TYPE_BREAKFAST 
  
 = 
  
 1 
 ; 
  
 MEAL_TYPE_LUNCH 
  
 = 
  
 2 
 ; 
  
 MEAL_TYPE_DINNER 
  
 = 
  
 3 
 ; 
 } 
 

PaymentInstrument definition

  message 
  
 PaymentInstrument 
  
 { 
  
 // List of payment instruments that can be used to avail the offer. 
  
 // Required. 
  
 repeated 
  
 PaymentInstrumentItem 
  
 items 
  
 = 
  
 1 
  
 [( 
 validator.rule 
 ) 
  
 = 
  
 { 
  
 predicate 
 : 
  
 "not empty($) ?: WARNING_MISSING_PAYMENT_INSTRUMENT_ITEMS" 
  
 }]; 
  
 // Name of the payment instrument provider. Could be a banking partner, name 
  
 // of a bank, etc. For example: American Express, HDFC, ICICI. 
  
 string 
  
 provider_name 
  
 = 
  
 2 
 ; 
 } 
 

PaymentInstrumentType definition

  enum 
  
 PaymentInstrumentType 
  
 { 
  
 // The UNSPECIFIED or default enum value should not be used in feeds. 
  
 PAYMENT_INSTRUMENT_TYPE_UNSPECIFIED 
  
 = 
  
 0 
 ; 
  
 PAYMENT_INSTRUMENT_CREDIT_CARD 
  
 = 
  
 1 
 ; 
  
 PAYMENT_INSTRUMENT_DEBIT_CARD 
  
 = 
  
 2 
 ; 
  
 PAYMENT_INSTRUMENT_BANK_ACCOUNT 
  
 = 
  
 3 
 ; 
  
 PAYMENT_INSTRUMENT_UPI 
  
 = 
  
 4 
 ; 
  
 PAYMENT_INSTRUMENT_ONLINE_WALLET 
  
 = 
  
 5 
 ; 
  
 PAYMENT_INSTRUMENT_NETBANKING 
  
 = 
  
 6 
 ; 
 } 
 

PaymentInstrumentItem definition

  message 
  
 PaymentInstrumentItem 
  
 { 
  
 // Type of the payment instrument. 
  
 // Required. 
  
 PaymentInstrumentType 
  
 type 
  
 = 
  
 1 
  
 [( 
 validator.rule 
 ) 
  
 = 
  
 { 
  
 predicate 
 : 
  
 "$ != PAYMENT_INSTRUMENT_TYPE_UNSPECIFIED ?: WARNING_ILLEGAL_PAYMENT_INSTRUMENT_ITEM_TYPE" 
  
 }]; 
  
 // Name of the payment instrument item like the name of the credit card. 
  
 // For example: HDFC Infinia, American Express Platinum. 
  
 // Required. 
  
 string 
  
 name 
  
 = 
  
 2 
  
 [( 
 validator.rule 
 ) 
  
 = 
  
 { 
  
 predicate 
 : 
  
 "not empty($) ?: WARNING_MISSING_PAYMENT_INSTRUMENT_ITEM_NAME" 
  
 }]; 
 } 
 

Coupon definition

  message 
  
 Coupon 
  
 { 
  
 // The coupon text the offer provider wants to display to users. 
  
 string 
  
 text 
  
 = 
  
 1 
 ; 
  
 // Coupon code required to redeem the offer. 
  
 // Required. 
  
 string 
  
 code 
  
 = 
  
 2 
  
 [( 
 validator.rule 
 ) 
  
 = 
  
 { 
  
 predicate 
 : 
  
 "not empty($) ?: WARNING_MISSING_COUPON_CODE" 
  
 }]; 
 } 
 

Subscription definition

  message 
  
 Subscription 
  
 { 
  
 // The name of the subscription. 
  
 // Required. 
  
 string 
  
 name 
  
 = 
  
 1 
  
 [( 
 validator.rule 
 ) 
  
 = 
  
 { 
  
 predicate 
 : 
  
 "not empty($) ?: WARNING_MISSING_SUBSCRIPTION_NAME" 
  
 }]; 
  
 // Whether the subscription is auto added when a user avails this offer 
  
 bool 
  
 subscription_auto_added 
  
 = 
  
 2 
 ; 
  
 // The cost of the subscription. 
  
 // Required. 
  
 google.type.Money 
  
 cost 
  
 = 
  
 3 
  
 [( 
 validator.rule 
 ) 
  
 = 
  
 { 
  
 is_required 
 : 
  
 "true ?: WARNING_MISSING_SUBSCRIPTION_COST" 
  
 predicate 
 : 
  
 "$.units > 0 or $.nanos > 0 ?: WARNING_MISSING_SUBSCRIPTION_COST" 
  
 }]; 
  
 // How long the subscription is valid for at the subscription_cost. 
  
 // Required. 
  
 google.protobuf.Duration 
  
 subscription_duration 
  
 = 
  
 4 
  
 [( 
 validator.rule 
 ) 
  
 = 
  
 { 
  
 is_required 
 : 
  
 "true ?: WARNING_MISSING_SUBSCRIPTION_DURATION" 
  
 predicate 
 : 
  
 "$.seconds > 0 or $.nanos > 0 ?: WARNING_MISSING_SUBSCRIPTION_DURATION" 
  
 }]; 
  
 // URL to the partner's terms and conditions relevant to this subscription. 
  
 string 
  
 terms_and_conditions_url 
  
 = 
  
 5 
 ; 
 } 
 

Terms definition

  message 
  
 Terms 
  
 { 
  
 // URL to the partner's terms and conditions. 
  
 string 
  
 url 
  
 = 
  
 1 
 ; 
  
 // Whether the offer is restricted to certain users. 
  
 bool 
  
 restricted_to_certain_users 
  
 = 
  
 2 
 ; 
  
 // Primary T&C text provided by the partner. 
  
 string 
  
 terms_and_conditions 
  
 = 
  
 3 
 ; 
  
 // Terms and conditions in addition to the primary T&C from the partner. 
  
 repeated 
  
 string 
  
 additional_terms_and_conditions 
  
 = 
  
 4 
 ; 
 } 
 

ValidityPeriod definition

  message 
  
 ValidityPeriod 
  
 { 
  
 // The start and end timestamp that the offer is valid for. 
  
 // These times must represent distinct days i.e. the start time must be 00:00 
  
 // (beginning of the day) and the end time must be 00:00 (exclusive) on the 
  
 // day the validity period ends. 
  
 ValidityRange 
  
 valid_period 
  
 = 
  
 1 
 ; 
  
 // Specifies the valid time interval on a given day and which days are 
  
 // available for the offer. For timeframes crossing midnight (e.g., 10 PM to 
  
 // 2 AM), use separate windows for each day: one ending at 11:59:59 PM and 
  
 // another starting at 12:00 AM the next day. 
  
 // For example: 
  
 // Monday: 10AM to 5PM 
  
 // Tuesday: 10AM to 2PM 
  
 // Tuesday:  5PM to 7PM 
  
 // Wed, Thur, Fri, Sat, Sun: 3PM to 7PM 
  
 // If none set, it means the offer is available for all time within 
  
 // `valid_period`. 
  
 repeated 
  
 TimeOfDayWindow 
  
 time_of_day 
  
 = 
  
 2 
 ; 
  
 // Specifies exceptions to the above valid_period and valid_time_of_week 
  
 repeated 
  
 ValidTimeException 
  
 time_exceptions 
  
 = 
  
 3 
 ; 
  
 // Specifies exceptions in days to the above valid_period and time_of_day 
  
 repeated 
  
 google.type.Date 
  
 date_exceptions 
  
 = 
  
 4 
 ; 
  
 // Specifies the scope of the validity period. 
  
 ValidityScope 
  
 validity_scope 
  
 = 
  
 5 
 ; 
  
 // The duration (in days) the voucher/coupon is valid for, once 
  
 // purchased. 
  
 int32 
  
 validity_duration_in_days 
  
 = 
  
 6 
 ; 
 } 
 

ValidityRange definition

  // A closed-open timestamp range. 
 message 
  
 ValidityRange 
  
 { 
  
 // The beginning time of the range (inclusive). 
  
 // Required. 
  
 google.protobuf.Timestamp 
  
 valid_from_time 
  
 = 
  
 1 
 ; 
  
 // The ending time of the range (exclusive). 
  
 // If not set, it means that this period is never ending. 
  
 // Optional. 
  
 google.protobuf.Timestamp 
  
 valid_through_time 
  
 = 
  
 2 
 ; 
 } 
 

TimeOfDayWindow definition

  message 
  
 TimeOfDayWindow 
  
 { 
  
 option 
  
 ( 
 validator.defs 
 ) 
  
 = 
  
 { 
  
 feature 
 : 
  
 "deals" 
  
 }; 
  
 // The time window the order can be placed/fulfilled. 
  
 // Required. 
  
 TimeOfDayRange 
  
 time_windows 
  
 = 
  
 1 
  
 [ 
  
 ( 
 validator.rule 
 ) 
  
 = 
  
 { 
  
 is_required 
 : 
  
 "#deals ?: WARNING_MISSING_TIME_WINDOW" 
  
 } 
  
 ]; 
  
 // The list of days in a week the windows are applied. 
  
 // If none set, it means that it applies for all days of the week. 
  
 // Optional. 
  
 repeated 
  
 google.type.DayOfWeek 
  
 day_of_week 
  
 = 
  
 2 
 ; 
 } 
 

TimeOfDayRange definition

  // A closed-open time range. 
 message 
  
 TimeOfDayRange 
  
 { 
  
 option 
  
 ( 
 validator.defs 
 ) 
  
 = 
  
 { 
  
 feature 
 : 
  
 "deals" 
  
 }; 
  
 // A Time indicating the beginning time of the day of the range (inclusive). 
  
 // If not set, it means 00:00:00. 
  
 // Optional. 
  
 google.type.TimeOfDay 
  
 open_time 
  
 = 
  
 1 
  
 [ 
  
 ( 
 validator.rule 
 ) 
  
 = 
  
 { 
  
 is_required 
 : 
  
 "#deals ?: WARNING_MISSING_OPEN_TIME" 
  
 } 
  
 ]; 
  
 // A Time indicating the ending time of the day of the range (exclusive). 
  
 // If not set, it means 23:59:59. 
  
 // Optional. 
  
 google.type.TimeOfDay 
  
 close_time 
  
 = 
  
 2 
  
 [ 
  
 ( 
 validator.rule 
 ) 
  
 = 
  
 { 
  
 is_required 
 : 
  
 "#deals ?: WARNING_MISSING_CLOSE_TIME" 
  
 } 
  
 ]; 
 } 
 

ValidTimeException definition

  message 
  
 ValidTimeException 
  
 { 
  
 option 
  
 ( 
 validator.defs 
 ) 
  
 = 
  
 { 
  
 feature 
 : 
  
 "deals" 
  
 }; 
  
 // The start and end timestamp that the offer is not valid for. 
  
 // These times must represent distinct days i.e. the start time must be 00:00 
  
 // (beginning of the day) and the end time must be 00:00 (exclusive) on the 
  
 // day the exception period ends. 
  
 ValidityRange 
  
 exceptional_period 
  
 = 
  
 1 
  
 [( 
 validator.rule 
 ) 
  
 = 
  
 { 
  
 is_required 
 : 
  
 "#deals ?: WARNING_MISSING_EXCEPTIONAL_PERIOD" 
  
 }]; 
 } 
 

AdditionalFee definition

  message 
  
 AdditionalFee 
  
 { 
  
 // The name of the additional fee. Examples: convenience fee, handling fee 
  
 // etc. 
  
 // Required. 
  
 string 
  
 name 
  
 = 
  
 1 
  
 [( 
 validator.rule 
 ) 
  
 = 
  
 { 
  
 predicate 
 : 
  
 "if(has($fee), not empty($)) ?: ERROR_MISSING_ADDITIONAL_FEE_NAME" 
 , 
  
 }]; 
  
 Fee 
  
 fee 
  
 = 
  
 2 
 ; 
 } 
 

Fee definition

  // Next ID: 5 
 message 
  
 Fee 
  
 { 
  
 option 
  
 ( 
 validator.defs 
 ) 
  
 = 
  
 { 
  
 feature 
 : 
  
 "ignore_offers_with_no_monetary_value" 
  
 }; 
  
 FeeUnit 
  
 unit 
  
 = 
  
 1 
 ; 
  
 FeeType 
  
 type 
  
 = 
  
 2 
 ; 
  
 oneof 
  
 cost 
  
 { 
  
 google.type.Money 
  
 amount 
  
 = 
  
 3 
  
 [( 
 validator.rule 
 ) 
  
 = 
  
 { 
  
 predicate 
 : 
  
 "if($type == FEE_TYPE_FIXED and not #ignore_offers_with_no_monetary_value, $.units > 0 or $.nanos > 0) ?: ERROR_MISSING_MONETARY_VALUE" 
  
 }]; 
  
 MoneyRange 
  
 amount_range 
  
 = 
  
 4 
 ; 
  
 } 
 } 
 

FeeType definition

  enum 
  
 FeeType 
  
 { 
  
 // The UNSPECIFIED or default enum value should not be used in feeds. 
  
 FEE_TYPE_UNSPECIFIED 
  
 = 
  
 0 
 ; 
  
 FEE_TYPE_FIXED 
  
 = 
  
 1 
 ; 
  
 FEE_TYPE_VARIABLE 
  
 = 
  
 2 
 ; 
 } 
 

FeeUnit definition

  enum 
  
 FeeUnit 
  
 { 
  
 // The UNSPECIFIED or default enum value should not be used in feeds. 
  
 FEE_UNIT_UNSPECIFIED 
  
 = 
  
 0 
 ; 
  
 FEE_UNIT_PER_GUEST 
  
 = 
  
 1 
 ; 
  
 FEE_UNIT_PER_TRANSACTION 
  
 = 
  
 2 
 ; 
 } 
 

MoneyRange definition

  // Wrapper for a range of monetary amount that could be bounded or unbounded. 
 // At least one of min_amount and max_amount is required. 
 message 
  
 MoneyRange 
  
 { 
  
 // Minimum amount. 
  
 google.type.Money 
  
 min_amount 
  
 = 
  
 1 
  
 ; 
  
 // Maximum amount. 
  
 google.type.Money 
  
 max_amount 
  
 = 
  
 2 
 ; 
 } 
 

OfferCondition definition

  message 
  
 OfferCondition 
  
 { 
  
 string 
  
 description 
  
 = 
  
 1 
 ; 
 } 
 

OfferTag definition

  enum 
  
 OfferTag 
  
 { 
  
 // The UNSPECIFIED or default enum value should not be used in feeds. 
  
 OFFER_TAG_UNSPECIFIED 
  
 = 
  
 0 
 ; 
  
 OFFER_TAG_NEW_YEAR_SPECIAL 
  
 = 
  
 1 
 ; 
  
 OFFER_TAG_VALENTINES_SPECIAL 
  
 = 
  
 2 
 ; 
 } 
 

Other generic specifications

Samples

Offer

  { 
  
 "data" 
 : 
  
 [ 
  
 { 
  
 "offer_id" 
 : 
  
 "example-footwear-base-offer" 
 , 
  
 "entity_ids" 
 : 
  
 [ 
  
 "footwear-brand-store-1" 
  
 ], 
  
 "brand_id" 
 : 
  
 "example-aggregator" 
 , 
  
 "offer_modes" 
 : 
  
 [ 
 "OFFER_MODE_GIFT_CARD_PURCHASE" 
 ], 
  
 "action_type" 
 : 
  
 "ACTION_TYPE_SHOPPING_IN_STORE" 
 , 
  
 "offer_source" 
 : 
  
 "OFFER_SOURCE_AGGREGATOR" 
 , 
  
 "offer_category" 
 : 
  
 "OFFER_CATEGORY_BASE_OFFER" 
 , 
  
 "offer_details" 
 : 
  
 { 
  
 "offer_display_text" 
 : 
  
 "10% off on Gift Cards" 
 , 
  
 "discount_percent" 
 : 
  
 10.0 
 , 
  
 "gift_card_info" 
 : 
  
 { 
  
 "custom_range" 
 : 
  
 { 
  
 "min_amount" 
 : 
  
 { 
  
 "units" 
 : 
  
 500 
 , 
  
 "currency_code" 
 : 
  
 "INR" 
  
 }, 
  
 "max_amount" 
 : 
  
 { 
  
 "units" 
 : 
  
 20000 
 , 
  
 "currency_code" 
 : 
  
 "INR" 
  
 } 
  
 } 
  
 } 
  
 }, 
  
 "offer_restrictions" 
 : 
  
 { 
  
 "combinable_with_other_offers" 
 : 
  
 true 
 , 
  
 "combinable_offer_categories" 
 : 
  
 [ 
 "OFFER_CATEGORY_ADD_ON_PAYMENT_OFFER" 
 ], 
  
 "special_conditions" 
 : 
  
 [ 
  
 "Gift Voucher can be clubbed with any offer & promotion" 
 , 
  
 "Partial redemption of this Gift Voucher is not allowed; No cash refund, in part or full, will be provided against this Gift Voucher" 
 , 
  
 "Multiple gift vouchers can be used against one bill. If the invoice value is greater than the GC value, customers can pay the balance amount through Cash, UPI or Debit / credit card as the case may be." 
  
 ] 
  
 }, 
  
 "terms" 
 : 
  
 { 
  
 "restricted_to_certain_users" 
 : 
  
 false 
 , 
  
 "terms_and_conditions" 
 : 
  
 "1. Gift Voucher is redeemable exclusively at our stores\n2. Gift Voucher is valid for 6 (six) months from the date of issue and cannot be extended or replaced post expiry\n3. In case Gift Voucher is lost, or stolen, damaged or destroyed we shall not be liable for the same" 
  
 }, 
  
 "validity_periods" 
 : 
  
 [ 
  
 { 
  
 "valid_period" 
 : 
  
 { 
  
 "valid_from_time" 
 : 
  
 { 
  
 "seconds" 
 : 
  
 "1774934350" 
  
 } 
  
 }, 
  
 "validity_scope" 
 : 
  
 "VALIDITY_SCOPE_CLAIM" 
  
 }, 
  
 { 
  
 "validity_duration_in_days" 
 : 
  
 180 
 , 
  
 "validity_scope" 
 : 
  
 "VALIDITY_SCOPE_REDEEM" 
  
 } 
  
 ], 
  
 "offer_url" 
 : 
  
 "https://www.example-aggregator.com/footwear-brand-e-gift-instant-voucher" 
  
 }, 
  
 { 
  
 "offer_id" 
 : 
  
 "example-apparel-base-offer-1" 
 , 
  
 "entity_ids" 
 : 
  
 [ 
  
 "apparel-brand-store-1" 
  
 ], 
  
 "brand_id" 
 : 
  
 "example-aggregator" 
 , 
  
 "offer_modes" 
 : 
  
 [ 
 "OFFER_MODE_GIFT_CARD_PURCHASE" 
 ], 
  
 "action_type" 
 : 
  
 "ACTION_TYPE_SHOPPING_IN_STORE" 
 , 
  
 "offer_source" 
 : 
  
 "OFFER_SOURCE_AGGREGATOR" 
 , 
  
 "offer_category" 
 : 
  
 "OFFER_CATEGORY_BASE_OFFER" 
 , 
  
 "offer_details" 
 : 
  
 { 
  
 "offer_display_text" 
 : 
  
 "11% off on Gift Cards" 
 , 
  
 "discount_percent" 
 : 
  
 11.0 
 , 
  
 "gift_card_info" 
 : 
  
 { 
  
 "fixed_denominations" 
 : 
  
 { 
  
 "amounts" 
 : 
  
 [ 
  
 { 
  
 "units" 
 : 
  
 500 
 , 
  
 "currency_code" 
 : 
  
 "INR" 
  
 }, 
  
 { 
  
 "units" 
 : 
  
 1000 
 , 
  
 "currency_code" 
 : 
  
 "INR" 
  
 }, 
  
 { 
  
 "units" 
 : 
  
 2000 
 , 
  
 "currency_code" 
 : 
  
 "INR" 
  
 }, 
  
 { 
  
 "units" 
 : 
  
 3000 
 , 
  
 "currency_code" 
 : 
  
 "INR" 
  
 }, 
  
 { 
  
 "units" 
 : 
  
 5000 
 , 
  
 "currency_code" 
 : 
  
 "INR" 
  
 } 
  
 ] 
  
 } 
  
 } 
  
 }, 
  
 "offer_restrictions" 
 : 
  
 { 
  
 "combinable_with_other_offers" 
 : 
  
 false 
 , 
  
 "special_conditions" 
 : 
  
 [ 
  
 "Multiple Vouchers are applicable on the same bill" 
 , 
  
 "Non Refundable" 
  
 ] 
  
 }, 
  
 "terms" 
 : 
  
 { 
  
 "restricted_to_certain_users" 
 : 
  
 false 
 , 
  
 "terms_and_conditions" 
 : 
  
 "1. This E-Gift Voucher can be redeemed only at physical stores, and not official website.\n2. E-Gift voucher has to be redeemed in full as partial redemption is not allowed.\n3. Do inform the cashier that you plan using the E-Gift Voucher for making payments before billing." 
  
 }, 
  
 "validity_periods" 
 : 
  
 [ 
  
 { 
  
 "valid_period" 
 : 
  
 { 
  
 "valid_from_time" 
 : 
  
 { 
  
 "seconds" 
 : 
  
 "1774934350" 
  
 } 
  
 }, 
  
 "validity_scope" 
 : 
  
 "VALIDITY_SCOPE_CLAIM" 
  
 }, 
  
 { 
  
 "validity_duration_in_days" 
 : 
  
 60 
 , 
  
 "validity_scope" 
 : 
  
 "VALIDITY_SCOPE_REDEEM" 
  
 } 
  
 ], 
  
 "offer_url" 
 : 
  
 "https://www.example-aggregator.com/apparel-brand/vouchers/" 
  
 }, 
  
 { 
  
 "offer_id" 
 : 
  
 "example-bank-fashion-base-offer" 
 , 
  
 "entity_ids" 
 : 
  
 [ 
  
 "fashion-retailer-india" 
  
 ], 
  
 "brand_id" 
 : 
  
 "example-bank-rewards" 
 , 
  
 "offer_modes" 
 : 
  
 [ 
 "OFFER_MODE_GIFT_CARD_PURCHASE" 
 ], 
  
 "action_type" 
 : 
  
 "ACTION_TYPE_SHOPPING_IN_STORE" 
 , 
  
 "offer_source" 
 : 
  
 "OFFER_SOURCE_AGGREGATOR" 
 , 
  
 "offer_category" 
 : 
  
 "OFFER_CATEGORY_BASE_OFFER" 
 , 
  
 "offer_details" 
 : 
  
 { 
  
 "offer_display_text" 
 : 
  
 "7.5% off on Gift Cards" 
 , 
  
 "discount_percent" 
 : 
  
 7.5 
 , 
  
 "gift_card_info" 
 : 
  
 { 
  
 "custom_range" 
 : 
  
 { 
  
 "min_amount" 
 : 
  
 { 
  
 "units" 
 : 
  
 100 
 , 
  
 "currency_code" 
 : 
  
 "INR" 
  
 }, 
  
 "max_amount" 
 : 
  
 { 
  
 "units" 
 : 
  
 10000 
 , 
  
 "currency_code" 
 : 
  
 "INR" 
  
 } 
  
 } 
  
 } 
  
 }, 
  
 "payment_instrument" 
 : 
  
 { 
  
 "items" 
 : 
  
 [ 
  
 { 
  
 "type" 
 : 
  
 "PAYMENT_INSTRUMENT_CREDIT_CARD" 
 , 
  
 "name" 
 : 
  
 "MockBank Credit Card" 
  
 }, 
  
 { 
  
 "type" 
 : 
  
 "PAYMENT_INSTRUMENT_DEBIT_CARD" 
 , 
  
 "name" 
 : 
  
 "MockBank Debit Card" 
  
 }, 
  
 { 
  
 "type" 
 : 
  
 "PAYMENT_INSTRUMENT_ONLINE_WALLET" 
 , 
  
 "name" 
 : 
  
 "MockWallet" 
  
 } 
  
 ] 
  
 }, 
  
 "offer_restrictions" 
 : 
  
 { 
  
 "combinable_with_other_offers" 
 : 
  
 false 
 , 
  
 "special_conditions" 
 : 
  
 [ 
  
 "Gift Voucher/ e-Pay is ACCEPTED at all Listed Outlets." 
 , 
  
 "Gift Voucher/ e-Pay CANNOT be used Online." 
 , 
  
 "Gift Voucher/e-Pay CAN be used during the Sale." 
 , 
  
 "Multiple Gift Vouchers CAN be combined & added to the e-Pay balance." 
  
 ] 
  
 }, 
  
 "terms" 
 : 
  
 { 
  
 "restricted_to_certain_users" 
 : 
  
 false 
 , 
  
 "terms_and_conditions" 
 : 
  
 "1. Ensure your Gift Card is valid and active before redemption.\n2. Partial balances, if any, remain usable until the expiry date.\n3. Redemption is subject to prevailing terms and conditions." 
  
 }, 
  
 "validity_periods" 
 : 
  
 [ 
  
 { 
  
 "valid_period" 
 : 
  
 { 
  
 "valid_from_time" 
 : 
  
 { 
  
 "seconds" 
 : 
  
 "1774934350" 
  
 } 
  
 }, 
  
 "validity_scope" 
 : 
  
 "VALIDITY_SCOPE_CLAIM" 
  
 }, 
  
 { 
  
 "validity_duration_in_days" 
 : 
  
 180 
 , 
  
 "validity_scope" 
 : 
  
 "VALIDITY_SCOPE_REDEEM" 
  
 } 
  
 ], 
  
 "offer_url" 
 : 
  
 "https://www.example-aggregator.com/instantvouchers/fashion-gift-vouchers" 
  
 }, 
  
 { 
  
 "offer_id" 
 : 
  
 "example-bank-fashion-addon-offer" 
 , 
  
 "entity_ids" 
 : 
  
 [ 
  
 "fashion-retailer-india" 
  
 ], 
  
 "brand_id" 
 : 
  
 "example-bank-rewards" 
 , 
  
 "offer_modes" 
 : 
  
 [ 
 "OFFER_MODE_GIFT_CARD_PURCHASE" 
 ], 
  
 "action_type" 
 : 
  
 "ACTION_TYPE_SHOPPING_IN_STORE" 
 , 
  
 "offer_source" 
 : 
  
 "OFFER_SOURCE_AGGREGATOR" 
 , 
  
 "offer_category" 
 : 
  
 "OFFER_CATEGORY_ADD_ON_PAYMENT_OFFER" 
 , 
  
 "offer_details" 
 : 
  
 { 
  
 "offer_display_text" 
 : 
  
 "Get additional 5% Loyalty points" 
 , 
  
 "other_offer_detail_text" 
 : 
  
 "Get additional 5% Loyalty points" 
  
 }, 
  
 "payment_instrument" 
 : 
  
 { 
  
 "items" 
 : 
  
 [ 
  
 { 
  
 "type" 
 : 
  
 "PAYMENT_INSTRUMENT_CREDIT_CARD" 
 , 
  
 "name" 
 : 
  
 "MockBank Credit Card" 
  
 }, 
  
 { 
  
 "type" 
 : 
  
 "PAYMENT_INSTRUMENT_DEBIT_CARD" 
 , 
  
 "name" 
 : 
  
 "MockBank Debit Card" 
  
 }, 
  
 { 
  
 "type" 
 : 
  
 "PAYMENT_INSTRUMENT_ONLINE_WALLET" 
 , 
  
 "name" 
 : 
  
 "MockWallet" 
  
 } 
  
 ] 
  
 }, 
  
 "offer_restrictions" 
 : 
  
 { 
  
 "combinable_with_other_offers" 
 : 
  
 true 
 , 
  
 "combinable_offer_ids" 
 : 
  
 [ 
 "example-bank-fashion-base-offer" 
 ] 
  
 }, 
  
 "terms" 
 : 
  
 { 
  
 "restricted_to_certain_users" 
 : 
  
 false 
  
 }, 
  
 "validity_periods" 
 : 
  
 [ 
  
 { 
  
 "valid_period" 
 : 
  
 { 
  
 "valid_from_time" 
 : 
  
 { 
  
 "seconds" 
 : 
  
 "1774934350" 
  
 } 
  
 }, 
  
 "validity_scope" 
 : 
  
 "VALIDITY_SCOPE_CLAIM" 
  
 } 
  
 ], 
  
 "offer_url" 
 : 
  
 "https://www.example-aggregator.com/instantvouchers/fashion-gift-vouchers" 
  
 } 
  
 ] 
 } 
 

File Descriptor

  { 
  
 "generation_timestamp" 
 : 
  
 1692998244 
 , 
  
 "name" 
 : 
  
 "google.offer" 
 , 
  
 "data_file" 
 : 
  
 [ 
  
 "offer_shopping.json" 
  
 ] 
 } 
 
Create a Mobile Website
View Site in Mobile | Classic
Share by: