@encorekit/web-sdk 2.2.1 → 2.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (269) hide show
  1. package/README.md +66 -1
  2. package/dist/cjs/index.cjs +1 -1
  3. package/dist/cjs/index.cjs.map +1 -1
  4. package/dist/cjs/preview.cjs +2 -0
  5. package/dist/cjs/preview.cjs.map +1 -0
  6. package/dist/cjs/react.cjs +1 -1
  7. package/dist/cjs/react.cjs.map +1 -1
  8. package/dist/esm/chunks/ClaimReminder-DFyrm5bJ.js +2 -0
  9. package/dist/esm/chunks/ClaimReminder-DFyrm5bJ.js.map +1 -0
  10. package/dist/esm/chunks/GiftsButton-B0lVB463.js +2 -0
  11. package/dist/esm/chunks/GiftsButton-B0lVB463.js.map +1 -0
  12. package/dist/esm/chunks/TriggerHost-CNTiNrTH.js +2 -0
  13. package/dist/esm/chunks/TriggerHost-CNTiNrTH.js.map +1 -0
  14. package/dist/esm/chunks/autoPops-CngtK_R0.js +2 -0
  15. package/dist/esm/chunks/autoPops-CngtK_R0.js.map +1 -0
  16. package/dist/esm/chunks/customClaim-B4uj-aOc.js +2 -0
  17. package/dist/esm/chunks/customClaim-B4uj-aOc.js.map +1 -0
  18. package/dist/esm/chunks/eligibility-BY7fL8Ve.js +2 -0
  19. package/dist/esm/chunks/eligibility-BY7fL8Ve.js.map +1 -0
  20. package/dist/esm/chunks/index-CaBSqauy.js +2 -0
  21. package/dist/esm/chunks/index-CaBSqauy.js.map +1 -0
  22. package/dist/esm/chunks/lookValues-B9z2VWpH.js +2 -0
  23. package/dist/esm/chunks/lookValues-B9z2VWpH.js.map +1 -0
  24. package/dist/esm/chunks/sduiView-Ds7QtFId.js +2 -0
  25. package/dist/esm/chunks/sduiView-Ds7QtFId.js.map +1 -0
  26. package/dist/esm/chunks/spot-DkKMLpB-.js +2 -0
  27. package/dist/esm/chunks/spot-DkKMLpB-.js.map +1 -0
  28. package/dist/esm/chunks/template-B9p4CbPD.js +2 -0
  29. package/dist/esm/chunks/template-B9p4CbPD.js.map +1 -0
  30. package/dist/esm/chunks/textSlots-BnwxUg9V.js +2 -0
  31. package/dist/esm/chunks/textSlots-BnwxUg9V.js.map +1 -0
  32. package/dist/esm/chunks/timers-Bva4yoGM.js +2 -0
  33. package/dist/esm/chunks/timers-Bva4yoGM.js.map +1 -0
  34. package/dist/esm/index.js +1 -1
  35. package/dist/esm/index.js.map +1 -1
  36. package/dist/esm/preview.js +2 -0
  37. package/dist/esm/preview.js.map +1 -0
  38. package/dist/esm/react.js +1 -1
  39. package/dist/esm/react.js.map +1 -1
  40. package/dist/umd/encore.min.js +1 -1
  41. package/dist/umd/encore.min.js.map +1 -1
  42. package/package.json +9 -1
  43. package/types/analytics/DiagnosticsOutbox.d.ts +1 -0
  44. package/types/analytics/DiagnosticsOutbox.d.ts.map +1 -1
  45. package/types/analytics/events.d.ts +108 -8
  46. package/types/analytics/events.d.ts.map +1 -1
  47. package/types/analytics/models.d.ts +2 -0
  48. package/types/analytics/models.d.ts.map +1 -1
  49. package/types/analytics/transport.d.ts +6 -0
  50. package/types/analytics/transport.d.ts.map +1 -1
  51. package/types/api/APIClient.d.ts +70 -33
  52. package/types/api/APIClient.d.ts.map +1 -1
  53. package/types/api/contract.d.ts +4 -1
  54. package/types/api/contract.d.ts.map +1 -1
  55. package/types/api/generated/types.d.ts +994 -17
  56. package/types/api/generated/types.d.ts.map +1 -1
  57. package/types/api/models.d.ts +29 -8
  58. package/types/api/models.d.ts.map +1 -1
  59. package/types/api/offerBuilder.d.ts +51 -0
  60. package/types/api/offerBuilder.d.ts.map +1 -0
  61. package/types/core/Configuration.d.ts +9 -0
  62. package/types/core/Configuration.d.ts.map +1 -1
  63. package/types/core/Encore.d.ts +145 -3
  64. package/types/core/Encore.d.ts.map +1 -1
  65. package/types/core/OfferManager.d.ts +27 -5
  66. package/types/core/OfferManager.d.ts.map +1 -1
  67. package/types/core/PlacementBuilder.d.ts +6 -1
  68. package/types/core/PlacementBuilder.d.ts.map +1 -1
  69. package/types/core/SignalManager.d.ts.map +1 -1
  70. package/types/core/StorageManager.d.ts +3 -2
  71. package/types/core/StorageManager.d.ts.map +1 -1
  72. package/types/core/StrictUnlockReconciler.d.ts +1 -1
  73. package/types/core/StrictUnlockReconciler.d.ts.map +1 -1
  74. package/types/core/claimHandle.d.ts +44 -0
  75. package/types/core/claimHandle.d.ts.map +1 -0
  76. package/types/core/claimLog.d.ts +102 -0
  77. package/types/core/claimLog.d.ts.map +1 -0
  78. package/types/core/claimRefusal.d.ts +3 -0
  79. package/types/core/claimRefusal.d.ts.map +1 -0
  80. package/types/core/claimScreenVariant.d.ts +3 -0
  81. package/types/core/claimScreenVariant.d.ts.map +1 -0
  82. package/types/core/claimStatusCheck.d.ts +62 -0
  83. package/types/core/claimStatusCheck.d.ts.map +1 -0
  84. package/types/core/giftVariant.d.ts +5 -0
  85. package/types/core/giftVariant.d.ts.map +1 -1
  86. package/types/core/hostDisplay.d.ts +9 -2
  87. package/types/core/hostDisplay.d.ts.map +1 -1
  88. package/types/core/sduiVariables.d.ts +20 -0
  89. package/types/core/sduiVariables.d.ts.map +1 -0
  90. package/types/core/strings.d.ts +114 -0
  91. package/types/core/strings.d.ts.map +1 -0
  92. package/types/core/unlockCode.d.ts +12 -2
  93. package/types/core/unlockCode.d.ts.map +1 -1
  94. package/types/core/userKeys.d.ts +7 -0
  95. package/types/core/userKeys.d.ts.map +1 -0
  96. package/types/core/version.d.ts +1 -1
  97. package/types/experiments/ExposureOutbox.d.ts +1 -0
  98. package/types/experiments/ExposureOutbox.d.ts.map +1 -1
  99. package/types/preview.d.ts +51 -0
  100. package/types/preview.d.ts.map +1 -0
  101. package/types/react.d.ts +53 -1
  102. package/types/react.d.ts.map +1 -1
  103. package/types/sdui/actions.d.ts +93 -0
  104. package/types/sdui/actions.d.ts.map +1 -0
  105. package/types/sdui/bindings.d.ts +63 -0
  106. package/types/sdui/bindings.d.ts.map +1 -0
  107. package/types/sdui/compile.d.ts +88 -0
  108. package/types/sdui/compile.d.ts.map +1 -0
  109. package/types/sdui/conditions.d.ts +22 -0
  110. package/types/sdui/conditions.d.ts.map +1 -0
  111. package/types/sdui/context.d.ts +132 -0
  112. package/types/sdui/context.d.ts.map +1 -0
  113. package/types/sdui/countdown.d.ts +31 -0
  114. package/types/sdui/countdown.d.ts.map +1 -0
  115. package/types/sdui/decode.d.ts +35 -0
  116. package/types/sdui/decode.d.ts.map +1 -0
  117. package/types/sdui/deps.d.ts +43 -0
  118. package/types/sdui/deps.d.ts.map +1 -0
  119. package/types/sdui/dominantColor.d.ts +24 -0
  120. package/types/sdui/dominantColor.d.ts.map +1 -0
  121. package/types/sdui/elements/confetti.d.ts +38 -0
  122. package/types/sdui/elements/confetti.d.ts.map +1 -0
  123. package/types/sdui/elements/content.d.ts +27 -0
  124. package/types/sdui/elements/content.d.ts.map +1 -0
  125. package/types/sdui/elements/interactive.d.ts +48 -0
  126. package/types/sdui/elements/interactive.d.ts.map +1 -0
  127. package/types/sdui/elements/layout.d.ts +41 -0
  128. package/types/sdui/elements/layout.d.ts.map +1 -0
  129. package/types/sdui/elements/marquee.d.ts +17 -0
  130. package/types/sdui/elements/marquee.d.ts.map +1 -0
  131. package/types/sdui/elements/progress.d.ts +10 -0
  132. package/types/sdui/elements/progress.d.ts.map +1 -0
  133. package/types/sdui/elements/shared.d.ts +138 -0
  134. package/types/sdui/elements/shared.d.ts.map +1 -0
  135. package/types/sdui/elements/symbols.d.ts +22 -0
  136. package/types/sdui/elements/symbols.d.ts.map +1 -0
  137. package/types/sdui/elements/triggerText.d.ts +55 -0
  138. package/types/sdui/elements/triggerText.d.ts.map +1 -0
  139. package/types/sdui/host.d.ts +274 -0
  140. package/types/sdui/host.d.ts.map +1 -0
  141. package/types/sdui/inlineMarkup.d.ts +22 -0
  142. package/types/sdui/inlineMarkup.d.ts.map +1 -0
  143. package/types/sdui/lookValues.d.ts +50 -0
  144. package/types/sdui/lookValues.d.ts.map +1 -0
  145. package/types/sdui/model.d.ts +130 -0
  146. package/types/sdui/model.d.ts.map +1 -0
  147. package/types/sdui/motion.d.ts +37 -0
  148. package/types/sdui/motion.d.ts.map +1 -0
  149. package/types/sdui/precheck.d.ts +94 -0
  150. package/types/sdui/precheck.d.ts.map +1 -0
  151. package/types/sdui/scrollMath.d.ts +32 -0
  152. package/types/sdui/scrollMath.d.ts.map +1 -0
  153. package/types/sdui/style.d.ts +99 -0
  154. package/types/sdui/style.d.ts.map +1 -0
  155. package/types/sdui/triggerKit.d.ts +24 -0
  156. package/types/sdui/triggerKit.d.ts.map +1 -0
  157. package/types/sdui/unrunnable.d.ts +11 -0
  158. package/types/sdui/unrunnable.d.ts.map +1 -0
  159. package/types/sdui/vocabulary.d.ts +119 -0
  160. package/types/sdui/vocabulary.d.ts.map +1 -0
  161. package/types/triggers/claimReminder/ClaimReminder.d.ts +65 -0
  162. package/types/triggers/claimReminder/ClaimReminder.d.ts.map +1 -0
  163. package/types/triggers/claimReminder/bindings.d.ts +40 -0
  164. package/types/triggers/claimReminder/bindings.d.ts.map +1 -0
  165. package/types/triggers/claimReminder/config.d.ts +56 -0
  166. package/types/triggers/claimReminder/config.d.ts.map +1 -0
  167. package/types/triggers/claimReminder/eligibility.d.ts +37 -0
  168. package/types/triggers/claimReminder/eligibility.d.ts.map +1 -0
  169. package/types/triggers/claimReminder/servedWindow.d.ts +15 -0
  170. package/types/triggers/claimReminder/servedWindow.d.ts.map +1 -0
  171. package/types/triggers/claimReminder/source.d.ts +29 -0
  172. package/types/triggers/claimReminder/source.d.ts.map +1 -0
  173. package/types/triggers/giftsButton/GiftsButton.d.ts +60 -0
  174. package/types/triggers/giftsButton/GiftsButton.d.ts.map +1 -0
  175. package/types/triggers/giftsButton/config.d.ts +53 -0
  176. package/types/triggers/giftsButton/config.d.ts.map +1 -0
  177. package/types/triggers/giftsButton/spot.d.ts +54 -0
  178. package/types/triggers/giftsButton/spot.d.ts.map +1 -0
  179. package/types/triggers/host/TriggerHost.d.ts +127 -0
  180. package/types/triggers/host/TriggerHost.d.ts.map +1 -0
  181. package/types/triggers/host/autoPops.d.ts +16 -0
  182. package/types/triggers/host/autoPops.d.ts.map +1 -0
  183. package/types/triggers/host/configCache.d.ts +29 -0
  184. package/types/triggers/host/configCache.d.ts.map +1 -0
  185. package/types/triggers/host/customClaim.d.ts +85 -0
  186. package/types/triggers/host/customClaim.d.ts.map +1 -0
  187. package/types/triggers/host/dismissStore.d.ts +37 -0
  188. package/types/triggers/host/dismissStore.d.ts.map +1 -0
  189. package/types/triggers/host/readThrottle.d.ts +15 -0
  190. package/types/triggers/host/readThrottle.d.ts.map +1 -0
  191. package/types/triggers/host/registry.d.ts +17 -0
  192. package/types/triggers/host/registry.d.ts.map +1 -0
  193. package/types/triggers/host/sduiView.d.ts +31 -0
  194. package/types/triggers/host/sduiView.d.ts.map +1 -0
  195. package/types/triggers/host/template.d.ts +28 -0
  196. package/types/triggers/host/template.d.ts.map +1 -0
  197. package/types/triggers/host/textSlots.d.ts +35 -0
  198. package/types/triggers/host/textSlots.d.ts.map +1 -0
  199. package/types/triggers/host/theme.d.ts +87 -0
  200. package/types/triggers/host/theme.d.ts.map +1 -0
  201. package/types/triggers/host/timers.d.ts +11 -0
  202. package/types/triggers/host/timers.d.ts.map +1 -0
  203. package/types/triggers/host/types.d.ts +278 -0
  204. package/types/triggers/host/types.d.ts.map +1 -0
  205. package/types/triggers/host/wire.d.ts +55 -0
  206. package/types/triggers/host/wire.d.ts.map +1 -0
  207. package/types/triggers/preview.d.ts +78 -0
  208. package/types/triggers/preview.d.ts.map +1 -0
  209. package/types/triggers/request.d.ts +53 -0
  210. package/types/triggers/request.d.ts.map +1 -0
  211. package/types/types.d.ts +420 -4
  212. package/types/types.d.ts.map +1 -1
  213. package/types/ui/ClaimScreen.d.ts +62 -0
  214. package/types/ui/ClaimScreen.d.ts.map +1 -0
  215. package/types/ui/CodeUnlock.d.ts +26 -2
  216. package/types/ui/CodeUnlock.d.ts.map +1 -1
  217. package/types/ui/GiftHero.d.ts.map +1 -1
  218. package/types/ui/GiftList.d.ts.map +1 -1
  219. package/types/ui/GiftPicker.d.ts.map +1 -1
  220. package/types/ui/GiftPickerHero.d.ts.map +1 -1
  221. package/types/ui/GiftReveal.d.ts.map +1 -1
  222. package/types/ui/GiftSheet.d.ts +5 -5
  223. package/types/ui/GiftSheet.d.ts.map +1 -1
  224. package/types/ui/GiftUnwrap.d.ts.map +1 -1
  225. package/types/ui/OfferCard.d.ts.map +1 -1
  226. package/types/ui/OfferCarousel.d.ts.map +1 -1
  227. package/types/ui/OfferModal.d.ts +31 -6
  228. package/types/ui/OfferModal.d.ts.map +1 -1
  229. package/types/ui/PrimerScreen.d.ts +2 -0
  230. package/types/ui/PrimerScreen.d.ts.map +1 -1
  231. package/types/ui/RedemptionScreen.d.ts +5 -0
  232. package/types/ui/RedemptionScreen.d.ts.map +1 -1
  233. package/types/ui/RewardActions.d.ts.map +1 -1
  234. package/types/ui/RewardCard.d.ts.map +1 -1
  235. package/types/ui/SduiRewardSurface.d.ts +145 -0
  236. package/types/ui/SduiRewardSurface.d.ts.map +1 -0
  237. package/types/ui/Tooltip.d.ts.map +1 -1
  238. package/types/ui/brandComponents.d.ts.map +1 -1
  239. package/types/ui/brandTint.d.ts.map +1 -1
  240. package/types/ui/colorScheme.d.ts +15 -0
  241. package/types/ui/colorScheme.d.ts.map +1 -0
  242. package/types/ui/covered.d.ts +12 -0
  243. package/types/ui/covered.d.ts.map +1 -0
  244. package/types/ui/giftCategoryGroups.d.ts +13 -0
  245. package/types/ui/giftCategoryGroups.d.ts.map +1 -1
  246. package/types/ui/giftCopy.d.ts +14 -9
  247. package/types/ui/giftCopy.d.ts.map +1 -1
  248. package/types/ui/giftUnwrapCopy.d.ts.map +1 -1
  249. package/types/ui/imageURL.d.ts +44 -0
  250. package/types/ui/imageURL.d.ts.map +1 -0
  251. package/types/ui/impressionGate.d.ts +9 -0
  252. package/types/ui/impressionGate.d.ts.map +1 -1
  253. package/types/ui/offerBadge.d.ts.map +1 -1
  254. package/types/ui/rewardSurface.d.ts +11 -1
  255. package/types/ui/rewardSurface.d.ts.map +1 -1
  256. package/types/ui/sduiTheme.d.ts +48 -0
  257. package/types/ui/sduiTheme.d.ts.map +1 -0
  258. package/types/ui/sheetDetents.d.ts +28 -0
  259. package/types/ui/sheetDetents.d.ts.map +1 -0
  260. package/types/ui/styles.d.ts +11 -8
  261. package/types/ui/styles.d.ts.map +1 -1
  262. package/types/ui/termsLine.d.ts +3 -3
  263. package/types/ui/termsLine.d.ts.map +1 -1
  264. package/types/ui/toast.d.ts +11 -0
  265. package/types/ui/toast.d.ts.map +1 -0
  266. package/types/utils/logger.d.ts +10 -0
  267. package/types/utils/logger.d.ts.map +1 -1
  268. package/types/utils/text.d.ts +17 -0
  269. package/types/utils/text.d.ts.map +1 -1
@@ -104,6 +104,10 @@ export interface paths {
104
104
  heroImageUrl?: string | null;
105
105
  /** @description https link to the advertiser offer terms. Null or absent: render terms copy as plain text. */
106
106
  termsUrl?: string | null;
107
+ /** @description Display-only strings a variant renders by key, e.g. {"eligibilityNote":"New subscribers only"}. Values are strings; the type is free-form so one unexpected value cannot fail a client decode. Absent or empty: the variant draws none of those lines. */
108
+ displayProperties?: {
109
+ [key: string]: unknown;
110
+ };
107
111
  /** Format: date-time */
108
112
  createdAt: string;
109
113
  /** Format: date-time */
@@ -139,9 +143,10 @@ export interface paths {
139
143
  ctaText: string;
140
144
  /**
141
145
  * Format: uri
142
- * @description Optional override for campaign destinationUrl
146
+ * @description The campaign's destination, on a served creative; null where not served
143
147
  */
144
148
  destinationUrl: string | null;
149
+ /** @description The campaign's claim tracking, on a served creative; null where not served */
145
150
  trackingParameters: {
146
151
  [key: string]: unknown;
147
152
  } | null;
@@ -152,6 +157,8 @@ export interface paths {
152
157
  title: string;
153
158
  subtitle: string;
154
159
  ctaButtonText?: string;
160
+ /** @description Optional https image for this step. Absent: the step has none. */
161
+ imageUrl?: string;
155
162
  }[] | null;
156
163
  /** @description Short, actionable phrases (max 1-3) that guide users. Examples: "sign up, create registry", "add to cart" */
157
164
  quickInstructions: string | null;
@@ -231,6 +238,8 @@ export interface paths {
231
238
  "application/json": {
232
239
  error: string;
233
240
  details?: unknown;
241
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
242
+ code?: string;
234
243
  };
235
244
  };
236
245
  };
@@ -283,8 +292,12 @@ export interface paths {
283
292
  latitude?: string;
284
293
  /** @description Decimal degrees as string (e.g., "-122.4194") */
285
294
  longitude?: string;
295
+ /** @description Whole years, as an integer. If you hold only a RANGE, send its LOWEST end: "13-17" is sent as 13. Under 18 restricts this request to offers rated for that age, with no per-user personalisation. Used for this request only and never stored. Lower than an age stored through /users/attributes, it wins; higher, the stored one does. A fraction is rounded down, also as a decimal string ("17.9" is 17), a whole-number string is read as its number, and a range string as its lowest end ("13-17" is 13, "65+" is 65); any other value is ignored, never a 400. */
296
+ age?: number;
297
+ /** @description Deprecated: send age instead. A YYYY-MM-DD date, or an ISO 8601 date-time with a zone, is turned into an age for this request only, then discarded; never stored or logged. If age is also sent, the younger of the two is used. An unreadable date is ignored, never a 400. */
286
298
  dateOfBirth?: string;
287
299
  gender?: string;
300
+ /** @description BCP 47 language tag; only the language subtag is used for creative locale resolution, and only when the app has that language enabled. Falls back to Accept-Language, then the app default locale. */
288
301
  language?: string;
289
302
  subscriptionTier?: string;
290
303
  monthsSubscribed?: string;
@@ -325,8 +338,17 @@ export interface paths {
325
338
  variantId?: string;
326
339
  /** @description Publisher-defined surface label for where the offer is shown (e.g. 'paywall', 'onboarding', 'settings'). Stamped onto the sdk_offer_requested event so publisher analytics can break the funnel out by placement. An Encore admin can also configure a per-placement offer rule for an app, in which case this label SELECTS and ORDERS the offers returned for that placement; with no rule configured, which is the default for every app, it stays analytics-only and changes nothing about what is served. Max 64 chars. SDKs may send their own auto-generated `placement_<8 hex>` id when the publisher supplied none — that is expected and is folded into the '(unlabeled)' bucket at read time; do NOT substitute '(unlabeled)' or an empty string yourself. */
327
340
  placementId?: string;
341
+ /**
342
+ * @description Which Encore surface is being filled. Ignored while OFFERS_SEARCH_RESOLVES_SURFACE is off. With it on and no variantId, the server resolves the variant for this use case (and the placementId pin) as GET /config does; a sent variantId always wins. Absent or unrecognised: today's behaviour (churn-intervention). Never a 400.
343
+ * @enum {string}
344
+ */
345
+ useCase?: "churn-intervention" | "post-action-reward";
328
346
  /** @description Strict unlock mode: only include campaigns whose postback latency is less than or equal to this value (in milliseconds). Omit for no filtering. Bounded 1000..120000. */
329
347
  maxPostbackTimeMs?: number;
348
+ /** @description Send only when this placement carries the app's own prize for a reward-for-trying Yes: the app's daily prize limit from its SDK configuration (PublisherRewardPolicy), clamped server-side to 1..10. The response then carries publisherRewardPromise. Omit it and nothing changes. */
349
+ publisherRewardDailyLimit?: number;
350
+ /** @description Why the client is searching. `purpose: "prefetch"` marks a search the SDK runs before any sheet is shown (a GiftsButton or ClaimReminder checking that offers exist). Its result may later back the sheet the user opens with a tap, so it is a served request like any other, not an impression. It is stamped as purpose on sdk_offer_requested so a report can split these out. Any other value is ignored, never a 400. Serving is identical either way. */
351
+ purpose?: string;
330
352
  /** @description Request-scoped serving context. Unknown keys are ignored. */
331
353
  context?: {
332
354
  /** @description Request-scoped activity the user is engaged in at serve time (what the surface is being used for, not a persisted user property). Recognized values: laundry, vending, car_wash, air_vacuum, amusement. Any other value is accepted and recorded on serve analytics, so unrecognized activities show up in reporting rather than failing the request. Does not change which offers are served today. */
@@ -409,6 +431,10 @@ export interface paths {
409
431
  heroImageUrl?: string | null;
410
432
  /** @description https link to the advertiser offer terms. Null or absent: render terms copy as plain text. */
411
433
  termsUrl?: string | null;
434
+ /** @description Display-only strings a variant renders by key, e.g. {"eligibilityNote":"New subscribers only"}. Values are strings; the type is free-form so one unexpected value cannot fail a client decode. Absent or empty: the variant draws none of those lines. */
435
+ displayProperties?: {
436
+ [key: string]: unknown;
437
+ };
412
438
  /** Format: date-time */
413
439
  createdAt: string;
414
440
  /** Format: date-time */
@@ -444,9 +470,10 @@ export interface paths {
444
470
  ctaText: string;
445
471
  /**
446
472
  * Format: uri
447
- * @description Optional override for campaign destinationUrl
473
+ * @description The campaign's destination, on a served creative; null where not served
448
474
  */
449
475
  destinationUrl: string | null;
476
+ /** @description The campaign's claim tracking, on a served creative; null where not served */
450
477
  trackingParameters: {
451
478
  [key: string]: unknown;
452
479
  } | null;
@@ -457,6 +484,8 @@ export interface paths {
457
484
  title: string;
458
485
  subtitle: string;
459
486
  ctaButtonText?: string;
487
+ /** @description Optional https image for this step. Absent: the step has none. */
488
+ imageUrl?: string;
460
489
  }[] | null;
461
490
  /** @description Short, actionable phrases (max 1-3) that guide users. Examples: "sign up, create registry", "add to cart" */
462
491
  quickInstructions: string | null;
@@ -523,11 +552,48 @@ export interface paths {
523
552
  category?: string | null;
524
553
  /** @description The gift-sheet group this campaign files under: "Watch & listen", "Money" or "Everyday". Derived from `category` by the server so a native chip strip shows what web tabs show without holding the taxonomy map. Always set: an absent, blank or unmapped category files under "Everyday", so every offer sits in some group. Whether a strip is worth drawing is the client's call, because only it knows which offers its sheet lists. /offers/search only: web-sdk holds its own copy of the map and groups `category` itself. */
525
554
  categoryGroup?: string | null;
555
+ /** @description `category` in the response locale, for display only. Group and filter on `category`, which stays English. Null when `category` is null. /offers/search only. */
556
+ categoryDisplayName?: string | null;
557
+ /** @description `categoryGroup` in the response locale, for display only. Group on `categoryGroup`, which stays English. /offers/search only. */
558
+ categoryGroupDisplayName?: string | null;
526
559
  /** @description Estimated time from the user tapping this offer to the reward being confirmed, from recent real conversions (on demo offers, from the demo advertiser's configured behavior instead). Half confirm within medianSeconds, 9 in 10 within p90Seconds. Not a guarantee: to show a wait, use p90Seconds. Null when there is no current estimate (too few recent conversions, data more than 7 days old, or an offer that does not confirm through the advertiser); say nothing about timing then. */
527
560
  rewardConfirmationTime?: {
528
561
  medianSeconds: number;
529
562
  p90Seconds: number;
530
563
  } | null;
564
+ /** @description This offer's per-offer reward. Present only for an app with reward settings; null when the offer carries no value: in on_yes show the placement's flat prize, in on_verified show no prize (a null value is never paid). Absent: the app has no per-offer rewards. /offers/search only. */
565
+ publisherRewardValue?: {
566
+ /** @description Tokens this offer is worth in the app's own unit. The offer_completed webhook's reward.amount carries the value frozen when the user claimed. */
567
+ amount: number;
568
+ /** @description Ready-to-render card text, e.g. "1,500 tokens". Show it in place of the flat PublisherReward title. */
569
+ label: string;
570
+ } | null;
571
+ /** @description Campaign claim-URL query parameters, keys verbatim (e.g. {"af_rid":"TRANSACTION_ID"}); equals the served creative's whenever one exists. Always pair it with the offer's destinationUrl, never with a creative's, and never build a claim URL from an absent or empty value. Absent from servers that predate it; null means the campaign has none. */
572
+ trackingParameters?: {
573
+ [key: string]: unknown;
574
+ } | null;
575
+ /** @description Campaign call-to-action text. Absent from servers that predate it; null means the campaign has none. */
576
+ ctaText?: string | null;
577
+ /** @description Campaign description, localized like creatives. Absent from servers that predate it; null means the campaign has none. */
578
+ description?: string | null;
579
+ /** @description Campaign step-by-step instructions, same shape as a creative's. Absent from servers that predate it; null means the campaign has none. */
580
+ instructions?: {
581
+ title: string;
582
+ subtitle: string;
583
+ ctaButtonText?: string;
584
+ /** @description Optional https image for this step. Absent: the step has none. */
585
+ imageUrl?: string;
586
+ }[] | null;
587
+ /** @description Campaign one-line instructions. Absent from servers that predate it; null means the campaign has none. */
588
+ quickInstructions?: string | null;
589
+ /** @description Campaign logo override; null means use organization.logoUrl. Plain string, not format: uri, so one bad value cannot fail a whole Android decode. Absent from servers that predate it; null means the campaign has none. */
590
+ logoUrl?: string | null;
591
+ /** @description Campaign card title. Absent from servers that predate it; null means the campaign has none. */
592
+ title?: string | null;
593
+ /** @description Campaign card subtitle. Absent from servers that predate it; null means the campaign has none. */
594
+ subtitle?: string | null;
595
+ /** @description Campaign tooltip text. Absent from servers that predate it; null means the campaign has none. */
596
+ tooltipText?: string | null;
531
597
  }[];
532
598
  metadata: {
533
599
  /** @description Total offers available */
@@ -545,6 +611,13 @@ export interface paths {
545
611
  };
546
612
  /** @description Resolved locale served in this response (language-only, e.g. 'es'). Absent on pre-localization responses. */
547
613
  locale?: string;
614
+ /** @description Whether this user is still under the app's daily prize limit (publisherRewardDailyLimit, rolling 24 hours). What counts depends on publisherRewardMode. on_yes (or no mode): prizes granted on a reward-for-trying Yes. on_verified: this user's verified completions that carried a reward, by when they verified; a Yes never grants and never counts, and the reward arrives on the offer_completed webhook. Present only when the request sent publisherRewardDailyLimit. Offers this user already completed or said Yes to are never served, so this answers the daily limit only. Absent (an older backend, or no limit sent) means no promise. Not a grant: in on_yes the self-report's granted answer is final. */
615
+ publisherRewardPromise?: boolean;
616
+ /**
617
+ * @description How this app pays its prize. on_yes: a reward-for-trying Yes can grant it (self-report granted). on_verified: a Yes never grants; each offer's publisherRewardValue arrives on the offer_completed webhook when the brand confirms. Present only for an app with reward settings (and always when the promise was counted under on_verified). Decode as a string and treat an unknown value as on_yes.
618
+ * @enum {string}
619
+ */
620
+ publisherRewardMode?: "on_yes" | "on_verified";
548
621
  error?: string | null;
549
622
  };
550
623
  };
@@ -558,6 +631,8 @@ export interface paths {
558
631
  "application/json": {
559
632
  error: string;
560
633
  details?: unknown;
634
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
635
+ code?: string;
561
636
  };
562
637
  };
563
638
  };
@@ -570,6 +645,8 @@ export interface paths {
570
645
  "application/json": {
571
646
  error: string;
572
647
  details?: unknown;
648
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
649
+ code?: string;
573
650
  };
574
651
  };
575
652
  };
@@ -582,6 +659,8 @@ export interface paths {
582
659
  "application/json": {
583
660
  error: string;
584
661
  details?: unknown;
662
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
663
+ code?: string;
585
664
  };
586
665
  };
587
666
  };
@@ -594,6 +673,8 @@ export interface paths {
594
673
  "application/json": {
595
674
  error: string;
596
675
  details?: unknown;
676
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
677
+ code?: string;
597
678
  };
598
679
  };
599
680
  };
@@ -614,7 +695,7 @@ export interface paths {
614
695
  };
615
696
  get?: never;
616
697
  put?: never;
617
- /** @description Rebrokering catalog: the full set of offers your app may serve to a given end user, to render on your own surface. Two hard, server-enforced filters always apply: entitlement (your app's opt-outs + whitelist) and geo (offers not redeemable in the end user's country are dropped: non-redeemable offers are never returned). Serve path requires `userId` (a stable end-user identifier) and geo (`countryCode`, or the end user's IP forwarded via X-Forwarded-For); missing either is a 400. Each returned creative carries a tokenized `clickUrl`: route the end user there on tap and it records an attributed transaction (bound to your app, the offer, the creative, and the userId) then 302s to the advertiser. Filter to your curated offer IDs and order CLIENT-SIDE, falling back to other returned offers so your surface is never empty (the server does not narrow to your picks). Set `includeAllRegions: true` for config-time discovery of your full addressable inventory (skips geo, needs no userId, returns no clickUrls; each offer carries targetCountries); not for display. Authentication: publishable key (X-API-Key: pk_live_* / pk_test_*). */
698
+ /** @description Rebrokering catalog: the full set of offers your app may serve to a given end user, to render on your own surface. Two hard, server-enforced filters always apply: entitlement (your app's opt-outs + whitelist) and geo (offers not redeemable in the end user's country are dropped: non-redeemable offers are never returned). Serve path requires `userId` (a stable end-user identifier) and geo (`countryCode`, or the end user's IP forwarded via X-Forwarded-For); missing either is a 400. On the serve path, offers this end user already completed (a confirmed conversion, or a Yes they reported through an Encore SDK) are left out. Each returned creative carries a tokenized `clickUrl`: route the end user there on tap and it records an attributed transaction (bound to your app, the offer, the creative, and the userId) then 302s to the advertiser. Filter to your curated offer IDs and order CLIENT-SIDE, falling back to other returned offers so your surface is never empty (the server does not narrow to your picks). Set `includeAllRegions: true` for config-time discovery of your full addressable inventory (skips geo, needs no userId, returns no clickUrls; each offer carries targetCountries); not for display. Authentication: publishable key (X-API-Key: pk_live_* / pk_test_*). */
618
699
  post: {
619
700
  parameters: {
620
701
  query?: never;
@@ -625,7 +706,7 @@ export interface paths {
625
706
  requestBody?: {
626
707
  content: {
627
708
  "application/json": {
628
- /** @description Stable identifier for the END USER you are rendering offers to (any opaque string; does not need to be PII). REQUIRED on the serve path — it is bound into each offer's clickUrl so a click records a transaction attributed to (your app, the offer, the creative, this user), and it drives per-user fraud controls (trial caps, retake blocking) at click time. Use the same value across renders for the same user. Not required when includeAllRegions is set (config mode returns no clickUrls). */
709
+ /** @description Stable identifier for the END USER you are rendering offers to (any opaque string; does not need to be PII). REQUIRED on the serve path — it is bound into each offer's clickUrl so a click records a transaction attributed to (your app, the offer, the creative, this user), it drives per-user fraud controls (trial caps, retake blocking) at click time, and on the serve path it leaves out offers this user already completed. Use the same value across renders for the same user. Not required when includeAllRegions is set (config mode returns no clickUrls). */
629
710
  userId?: string;
630
711
  /** @description Optional identifier for the operator/sub-publisher on whose behalf offers are shown. Carried through as an analytics dimension. Defaults to userId when omitted. */
631
712
  clientId?: string;
@@ -638,6 +719,8 @@ export interface paths {
638
719
  platform?: "android" | "ios" | "web";
639
720
  /** @description Optional publisher-defined label for the surface this offer is shown on (e.g. 'cancel_flow', 'home_feed', 'post_purchase'). Stamped onto the impression AND onto the click it produces, so publisher analytics can break the funnel out by placement. Normalised server-side: a blank value is treated as absent, anything longer than 64 characters is TRUNCATED rather than rejected, and the stored label NEVER carries leading or trailing whitespace, including after truncation, so ' my label ' and 'my label' are always one placement and can never show up as two rows. Case IS significant: 'Cancel_Flow' and 'cancel_flow' are different placements. Omit it and this traffic groups under '(unlabeled)', the same bucket as an SDK integration that supplies no placement. A per-placement offer rule NEVER applies here. `/offers/catalog` returns inventory rather than a served set, so a rule configured for this label does not select or order what comes back. Scope an inventory pull on your own filters, never on a rule. */
640
721
  placementId?: string;
722
+ /** @description Optional BCP 47 language tag (e.g. "es", "pt-BR"), from the host's language override. Wins over Accept-Language; only the language subtag is used (nb is served as no; iw, in, ji, jw as he, id, yi, jv), and only when the app has it enabled, else Accept-Language, then the app default. A tag the SDKs would refuse (malformed, underscores, or an extended language subtag such as zh-yue-HK) is 400 with details.code INVALID_LANGUAGE. */
723
+ language?: string;
641
724
  /** @description CONFIG-TIME ONLY. When true, skips geo-filtering and returns the full addressable inventory for your app (entitlement still applies), with each offer's targetCountries — use this to build your curation. Do NOT use for offers displayed to an end user; those must come from a geo-scoped request (countryCode or forwarded IP). When true, no geography signal is required and countryCode is ignored. */
642
725
  includeAllRegions?: boolean;
643
726
  /** @description Optional page size (1..100). OMIT to return ALL eligible offers (the default) — catalogs are small enough that you normally take the whole set and curate client-side. Provide only if you want to page (with offset). */
@@ -680,6 +763,10 @@ export interface paths {
680
763
  isDemo?: boolean;
681
764
  /** @description https link to the advertiser offer terms. Null or absent: render terms copy as plain text. */
682
765
  termsUrl?: string | null;
766
+ /** @description Display-only strings a variant renders by key, e.g. {"eligibilityNote":"New subscribers only"}. Values are strings; the type is free-form so one unexpected value cannot fail a client decode. Absent or empty: the variant draws none of those lines. */
767
+ displayProperties?: {
768
+ [key: string]: unknown;
769
+ };
683
770
  /** @description Estimated time from the user tapping this offer to the reward being confirmed, from recent real conversions (on demo offers, from the demo advertiser's configured behavior instead). Half confirm within medianSeconds, 9 in 10 within p90Seconds. Not a guarantee: to show a wait, use p90Seconds. Null when there is no current estimate (too few recent conversions, data more than 7 days old, or an offer that does not confirm through the advertiser); say nothing about timing then. */
684
771
  rewardConfirmationTime?: {
685
772
  medianSeconds: number;
@@ -712,6 +799,8 @@ export interface paths {
712
799
  title: string;
713
800
  subtitle: string;
714
801
  ctaButtonText?: string;
802
+ /** @description Optional https image for this step. Absent: the step has none. */
803
+ imageUrl?: string;
715
804
  }[] | null;
716
805
  /** @description A short one line version of the instructions, e.g. "sign up, complete one survey". Null or absent: the creative has none. */
717
806
  quickInstructions?: string | null;
@@ -744,6 +833,8 @@ export interface paths {
744
833
  "application/json": {
745
834
  error: string;
746
835
  details?: unknown;
836
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
837
+ code?: string;
747
838
  };
748
839
  };
749
840
  };
@@ -756,6 +847,8 @@ export interface paths {
756
847
  "application/json": {
757
848
  error: string;
758
849
  details?: unknown;
850
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
851
+ code?: string;
759
852
  };
760
853
  };
761
854
  };
@@ -768,6 +861,8 @@ export interface paths {
768
861
  "application/json": {
769
862
  error: string;
770
863
  details?: unknown;
864
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
865
+ code?: string;
771
866
  };
772
867
  };
773
868
  };
@@ -807,13 +902,35 @@ export interface paths {
807
902
  attributes: {
808
903
  /** @description ISO 3166-1 alpha-2 country code (e.g., "US", "GB", "CA"). */
809
904
  countryCode: string;
810
- /** @description BCP 47 language tag — drives creative locale resolution (e.g., 'en', 'es'). */
905
+ /** @description BCP 47 language tag; only the language subtag is used for creative locale resolution, and only when the app has that language enabled. Falls back to Accept-Language, then the app default locale. */
811
906
  language: string;
812
907
  /**
813
908
  * @description Recipient's device platform — drives creative compatibility filtering. Optional: omit for a platform='api' app to receive all eligible offers untrimmed; device-SDK apps always send it. 'api' is not a valid value here.
814
909
  * @enum {string}
815
910
  */
816
911
  platform?: "android" | "ios" | "web";
912
+ /** @description Device OS version, e.g. '14' or '17.5.1'. Optional; a malformed value is ignored. */
913
+ osVersion?: string | null;
914
+ /** @description The END DEVICE's user agent, not the caller's. On the API lane the publisher's server calls us, so the header we see is theirs. Optional; a malformed value is ignored. */
915
+ userAgent?: string | null;
916
+ /** @description Device advertising id, unhashed: IDFA on iOS, GAID/GPID on Android. Optional, and accepted only from an app whose `deviceIdentifiersMode` is enabled and which is not declared for children or likely used by them; ignored otherwise. Must be a UUID; an all-zero id reads as absent. */
917
+ advertisingId?: string | null;
918
+ /** @description True when the user has limited ad tracking. Accepts OpenRTB's 0/1 integer too. A consent signal, not a device attribute. Optional; a malformed value counts as true. */
919
+ limitAdTracking?: (boolean | null) | 0 | 1;
920
+ /** @description OpenRTB `device.dnt`. A consent signal like `limitAdTracking`, and equally underivable. Accepts 0/1 too. Optional; a malformed value counts as true. */
921
+ doNotTrack?: (boolean | null) | 0 | 1;
922
+ /** @description Public IPv4 or IPv6 address of the END DEVICE, never your server's. Same gate as `advertisingId`. Optional; a malformed, private or reserved address is ignored. */
923
+ deviceIp?: string | null;
924
+ /** @description OpenRTB `regs.gdpr`: true when GDPR applies to this user. Accepts 0/1 too. Optional; a malformed value counts as true. */
925
+ gdprApplies?: (boolean | null) | 0 | 1;
926
+ /** @description IAB TCF consent string from your consent tool, forwarded as `user.consent`. Optional; a malformed value is ignored. */
927
+ consentString?: string | null;
928
+ /** @description IAB Global Privacy Platform string, forwarded as `regs.gpp`. Optional; a malformed value counts as an opt-out. */
929
+ gpp?: string | null;
930
+ /** @description GPP section ids in force, forwarded as `regs.gpp_sid`. Optional; a malformed value counts as an opt-out. */
931
+ gppSid?: number[] | null;
932
+ /** @description IAB US Privacy string, e.g. '1YNN', forwarded as `regs.us_privacy`. Optional; a malformed value counts as an opt-out. */
933
+ usPrivacy?: string | null;
817
934
  };
818
935
  /** @description Optional publisher-defined label for the surface this offer is shown on (e.g. 'cancel_flow', 'home_feed', 'post_purchase'). Stamped onto the impression AND onto the click it produces, so publisher analytics can break the funnel out by placement. Normalised server-side: a blank value is treated as absent, anything longer than 64 characters is TRUNCATED rather than rejected, and the stored label NEVER carries leading or trailing whitespace, including after truncation, so ' my label ' and 'my label' are always one placement and can never show up as two rows. Case IS significant: 'Cancel_Flow' and 'cancel_flow' are different placements. Omit it and this traffic groups under '(unlabeled)', the same bucket as an SDK integration that supplies no placement. An Encore admin can also configure a per-placement offer rule for an app, in which case this label SELECTS and ORDERS the offers returned for that placement; with no rule configured, which is the default for every app, it stays analytics-only and changes nothing about what is served. */
819
936
  placementId?: string;
@@ -875,6 +992,8 @@ export interface paths {
875
992
  "application/json": {
876
993
  error: string;
877
994
  details?: unknown;
995
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
996
+ code?: string;
878
997
  };
879
998
  };
880
999
  };
@@ -887,6 +1006,8 @@ export interface paths {
887
1006
  "application/json": {
888
1007
  error: string;
889
1008
  details?: unknown;
1009
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
1010
+ code?: string;
890
1011
  };
891
1012
  };
892
1013
  };
@@ -899,6 +1020,8 @@ export interface paths {
899
1020
  "application/json": {
900
1021
  error: string;
901
1022
  details?: unknown;
1023
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
1024
+ code?: string;
902
1025
  };
903
1026
  };
904
1027
  };
@@ -938,13 +1061,35 @@ export interface paths {
938
1061
  attributes: {
939
1062
  /** @description ISO 3166-1 alpha-2 country code (e.g., "US", "GB", "CA"). */
940
1063
  countryCode: string;
941
- /** @description BCP 47 language tag — drives creative locale resolution (e.g., 'en', 'es'). */
1064
+ /** @description BCP 47 language tag; only the language subtag is used for creative locale resolution, and only when the app has that language enabled. Falls back to Accept-Language, then the app default locale. */
942
1065
  language: string;
943
1066
  /**
944
1067
  * @description Recipient's device platform — drives creative compatibility filtering. Optional: omit for a platform='api' app to receive all eligible offers untrimmed; device-SDK apps always send it. 'api' is not a valid value here.
945
1068
  * @enum {string}
946
1069
  */
947
1070
  platform?: "android" | "ios" | "web";
1071
+ /** @description Device OS version, e.g. '14' or '17.5.1'. Optional; a malformed value is ignored. */
1072
+ osVersion?: string | null;
1073
+ /** @description The END DEVICE's user agent, not the caller's. On the API lane the publisher's server calls us, so the header we see is theirs. Optional; a malformed value is ignored. */
1074
+ userAgent?: string | null;
1075
+ /** @description Device advertising id, unhashed: IDFA on iOS, GAID/GPID on Android. Optional, and accepted only from an app whose `deviceIdentifiersMode` is enabled and which is not declared for children or likely used by them; ignored otherwise. Must be a UUID; an all-zero id reads as absent. */
1076
+ advertisingId?: string | null;
1077
+ /** @description True when the user has limited ad tracking. Accepts OpenRTB's 0/1 integer too. A consent signal, not a device attribute. Optional; a malformed value counts as true. */
1078
+ limitAdTracking?: (boolean | null) | 0 | 1;
1079
+ /** @description OpenRTB `device.dnt`. A consent signal like `limitAdTracking`, and equally underivable. Accepts 0/1 too. Optional; a malformed value counts as true. */
1080
+ doNotTrack?: (boolean | null) | 0 | 1;
1081
+ /** @description Public IPv4 or IPv6 address of the END DEVICE, never your server's. Same gate as `advertisingId`. Optional; a malformed, private or reserved address is ignored. */
1082
+ deviceIp?: string | null;
1083
+ /** @description OpenRTB `regs.gdpr`: true when GDPR applies to this user. Accepts 0/1 too. Optional; a malformed value counts as true. */
1084
+ gdprApplies?: (boolean | null) | 0 | 1;
1085
+ /** @description IAB TCF consent string from your consent tool, forwarded as `user.consent`. Optional; a malformed value is ignored. */
1086
+ consentString?: string | null;
1087
+ /** @description IAB Global Privacy Platform string, forwarded as `regs.gpp`. Optional; a malformed value counts as an opt-out. */
1088
+ gpp?: string | null;
1089
+ /** @description GPP section ids in force, forwarded as `regs.gpp_sid`. Optional; a malformed value counts as an opt-out. */
1090
+ gppSid?: number[] | null;
1091
+ /** @description IAB US Privacy string, e.g. '1YNN', forwarded as `regs.us_privacy`. Optional; a malformed value counts as an opt-out. */
1092
+ usPrivacy?: string | null;
948
1093
  };
949
1094
  /**
950
1095
  * @description Maximum number of offers to return (1–25, default 10). The client controls display order and cycles through them one at a time.
@@ -1014,6 +1159,10 @@ export interface paths {
1014
1159
  heroImageUrl?: string | null;
1015
1160
  /** @description https link to the advertiser offer terms. Null or absent: render terms copy as plain text. */
1016
1161
  termsUrl?: string | null;
1162
+ /** @description Display-only strings a variant renders by key, e.g. {"eligibilityNote":"New subscribers only"}. Values are strings; the type is free-form so one unexpected value cannot fail a client decode. Absent or empty: the variant draws none of those lines. */
1163
+ displayProperties?: {
1164
+ [key: string]: unknown;
1165
+ };
1017
1166
  /** @description Display name of the campaign category, e.g. "Music and Audio". Free string: the taxonomy is admin-editable, so accept any value. */
1018
1167
  category?: string | null;
1019
1168
  /** @description Step by step instructions from the creative, translated like the title. Null or absent: the creative has none. */
@@ -1021,6 +1170,8 @@ export interface paths {
1021
1170
  title: string;
1022
1171
  subtitle: string;
1023
1172
  ctaButtonText?: string;
1173
+ /** @description Optional https image for this step. Absent: the step has none. */
1174
+ imageUrl?: string;
1024
1175
  }[] | null;
1025
1176
  /** @description A short one line version of the instructions, e.g. "sign up, complete one survey". Null or absent: the creative has none. */
1026
1177
  quickInstructions?: string | null;
@@ -1042,6 +1193,8 @@ export interface paths {
1042
1193
  "application/json": {
1043
1194
  error: string;
1044
1195
  details?: unknown;
1196
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
1197
+ code?: string;
1045
1198
  };
1046
1199
  };
1047
1200
  };
@@ -1054,6 +1207,8 @@ export interface paths {
1054
1207
  "application/json": {
1055
1208
  error: string;
1056
1209
  details?: unknown;
1210
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
1211
+ code?: string;
1057
1212
  };
1058
1213
  };
1059
1214
  };
@@ -1066,6 +1221,8 @@ export interface paths {
1066
1221
  "application/json": {
1067
1222
  error: string;
1068
1223
  details?: unknown;
1224
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
1225
+ code?: string;
1069
1226
  };
1070
1227
  };
1071
1228
  };
@@ -1129,6 +1286,8 @@ export interface paths {
1129
1286
  "application/json": {
1130
1287
  error: string;
1131
1288
  details?: unknown;
1289
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
1290
+ code?: string;
1132
1291
  };
1133
1292
  };
1134
1293
  };
@@ -1141,6 +1300,8 @@ export interface paths {
1141
1300
  "application/json": {
1142
1301
  error: string;
1143
1302
  details?: unknown;
1303
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
1304
+ code?: string;
1144
1305
  };
1145
1306
  };
1146
1307
  };
@@ -1153,6 +1314,8 @@ export interface paths {
1153
1314
  "application/json": {
1154
1315
  error: string;
1155
1316
  details?: unknown;
1317
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
1318
+ code?: string;
1156
1319
  };
1157
1320
  };
1158
1321
  };
@@ -1173,7 +1336,7 @@ export interface paths {
1173
1336
  };
1174
1337
  get?: never;
1175
1338
  put?: never;
1176
- /** @description Create a new transaction for a specific campaign */
1339
+ /** @description Create a new transaction for a specific campaign. 409 with code 'offerAlreadyCompleted' when this user already completed the offer, or said Yes to it through a self-report: drop the offer from the list rather than retrying. The app-wide trial-limit 409 carries no code. */
1177
1340
  post: {
1178
1341
  parameters: {
1179
1342
  query?: never;
@@ -1191,6 +1354,11 @@ export interface paths {
1191
1354
  * @enum {string}
1192
1355
  */
1193
1356
  useCase?: "churn-intervention" | "post-action-reward";
1357
+ /**
1358
+ * Format: uuid
1359
+ * @description The id of the variant whose remote template rendered this sheet. Absent when the embedded floor rendered. A per-offer reward is frozen on the transaction only when this variant shows per-offer reward values; absent, malformed or unknown means none is frozen. Never a 400.
1360
+ */
1361
+ variantId?: string;
1194
1362
  };
1195
1363
  };
1196
1364
  };
@@ -1230,6 +1398,8 @@ export interface paths {
1230
1398
  "application/json": {
1231
1399
  error: string;
1232
1400
  details?: unknown;
1401
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
1402
+ code?: string;
1233
1403
  };
1234
1404
  };
1235
1405
  };
@@ -1242,6 +1412,8 @@ export interface paths {
1242
1412
  "application/json": {
1243
1413
  error: string;
1244
1414
  details?: unknown;
1415
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
1416
+ code?: string;
1245
1417
  };
1246
1418
  };
1247
1419
  };
@@ -1254,6 +1426,8 @@ export interface paths {
1254
1426
  "application/json": {
1255
1427
  error: string;
1256
1428
  details?: unknown;
1429
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
1430
+ code?: string;
1257
1431
  };
1258
1432
  };
1259
1433
  };
@@ -1266,6 +1440,8 @@ export interface paths {
1266
1440
  "application/json": {
1267
1441
  error: string;
1268
1442
  details?: unknown;
1443
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
1444
+ code?: string;
1269
1445
  };
1270
1446
  };
1271
1447
  };
@@ -1278,6 +1454,139 @@ export interface paths {
1278
1454
  "application/json": {
1279
1455
  error: string;
1280
1456
  details?: unknown;
1457
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
1458
+ code?: string;
1459
+ };
1460
+ };
1461
+ };
1462
+ };
1463
+ };
1464
+ delete?: never;
1465
+ options?: never;
1466
+ head?: never;
1467
+ patch?: never;
1468
+ trace?: never;
1469
+ };
1470
+ "/publisher/sdk/v1/transactions/preload": {
1471
+ parameters: {
1472
+ query?: never;
1473
+ header?: never;
1474
+ path?: never;
1475
+ cookie?: never;
1476
+ };
1477
+ get?: never;
1478
+ put?: never;
1479
+ /** @description Reserve the transaction id to substitute for TRANSACTION_ID when preloading an offer link before the claim tap. Not a claim: nothing is counted, stamped or frozen until POST /transactions, which returns this same id when it comes within 30 minutes of the last preload. Send the claim's body. 409 with code 'preloadUnsupported' when this offer's link must not be loaded before a tap; 409 'offerAlreadyCompleted' and the trial-limit 409 as on the claim. Treat any non-200 as no preload. */
1480
+ post: {
1481
+ parameters: {
1482
+ query?: never;
1483
+ header?: never;
1484
+ path?: never;
1485
+ cookie?: never;
1486
+ };
1487
+ requestBody: {
1488
+ content: {
1489
+ "application/json": {
1490
+ campaignId: string;
1491
+ userId: string;
1492
+ /**
1493
+ * @description Accepted so the claim's body can be sent unchanged; ignored. The claim stamps it.
1494
+ * @enum {string}
1495
+ */
1496
+ useCase?: "churn-intervention" | "post-action-reward";
1497
+ /**
1498
+ * Format: uuid
1499
+ * @description Accepted so the claim's body can be sent unchanged; ignored. Never a 400.
1500
+ */
1501
+ variantId?: string;
1502
+ };
1503
+ };
1504
+ };
1505
+ responses: {
1506
+ /** @description Default Response */
1507
+ 200: {
1508
+ headers: {
1509
+ [name: string]: unknown;
1510
+ };
1511
+ content: {
1512
+ "application/json": {
1513
+ /** @enum {boolean} */
1514
+ success: true;
1515
+ /**
1516
+ * Format: uuid
1517
+ * @description The id to substitute for TRANSACTION_ID in the preloaded offer link. The claim returns the same id when it comes within 30 minutes of the last preload; any other id means discard the preload.
1518
+ */
1519
+ transactionId: string;
1520
+ };
1521
+ };
1522
+ };
1523
+ /** @description Default Response */
1524
+ 400: {
1525
+ headers: {
1526
+ [name: string]: unknown;
1527
+ };
1528
+ content: {
1529
+ "application/json": {
1530
+ error: string;
1531
+ details?: unknown;
1532
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
1533
+ code?: string;
1534
+ };
1535
+ };
1536
+ };
1537
+ /** @description Default Response */
1538
+ 401: {
1539
+ headers: {
1540
+ [name: string]: unknown;
1541
+ };
1542
+ content: {
1543
+ "application/json": {
1544
+ error: string;
1545
+ details?: unknown;
1546
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
1547
+ code?: string;
1548
+ };
1549
+ };
1550
+ };
1551
+ /** @description Default Response */
1552
+ 404: {
1553
+ headers: {
1554
+ [name: string]: unknown;
1555
+ };
1556
+ content: {
1557
+ "application/json": {
1558
+ error: string;
1559
+ details?: unknown;
1560
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
1561
+ code?: string;
1562
+ };
1563
+ };
1564
+ };
1565
+ /** @description Default Response */
1566
+ 409: {
1567
+ headers: {
1568
+ [name: string]: unknown;
1569
+ };
1570
+ content: {
1571
+ "application/json": {
1572
+ error: string;
1573
+ details?: unknown;
1574
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
1575
+ code?: string;
1576
+ };
1577
+ };
1578
+ };
1579
+ /** @description Default Response */
1580
+ 500: {
1581
+ headers: {
1582
+ [name: string]: unknown;
1583
+ };
1584
+ content: {
1585
+ "application/json": {
1586
+ error: string;
1587
+ details?: unknown;
1588
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
1589
+ code?: string;
1281
1590
  };
1282
1591
  };
1283
1592
  };
@@ -1341,6 +1650,8 @@ export interface paths {
1341
1650
  "application/json": {
1342
1651
  error: string;
1343
1652
  details?: unknown;
1653
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
1654
+ code?: string;
1344
1655
  };
1345
1656
  };
1346
1657
  };
@@ -1353,6 +1664,8 @@ export interface paths {
1353
1664
  "application/json": {
1354
1665
  error: string;
1355
1666
  details?: unknown;
1667
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
1668
+ code?: string;
1356
1669
  };
1357
1670
  };
1358
1671
  };
@@ -1365,6 +1678,8 @@ export interface paths {
1365
1678
  "application/json": {
1366
1679
  error: string;
1367
1680
  details?: unknown;
1681
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
1682
+ code?: string;
1368
1683
  };
1369
1684
  };
1370
1685
  };
@@ -1377,6 +1692,8 @@ export interface paths {
1377
1692
  "application/json": {
1378
1693
  error: string;
1379
1694
  details?: unknown;
1695
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
1696
+ code?: string;
1380
1697
  };
1381
1698
  };
1382
1699
  };
@@ -1389,6 +1706,133 @@ export interface paths {
1389
1706
  "application/json": {
1390
1707
  error: string;
1391
1708
  details?: unknown;
1709
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
1710
+ code?: string;
1711
+ };
1712
+ };
1713
+ };
1714
+ };
1715
+ };
1716
+ delete?: never;
1717
+ options?: never;
1718
+ head?: never;
1719
+ patch?: never;
1720
+ trace?: never;
1721
+ };
1722
+ "/publisher/sdk/v1/transactions/{transactionId}/self-report": {
1723
+ parameters: {
1724
+ query?: never;
1725
+ header?: never;
1726
+ path?: never;
1727
+ cookie?: never;
1728
+ };
1729
+ get?: never;
1730
+ put?: never;
1731
+ /** @description Record that the user answered "Yes, I completed it" to a reward-for-trying offer, and decide whether the app may grant its own prize. Send it on EVERY tapped Yes, prize or not: the Yes is stored per person (the app's user id), so the offer is hidden from that person on every surface and a re-claim is refused (409 offerAlreadyCompleted), including after a reinstall or on a second device. granted is true only for the first Yes per person per offer, while the person is under the app's daily limit (a rolling 24 hours). Treat no answer as no prize. Idempotent on reportId. Never changes the transaction: no status, payout, entitlement or webhook. 404 when the transaction does not belong to this app, or userId is not the current user id of the person who claimed it. The server cannot tell an identified user from an SDK-generated anonymous id: an app that wants prizes kept to signed-in users must gate the promise client-side. */
1732
+ post: {
1733
+ parameters: {
1734
+ query?: never;
1735
+ header?: never;
1736
+ path: {
1737
+ transactionId: string;
1738
+ };
1739
+ cookie?: never;
1740
+ };
1741
+ requestBody: {
1742
+ content: {
1743
+ "application/json": {
1744
+ /** @description The SDK's CURRENT user id at the moment the report is sent (not the id captured when the user tapped Yes). Must equal the current app user id of the user who owns the transaction, or the request is a 404. */
1745
+ userId: string;
1746
+ /**
1747
+ * Format: uuid
1748
+ * @description Minted once per tapped Yes and reused on every retry of that Yes, with the same body. A retry gets the same granted. On a refused Yes the server keeps only that no prize was granted, so the retry's reason is derived from the retry's own body (daily_cap when it carries publisherRewardId, else no_prize): resend the body unchanged.
1749
+ */
1750
+ reportId: string;
1751
+ /** @description Present only when a prize was promised for this Yes. Absent: the Yes is still recorded (the offer is hidden and cannot be re-claimed) and granted is false with reason no_prize. */
1752
+ publisherRewardId?: string;
1753
+ /** @description The app's daily prize limit from its SDK configuration. Required when publisherRewardId is present. Clamped server-side to 1..10. */
1754
+ dailyLimit?: number;
1755
+ };
1756
+ };
1757
+ };
1758
+ responses: {
1759
+ /** @description Default Response */
1760
+ 200: {
1761
+ headers: {
1762
+ [name: string]: unknown;
1763
+ };
1764
+ content: {
1765
+ "application/json": {
1766
+ /** @enum {boolean} */
1767
+ success: true;
1768
+ /** @description Whether the app may grant its prize for this Yes. True only for the first Yes per person per offer, under the daily limit. The ONLY source of prize eligibility: no answer (timeout, offline, 5xx, 404) means no prize. */
1769
+ granted: boolean;
1770
+ /**
1771
+ * @description Present when granted is false.
1772
+ * @enum {string}
1773
+ */
1774
+ reason?: "per_offer" | "daily_cap" | "no_prize" | "pays_on_verification";
1775
+ /**
1776
+ * Format: date-time
1777
+ * @description When the server recorded this person's Yes for this offer (the first one, on a retry or a second device).
1778
+ */
1779
+ reportedAt: string;
1780
+ };
1781
+ };
1782
+ };
1783
+ /** @description Default Response */
1784
+ 400: {
1785
+ headers: {
1786
+ [name: string]: unknown;
1787
+ };
1788
+ content: {
1789
+ "application/json": {
1790
+ error: string;
1791
+ details?: unknown;
1792
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
1793
+ code?: string;
1794
+ };
1795
+ };
1796
+ };
1797
+ /** @description Default Response */
1798
+ 401: {
1799
+ headers: {
1800
+ [name: string]: unknown;
1801
+ };
1802
+ content: {
1803
+ "application/json": {
1804
+ error: string;
1805
+ details?: unknown;
1806
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
1807
+ code?: string;
1808
+ };
1809
+ };
1810
+ };
1811
+ /** @description Default Response */
1812
+ 404: {
1813
+ headers: {
1814
+ [name: string]: unknown;
1815
+ };
1816
+ content: {
1817
+ "application/json": {
1818
+ error: string;
1819
+ details?: unknown;
1820
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
1821
+ code?: string;
1822
+ };
1823
+ };
1824
+ };
1825
+ /** @description Default Response */
1826
+ 500: {
1827
+ headers: {
1828
+ [name: string]: unknown;
1829
+ };
1830
+ content: {
1831
+ "application/json": {
1832
+ error: string;
1833
+ details?: unknown;
1834
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
1835
+ code?: string;
1392
1836
  };
1393
1837
  };
1394
1838
  };
@@ -1448,6 +1892,8 @@ export interface paths {
1448
1892
  "application/json": {
1449
1893
  error: string;
1450
1894
  details?: unknown;
1895
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
1896
+ code?: string;
1451
1897
  };
1452
1898
  };
1453
1899
  };
@@ -1460,6 +1906,8 @@ export interface paths {
1460
1906
  "application/json": {
1461
1907
  error: string;
1462
1908
  details?: unknown;
1909
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
1910
+ code?: string;
1463
1911
  };
1464
1912
  };
1465
1913
  };
@@ -1472,6 +1920,8 @@ export interface paths {
1472
1920
  "application/json": {
1473
1921
  error: string;
1474
1922
  details?: unknown;
1923
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
1924
+ code?: string;
1475
1925
  };
1476
1926
  };
1477
1927
  };
@@ -1655,6 +2105,8 @@ export interface paths {
1655
2105
  "application/json": {
1656
2106
  error: string;
1657
2107
  details?: unknown;
2108
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
2109
+ code?: string;
1658
2110
  };
1659
2111
  };
1660
2112
  };
@@ -1667,6 +2119,8 @@ export interface paths {
1667
2119
  "application/json": {
1668
2120
  error: string;
1669
2121
  details?: unknown;
2122
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
2123
+ code?: string;
1670
2124
  };
1671
2125
  };
1672
2126
  };
@@ -1679,6 +2133,8 @@ export interface paths {
1679
2133
  "application/json": {
1680
2134
  error: string;
1681
2135
  details?: unknown;
2136
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
2137
+ code?: string;
1682
2138
  };
1683
2139
  };
1684
2140
  };
@@ -1854,6 +2310,8 @@ export interface paths {
1854
2310
  "application/json": {
1855
2311
  error: string;
1856
2312
  details?: unknown;
2313
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
2314
+ code?: string;
1857
2315
  };
1858
2316
  };
1859
2317
  };
@@ -1866,6 +2324,8 @@ export interface paths {
1866
2324
  "application/json": {
1867
2325
  error: string;
1868
2326
  details?: unknown;
2327
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
2328
+ code?: string;
1869
2329
  };
1870
2330
  };
1871
2331
  };
@@ -1878,6 +2338,8 @@ export interface paths {
1878
2338
  "application/json": {
1879
2339
  error: string;
1880
2340
  details?: unknown;
2341
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
2342
+ code?: string;
1881
2343
  };
1882
2344
  };
1883
2345
  };
@@ -2059,6 +2521,8 @@ export interface paths {
2059
2521
  "application/json": {
2060
2522
  error: string;
2061
2523
  details?: unknown;
2524
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
2525
+ code?: string;
2062
2526
  };
2063
2527
  };
2064
2528
  };
@@ -2071,6 +2535,8 @@ export interface paths {
2071
2535
  "application/json": {
2072
2536
  error: string;
2073
2537
  details?: unknown;
2538
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
2539
+ code?: string;
2074
2540
  };
2075
2541
  };
2076
2542
  };
@@ -2150,6 +2616,8 @@ export interface paths {
2150
2616
  "application/json": {
2151
2617
  error: string;
2152
2618
  details?: unknown;
2619
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
2620
+ code?: string;
2153
2621
  };
2154
2622
  };
2155
2623
  };
@@ -2162,6 +2630,8 @@ export interface paths {
2162
2630
  "application/json": {
2163
2631
  error: string;
2164
2632
  details?: unknown;
2633
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
2634
+ code?: string;
2165
2635
  };
2166
2636
  };
2167
2637
  };
@@ -2174,6 +2644,8 @@ export interface paths {
2174
2644
  "application/json": {
2175
2645
  error: string;
2176
2646
  details?: unknown;
2647
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
2648
+ code?: string;
2177
2649
  };
2178
2650
  };
2179
2651
  };
@@ -2226,6 +2698,11 @@ export interface paths {
2226
2698
  variantId: string;
2227
2699
  /** @description The name of the selected variant */
2228
2700
  variantName: string;
2701
+ /**
2702
+ * Format: uuid
2703
+ * @description The SDUI experiment that assigned this variant. Echo it as experiment_id on offer events beside variant_id. Null or absent when no experiment decided the variant.
2704
+ */
2705
+ experimentId?: string | null;
2229
2706
  /** @description The minimum SDK version required for this variant */
2230
2707
  minSdkVersion: string;
2231
2708
  /** @description The SDUI JSON layout configuration */
@@ -2304,6 +2781,8 @@ export interface paths {
2304
2781
  "application/json": {
2305
2782
  error: string;
2306
2783
  details?: unknown;
2784
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
2785
+ code?: string;
2307
2786
  };
2308
2787
  };
2309
2788
  };
@@ -2316,6 +2795,8 @@ export interface paths {
2316
2795
  "application/json": {
2317
2796
  error: string;
2318
2797
  details?: unknown;
2798
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
2799
+ code?: string;
2319
2800
  };
2320
2801
  };
2321
2802
  };
@@ -2336,7 +2817,7 @@ export interface paths {
2336
2817
  path?: never;
2337
2818
  cookie?: never;
2338
2819
  };
2339
- /** @description Get unified SDK configuration including SDUI, entitlements, experiments, and remote config. This endpoint replaces /ui-config with a cleaner structure. Entitlement mode is implicit: if entitlements.iap.productId exists, use IAP mode; otherwise use Native mode. Pass `useCase` to configure a surface other than churn-intervention; the response echoes it as ui.useCase. `demoVariant` names an SDUI variant to serve for this request. It is honoured on a TEST key (pk_test_*) for any app, and on a live key only for Encore's own demo apps; for every other app it is ignored silently (never an error). It exists for demos and previews: Encore's own demo pages, and a publisher who wants to see the other variants against their own test key. `placementId` selects a variant an admin pinned to that placement, in `ui` only; any label without a pin resolves as before. Requesting a surface is all it takes to be served it — no setup call is required. A surface Encore has explicitly switched off for this app, or one with no variant available, returns ui.template: null — clients must no-op, never reuse another use case's template. */
2820
+ /** @description Get unified SDK configuration including SDUI, entitlements, experiments, and remote config. This endpoint replaces /ui-config with a cleaner structure. Entitlement mode is implicit: if entitlements.iap.productId exists, use IAP mode; otherwise use Native mode. Pass `useCase` to configure a surface other than churn-intervention; the response echoes it as ui.useCase. `demoVariant` names an SDUI variant to serve for this request. It is honoured on a TEST key (pk_test_*) for any app, and on a live key only for Encore's own demo apps; for every other app it is ignored silently (never an error). It exists for demos and previews: Encore's own demo pages, and a publisher who wants to see the other variants against their own test key. `placementId` selects a variant an admin pinned to that placement, in `ui` only; any label without a pin resolves as before. `trigger` makes this a trigger component request (GiftsButton, ClaimReminder): `useCase` is then required and is the real use case it serves, `layout` pins a look and `autoOpen=off` opts the mount out of looks that open the sheet by itself (any other present value also reads as off); a missing useCase or a malformed trigger or layout is a 400. Without `trigger`, `layout` and `autoOpen` are ignored. Requesting a surface is all it takes to be served it — no setup call is required. A surface Encore has explicitly switched off for this app, or one with no variant available, returns ui.template: null — clients must no-op, never reuse another use case's template. */
2340
2821
  get: {
2341
2822
  parameters: {
2342
2823
  query: {
@@ -2348,8 +2829,28 @@ export interface paths {
2348
2829
  language?: string;
2349
2830
  /** @description Which Encore surface is being configured. Omit for today's behaviour. Requesting a surface is all it takes to be served it — no setup call is required. A surface Encore has explicitly switched off for this app, or one with no variant available, resolves to template: null — it NEVER falls back to another use case's template. */
2350
2831
  useCase?: "churn-intervention" | "post-action-reward";
2351
- /** @description Demos and previews only. The SDUI variant file stem to serve for this request, e.g. 'giftUnwrap'. Honoured on a TEST key (pk_test_*) for any app. On a live key it is honoured only for Encore's own demo apps; for every other app it is ignored silently and resolution is unchanged, never an error. Intended for Encore's internal demos and for a publisher previewing the other variants against their own test key. An honoured value bypasses app targeting, experiments and arm weights, and WIDENS the status filter from 'active' to 'active' or 'valid' — the filter is widened, not removed, so a draft, testing, invalid or archived variant is still refused. The use-case partition, the per-app kill switch and the SDK version gate all still apply. Note that a test key also serves the demo campaign catalog rather than live advertiser inventory, and tags the request as test traffic in analytics. */
2832
+ /** @description Demos and previews only. The SDUI variant file stem to serve for this request, e.g. 'giftUnwrap'. Honoured on a TEST key (pk_test_*) for any app. On a live key it is honoured only for Encore's own demo apps; for every other app it is ignored silently and resolution is unchanged, never an error. On a trigger request with autoOpen=off, an honoured look that opens the sheet by itself is served with behavior.autoOpen 'off'. Intended for Encore's internal demos and for a publisher previewing the other variants against their own test key. An honoured value bypasses app targeting, experiments and arm weights, and WIDENS the status filter from 'active' to 'active' or 'valid' — the filter is widened, not removed, so a draft, testing, invalid or archived variant is still refused. The use-case partition, the per-app kill switch and the SDK version gate all still apply. Note that a test key also serves the demo campaign catalog rather than live advertiser inventory, and tags the request as test traffic in analytics. */
2352
2833
  demoVariant?: string;
2834
+ /** @description Present = a trigger component request (GiftsButton, ClaimReminder, customClaim): the camelCase trigger id, e.g. 'giftsButton'. Absent = a sheet request, unchanged. `useCase` is then REQUIRED and names the real use case the trigger serves (a missing useCase or a malformed trigger is a 400). The response's `ui.template` is that trigger's config (`ui.template.trigger` equals this id) or null, and `ui.useCase` echoes the requested use case. Its `root` is an SDUI element tree the SDK draws inline at `root`'s `style.frame.height` (the trigger's height), filling `${...}` from `ui.template.strings` and host values. customClaim (the custom-UI handle, which draws the app's own view) is answered with a rules-only look: layout 'behavior', no `root` or strings, minimal `ui.values`. `ui.template.behavior` names the look's step rules; `behavior.autoOpen` 'on' (an experiment arm only) opens the sheet once by itself, then draws the same look. A holdout carries `ui.experimentId` beside a null template, and `useCases` is always empty. */
2835
+ trigger?: string;
2836
+ /** @description Trigger requests only (ignored otherwise): pin the look, a camelCase layout name such as 'card' or 'pill' (malformed = 400). Serves the trigger's variant file marked pin for that layout, never enrolls in an experiment, and returns template null when there is none. */
2837
+ layout?: string;
2838
+ /** @description Trigger requests only (ignored otherwise): what happened on the device. 'claimOpen' = an eligible open claim; 'completed' = an offer finished on this local day, none claimed since, its thanks not tapped. The served look's behavior then picks the step's look: claimOpen on a gifts button whose behavior.afterClaim is showReminder is answered with the reminder look (ui.template.trigger claimReminder); completed applies behavior.afterComplete (gifts serves the look, hide serves template null, thanks serves the trigger's thanks look). Any other value is served as no state, and customClaim ignores every state (the device applies its rules). */
2839
+ state?: string;
2840
+ /** @description Trigger requests only (ignored otherwise): the mount's opt-out from looks that open the sheet by itself. Send 'off', and only when the mount forbids it; absent means allowed. Any other present value (another case, empty, repeated) is read as 'off', never as allowed, and is never a 400. With it, an experiment with any arm whose behavior.autoOpen is 'on', or whose file cannot be read, is skipped (the request gets the trigger's default look, never a lower experiment, and records no assignment), and any look served to the request carries behavior.autoOpen 'off'. */
2841
+ autoOpen?: string;
2842
+ /** @description GiftsButton requests without a layout pin only (ignored otherwise): Distinct local days this placement's button counted an impression, before this request; 0 to 30. Part of the exposure tally the served look's behavior.ifIgnored reads (seenDays, taps and firstSeenDaysAgo are required for it). A value that is not a whole number in range is dropped, never a 400. */
2843
+ seenDays?: string;
2844
+ /** @description GiftsButton requests without a layout pin only (ignored otherwise): Mounts at this placement whose impression fired, before this request; 0 to 5. Not used by today's rule. Part of the exposure tally the served look's behavior.ifIgnored reads (seenDays, taps and firstSeenDaysAgo are required for it). A value that is not a whole number in range is dropped, never a 400. */
2845
+ seenCount?: string;
2846
+ /** @description GiftsButton requests without a layout pin only (ignored otherwise): User taps on the button (auto pops do not count); 0 to 3. Part of the exposure tally the served look's behavior.ifIgnored reads (seenDays, taps and firstSeenDaysAgo are required for it). A value that is not a whole number in range is dropped, never a 400. */
2847
+ taps?: string;
2848
+ /** @description GiftsButton requests without a layout pin only (ignored otherwise): Local days since the first counted impression, 0 when never seen; 0 to 60. Part of the exposure tally the served look's behavior.ifIgnored reads (seenDays, taps and firstSeenDaysAgo are required for it). A value that is not a whole number in range is dropped, never a 400. */
2849
+ firstSeenDaysAgo?: string;
2850
+ /** @description GiftsButton requests without a layout pin only (ignored otherwise): Local days since the last user tap, absent when never tapped; 0 to 60. Not used by today's rule. Part of the exposure tally the served look's behavior.ifIgnored reads (seenDays, taps and firstSeenDaysAgo are required for it). A value that is not a whole number in range is dropped, never a 400. */
2851
+ lastTapDaysAgo?: string;
2852
+ /** @description GiftsButton requests without a layout pin only (ignored otherwise): ifIgnored answers this device already showed at this placement; 0 to 3, absent reads 0. Part of the exposure tally the served look's behavior.ifIgnored reads (seenDays, taps and firstSeenDaysAgo are required for it). A value that is not a whole number in range is dropped, never a 400. */
2853
+ nudges?: string;
2353
2854
  /** @description The publisher's placement label for the surface being configured, e.g. 'email_code'. Optional. When an admin has pinned an SDUI variant to this (app, placement), `ui` serves that variant instead of the experiment assignment, provided it is active or valid, matches the requested use case and passes its SDK version gate and app targeting. Otherwise, and for any label with no pin, resolution is unchanged. Never a 4xx on any input. Applies to `ui` only; the `useCases` prefetch block is never pinned. */
2354
2855
  placementId?: string;
2355
2856
  };
@@ -2376,11 +2877,20 @@ export interface paths {
2376
2877
  useCase: "churn-intervention" | "post-action-reward";
2377
2878
  /**
2378
2879
  * Format: uuid
2379
- * @description Selected variant ID
2880
+ * @description Selected variant ID. On a trigger step answer that draws nothing (template null with a step: a hide, or thanks with no thanks look), the look whose behavior decided it, so after_complete_hide can name it.
2380
2881
  */
2381
2882
  variantId?: string | null;
2382
2883
  /** @description Selected variant name */
2383
2884
  variantName?: string | null;
2885
+ /**
2886
+ * Format: uuid
2887
+ * @description The SDUI experiment that assigned this variant. Echo it as experiment_id on offer events beside variant_id. Null or absent when no experiment decided the variant. On a trigger response it is also present when the user was held out (template null), so a trigger can tell a holdout from no experiment; a sheet response never carries it beside a null template.
2888
+ */
2889
+ experimentId?: string | null;
2890
+ /** @description Trigger responses only: set when the look served (or template null) was chosen by a behavior for the request's `state`, or by the look's behavior.ifIgnored for a gifts button's exposure tally (a non-clicker). Values today: afterClaim, afterComplete, ifIgnored; more may be added, and an SDK treats a value it does not know as no step. With template null and an experimentId, it tells a behavior's hide apart from a holdout (an unknown step with template null is reported as reason unknown_step). Stamp it as step on the trigger events. */
2891
+ step?: string;
2892
+ /** @description Trigger responses with a `step` only: the experiment whose look's behavior chose the step (for a reminder in a gifts button spot, the gifts button's), beside experimentId (the drawn look's own; on an afterComplete step, the deciding look's, as a thanks look is in no arm). An opaque id (a UUID today). Stamp it as step_experiment_id on the trigger events. */
2893
+ stepExperimentId?: string | null;
2384
2894
  /** @description Minimum SDK version for this variant */
2385
2895
  minSdkVersion?: string | null;
2386
2896
  /** @description SDUI template with placeholders */
@@ -2427,6 +2937,10 @@ export interface paths {
2427
2937
  rewardDecline?: string | null;
2428
2938
  /** @description Badge on the highlighted offer card, e.g. 'Most claimed'. Same resolution and same null meaning as rewardCta. */
2429
2939
  rewardBadge?: string | null;
2940
+ /** @description Label on the card that opens the rest of the offer list, e.g. 'Show more gifts'. Same resolution and same null meaning as rewardCta. */
2941
+ rewardMoreGifts?: string | null;
2942
+ /** @description Header above the rest of the offer list, e.g. 'Other gifts'. Same resolution and same null meaning as rewardCta. */
2943
+ rewardOtherGifts?: string | null;
2430
2944
  };
2431
2945
  /** @description Appearance values */
2432
2946
  appearance: {
@@ -2445,6 +2959,21 @@ export interface paths {
2445
2959
  /** @description App icon URL (App Store artwork for mobile apps, fetched favicon for web apps). Web SDK uses it as the default host logo when display.logoUrl is not set. */
2446
2960
  appstoreIcon: string | null;
2447
2961
  };
2962
+ /** @description Words the SDK says itself, translated into the response `locale`, by string id (e.g. 'card.claim'). Only ids that locale has; for any other id, and whenever the key is absent, use the SDK's own English. Never served for 'en'. Placeholders use ${name}. Populated in `ui.values` only, not in `useCases`. */
2963
+ strings?: {
2964
+ [key: string]: string;
2965
+ };
2966
+ /** @description Count-dependent SDK strings (e.g. 'unit.month'), translated into the response `locale`, by string id. Same id namespace as `strings`; an id appears in only one of the two. Same fallback rules as `strings`. */
2967
+ plurals?: {
2968
+ [key: string]: {
2969
+ zero?: string;
2970
+ one?: string;
2971
+ two?: string;
2972
+ few?: string;
2973
+ many?: string;
2974
+ other: string;
2975
+ };
2976
+ };
2448
2977
  };
2449
2978
  };
2450
2979
  /** @description Assigned variant for every use case this app is enabled for other than the one REQUESTED, so the SDK can cache them at identify(). When the single-enabled-use-case fallback serves a different surface in `ui`, that surface also appears here under its own key, so a client that files `ui` under the requested use case still finds it. `ui` is unchanged; un-upgraded decoders ignore this key. */
@@ -2457,6 +2986,11 @@ export interface paths {
2457
2986
  variantId: string | null;
2458
2987
  /** @description Default variant name; null alongside a null variantId. */
2459
2988
  variantName: string | null;
2989
+ /**
2990
+ * Format: uuid
2991
+ * @description The SDUI experiment that assigned this variant, as on `ui.experimentId`. Null or absent when no experiment decided it.
2992
+ */
2993
+ experimentId?: string | null;
2460
2994
  /** @description The default variant's SDUI template. NULL means 'enabled, but nothing to render' — the SDK must no-op on this surface. It must NEVER substitute another use case's template. */
2461
2995
  template: {
2462
2996
  [key: string]: unknown;
@@ -2501,6 +3035,10 @@ export interface paths {
2501
3035
  rewardDecline?: string | null;
2502
3036
  /** @description Badge on the highlighted offer card, e.g. 'Most claimed'. Same resolution and same null meaning as rewardCta. */
2503
3037
  rewardBadge?: string | null;
3038
+ /** @description Label on the card that opens the rest of the offer list, e.g. 'Show more gifts'. Same resolution and same null meaning as rewardCta. */
3039
+ rewardMoreGifts?: string | null;
3040
+ /** @description Header above the rest of the offer list, e.g. 'Other gifts'. Same resolution and same null meaning as rewardCta. */
3041
+ rewardOtherGifts?: string | null;
2504
3042
  };
2505
3043
  /** @description Appearance values */
2506
3044
  appearance: {
@@ -2519,6 +3057,21 @@ export interface paths {
2519
3057
  /** @description App icon URL (App Store artwork for mobile apps, fetched favicon for web apps). Web SDK uses it as the default host logo when display.logoUrl is not set. */
2520
3058
  appstoreIcon: string | null;
2521
3059
  };
3060
+ /** @description Words the SDK says itself, translated into the response `locale`, by string id (e.g. 'card.claim'). Only ids that locale has; for any other id, and whenever the key is absent, use the SDK's own English. Never served for 'en'. Placeholders use ${name}. Populated in `ui.values` only, not in `useCases`. */
3061
+ strings?: {
3062
+ [key: string]: string;
3063
+ };
3064
+ /** @description Count-dependent SDK strings (e.g. 'unit.month'), translated into the response `locale`, by string id. Same id namespace as `strings`; an id appears in only one of the two. Same fallback rules as `strings`. */
3065
+ plurals?: {
3066
+ [key: string]: {
3067
+ zero?: string;
3068
+ one?: string;
3069
+ two?: string;
3070
+ few?: string;
3071
+ many?: string;
3072
+ other: string;
3073
+ };
3074
+ };
2522
3075
  };
2523
3076
  };
2524
3077
  "post-action-reward"?: {
@@ -2529,6 +3082,11 @@ export interface paths {
2529
3082
  variantId: string | null;
2530
3083
  /** @description Default variant name; null alongside a null variantId. */
2531
3084
  variantName: string | null;
3085
+ /**
3086
+ * Format: uuid
3087
+ * @description The SDUI experiment that assigned this variant, as on `ui.experimentId`. Null or absent when no experiment decided it.
3088
+ */
3089
+ experimentId?: string | null;
2532
3090
  /** @description The default variant's SDUI template. NULL means 'enabled, but nothing to render' — the SDK must no-op on this surface. It must NEVER substitute another use case's template. */
2533
3091
  template: {
2534
3092
  [key: string]: unknown;
@@ -2573,6 +3131,10 @@ export interface paths {
2573
3131
  rewardDecline?: string | null;
2574
3132
  /** @description Badge on the highlighted offer card, e.g. 'Most claimed'. Same resolution and same null meaning as rewardCta. */
2575
3133
  rewardBadge?: string | null;
3134
+ /** @description Label on the card that opens the rest of the offer list, e.g. 'Show more gifts'. Same resolution and same null meaning as rewardCta. */
3135
+ rewardMoreGifts?: string | null;
3136
+ /** @description Header above the rest of the offer list, e.g. 'Other gifts'. Same resolution and same null meaning as rewardCta. */
3137
+ rewardOtherGifts?: string | null;
2576
3138
  };
2577
3139
  /** @description Appearance values */
2578
3140
  appearance: {
@@ -2591,6 +3153,21 @@ export interface paths {
2591
3153
  /** @description App icon URL (App Store artwork for mobile apps, fetched favicon for web apps). Web SDK uses it as the default host logo when display.logoUrl is not set. */
2592
3154
  appstoreIcon: string | null;
2593
3155
  };
3156
+ /** @description Words the SDK says itself, translated into the response `locale`, by string id (e.g. 'card.claim'). Only ids that locale has; for any other id, and whenever the key is absent, use the SDK's own English. Never served for 'en'. Placeholders use ${name}. Populated in `ui.values` only, not in `useCases`. */
3157
+ strings?: {
3158
+ [key: string]: string;
3159
+ };
3160
+ /** @description Count-dependent SDK strings (e.g. 'unit.month'), translated into the response `locale`, by string id. Same id namespace as `strings`; an id appears in only one of the two. Same fallback rules as `strings`. */
3161
+ plurals?: {
3162
+ [key: string]: {
3163
+ zero?: string;
3164
+ one?: string;
3165
+ two?: string;
3166
+ few?: string;
3167
+ many?: string;
3168
+ other: string;
3169
+ };
3170
+ };
2594
3171
  };
2595
3172
  };
2596
3173
  };
@@ -2633,6 +3210,22 @@ export interface paths {
2633
3210
  };
2634
3211
  /** @description Resolved locale served in this response (language-only, e.g. 'es'). Absent on pre-localization responses. */
2635
3212
  locale?: string;
3213
+ /** @description Placement labels for this app that carry a placement rule or pinned variant. Present whenever the app's placement rules can be read; empty when none. Clients scope their offers cache by placement only for labels in this list; when the field is absent (older server) clients keep their pre-2.4 behaviour. */
3214
+ ruledPlacements?: string[];
3215
+ };
3216
+ };
3217
+ };
3218
+ /** @description Default Response */
3219
+ 400: {
3220
+ headers: {
3221
+ [name: string]: unknown;
3222
+ };
3223
+ content: {
3224
+ "application/json": {
3225
+ error: string;
3226
+ details?: unknown;
3227
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
3228
+ code?: string;
2636
3229
  };
2637
3230
  };
2638
3231
  };
@@ -2645,6 +3238,8 @@ export interface paths {
2645
3238
  "application/json": {
2646
3239
  error: string;
2647
3240
  details?: unknown;
3241
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
3242
+ code?: string;
2648
3243
  };
2649
3244
  };
2650
3245
  };
@@ -2657,6 +3252,8 @@ export interface paths {
2657
3252
  "application/json": {
2658
3253
  error: string;
2659
3254
  details?: unknown;
3255
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
3256
+ code?: string;
2660
3257
  };
2661
3258
  };
2662
3259
  };
@@ -2729,6 +3326,8 @@ export interface paths {
2729
3326
  "application/json": {
2730
3327
  error: string;
2731
3328
  details?: unknown;
3329
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
3330
+ code?: string;
2732
3331
  };
2733
3332
  };
2734
3333
  };
@@ -2741,6 +3340,8 @@ export interface paths {
2741
3340
  "application/json": {
2742
3341
  error: string;
2743
3342
  details?: unknown;
3343
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
3344
+ code?: string;
2744
3345
  };
2745
3346
  };
2746
3347
  };
@@ -2765,7 +3366,7 @@ export interface paths {
2765
3366
  delete?: never;
2766
3367
  options?: never;
2767
3368
  head?: never;
2768
- /** @description Update user identity (anonymous→identified). Updates the user's app_user_id. Called when developer calls SDK.identify() after login. */
3369
+ /** @description Update user identity (anonymous→identified). Updates the user's app_user_id. Called when developer calls SDK.identify() after login. When newUserId already exists (the person signed in before, e.g. on another device), the anonymous user's completed and self-reported offers are copied onto that account, so they stay hidden and cannot be re-claimed. The copy is taken once, at this call: send any queued self-reports BEFORE it. A report for the anonymous user's claim that arrives afterwards is refused if it carries newUserId (404), and recorded on the anonymous user only, not this account, if it carries currentUserId. */
2769
3370
  patch: {
2770
3371
  parameters: {
2771
3372
  query?: never;
@@ -2815,6 +3416,8 @@ export interface paths {
2815
3416
  "application/json": {
2816
3417
  error: string;
2817
3418
  details?: unknown;
3419
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
3420
+ code?: string;
2818
3421
  };
2819
3422
  };
2820
3423
  };
@@ -2827,6 +3430,8 @@ export interface paths {
2827
3430
  "application/json": {
2828
3431
  error: string;
2829
3432
  details?: unknown;
3433
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
3434
+ code?: string;
2830
3435
  };
2831
3436
  };
2832
3437
  };
@@ -2848,7 +3453,9 @@ export interface paths {
2848
3453
  *
2849
3454
  * Precedence: an attribute sent on an /offers/search or /offers/feed request always WINS over the stored one. The stored set only fills an attribute the request omits.
2850
3455
  *
2851
- * AGE. Send `age` as a whole-number integer. If you hold only a RANGE, send its LOWEST end — "13-17" is sent as 13, never 15 and never 17. Sending the middle of a range silently defeats the under-age check: flooring can never mask a minor, a midpoint can. An age below 18 restricts that user to age-appropriate inventory ranked by the app-level bandit, with NO per-user personalisation — offers are still served. For such a user only `age`, `countryCode` and `language` are STORED — the attributes that decide where an offer may legally appear and which creative locale renders; everything else you sent is discarded, `custom` included, and the response reports `minor`. The instant you sent the set is recorded, so a stored age is aged forward rather than frozen. `dateOfBirth` is refused: `age` carries the same targeting value with far less identifying power.
3456
+ * LANGUAGE is accepted and ignored: it is never stored. The hosted page and the SDKs send it on each request, else Accept-Language decides.
3457
+ *
3458
+ * AGE. Send `age` as a whole-number integer. If you hold only a RANGE, send its LOWEST end — "13-17" is sent as 13, never 15 and never 17. Sending the middle of a range silently defeats the under-age check: flooring can never mask a minor, a midpoint can. An age below 18 restricts that user to age-appropriate inventory ranked by the app-level bandit, with NO per-user personalisation — offers are still served. For such a user only `age` and `countryCode` are STORED — the attributes that decide where an offer may legally appear; everything else you sent is discarded, `custom` included, and the response reports `minor`. The instant you sent the set is recorded, so a stored age is aged forward rather than frozen. `dateOfBirth` is refused: `age` carries the same targeting value with far less identifying power.
2852
3459
  *
2853
3460
  * GATED KEYS. email, firstName, lastName, mobile, phoneNumber, postcode, postalCode, latitude, longitude and gender are accepted ONLY from an app whose audience is declared adults_only (store-rated 18+). Any other status, including the default, is refused with 400. `age` is NOT gated — it is accepted from any app, because it is what restricts what a user is shown rather than something that identifies them. Unrecognised keys are refused rather than ignored. Authentication: publishable key (X-API-Key: pk_live_* / pk_test_*).
2854
3461
  */
@@ -2868,6 +3475,7 @@ export interface paths {
2868
3475
  attributes: {
2869
3476
  /** @description ISO 3166-1 alpha-2 country code (e.g., "US", "GB", "CA"). */
2870
3477
  countryCode?: string;
3478
+ /** @description Accepted for compatibility and ignored: the language is never stored. Send it on each request (attributes.language, or Accept-Language) instead. */
2871
3479
  language?: string;
2872
3480
  city?: string;
2873
3481
  state?: string;
@@ -2915,7 +3523,7 @@ export interface paths {
2915
3523
  userId: string;
2916
3524
  /** @description ISO 8601 instant the set was recorded; what a stored age is aged forward from */
2917
3525
  storedAt: string;
2918
- /** @description True when the supplied age was under 18. Offers are STILL served to this user — from age-appropriate inventory only, ranked by the app-level bandit, with no per-user personalisation. Only `age`, `countryCode` and `language` are kept for this user. Everything else you sent is DISCARDED, including `custom`, `city`, `state`, `region` and the subscription and billing fields — a profile that may not be targeted on has no purpose. Re-send the set once they are 18 and it is stored in full. */
3526
+ /** @description True when the supplied age was under 18. Offers are STILL served to this user — from age-appropriate inventory only, ranked by the app-level bandit, with no per-user personalisation. Only `age` and `countryCode` are kept for this user. Everything else you sent is DISCARDED, including `custom`, `city`, `state`, `region` and the subscription and billing fields — a profile that may not be targeted on has no purpose. Re-send the set once they are 18 and it is stored in full. */
2919
3527
  minor: boolean;
2920
3528
  };
2921
3529
  };
@@ -2929,6 +3537,8 @@ export interface paths {
2929
3537
  "application/json": {
2930
3538
  error: string;
2931
3539
  details?: unknown;
3540
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
3541
+ code?: string;
2932
3542
  };
2933
3543
  };
2934
3544
  };
@@ -2941,6 +3551,8 @@ export interface paths {
2941
3551
  "application/json": {
2942
3552
  error: string;
2943
3553
  details?: unknown;
3554
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
3555
+ code?: string;
2944
3556
  };
2945
3557
  };
2946
3558
  };
@@ -2953,6 +3565,8 @@ export interface paths {
2953
3565
  "application/json": {
2954
3566
  error: string;
2955
3567
  details?: unknown;
3568
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
3569
+ code?: string;
2956
3570
  };
2957
3571
  };
2958
3572
  };
@@ -3019,6 +3633,8 @@ export interface paths {
3019
3633
  "application/json": {
3020
3634
  error: string;
3021
3635
  details?: unknown;
3636
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
3637
+ code?: string;
3022
3638
  };
3023
3639
  };
3024
3640
  };
@@ -3031,6 +3647,8 @@ export interface paths {
3031
3647
  "application/json": {
3032
3648
  error: string;
3033
3649
  details?: unknown;
3650
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
3651
+ code?: string;
3034
3652
  };
3035
3653
  };
3036
3654
  };
@@ -3087,6 +3705,8 @@ export interface paths {
3087
3705
  "application/json": {
3088
3706
  error: string;
3089
3707
  details?: unknown;
3708
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
3709
+ code?: string;
3090
3710
  };
3091
3711
  };
3092
3712
  };
@@ -3099,6 +3719,8 @@ export interface paths {
3099
3719
  "application/json": {
3100
3720
  error: string;
3101
3721
  details?: unknown;
3722
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
3723
+ code?: string;
3102
3724
  };
3103
3725
  };
3104
3726
  };
@@ -3111,6 +3733,8 @@ export interface paths {
3111
3733
  "application/json": {
3112
3734
  error: string;
3113
3735
  details?: unknown;
3736
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
3737
+ code?: string;
3114
3738
  };
3115
3739
  };
3116
3740
  };
@@ -3123,6 +3747,8 @@ export interface paths {
3123
3747
  "application/json": {
3124
3748
  error: string;
3125
3749
  details?: unknown;
3750
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
3751
+ code?: string;
3126
3752
  };
3127
3753
  };
3128
3754
  };
@@ -3189,6 +3815,8 @@ export interface paths {
3189
3815
  "application/json": {
3190
3816
  error: string;
3191
3817
  details?: unknown;
3818
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
3819
+ code?: string;
3192
3820
  };
3193
3821
  };
3194
3822
  };
@@ -3201,6 +3829,8 @@ export interface paths {
3201
3829
  "application/json": {
3202
3830
  error: string;
3203
3831
  details?: unknown;
3832
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
3833
+ code?: string;
3204
3834
  };
3205
3835
  };
3206
3836
  };
@@ -3213,6 +3843,8 @@ export interface paths {
3213
3843
  "application/json": {
3214
3844
  error: string;
3215
3845
  details?: unknown;
3846
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
3847
+ code?: string;
3216
3848
  };
3217
3849
  };
3218
3850
  };
@@ -3249,6 +3881,8 @@ export interface paths {
3249
3881
  campaignId: string;
3250
3882
  /** Format: email */
3251
3883
  email: string;
3884
+ /** @description Optional BCP 47 language tag (e.g. "es", "pt-BR"), from the host's language override. Wins over Accept-Language; only the language subtag is used (nb is served as no; iw, in, ji, jw as he, id, yi, jv), and only when the app has it enabled, else Accept-Language, then the app default. A tag the SDKs would refuse (malformed, underscores, or an extended language subtag such as zh-yue-HK) is 400 with details.code INVALID_LANGUAGE. The lead's emails go out in the language served. */
3885
+ language?: string;
3252
3886
  /** @description Trial length in days as reported by StoreKit; drives reminder scheduling. */
3253
3887
  trialDurationDays?: number | null;
3254
3888
  /**
@@ -3290,6 +3924,8 @@ export interface paths {
3290
3924
  "application/json": {
3291
3925
  error: string;
3292
3926
  details?: unknown;
3927
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
3928
+ code?: string;
3293
3929
  };
3294
3930
  };
3295
3931
  };
@@ -3302,6 +3938,8 @@ export interface paths {
3302
3938
  "application/json": {
3303
3939
  error: string;
3304
3940
  details?: unknown;
3941
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
3942
+ code?: string;
3305
3943
  };
3306
3944
  };
3307
3945
  };
@@ -3314,6 +3952,8 @@ export interface paths {
3314
3952
  "application/json": {
3315
3953
  error: string;
3316
3954
  details?: unknown;
3955
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
3956
+ code?: string;
3317
3957
  };
3318
3958
  };
3319
3959
  };
@@ -3377,6 +4017,8 @@ export interface paths {
3377
4017
  "application/json": {
3378
4018
  error: string;
3379
4019
  details?: unknown;
4020
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
4021
+ code?: string;
3380
4022
  };
3381
4023
  };
3382
4024
  };
@@ -3389,6 +4031,8 @@ export interface paths {
3389
4031
  "application/json": {
3390
4032
  error: string;
3391
4033
  details?: unknown;
4034
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
4035
+ code?: string;
3392
4036
  };
3393
4037
  };
3394
4038
  };
@@ -3401,6 +4045,8 @@ export interface paths {
3401
4045
  "application/json": {
3402
4046
  error: string;
3403
4047
  details?: unknown;
4048
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
4049
+ code?: string;
3404
4050
  };
3405
4051
  };
3406
4052
  };
@@ -3465,6 +4111,8 @@ export interface paths {
3465
4111
  "application/json": {
3466
4112
  error: string;
3467
4113
  details?: unknown;
4114
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
4115
+ code?: string;
3468
4116
  };
3469
4117
  };
3470
4118
  };
@@ -3477,6 +4125,8 @@ export interface paths {
3477
4125
  "application/json": {
3478
4126
  error: string;
3479
4127
  details?: unknown;
4128
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
4129
+ code?: string;
3480
4130
  };
3481
4131
  };
3482
4132
  };
@@ -3489,6 +4139,8 @@ export interface paths {
3489
4139
  "application/json": {
3490
4140
  error: string;
3491
4141
  details?: unknown;
4142
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
4143
+ code?: string;
3492
4144
  };
3493
4145
  };
3494
4146
  };
@@ -3501,6 +4153,8 @@ export interface paths {
3501
4153
  "application/json": {
3502
4154
  error: string;
3503
4155
  details?: unknown;
4156
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
4157
+ code?: string;
3504
4158
  };
3505
4159
  };
3506
4160
  };
@@ -3513,6 +4167,8 @@ export interface paths {
3513
4167
  "application/json": {
3514
4168
  error: string;
3515
4169
  details?: unknown;
4170
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
4171
+ code?: string;
3516
4172
  };
3517
4173
  };
3518
4174
  };
@@ -3576,6 +4232,8 @@ export interface paths {
3576
4232
  "application/json": {
3577
4233
  error: string;
3578
4234
  details?: unknown;
4235
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
4236
+ code?: string;
3579
4237
  };
3580
4238
  };
3581
4239
  };
@@ -3588,6 +4246,8 @@ export interface paths {
3588
4246
  "application/json": {
3589
4247
  error: string;
3590
4248
  details?: unknown;
4249
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
4250
+ code?: string;
3591
4251
  };
3592
4252
  };
3593
4253
  };
@@ -3600,6 +4260,8 @@ export interface paths {
3600
4260
  "application/json": {
3601
4261
  error: string;
3602
4262
  details?: unknown;
4263
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
4264
+ code?: string;
3603
4265
  };
3604
4266
  };
3605
4267
  };
@@ -3612,6 +4274,8 @@ export interface paths {
3612
4274
  "application/json": {
3613
4275
  error: string;
3614
4276
  details?: unknown;
4277
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
4278
+ code?: string;
3615
4279
  };
3616
4280
  };
3617
4281
  };
@@ -3624,6 +4288,8 @@ export interface paths {
3624
4288
  "application/json": {
3625
4289
  error: string;
3626
4290
  details?: unknown;
4291
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
4292
+ code?: string;
3627
4293
  };
3628
4294
  };
3629
4295
  };
@@ -3636,6 +4302,8 @@ export interface paths {
3636
4302
  "application/json": {
3637
4303
  error: string;
3638
4304
  details?: unknown;
4305
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
4306
+ code?: string;
3639
4307
  };
3640
4308
  };
3641
4309
  };
@@ -3715,6 +4383,8 @@ export interface paths {
3715
4383
  "application/json": {
3716
4384
  error: string;
3717
4385
  details?: unknown;
4386
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
4387
+ code?: string;
3718
4388
  };
3719
4389
  };
3720
4390
  };
@@ -3727,6 +4397,8 @@ export interface paths {
3727
4397
  "application/json": {
3728
4398
  error: string;
3729
4399
  details?: unknown;
4400
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
4401
+ code?: string;
3730
4402
  };
3731
4403
  };
3732
4404
  };
@@ -3739,6 +4411,8 @@ export interface paths {
3739
4411
  "application/json": {
3740
4412
  error: string;
3741
4413
  details?: unknown;
4414
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
4415
+ code?: string;
3742
4416
  };
3743
4417
  };
3744
4418
  };
@@ -3819,6 +4493,8 @@ export interface paths {
3819
4493
  "application/json": {
3820
4494
  error: string;
3821
4495
  details?: unknown;
4496
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
4497
+ code?: string;
3822
4498
  };
3823
4499
  };
3824
4500
  };
@@ -3831,6 +4507,8 @@ export interface paths {
3831
4507
  "application/json": {
3832
4508
  error: string;
3833
4509
  details?: unknown;
4510
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
4511
+ code?: string;
3834
4512
  };
3835
4513
  };
3836
4514
  };
@@ -3843,6 +4521,8 @@ export interface paths {
3843
4521
  "application/json": {
3844
4522
  error: string;
3845
4523
  details?: unknown;
4524
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
4525
+ code?: string;
3846
4526
  };
3847
4527
  };
3848
4528
  };
@@ -3855,6 +4535,8 @@ export interface paths {
3855
4535
  "application/json": {
3856
4536
  error: string;
3857
4537
  details?: unknown;
4538
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
4539
+ code?: string;
3858
4540
  };
3859
4541
  };
3860
4542
  };
@@ -3914,6 +4596,8 @@ export interface paths {
3914
4596
  "application/json": {
3915
4597
  error: string;
3916
4598
  details?: unknown;
4599
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
4600
+ code?: string;
3917
4601
  };
3918
4602
  };
3919
4603
  };
@@ -3926,6 +4610,8 @@ export interface paths {
3926
4610
  "application/json": {
3927
4611
  error: string;
3928
4612
  details?: unknown;
4613
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
4614
+ code?: string;
3929
4615
  };
3930
4616
  };
3931
4617
  };
@@ -3938,6 +4624,8 @@ export interface paths {
3938
4624
  "application/json": {
3939
4625
  error: string;
3940
4626
  details?: unknown;
4627
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
4628
+ code?: string;
3941
4629
  };
3942
4630
  };
3943
4631
  };
@@ -3950,6 +4638,8 @@ export interface paths {
3950
4638
  "application/json": {
3951
4639
  error: string;
3952
4640
  details?: unknown;
4641
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
4642
+ code?: string;
3953
4643
  };
3954
4644
  };
3955
4645
  };
@@ -4014,6 +4704,8 @@ export interface paths {
4014
4704
  "application/json": {
4015
4705
  error: string;
4016
4706
  details?: unknown;
4707
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
4708
+ code?: string;
4017
4709
  };
4018
4710
  };
4019
4711
  };
@@ -4026,6 +4718,8 @@ export interface paths {
4026
4718
  "application/json": {
4027
4719
  error: string;
4028
4720
  details?: unknown;
4721
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
4722
+ code?: string;
4029
4723
  };
4030
4724
  };
4031
4725
  };
@@ -4038,6 +4732,8 @@ export interface paths {
4038
4732
  "application/json": {
4039
4733
  error: string;
4040
4734
  details?: unknown;
4735
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
4736
+ code?: string;
4041
4737
  };
4042
4738
  };
4043
4739
  };
@@ -4050,6 +4746,8 @@ export interface paths {
4050
4746
  "application/json": {
4051
4747
  error: string;
4052
4748
  details?: unknown;
4749
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
4750
+ code?: string;
4053
4751
  };
4054
4752
  };
4055
4753
  };
@@ -4062,6 +4760,8 @@ export interface paths {
4062
4760
  "application/json": {
4063
4761
  error: string;
4064
4762
  details?: unknown;
4763
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
4764
+ code?: string;
4065
4765
  };
4066
4766
  };
4067
4767
  };
@@ -4180,6 +4880,8 @@ export interface paths {
4180
4880
  "application/json": {
4181
4881
  error: string;
4182
4882
  details?: unknown;
4883
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
4884
+ code?: string;
4183
4885
  };
4184
4886
  };
4185
4887
  };
@@ -4192,6 +4894,8 @@ export interface paths {
4192
4894
  "application/json": {
4193
4895
  error: string;
4194
4896
  details?: unknown;
4897
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
4898
+ code?: string;
4195
4899
  };
4196
4900
  };
4197
4901
  };
@@ -4204,6 +4908,8 @@ export interface paths {
4204
4908
  "application/json": {
4205
4909
  error: string;
4206
4910
  details?: unknown;
4911
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
4912
+ code?: string;
4207
4913
  };
4208
4914
  };
4209
4915
  };
@@ -4286,6 +4992,8 @@ export interface paths {
4286
4992
  "application/json": {
4287
4993
  error: string;
4288
4994
  details?: unknown;
4995
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
4996
+ code?: string;
4289
4997
  };
4290
4998
  };
4291
4999
  };
@@ -4298,6 +5006,8 @@ export interface paths {
4298
5006
  "application/json": {
4299
5007
  error: string;
4300
5008
  details?: unknown;
5009
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
5010
+ code?: string;
4301
5011
  };
4302
5012
  };
4303
5013
  };
@@ -4310,6 +5020,8 @@ export interface paths {
4310
5020
  "application/json": {
4311
5021
  error: string;
4312
5022
  details?: unknown;
5023
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
5024
+ code?: string;
4313
5025
  };
4314
5026
  };
4315
5027
  };
@@ -4387,6 +5099,8 @@ export interface paths {
4387
5099
  "application/json": {
4388
5100
  error: string;
4389
5101
  details?: unknown;
5102
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
5103
+ code?: string;
4390
5104
  };
4391
5105
  };
4392
5106
  };
@@ -4399,6 +5113,8 @@ export interface paths {
4399
5113
  "application/json": {
4400
5114
  error: string;
4401
5115
  details?: unknown;
5116
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
5117
+ code?: string;
4402
5118
  };
4403
5119
  };
4404
5120
  };
@@ -4411,6 +5127,8 @@ export interface paths {
4411
5127
  "application/json": {
4412
5128
  error: string;
4413
5129
  details?: unknown;
5130
+ /** @description Machine-readable reason, set only on the few errors a client must branch on (each route that sets one says so in its description) and absent on every other. Treat an unknown value as absent. */
5131
+ code?: string;
4414
5132
  };
4415
5133
  };
4416
5134
  };
@@ -4448,11 +5166,20 @@ export interface components {
4448
5166
  useCase: "churn-intervention" | "post-action-reward";
4449
5167
  /**
4450
5168
  * Format: uuid
4451
- * @description Selected variant ID
5169
+ * @description Selected variant ID. On a trigger step answer that draws nothing (template null with a step: a hide, or thanks with no thanks look), the look whose behavior decided it, so after_complete_hide can name it.
4452
5170
  */
4453
5171
  variantId?: string | null;
4454
5172
  /** @description Selected variant name */
4455
5173
  variantName?: string | null;
5174
+ /**
5175
+ * Format: uuid
5176
+ * @description The SDUI experiment that assigned this variant. Echo it as experiment_id on offer events beside variant_id. Null or absent when no experiment decided the variant. On a trigger response it is also present when the user was held out (template null), so a trigger can tell a holdout from no experiment; a sheet response never carries it beside a null template.
5177
+ */
5178
+ experimentId?: string | null;
5179
+ /** @description Trigger responses only: set when the look served (or template null) was chosen by a behavior for the request's `state`, or by the look's behavior.ifIgnored for a gifts button's exposure tally (a non-clicker). Values today: afterClaim, afterComplete, ifIgnored; more may be added, and an SDK treats a value it does not know as no step. With template null and an experimentId, it tells a behavior's hide apart from a holdout (an unknown step with template null is reported as reason unknown_step). Stamp it as step on the trigger events. */
5180
+ step?: string;
5181
+ /** @description Trigger responses with a `step` only: the experiment whose look's behavior chose the step (for a reminder in a gifts button spot, the gifts button's), beside experimentId (the drawn look's own; on an afterComplete step, the deciding look's, as a thanks look is in no arm). An opaque id (a UUID today). Stamp it as step_experiment_id on the trigger events. */
5182
+ stepExperimentId?: string | null;
4456
5183
  /** @description Minimum SDK version for this variant */
4457
5184
  minSdkVersion?: string | null;
4458
5185
  /** @description SDUI template with placeholders */
@@ -4499,6 +5226,10 @@ export interface components {
4499
5226
  rewardDecline?: string | null;
4500
5227
  /** @description Badge on the highlighted offer card, e.g. 'Most claimed'. Same resolution and same null meaning as rewardCta. */
4501
5228
  rewardBadge?: string | null;
5229
+ /** @description Label on the card that opens the rest of the offer list, e.g. 'Show more gifts'. Same resolution and same null meaning as rewardCta. */
5230
+ rewardMoreGifts?: string | null;
5231
+ /** @description Header above the rest of the offer list, e.g. 'Other gifts'. Same resolution and same null meaning as rewardCta. */
5232
+ rewardOtherGifts?: string | null;
4502
5233
  };
4503
5234
  /** @description Appearance values */
4504
5235
  appearance: {
@@ -4517,6 +5248,21 @@ export interface components {
4517
5248
  /** @description App icon URL (App Store artwork for mobile apps, fetched favicon for web apps). Web SDK uses it as the default host logo when display.logoUrl is not set. */
4518
5249
  appstoreIcon: string | null;
4519
5250
  };
5251
+ /** @description Words the SDK says itself, translated into the response `locale`, by string id (e.g. 'card.claim'). Only ids that locale has; for any other id, and whenever the key is absent, use the SDK's own English. Never served for 'en'. Placeholders use ${name}. Populated in `ui.values` only, not in `useCases`. */
5252
+ strings?: {
5253
+ [key: string]: string;
5254
+ };
5255
+ /** @description Count-dependent SDK strings (e.g. 'unit.month'), translated into the response `locale`, by string id. Same id namespace as `strings`; an id appears in only one of the two. Same fallback rules as `strings`. */
5256
+ plurals?: {
5257
+ [key: string]: {
5258
+ zero?: string;
5259
+ one?: string;
5260
+ two?: string;
5261
+ few?: string;
5262
+ many?: string;
5263
+ other: string;
5264
+ };
5265
+ };
4520
5266
  };
4521
5267
  };
4522
5268
  /** @description Assigned variant for every use case this app is enabled for other than the one REQUESTED, so the SDK can cache them at identify(). When the single-enabled-use-case fallback serves a different surface in `ui`, that surface also appears here under its own key, so a client that files `ui` under the requested use case still finds it. `ui` is unchanged; un-upgraded decoders ignore this key. */
@@ -4529,6 +5275,11 @@ export interface components {
4529
5275
  variantId: string | null;
4530
5276
  /** @description Default variant name; null alongside a null variantId. */
4531
5277
  variantName: string | null;
5278
+ /**
5279
+ * Format: uuid
5280
+ * @description The SDUI experiment that assigned this variant, as on `ui.experimentId`. Null or absent when no experiment decided it.
5281
+ */
5282
+ experimentId?: string | null;
4532
5283
  /** @description The default variant's SDUI template. NULL means 'enabled, but nothing to render' — the SDK must no-op on this surface. It must NEVER substitute another use case's template. */
4533
5284
  template: {
4534
5285
  [key: string]: unknown;
@@ -4573,6 +5324,10 @@ export interface components {
4573
5324
  rewardDecline?: string | null;
4574
5325
  /** @description Badge on the highlighted offer card, e.g. 'Most claimed'. Same resolution and same null meaning as rewardCta. */
4575
5326
  rewardBadge?: string | null;
5327
+ /** @description Label on the card that opens the rest of the offer list, e.g. 'Show more gifts'. Same resolution and same null meaning as rewardCta. */
5328
+ rewardMoreGifts?: string | null;
5329
+ /** @description Header above the rest of the offer list, e.g. 'Other gifts'. Same resolution and same null meaning as rewardCta. */
5330
+ rewardOtherGifts?: string | null;
4576
5331
  };
4577
5332
  /** @description Appearance values */
4578
5333
  appearance: {
@@ -4591,6 +5346,21 @@ export interface components {
4591
5346
  /** @description App icon URL (App Store artwork for mobile apps, fetched favicon for web apps). Web SDK uses it as the default host logo when display.logoUrl is not set. */
4592
5347
  appstoreIcon: string | null;
4593
5348
  };
5349
+ /** @description Words the SDK says itself, translated into the response `locale`, by string id (e.g. 'card.claim'). Only ids that locale has; for any other id, and whenever the key is absent, use the SDK's own English. Never served for 'en'. Placeholders use ${name}. Populated in `ui.values` only, not in `useCases`. */
5350
+ strings?: {
5351
+ [key: string]: string;
5352
+ };
5353
+ /** @description Count-dependent SDK strings (e.g. 'unit.month'), translated into the response `locale`, by string id. Same id namespace as `strings`; an id appears in only one of the two. Same fallback rules as `strings`. */
5354
+ plurals?: {
5355
+ [key: string]: {
5356
+ zero?: string;
5357
+ one?: string;
5358
+ two?: string;
5359
+ few?: string;
5360
+ many?: string;
5361
+ other: string;
5362
+ };
5363
+ };
4594
5364
  };
4595
5365
  };
4596
5366
  "post-action-reward"?: {
@@ -4601,6 +5371,11 @@ export interface components {
4601
5371
  variantId: string | null;
4602
5372
  /** @description Default variant name; null alongside a null variantId. */
4603
5373
  variantName: string | null;
5374
+ /**
5375
+ * Format: uuid
5376
+ * @description The SDUI experiment that assigned this variant, as on `ui.experimentId`. Null or absent when no experiment decided it.
5377
+ */
5378
+ experimentId?: string | null;
4604
5379
  /** @description The default variant's SDUI template. NULL means 'enabled, but nothing to render' — the SDK must no-op on this surface. It must NEVER substitute another use case's template. */
4605
5380
  template: {
4606
5381
  [key: string]: unknown;
@@ -4645,6 +5420,10 @@ export interface components {
4645
5420
  rewardDecline?: string | null;
4646
5421
  /** @description Badge on the highlighted offer card, e.g. 'Most claimed'. Same resolution and same null meaning as rewardCta. */
4647
5422
  rewardBadge?: string | null;
5423
+ /** @description Label on the card that opens the rest of the offer list, e.g. 'Show more gifts'. Same resolution and same null meaning as rewardCta. */
5424
+ rewardMoreGifts?: string | null;
5425
+ /** @description Header above the rest of the offer list, e.g. 'Other gifts'. Same resolution and same null meaning as rewardCta. */
5426
+ rewardOtherGifts?: string | null;
4648
5427
  };
4649
5428
  /** @description Appearance values */
4650
5429
  appearance: {
@@ -4663,6 +5442,21 @@ export interface components {
4663
5442
  /** @description App icon URL (App Store artwork for mobile apps, fetched favicon for web apps). Web SDK uses it as the default host logo when display.logoUrl is not set. */
4664
5443
  appstoreIcon: string | null;
4665
5444
  };
5445
+ /** @description Words the SDK says itself, translated into the response `locale`, by string id (e.g. 'card.claim'). Only ids that locale has; for any other id, and whenever the key is absent, use the SDK's own English. Never served for 'en'. Placeholders use ${name}. Populated in `ui.values` only, not in `useCases`. */
5446
+ strings?: {
5447
+ [key: string]: string;
5448
+ };
5449
+ /** @description Count-dependent SDK strings (e.g. 'unit.month'), translated into the response `locale`, by string id. Same id namespace as `strings`; an id appears in only one of the two. Same fallback rules as `strings`. */
5450
+ plurals?: {
5451
+ [key: string]: {
5452
+ zero?: string;
5453
+ one?: string;
5454
+ two?: string;
5455
+ few?: string;
5456
+ many?: string;
5457
+ other: string;
5458
+ };
5459
+ };
4666
5460
  };
4667
5461
  };
4668
5462
  };
@@ -4705,6 +5499,91 @@ export interface components {
4705
5499
  };
4706
5500
  /** @description Resolved locale served in this response (language-only, e.g. 'es'). Absent on pre-localization responses. */
4707
5501
  locale?: string;
5502
+ /** @description Placement labels for this app that carry a placement rule or pinned variant. Present whenever the app's placement rules can be read; empty when none. Clients scope their offers cache by placement only for labels in this list; when the field is absent (older server) clients keep their pre-2.4 behaviour. */
5503
+ ruledPlacements?: string[];
5504
+ };
5505
+ OffersSearchRequest: {
5506
+ userId: string;
5507
+ /** @description Optional user attributes for offer selection */
5508
+ attributes?: {
5509
+ email?: string;
5510
+ firstName?: string;
5511
+ lastName?: string;
5512
+ mobile?: string;
5513
+ phoneNumber?: string;
5514
+ postcode?: string;
5515
+ postalCode?: string;
5516
+ city?: string;
5517
+ state?: string;
5518
+ region?: string;
5519
+ /** @description ISO 3166-1 alpha-2 country code (e.g., "US", "GB", "CA"). */
5520
+ countryCode?: string;
5521
+ /** @description Decimal degrees as string (e.g., "37.7749") */
5522
+ latitude?: string;
5523
+ /** @description Decimal degrees as string (e.g., "-122.4194") */
5524
+ longitude?: string;
5525
+ /** @description Whole years, as an integer. If you hold only a RANGE, send its LOWEST end: "13-17" is sent as 13. Under 18 restricts this request to offers rated for that age, with no per-user personalisation. Used for this request only and never stored. Lower than an age stored through /users/attributes, it wins; higher, the stored one does. A fraction is rounded down, also as a decimal string ("17.9" is 17), a whole-number string is read as its number, and a range string as its lowest end ("13-17" is 13, "65+" is 65); any other value is ignored, never a 400. */
5526
+ age?: number;
5527
+ /** @description Deprecated: send age instead. A YYYY-MM-DD date, or an ISO 8601 date-time with a zone, is turned into an age for this request only, then discarded; never stored or logged. If age is also sent, the younger of the two is used. An unreadable date is ignored, never a 400. */
5528
+ dateOfBirth?: string;
5529
+ gender?: string;
5530
+ /** @description BCP 47 language tag; only the language subtag is used for creative locale resolution, and only when the app has that language enabled. Falls back to Accept-Language, then the app default locale. */
5531
+ language?: string;
5532
+ subscriptionTier?: string;
5533
+ monthsSubscribed?: string;
5534
+ billingCycle?: string;
5535
+ lastPaymentAmount?: string;
5536
+ lastActiveDate?: string;
5537
+ totalSessions?: string;
5538
+ custom?: {
5539
+ [key: string]: string;
5540
+ };
5541
+ };
5542
+ /**
5543
+ * @description Number of campaigns to fetch (default: 10)
5544
+ * @default 50
5545
+ */
5546
+ limit: number;
5547
+ /**
5548
+ * @description Pagination offset (default: 0)
5549
+ * @default 0
5550
+ */
5551
+ offset: number;
5552
+ /**
5553
+ * Format: uuid
5554
+ * @description Session ID for deterministic pagination - if not provided, server will generate one
5555
+ */
5556
+ requestId?: string;
5557
+ /** @description SDK version in semver format (e.g., "1.2.3") */
5558
+ sdkVersion?: string;
5559
+ /**
5560
+ * @description Client platform: android, ios, or web
5561
+ * @enum {string}
5562
+ */
5563
+ platform?: "android" | "ios" | "web";
5564
+ /**
5565
+ * Format: uuid
5566
+ * @description SDUI variant ID from frontend config fetch. If provided, filters creatives by variant assignment. If not provided, no variant filtering is applied.
5567
+ */
5568
+ variantId?: string;
5569
+ /** @description Publisher-defined surface label for where the offer is shown (e.g. 'paywall', 'onboarding', 'settings'). Stamped onto the sdk_offer_requested event so publisher analytics can break the funnel out by placement. An Encore admin can also configure a per-placement offer rule for an app, in which case this label SELECTS and ORDERS the offers returned for that placement; with no rule configured, which is the default for every app, it stays analytics-only and changes nothing about what is served. Max 64 chars. SDKs may send their own auto-generated `placement_<8 hex>` id when the publisher supplied none — that is expected and is folded into the '(unlabeled)' bucket at read time; do NOT substitute '(unlabeled)' or an empty string yourself. */
5570
+ placementId?: string;
5571
+ /**
5572
+ * @description Which Encore surface is being filled. Ignored while OFFERS_SEARCH_RESOLVES_SURFACE is off. With it on and no variantId, the server resolves the variant for this use case (and the placementId pin) as GET /config does; a sent variantId always wins. Absent or unrecognised: today's behaviour (churn-intervention). Never a 400.
5573
+ * @enum {string}
5574
+ */
5575
+ useCase?: "churn-intervention" | "post-action-reward";
5576
+ /** @description Strict unlock mode: only include campaigns whose postback latency is less than or equal to this value (in milliseconds). Omit for no filtering. Bounded 1000..120000. */
5577
+ maxPostbackTimeMs?: number;
5578
+ /** @description Send only when this placement carries the app's own prize for a reward-for-trying Yes: the app's daily prize limit from its SDK configuration (PublisherRewardPolicy), clamped server-side to 1..10. The response then carries publisherRewardPromise. Omit it and nothing changes. */
5579
+ publisherRewardDailyLimit?: number;
5580
+ /** @description Why the client is searching. `purpose: "prefetch"` marks a search the SDK runs before any sheet is shown (a GiftsButton or ClaimReminder checking that offers exist). Its result may later back the sheet the user opens with a tap, so it is a served request like any other, not an impression. It is stamped as purpose on sdk_offer_requested so a report can split these out. Any other value is ignored, never a 400. Serving is identical either way. */
5581
+ purpose?: string;
5582
+ /** @description Request-scoped serving context. Unknown keys are ignored. */
5583
+ context?: {
5584
+ /** @description Request-scoped activity the user is engaged in at serve time (what the surface is being used for, not a persisted user property). Recognized values: laundry, vending, car_wash, air_vacuum, amusement. Any other value is accepted and recorded on serve analytics, so unrecognized activities show up in reporting rather than failing the request. Does not change which offers are served today. */
5585
+ activity?: string;
5586
+ };
4708
5587
  };
4709
5588
  OffersSearchResponse: {
4710
5589
  success: boolean;
@@ -4773,6 +5652,10 @@ export interface components {
4773
5652
  heroImageUrl?: string | null;
4774
5653
  /** @description https link to the advertiser offer terms. Null or absent: render terms copy as plain text. */
4775
5654
  termsUrl?: string | null;
5655
+ /** @description Display-only strings a variant renders by key, e.g. {"eligibilityNote":"New subscribers only"}. Values are strings; the type is free-form so one unexpected value cannot fail a client decode. Absent or empty: the variant draws none of those lines. */
5656
+ displayProperties?: {
5657
+ [key: string]: unknown;
5658
+ };
4776
5659
  /** Format: date-time */
4777
5660
  createdAt: string;
4778
5661
  /** Format: date-time */
@@ -4808,9 +5691,10 @@ export interface components {
4808
5691
  ctaText: string;
4809
5692
  /**
4810
5693
  * Format: uri
4811
- * @description Optional override for campaign destinationUrl
5694
+ * @description The campaign's destination, on a served creative; null where not served
4812
5695
  */
4813
5696
  destinationUrl: string | null;
5697
+ /** @description The campaign's claim tracking, on a served creative; null where not served */
4814
5698
  trackingParameters: {
4815
5699
  [key: string]: unknown;
4816
5700
  } | null;
@@ -4821,6 +5705,8 @@ export interface components {
4821
5705
  title: string;
4822
5706
  subtitle: string;
4823
5707
  ctaButtonText?: string;
5708
+ /** @description Optional https image for this step. Absent: the step has none. */
5709
+ imageUrl?: string;
4824
5710
  }[] | null;
4825
5711
  /** @description Short, actionable phrases (max 1-3) that guide users. Examples: "sign up, create registry", "add to cart" */
4826
5712
  quickInstructions: string | null;
@@ -4887,11 +5773,48 @@ export interface components {
4887
5773
  category?: string | null;
4888
5774
  /** @description The gift-sheet group this campaign files under: "Watch & listen", "Money" or "Everyday". Derived from `category` by the server so a native chip strip shows what web tabs show without holding the taxonomy map. Always set: an absent, blank or unmapped category files under "Everyday", so every offer sits in some group. Whether a strip is worth drawing is the client's call, because only it knows which offers its sheet lists. /offers/search only: web-sdk holds its own copy of the map and groups `category` itself. */
4889
5775
  categoryGroup?: string | null;
5776
+ /** @description `category` in the response locale, for display only. Group and filter on `category`, which stays English. Null when `category` is null. /offers/search only. */
5777
+ categoryDisplayName?: string | null;
5778
+ /** @description `categoryGroup` in the response locale, for display only. Group on `categoryGroup`, which stays English. /offers/search only. */
5779
+ categoryGroupDisplayName?: string | null;
4890
5780
  /** @description Estimated time from the user tapping this offer to the reward being confirmed, from recent real conversions (on demo offers, from the demo advertiser's configured behavior instead). Half confirm within medianSeconds, 9 in 10 within p90Seconds. Not a guarantee: to show a wait, use p90Seconds. Null when there is no current estimate (too few recent conversions, data more than 7 days old, or an offer that does not confirm through the advertiser); say nothing about timing then. */
4891
5781
  rewardConfirmationTime?: {
4892
5782
  medianSeconds: number;
4893
5783
  p90Seconds: number;
4894
5784
  } | null;
5785
+ /** @description This offer's per-offer reward. Present only for an app with reward settings; null when the offer carries no value: in on_yes show the placement's flat prize, in on_verified show no prize (a null value is never paid). Absent: the app has no per-offer rewards. /offers/search only. */
5786
+ publisherRewardValue?: {
5787
+ /** @description Tokens this offer is worth in the app's own unit. The offer_completed webhook's reward.amount carries the value frozen when the user claimed. */
5788
+ amount: number;
5789
+ /** @description Ready-to-render card text, e.g. "1,500 tokens". Show it in place of the flat PublisherReward title. */
5790
+ label: string;
5791
+ } | null;
5792
+ /** @description Campaign claim-URL query parameters, keys verbatim (e.g. {"af_rid":"TRANSACTION_ID"}); equals the served creative's whenever one exists. Always pair it with the offer's destinationUrl, never with a creative's, and never build a claim URL from an absent or empty value. Absent from servers that predate it; null means the campaign has none. */
5793
+ trackingParameters?: {
5794
+ [key: string]: unknown;
5795
+ } | null;
5796
+ /** @description Campaign call-to-action text. Absent from servers that predate it; null means the campaign has none. */
5797
+ ctaText?: string | null;
5798
+ /** @description Campaign description, localized like creatives. Absent from servers that predate it; null means the campaign has none. */
5799
+ description?: string | null;
5800
+ /** @description Campaign step-by-step instructions, same shape as a creative's. Absent from servers that predate it; null means the campaign has none. */
5801
+ instructions?: {
5802
+ title: string;
5803
+ subtitle: string;
5804
+ ctaButtonText?: string;
5805
+ /** @description Optional https image for this step. Absent: the step has none. */
5806
+ imageUrl?: string;
5807
+ }[] | null;
5808
+ /** @description Campaign one-line instructions. Absent from servers that predate it; null means the campaign has none. */
5809
+ quickInstructions?: string | null;
5810
+ /** @description Campaign logo override; null means use organization.logoUrl. Plain string, not format: uri, so one bad value cannot fail a whole Android decode. Absent from servers that predate it; null means the campaign has none. */
5811
+ logoUrl?: string | null;
5812
+ /** @description Campaign card title. Absent from servers that predate it; null means the campaign has none. */
5813
+ title?: string | null;
5814
+ /** @description Campaign card subtitle. Absent from servers that predate it; null means the campaign has none. */
5815
+ subtitle?: string | null;
5816
+ /** @description Campaign tooltip text. Absent from servers that predate it; null means the campaign has none. */
5817
+ tooltipText?: string | null;
4895
5818
  }[];
4896
5819
  metadata: {
4897
5820
  /** @description Total offers available */
@@ -4909,6 +5832,13 @@ export interface components {
4909
5832
  };
4910
5833
  /** @description Resolved locale served in this response (language-only, e.g. 'es'). Absent on pre-localization responses. */
4911
5834
  locale?: string;
5835
+ /** @description Whether this user is still under the app's daily prize limit (publisherRewardDailyLimit, rolling 24 hours). What counts depends on publisherRewardMode. on_yes (or no mode): prizes granted on a reward-for-trying Yes. on_verified: this user's verified completions that carried a reward, by when they verified; a Yes never grants and never counts, and the reward arrives on the offer_completed webhook. Present only when the request sent publisherRewardDailyLimit. Offers this user already completed or said Yes to are never served, so this answers the daily limit only. Absent (an older backend, or no limit sent) means no promise. Not a grant: in on_yes the self-report's granted answer is final. */
5836
+ publisherRewardPromise?: boolean;
5837
+ /**
5838
+ * @description How this app pays its prize. on_yes: a reward-for-trying Yes can grant it (self-report granted). on_verified: a Yes never grants; each offer's publisherRewardValue arrives on the offer_completed webhook when the brand confirms. Present only for an app with reward settings (and always when the promise was counted under on_verified). Decode as a string and treat an unknown value as on_yes.
5839
+ * @enum {string}
5840
+ */
5841
+ publisherRewardMode?: "on_yes" | "on_verified";
4912
5842
  error?: string | null;
4913
5843
  };
4914
5844
  Campaign: {
@@ -4976,6 +5906,10 @@ export interface components {
4976
5906
  heroImageUrl?: string | null;
4977
5907
  /** @description https link to the advertiser offer terms. Null or absent: render terms copy as plain text. */
4978
5908
  termsUrl?: string | null;
5909
+ /** @description Display-only strings a variant renders by key, e.g. {"eligibilityNote":"New subscribers only"}. Values are strings; the type is free-form so one unexpected value cannot fail a client decode. Absent or empty: the variant draws none of those lines. */
5910
+ displayProperties?: {
5911
+ [key: string]: unknown;
5912
+ };
4979
5913
  /** Format: date-time */
4980
5914
  createdAt: string;
4981
5915
  /** Format: date-time */
@@ -5011,9 +5945,10 @@ export interface components {
5011
5945
  ctaText: string;
5012
5946
  /**
5013
5947
  * Format: uri
5014
- * @description Optional override for campaign destinationUrl
5948
+ * @description The campaign's destination, on a served creative; null where not served
5015
5949
  */
5016
5950
  destinationUrl: string | null;
5951
+ /** @description The campaign's claim tracking, on a served creative; null where not served */
5017
5952
  trackingParameters: {
5018
5953
  [key: string]: unknown;
5019
5954
  } | null;
@@ -5024,6 +5959,8 @@ export interface components {
5024
5959
  title: string;
5025
5960
  subtitle: string;
5026
5961
  ctaButtonText?: string;
5962
+ /** @description Optional https image for this step. Absent: the step has none. */
5963
+ imageUrl?: string;
5027
5964
  }[] | null;
5028
5965
  /** @description Short, actionable phrases (max 1-3) that guide users. Examples: "sign up, create registry", "add to cart" */
5029
5966
  quickInstructions: string | null;
@@ -5090,11 +6027,48 @@ export interface components {
5090
6027
  category?: string | null;
5091
6028
  /** @description The gift-sheet group this campaign files under: "Watch & listen", "Money" or "Everyday". Derived from `category` by the server so a native chip strip shows what web tabs show without holding the taxonomy map. Always set: an absent, blank or unmapped category files under "Everyday", so every offer sits in some group. Whether a strip is worth drawing is the client's call, because only it knows which offers its sheet lists. /offers/search only: web-sdk holds its own copy of the map and groups `category` itself. */
5092
6029
  categoryGroup?: string | null;
6030
+ /** @description `category` in the response locale, for display only. Group and filter on `category`, which stays English. Null when `category` is null. /offers/search only. */
6031
+ categoryDisplayName?: string | null;
6032
+ /** @description `categoryGroup` in the response locale, for display only. Group on `categoryGroup`, which stays English. /offers/search only. */
6033
+ categoryGroupDisplayName?: string | null;
5093
6034
  /** @description Estimated time from the user tapping this offer to the reward being confirmed, from recent real conversions (on demo offers, from the demo advertiser's configured behavior instead). Half confirm within medianSeconds, 9 in 10 within p90Seconds. Not a guarantee: to show a wait, use p90Seconds. Null when there is no current estimate (too few recent conversions, data more than 7 days old, or an offer that does not confirm through the advertiser); say nothing about timing then. */
5094
6035
  rewardConfirmationTime?: {
5095
6036
  medianSeconds: number;
5096
6037
  p90Seconds: number;
5097
6038
  } | null;
6039
+ /** @description This offer's per-offer reward. Present only for an app with reward settings; null when the offer carries no value: in on_yes show the placement's flat prize, in on_verified show no prize (a null value is never paid). Absent: the app has no per-offer rewards. /offers/search only. */
6040
+ publisherRewardValue?: {
6041
+ /** @description Tokens this offer is worth in the app's own unit. The offer_completed webhook's reward.amount carries the value frozen when the user claimed. */
6042
+ amount: number;
6043
+ /** @description Ready-to-render card text, e.g. "1,500 tokens". Show it in place of the flat PublisherReward title. */
6044
+ label: string;
6045
+ } | null;
6046
+ /** @description Campaign claim-URL query parameters, keys verbatim (e.g. {"af_rid":"TRANSACTION_ID"}); equals the served creative's whenever one exists. Always pair it with the offer's destinationUrl, never with a creative's, and never build a claim URL from an absent or empty value. Absent from servers that predate it; null means the campaign has none. */
6047
+ trackingParameters?: {
6048
+ [key: string]: unknown;
6049
+ } | null;
6050
+ /** @description Campaign call-to-action text. Absent from servers that predate it; null means the campaign has none. */
6051
+ ctaText?: string | null;
6052
+ /** @description Campaign description, localized like creatives. Absent from servers that predate it; null means the campaign has none. */
6053
+ description?: string | null;
6054
+ /** @description Campaign step-by-step instructions, same shape as a creative's. Absent from servers that predate it; null means the campaign has none. */
6055
+ instructions?: {
6056
+ title: string;
6057
+ subtitle: string;
6058
+ ctaButtonText?: string;
6059
+ /** @description Optional https image for this step. Absent: the step has none. */
6060
+ imageUrl?: string;
6061
+ }[] | null;
6062
+ /** @description Campaign one-line instructions. Absent from servers that predate it; null means the campaign has none. */
6063
+ quickInstructions?: string | null;
6064
+ /** @description Campaign logo override; null means use organization.logoUrl. Plain string, not format: uri, so one bad value cannot fail a whole Android decode. Absent from servers that predate it; null means the campaign has none. */
6065
+ logoUrl?: string | null;
6066
+ /** @description Campaign card title. Absent from servers that predate it; null means the campaign has none. */
6067
+ title?: string | null;
6068
+ /** @description Campaign card subtitle. Absent from servers that predate it; null means the campaign has none. */
6069
+ subtitle?: string | null;
6070
+ /** @description Campaign tooltip text. Absent from servers that predate it; null means the campaign has none. */
6071
+ tooltipText?: string | null;
5098
6072
  };
5099
6073
  Creative: {
5100
6074
  /** Format: uuid */
@@ -5113,9 +6087,10 @@ export interface components {
5113
6087
  ctaText: string;
5114
6088
  /**
5115
6089
  * Format: uri
5116
- * @description Optional override for campaign destinationUrl
6090
+ * @description The campaign's destination, on a served creative; null where not served
5117
6091
  */
5118
6092
  destinationUrl: string | null;
6093
+ /** @description The campaign's claim tracking, on a served creative; null where not served */
5119
6094
  trackingParameters: {
5120
6095
  [key: string]: unknown;
5121
6096
  } | null;
@@ -5126,6 +6101,8 @@ export interface components {
5126
6101
  title: string;
5127
6102
  subtitle: string;
5128
6103
  ctaButtonText?: string;
6104
+ /** @description Optional https image for this step. Absent: the step has none. */
6105
+ imageUrl?: string;
5129
6106
  }[] | null;
5130
6107
  /** @description Short, actionable phrases (max 1-3) that guide users. Examples: "sign up, create registry", "add to cart" */
5131
6108
  quickInstructions: string | null;