@encorekit/web-sdk 2.2.0 → 2.3.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 (50) hide show
  1. package/README.md +20 -0
  2. package/dist/cjs/index.cjs +1 -1
  3. package/dist/cjs/index.cjs.map +1 -1
  4. package/dist/esm/index.js +1 -1
  5. package/dist/esm/index.js.map +1 -1
  6. package/dist/umd/encore.min.js +1 -1
  7. package/dist/umd/encore.min.js.map +1 -1
  8. package/package.json +1 -1
  9. package/types/analytics/events.d.ts +57 -5
  10. package/types/analytics/events.d.ts.map +1 -1
  11. package/types/api/APIClient.d.ts +16 -20
  12. package/types/api/APIClient.d.ts.map +1 -1
  13. package/types/api/generated/types.d.ts +643 -9
  14. package/types/api/generated/types.d.ts.map +1 -1
  15. package/types/api/models.d.ts +19 -7
  16. package/types/api/models.d.ts.map +1 -1
  17. package/types/api/offerBuilder.d.ts +45 -0
  18. package/types/api/offerBuilder.d.ts.map +1 -0
  19. package/types/core/Configuration.d.ts +11 -0
  20. package/types/core/Configuration.d.ts.map +1 -1
  21. package/types/core/Encore.d.ts.map +1 -1
  22. package/types/core/OfferManager.d.ts +2 -2
  23. package/types/core/OfferManager.d.ts.map +1 -1
  24. package/types/core/claimScreenVariant.d.ts +3 -0
  25. package/types/core/claimScreenVariant.d.ts.map +1 -0
  26. package/types/core/giftVariant.d.ts +11 -8
  27. package/types/core/giftVariant.d.ts.map +1 -1
  28. package/types/core/share.d.ts +58 -0
  29. package/types/core/share.d.ts.map +1 -0
  30. package/types/core/unlockCode.d.ts +4 -1
  31. package/types/core/unlockCode.d.ts.map +1 -1
  32. package/types/core/version.d.ts +1 -1
  33. package/types/types.d.ts +120 -3
  34. package/types/types.d.ts.map +1 -1
  35. package/types/ui/ClaimScreen.d.ts +62 -0
  36. package/types/ui/ClaimScreen.d.ts.map +1 -0
  37. package/types/ui/CodeUnlock.d.ts +14 -0
  38. package/types/ui/CodeUnlock.d.ts.map +1 -1
  39. package/types/ui/GiftSheet.d.ts +48 -4
  40. package/types/ui/GiftSheet.d.ts.map +1 -1
  41. package/types/ui/GiftUnwrap.d.ts +70 -0
  42. package/types/ui/GiftUnwrap.d.ts.map +1 -1
  43. package/types/ui/OfferCard.d.ts.map +1 -1
  44. package/types/ui/OfferModal.d.ts +22 -4
  45. package/types/ui/OfferModal.d.ts.map +1 -1
  46. package/types/ui/giftUnwrapArt.d.ts +6 -0
  47. package/types/ui/giftUnwrapArt.d.ts.map +1 -1
  48. package/types/ui/giftUnwrapCopy.d.ts +20 -0
  49. package/types/ui/giftUnwrapCopy.d.ts.map +1 -1
  50. package/types/ui/styles.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 */
@@ -152,6 +156,8 @@ export interface paths {
152
156
  title: string;
153
157
  subtitle: string;
154
158
  ctaButtonText?: string;
159
+ /** @description Optional https image for this step. Absent: the step has none. */
160
+ imageUrl?: string;
155
161
  }[] | null;
156
162
  /** @description Short, actionable phrases (max 1-3) that guide users. Examples: "sign up, create registry", "add to cart" */
157
163
  quickInstructions: string | null;
@@ -231,6 +237,8 @@ export interface paths {
231
237
  "application/json": {
232
238
  error: string;
233
239
  details?: unknown;
240
+ /** @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. */
241
+ code?: string;
234
242
  };
235
243
  };
236
244
  };
@@ -285,6 +293,7 @@ export interface paths {
285
293
  longitude?: string;
286
294
  dateOfBirth?: string;
287
295
  gender?: string;
296
+ /** @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
297
  language?: string;
289
298
  subscriptionTier?: string;
290
299
  monthsSubscribed?: string;
@@ -325,8 +334,15 @@ export interface paths {
325
334
  variantId?: string;
326
335
  /** @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
336
  placementId?: string;
337
+ /**
338
+ * @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.
339
+ * @enum {string}
340
+ */
341
+ useCase?: "churn-intervention" | "post-action-reward";
328
342
  /** @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
343
  maxPostbackTimeMs?: number;
344
+ /** @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. */
345
+ publisherRewardDailyLimit?: number;
330
346
  /** @description Request-scoped serving context. Unknown keys are ignored. */
331
347
  context?: {
332
348
  /** @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 +425,10 @@ export interface paths {
409
425
  heroImageUrl?: string | null;
410
426
  /** @description https link to the advertiser offer terms. Null or absent: render terms copy as plain text. */
411
427
  termsUrl?: string | null;
428
+ /** @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. */
429
+ displayProperties?: {
430
+ [key: string]: unknown;
431
+ };
412
432
  /** Format: date-time */
413
433
  createdAt: string;
414
434
  /** Format: date-time */
@@ -457,6 +477,8 @@ export interface paths {
457
477
  title: string;
458
478
  subtitle: string;
459
479
  ctaButtonText?: string;
480
+ /** @description Optional https image for this step. Absent: the step has none. */
481
+ imageUrl?: string;
460
482
  }[] | null;
461
483
  /** @description Short, actionable phrases (max 1-3) that guide users. Examples: "sign up, create registry", "add to cart" */
462
484
  quickInstructions: string | null;
@@ -523,11 +545,41 @@ export interface paths {
523
545
  category?: string | null;
524
546
  /** @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
547
  categoryGroup?: string | null;
548
+ /** @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. */
549
+ categoryDisplayName?: string | null;
550
+ /** @description `categoryGroup` in the response locale, for display only. Group on `categoryGroup`, which stays English. /offers/search only. */
551
+ categoryGroupDisplayName?: string | null;
526
552
  /** @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
553
  rewardConfirmationTime?: {
528
554
  medianSeconds: number;
529
555
  p90Seconds: number;
530
556
  } | null;
557
+ /** @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 unless the campaign offer fields flag is on; null means the campaign has none. */
558
+ trackingParameters?: {
559
+ [key: string]: unknown;
560
+ } | null;
561
+ /** @description Campaign call-to-action text. Absent unless the campaign offer fields flag is on; null means the campaign has none. */
562
+ ctaText?: string | null;
563
+ /** @description Campaign description, localized like creatives. Absent unless the campaign offer fields flag is on; null means the campaign has none. */
564
+ description?: string | null;
565
+ /** @description Campaign step-by-step instructions, same shape as a creative's. Absent unless the campaign offer fields flag is on; null means the campaign has none. */
566
+ instructions?: {
567
+ title: string;
568
+ subtitle: string;
569
+ ctaButtonText?: string;
570
+ /** @description Optional https image for this step. Absent: the step has none. */
571
+ imageUrl?: string;
572
+ }[] | null;
573
+ /** @description Campaign one-line instructions. Absent unless the campaign offer fields flag is on; null means the campaign has none. */
574
+ quickInstructions?: string | null;
575
+ /** @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 unless the campaign offer fields flag is on; null means the campaign has none. */
576
+ logoUrl?: string | null;
577
+ /** @description Campaign card title. Absent unless the campaign offer fields flag is on; null means the campaign has none. */
578
+ title?: string | null;
579
+ /** @description Campaign card subtitle. Absent unless the campaign offer fields flag is on; null means the campaign has none. */
580
+ subtitle?: string | null;
581
+ /** @description Campaign tooltip text. Absent unless the campaign offer fields flag is on; null means the campaign has none. */
582
+ tooltipText?: string | null;
531
583
  }[];
532
584
  metadata: {
533
585
  /** @description Total offers available */
@@ -545,6 +597,8 @@ export interface paths {
545
597
  };
546
598
  /** @description Resolved locale served in this response (language-only, e.g. 'es'). Absent on pre-localization responses. */
547
599
  locale?: string;
600
+ /** @description Whether this user may still be granted the app's prize for a reward-for-trying Yes: true while the prizes granted to them in the last 24 hours (rolling) are under publisherRewardDailyLimit. 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: the self-report's granted answer is final. */
601
+ publisherRewardPromise?: boolean;
548
602
  error?: string | null;
549
603
  };
550
604
  };
@@ -558,6 +612,8 @@ export interface paths {
558
612
  "application/json": {
559
613
  error: string;
560
614
  details?: unknown;
615
+ /** @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. */
616
+ code?: string;
561
617
  };
562
618
  };
563
619
  };
@@ -570,6 +626,8 @@ export interface paths {
570
626
  "application/json": {
571
627
  error: string;
572
628
  details?: unknown;
629
+ /** @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. */
630
+ code?: string;
573
631
  };
574
632
  };
575
633
  };
@@ -582,6 +640,8 @@ export interface paths {
582
640
  "application/json": {
583
641
  error: string;
584
642
  details?: unknown;
643
+ /** @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. */
644
+ code?: string;
585
645
  };
586
646
  };
587
647
  };
@@ -594,6 +654,8 @@ export interface paths {
594
654
  "application/json": {
595
655
  error: string;
596
656
  details?: unknown;
657
+ /** @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. */
658
+ code?: string;
597
659
  };
598
660
  };
599
661
  };
@@ -614,7 +676,7 @@ export interface paths {
614
676
  };
615
677
  get?: never;
616
678
  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_*). */
679
+ /** @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
680
  post: {
619
681
  parameters: {
620
682
  query?: never;
@@ -625,7 +687,7 @@ export interface paths {
625
687
  requestBody?: {
626
688
  content: {
627
689
  "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). */
690
+ /** @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
691
  userId?: string;
630
692
  /** @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
693
  clientId?: string;
@@ -638,6 +700,8 @@ export interface paths {
638
700
  platform?: "android" | "ios" | "web";
639
701
  /** @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
702
  placementId?: string;
703
+ /** @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. */
704
+ language?: string;
641
705
  /** @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
706
  includeAllRegions?: boolean;
643
707
  /** @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 +744,10 @@ export interface paths {
680
744
  isDemo?: boolean;
681
745
  /** @description https link to the advertiser offer terms. Null or absent: render terms copy as plain text. */
682
746
  termsUrl?: string | null;
747
+ /** @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. */
748
+ displayProperties?: {
749
+ [key: string]: unknown;
750
+ };
683
751
  /** @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
752
  rewardConfirmationTime?: {
685
753
  medianSeconds: number;
@@ -712,6 +780,8 @@ export interface paths {
712
780
  title: string;
713
781
  subtitle: string;
714
782
  ctaButtonText?: string;
783
+ /** @description Optional https image for this step. Absent: the step has none. */
784
+ imageUrl?: string;
715
785
  }[] | null;
716
786
  /** @description A short one line version of the instructions, e.g. "sign up, complete one survey". Null or absent: the creative has none. */
717
787
  quickInstructions?: string | null;
@@ -744,6 +814,8 @@ export interface paths {
744
814
  "application/json": {
745
815
  error: string;
746
816
  details?: unknown;
817
+ /** @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. */
818
+ code?: string;
747
819
  };
748
820
  };
749
821
  };
@@ -756,6 +828,8 @@ export interface paths {
756
828
  "application/json": {
757
829
  error: string;
758
830
  details?: unknown;
831
+ /** @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. */
832
+ code?: string;
759
833
  };
760
834
  };
761
835
  };
@@ -768,6 +842,8 @@ export interface paths {
768
842
  "application/json": {
769
843
  error: string;
770
844
  details?: unknown;
845
+ /** @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. */
846
+ code?: string;
771
847
  };
772
848
  };
773
849
  };
@@ -807,7 +883,7 @@ export interface paths {
807
883
  attributes: {
808
884
  /** @description ISO 3166-1 alpha-2 country code (e.g., "US", "GB", "CA"). */
809
885
  countryCode: string;
810
- /** @description BCP 47 language tag — drives creative locale resolution (e.g., 'en', 'es'). */
886
+ /** @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
887
  language: string;
812
888
  /**
813
889
  * @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.
@@ -875,6 +951,8 @@ export interface paths {
875
951
  "application/json": {
876
952
  error: string;
877
953
  details?: unknown;
954
+ /** @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. */
955
+ code?: string;
878
956
  };
879
957
  };
880
958
  };
@@ -887,6 +965,8 @@ export interface paths {
887
965
  "application/json": {
888
966
  error: string;
889
967
  details?: unknown;
968
+ /** @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. */
969
+ code?: string;
890
970
  };
891
971
  };
892
972
  };
@@ -899,6 +979,8 @@ export interface paths {
899
979
  "application/json": {
900
980
  error: string;
901
981
  details?: unknown;
982
+ /** @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. */
983
+ code?: string;
902
984
  };
903
985
  };
904
986
  };
@@ -938,7 +1020,7 @@ export interface paths {
938
1020
  attributes: {
939
1021
  /** @description ISO 3166-1 alpha-2 country code (e.g., "US", "GB", "CA"). */
940
1022
  countryCode: string;
941
- /** @description BCP 47 language tag — drives creative locale resolution (e.g., 'en', 'es'). */
1023
+ /** @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
1024
  language: string;
943
1025
  /**
944
1026
  * @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.
@@ -1014,6 +1096,10 @@ export interface paths {
1014
1096
  heroImageUrl?: string | null;
1015
1097
  /** @description https link to the advertiser offer terms. Null or absent: render terms copy as plain text. */
1016
1098
  termsUrl?: string | null;
1099
+ /** @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. */
1100
+ displayProperties?: {
1101
+ [key: string]: unknown;
1102
+ };
1017
1103
  /** @description Display name of the campaign category, e.g. "Music and Audio". Free string: the taxonomy is admin-editable, so accept any value. */
1018
1104
  category?: string | null;
1019
1105
  /** @description Step by step instructions from the creative, translated like the title. Null or absent: the creative has none. */
@@ -1021,6 +1107,8 @@ export interface paths {
1021
1107
  title: string;
1022
1108
  subtitle: string;
1023
1109
  ctaButtonText?: string;
1110
+ /** @description Optional https image for this step. Absent: the step has none. */
1111
+ imageUrl?: string;
1024
1112
  }[] | null;
1025
1113
  /** @description A short one line version of the instructions, e.g. "sign up, complete one survey". Null or absent: the creative has none. */
1026
1114
  quickInstructions?: string | null;
@@ -1042,6 +1130,8 @@ export interface paths {
1042
1130
  "application/json": {
1043
1131
  error: string;
1044
1132
  details?: unknown;
1133
+ /** @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. */
1134
+ code?: string;
1045
1135
  };
1046
1136
  };
1047
1137
  };
@@ -1054,6 +1144,8 @@ export interface paths {
1054
1144
  "application/json": {
1055
1145
  error: string;
1056
1146
  details?: unknown;
1147
+ /** @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. */
1148
+ code?: string;
1057
1149
  };
1058
1150
  };
1059
1151
  };
@@ -1066,6 +1158,8 @@ export interface paths {
1066
1158
  "application/json": {
1067
1159
  error: string;
1068
1160
  details?: unknown;
1161
+ /** @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. */
1162
+ code?: string;
1069
1163
  };
1070
1164
  };
1071
1165
  };
@@ -1129,6 +1223,8 @@ export interface paths {
1129
1223
  "application/json": {
1130
1224
  error: string;
1131
1225
  details?: unknown;
1226
+ /** @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. */
1227
+ code?: string;
1132
1228
  };
1133
1229
  };
1134
1230
  };
@@ -1141,6 +1237,8 @@ export interface paths {
1141
1237
  "application/json": {
1142
1238
  error: string;
1143
1239
  details?: unknown;
1240
+ /** @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. */
1241
+ code?: string;
1144
1242
  };
1145
1243
  };
1146
1244
  };
@@ -1153,6 +1251,8 @@ export interface paths {
1153
1251
  "application/json": {
1154
1252
  error: string;
1155
1253
  details?: unknown;
1254
+ /** @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. */
1255
+ code?: string;
1156
1256
  };
1157
1257
  };
1158
1258
  };
@@ -1173,7 +1273,7 @@ export interface paths {
1173
1273
  };
1174
1274
  get?: never;
1175
1275
  put?: never;
1176
- /** @description Create a new transaction for a specific campaign */
1276
+ /** @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
1277
  post: {
1178
1278
  parameters: {
1179
1279
  query?: never;
@@ -1230,6 +1330,8 @@ export interface paths {
1230
1330
  "application/json": {
1231
1331
  error: string;
1232
1332
  details?: unknown;
1333
+ /** @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. */
1334
+ code?: string;
1233
1335
  };
1234
1336
  };
1235
1337
  };
@@ -1242,6 +1344,8 @@ export interface paths {
1242
1344
  "application/json": {
1243
1345
  error: string;
1244
1346
  details?: unknown;
1347
+ /** @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. */
1348
+ code?: string;
1245
1349
  };
1246
1350
  };
1247
1351
  };
@@ -1254,6 +1358,8 @@ export interface paths {
1254
1358
  "application/json": {
1255
1359
  error: string;
1256
1360
  details?: unknown;
1361
+ /** @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. */
1362
+ code?: string;
1257
1363
  };
1258
1364
  };
1259
1365
  };
@@ -1266,6 +1372,8 @@ export interface paths {
1266
1372
  "application/json": {
1267
1373
  error: string;
1268
1374
  details?: unknown;
1375
+ /** @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. */
1376
+ code?: string;
1269
1377
  };
1270
1378
  };
1271
1379
  };
@@ -1278,6 +1386,8 @@ export interface paths {
1278
1386
  "application/json": {
1279
1387
  error: string;
1280
1388
  details?: unknown;
1389
+ /** @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. */
1390
+ code?: string;
1281
1391
  };
1282
1392
  };
1283
1393
  };
@@ -1341,6 +1451,8 @@ export interface paths {
1341
1451
  "application/json": {
1342
1452
  error: string;
1343
1453
  details?: unknown;
1454
+ /** @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. */
1455
+ code?: string;
1344
1456
  };
1345
1457
  };
1346
1458
  };
@@ -1353,6 +1465,8 @@ export interface paths {
1353
1465
  "application/json": {
1354
1466
  error: string;
1355
1467
  details?: unknown;
1468
+ /** @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. */
1469
+ code?: string;
1356
1470
  };
1357
1471
  };
1358
1472
  };
@@ -1365,6 +1479,8 @@ export interface paths {
1365
1479
  "application/json": {
1366
1480
  error: string;
1367
1481
  details?: unknown;
1482
+ /** @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. */
1483
+ code?: string;
1368
1484
  };
1369
1485
  };
1370
1486
  };
@@ -1377,6 +1493,133 @@ export interface paths {
1377
1493
  "application/json": {
1378
1494
  error: string;
1379
1495
  details?: unknown;
1496
+ /** @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. */
1497
+ code?: string;
1498
+ };
1499
+ };
1500
+ };
1501
+ /** @description Default Response */
1502
+ 500: {
1503
+ headers: {
1504
+ [name: string]: unknown;
1505
+ };
1506
+ content: {
1507
+ "application/json": {
1508
+ error: string;
1509
+ details?: unknown;
1510
+ /** @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. */
1511
+ code?: string;
1512
+ };
1513
+ };
1514
+ };
1515
+ };
1516
+ };
1517
+ delete?: never;
1518
+ options?: never;
1519
+ head?: never;
1520
+ patch?: never;
1521
+ trace?: never;
1522
+ };
1523
+ "/publisher/sdk/v1/transactions/{transactionId}/self-report": {
1524
+ parameters: {
1525
+ query?: never;
1526
+ header?: never;
1527
+ path?: never;
1528
+ cookie?: never;
1529
+ };
1530
+ get?: never;
1531
+ put?: never;
1532
+ /** @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. */
1533
+ post: {
1534
+ parameters: {
1535
+ query?: never;
1536
+ header?: never;
1537
+ path: {
1538
+ transactionId: string;
1539
+ };
1540
+ cookie?: never;
1541
+ };
1542
+ requestBody: {
1543
+ content: {
1544
+ "application/json": {
1545
+ /** @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. */
1546
+ userId: string;
1547
+ /**
1548
+ * Format: uuid
1549
+ * @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.
1550
+ */
1551
+ reportId: string;
1552
+ /** @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. */
1553
+ publisherRewardId?: string;
1554
+ /** @description The app's daily prize limit from its SDK configuration. Required when publisherRewardId is present. Clamped server-side to 1..10. */
1555
+ dailyLimit?: number;
1556
+ };
1557
+ };
1558
+ };
1559
+ responses: {
1560
+ /** @description Default Response */
1561
+ 200: {
1562
+ headers: {
1563
+ [name: string]: unknown;
1564
+ };
1565
+ content: {
1566
+ "application/json": {
1567
+ /** @enum {boolean} */
1568
+ success: true;
1569
+ /** @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. */
1570
+ granted: boolean;
1571
+ /**
1572
+ * @description Present when granted is false.
1573
+ * @enum {string}
1574
+ */
1575
+ reason?: "per_offer" | "daily_cap" | "no_prize";
1576
+ /**
1577
+ * Format: date-time
1578
+ * @description When the server recorded this person's Yes for this offer (the first one, on a retry or a second device).
1579
+ */
1580
+ reportedAt: string;
1581
+ };
1582
+ };
1583
+ };
1584
+ /** @description Default Response */
1585
+ 400: {
1586
+ headers: {
1587
+ [name: string]: unknown;
1588
+ };
1589
+ content: {
1590
+ "application/json": {
1591
+ error: string;
1592
+ details?: unknown;
1593
+ /** @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. */
1594
+ code?: string;
1595
+ };
1596
+ };
1597
+ };
1598
+ /** @description Default Response */
1599
+ 401: {
1600
+ headers: {
1601
+ [name: string]: unknown;
1602
+ };
1603
+ content: {
1604
+ "application/json": {
1605
+ error: string;
1606
+ details?: unknown;
1607
+ /** @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. */
1608
+ code?: string;
1609
+ };
1610
+ };
1611
+ };
1612
+ /** @description Default Response */
1613
+ 404: {
1614
+ headers: {
1615
+ [name: string]: unknown;
1616
+ };
1617
+ content: {
1618
+ "application/json": {
1619
+ error: string;
1620
+ details?: unknown;
1621
+ /** @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. */
1622
+ code?: string;
1380
1623
  };
1381
1624
  };
1382
1625
  };
@@ -1389,6 +1632,8 @@ export interface paths {
1389
1632
  "application/json": {
1390
1633
  error: string;
1391
1634
  details?: unknown;
1635
+ /** @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. */
1636
+ code?: string;
1392
1637
  };
1393
1638
  };
1394
1639
  };
@@ -1448,6 +1693,8 @@ export interface paths {
1448
1693
  "application/json": {
1449
1694
  error: string;
1450
1695
  details?: unknown;
1696
+ /** @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. */
1697
+ code?: string;
1451
1698
  };
1452
1699
  };
1453
1700
  };
@@ -1460,6 +1707,8 @@ export interface paths {
1460
1707
  "application/json": {
1461
1708
  error: string;
1462
1709
  details?: unknown;
1710
+ /** @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. */
1711
+ code?: string;
1463
1712
  };
1464
1713
  };
1465
1714
  };
@@ -1472,6 +1721,8 @@ export interface paths {
1472
1721
  "application/json": {
1473
1722
  error: string;
1474
1723
  details?: unknown;
1724
+ /** @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. */
1725
+ code?: string;
1475
1726
  };
1476
1727
  };
1477
1728
  };
@@ -1655,6 +1906,8 @@ export interface paths {
1655
1906
  "application/json": {
1656
1907
  error: string;
1657
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;
1658
1911
  };
1659
1912
  };
1660
1913
  };
@@ -1667,6 +1920,8 @@ export interface paths {
1667
1920
  "application/json": {
1668
1921
  error: string;
1669
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;
1670
1925
  };
1671
1926
  };
1672
1927
  };
@@ -1679,6 +1934,8 @@ export interface paths {
1679
1934
  "application/json": {
1680
1935
  error: string;
1681
1936
  details?: unknown;
1937
+ /** @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. */
1938
+ code?: string;
1682
1939
  };
1683
1940
  };
1684
1941
  };
@@ -1854,6 +2111,8 @@ export interface paths {
1854
2111
  "application/json": {
1855
2112
  error: string;
1856
2113
  details?: unknown;
2114
+ /** @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. */
2115
+ code?: string;
1857
2116
  };
1858
2117
  };
1859
2118
  };
@@ -1866,6 +2125,8 @@ export interface paths {
1866
2125
  "application/json": {
1867
2126
  error: string;
1868
2127
  details?: unknown;
2128
+ /** @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. */
2129
+ code?: string;
1869
2130
  };
1870
2131
  };
1871
2132
  };
@@ -1878,6 +2139,8 @@ export interface paths {
1878
2139
  "application/json": {
1879
2140
  error: string;
1880
2141
  details?: unknown;
2142
+ /** @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. */
2143
+ code?: string;
1881
2144
  };
1882
2145
  };
1883
2146
  };
@@ -2059,6 +2322,8 @@ export interface paths {
2059
2322
  "application/json": {
2060
2323
  error: string;
2061
2324
  details?: unknown;
2325
+ /** @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. */
2326
+ code?: string;
2062
2327
  };
2063
2328
  };
2064
2329
  };
@@ -2071,6 +2336,8 @@ export interface paths {
2071
2336
  "application/json": {
2072
2337
  error: string;
2073
2338
  details?: unknown;
2339
+ /** @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. */
2340
+ code?: string;
2074
2341
  };
2075
2342
  };
2076
2343
  };
@@ -2150,6 +2417,8 @@ export interface paths {
2150
2417
  "application/json": {
2151
2418
  error: string;
2152
2419
  details?: unknown;
2420
+ /** @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. */
2421
+ code?: string;
2153
2422
  };
2154
2423
  };
2155
2424
  };
@@ -2162,6 +2431,8 @@ export interface paths {
2162
2431
  "application/json": {
2163
2432
  error: string;
2164
2433
  details?: unknown;
2434
+ /** @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. */
2435
+ code?: string;
2165
2436
  };
2166
2437
  };
2167
2438
  };
@@ -2174,6 +2445,8 @@ export interface paths {
2174
2445
  "application/json": {
2175
2446
  error: string;
2176
2447
  details?: unknown;
2448
+ /** @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. */
2449
+ code?: string;
2177
2450
  };
2178
2451
  };
2179
2452
  };
@@ -2304,6 +2577,8 @@ export interface paths {
2304
2577
  "application/json": {
2305
2578
  error: string;
2306
2579
  details?: unknown;
2580
+ /** @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. */
2581
+ code?: string;
2307
2582
  };
2308
2583
  };
2309
2584
  };
@@ -2316,6 +2591,8 @@ export interface paths {
2316
2591
  "application/json": {
2317
2592
  error: string;
2318
2593
  details?: unknown;
2594
+ /** @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. */
2595
+ code?: string;
2319
2596
  };
2320
2597
  };
2321
2598
  };
@@ -2336,7 +2613,7 @@ export interface paths {
2336
2613
  path?: never;
2337
2614
  cookie?: never;
2338
2615
  };
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. 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. */
2616
+ /** @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. */
2340
2617
  get: {
2341
2618
  parameters: {
2342
2619
  query: {
@@ -2350,6 +2627,8 @@ export interface paths {
2350
2627
  useCase?: "churn-intervention" | "post-action-reward";
2351
2628
  /** @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. */
2352
2629
  demoVariant?: string;
2630
+ /** @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. */
2631
+ placementId?: string;
2353
2632
  };
2354
2633
  header?: never;
2355
2634
  path?: never;
@@ -2419,6 +2698,16 @@ export interface paths {
2419
2698
  rewardHeadline?: string | null;
2420
2699
  /** @description Subheadline for the reward template. NON-NULL whenever ui.useCase is 'post-action-reward', for the same reason as rewardHeadline — the template references ${rewardSubheadline} unconditionally. Resolution: app_use_cases.subheadline, else the shipped default. */
2421
2700
  rewardSubheadline?: string | null;
2701
+ /** @description Primary button label for the reward template. Resolution: the variant's own defaultCopy.cta. Null when the variant declares none, in which case its template carries a literal instead. An SDK that predates this field receives the wording inlined in the template, not a token. */
2702
+ rewardCta?: string | null;
2703
+ /** @description Decline button label for the reward template. Same resolution and same null meaning as rewardCta. */
2704
+ rewardDecline?: string | null;
2705
+ /** @description Badge on the highlighted offer card, e.g. 'Most claimed'. Same resolution and same null meaning as rewardCta. */
2706
+ rewardBadge?: string | null;
2707
+ /** @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. */
2708
+ rewardMoreGifts?: string | null;
2709
+ /** @description Header above the rest of the offer list, e.g. 'Other gifts'. Same resolution and same null meaning as rewardCta. */
2710
+ rewardOtherGifts?: string | null;
2422
2711
  };
2423
2712
  /** @description Appearance values */
2424
2713
  appearance: {
@@ -2437,6 +2726,21 @@ export interface paths {
2437
2726
  /** @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. */
2438
2727
  appstoreIcon: string | null;
2439
2728
  };
2729
+ /** @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`. */
2730
+ strings?: {
2731
+ [key: string]: string;
2732
+ };
2733
+ /** @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`. */
2734
+ plurals?: {
2735
+ [key: string]: {
2736
+ zero?: string;
2737
+ one?: string;
2738
+ two?: string;
2739
+ few?: string;
2740
+ many?: string;
2741
+ other: string;
2742
+ };
2743
+ };
2440
2744
  };
2441
2745
  };
2442
2746
  /** @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. */
@@ -2487,6 +2791,16 @@ export interface paths {
2487
2791
  rewardHeadline?: string | null;
2488
2792
  /** @description Subheadline for the reward template. NON-NULL whenever ui.useCase is 'post-action-reward', for the same reason as rewardHeadline — the template references ${rewardSubheadline} unconditionally. Resolution: app_use_cases.subheadline, else the shipped default. */
2489
2793
  rewardSubheadline?: string | null;
2794
+ /** @description Primary button label for the reward template. Resolution: the variant's own defaultCopy.cta. Null when the variant declares none, in which case its template carries a literal instead. An SDK that predates this field receives the wording inlined in the template, not a token. */
2795
+ rewardCta?: string | null;
2796
+ /** @description Decline button label for the reward template. Same resolution and same null meaning as rewardCta. */
2797
+ rewardDecline?: string | null;
2798
+ /** @description Badge on the highlighted offer card, e.g. 'Most claimed'. Same resolution and same null meaning as rewardCta. */
2799
+ rewardBadge?: string | null;
2800
+ /** @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. */
2801
+ rewardMoreGifts?: string | null;
2802
+ /** @description Header above the rest of the offer list, e.g. 'Other gifts'. Same resolution and same null meaning as rewardCta. */
2803
+ rewardOtherGifts?: string | null;
2490
2804
  };
2491
2805
  /** @description Appearance values */
2492
2806
  appearance: {
@@ -2505,6 +2819,21 @@ export interface paths {
2505
2819
  /** @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. */
2506
2820
  appstoreIcon: string | null;
2507
2821
  };
2822
+ /** @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`. */
2823
+ strings?: {
2824
+ [key: string]: string;
2825
+ };
2826
+ /** @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`. */
2827
+ plurals?: {
2828
+ [key: string]: {
2829
+ zero?: string;
2830
+ one?: string;
2831
+ two?: string;
2832
+ few?: string;
2833
+ many?: string;
2834
+ other: string;
2835
+ };
2836
+ };
2508
2837
  };
2509
2838
  };
2510
2839
  "post-action-reward"?: {
@@ -2553,6 +2882,16 @@ export interface paths {
2553
2882
  rewardHeadline?: string | null;
2554
2883
  /** @description Subheadline for the reward template. NON-NULL whenever ui.useCase is 'post-action-reward', for the same reason as rewardHeadline — the template references ${rewardSubheadline} unconditionally. Resolution: app_use_cases.subheadline, else the shipped default. */
2555
2884
  rewardSubheadline?: string | null;
2885
+ /** @description Primary button label for the reward template. Resolution: the variant's own defaultCopy.cta. Null when the variant declares none, in which case its template carries a literal instead. An SDK that predates this field receives the wording inlined in the template, not a token. */
2886
+ rewardCta?: string | null;
2887
+ /** @description Decline button label for the reward template. Same resolution and same null meaning as rewardCta. */
2888
+ rewardDecline?: string | null;
2889
+ /** @description Badge on the highlighted offer card, e.g. 'Most claimed'. Same resolution and same null meaning as rewardCta. */
2890
+ rewardBadge?: string | null;
2891
+ /** @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. */
2892
+ rewardMoreGifts?: string | null;
2893
+ /** @description Header above the rest of the offer list, e.g. 'Other gifts'. Same resolution and same null meaning as rewardCta. */
2894
+ rewardOtherGifts?: string | null;
2556
2895
  };
2557
2896
  /** @description Appearance values */
2558
2897
  appearance: {
@@ -2571,6 +2910,21 @@ export interface paths {
2571
2910
  /** @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. */
2572
2911
  appstoreIcon: string | null;
2573
2912
  };
2913
+ /** @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`. */
2914
+ strings?: {
2915
+ [key: string]: string;
2916
+ };
2917
+ /** @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`. */
2918
+ plurals?: {
2919
+ [key: string]: {
2920
+ zero?: string;
2921
+ one?: string;
2922
+ two?: string;
2923
+ few?: string;
2924
+ many?: string;
2925
+ other: string;
2926
+ };
2927
+ };
2574
2928
  };
2575
2929
  };
2576
2930
  };
@@ -2613,6 +2967,8 @@ export interface paths {
2613
2967
  };
2614
2968
  /** @description Resolved locale served in this response (language-only, e.g. 'es'). Absent on pre-localization responses. */
2615
2969
  locale?: string;
2970
+ /** @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. */
2971
+ ruledPlacements?: string[];
2616
2972
  };
2617
2973
  };
2618
2974
  };
@@ -2625,6 +2981,8 @@ export interface paths {
2625
2981
  "application/json": {
2626
2982
  error: string;
2627
2983
  details?: unknown;
2984
+ /** @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. */
2985
+ code?: string;
2628
2986
  };
2629
2987
  };
2630
2988
  };
@@ -2637,6 +2995,8 @@ export interface paths {
2637
2995
  "application/json": {
2638
2996
  error: string;
2639
2997
  details?: unknown;
2998
+ /** @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. */
2999
+ code?: string;
2640
3000
  };
2641
3001
  };
2642
3002
  };
@@ -2709,6 +3069,8 @@ export interface paths {
2709
3069
  "application/json": {
2710
3070
  error: string;
2711
3071
  details?: unknown;
3072
+ /** @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. */
3073
+ code?: string;
2712
3074
  };
2713
3075
  };
2714
3076
  };
@@ -2721,6 +3083,8 @@ export interface paths {
2721
3083
  "application/json": {
2722
3084
  error: string;
2723
3085
  details?: unknown;
3086
+ /** @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. */
3087
+ code?: string;
2724
3088
  };
2725
3089
  };
2726
3090
  };
@@ -2745,7 +3109,7 @@ export interface paths {
2745
3109
  delete?: never;
2746
3110
  options?: never;
2747
3111
  head?: never;
2748
- /** @description Update user identity (anonymous→identified). Updates the user's app_user_id. Called when developer calls SDK.identify() after login. */
3112
+ /** @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. */
2749
3113
  patch: {
2750
3114
  parameters: {
2751
3115
  query?: never;
@@ -2795,6 +3159,8 @@ export interface paths {
2795
3159
  "application/json": {
2796
3160
  error: string;
2797
3161
  details?: unknown;
3162
+ /** @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. */
3163
+ code?: string;
2798
3164
  };
2799
3165
  };
2800
3166
  };
@@ -2807,6 +3173,8 @@ export interface paths {
2807
3173
  "application/json": {
2808
3174
  error: string;
2809
3175
  details?: unknown;
3176
+ /** @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. */
3177
+ code?: string;
2810
3178
  };
2811
3179
  };
2812
3180
  };
@@ -2828,7 +3196,9 @@ export interface paths {
2828
3196
  *
2829
3197
  * 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.
2830
3198
  *
2831
- * 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.
3199
+ * LANGUAGE is accepted and ignored: it is never stored. The hosted page and the SDKs send it on each request, else Accept-Language decides.
3200
+ *
3201
+ * 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.
2832
3202
  *
2833
3203
  * 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_*).
2834
3204
  */
@@ -2848,6 +3218,7 @@ export interface paths {
2848
3218
  attributes: {
2849
3219
  /** @description ISO 3166-1 alpha-2 country code (e.g., "US", "GB", "CA"). */
2850
3220
  countryCode?: string;
3221
+ /** @description Accepted for compatibility and ignored: the language is never stored. Send it on each request (attributes.language, or Accept-Language) instead. */
2851
3222
  language?: string;
2852
3223
  city?: string;
2853
3224
  state?: string;
@@ -2895,7 +3266,7 @@ export interface paths {
2895
3266
  userId: string;
2896
3267
  /** @description ISO 8601 instant the set was recorded; what a stored age is aged forward from */
2897
3268
  storedAt: string;
2898
- /** @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. */
3269
+ /** @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. */
2899
3270
  minor: boolean;
2900
3271
  };
2901
3272
  };
@@ -2909,6 +3280,8 @@ export interface paths {
2909
3280
  "application/json": {
2910
3281
  error: string;
2911
3282
  details?: unknown;
3283
+ /** @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. */
3284
+ code?: string;
2912
3285
  };
2913
3286
  };
2914
3287
  };
@@ -2921,6 +3294,8 @@ export interface paths {
2921
3294
  "application/json": {
2922
3295
  error: string;
2923
3296
  details?: unknown;
3297
+ /** @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. */
3298
+ code?: string;
2924
3299
  };
2925
3300
  };
2926
3301
  };
@@ -2933,6 +3308,8 @@ export interface paths {
2933
3308
  "application/json": {
2934
3309
  error: string;
2935
3310
  details?: unknown;
3311
+ /** @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. */
3312
+ code?: string;
2936
3313
  };
2937
3314
  };
2938
3315
  };
@@ -2999,6 +3376,8 @@ export interface paths {
2999
3376
  "application/json": {
3000
3377
  error: string;
3001
3378
  details?: unknown;
3379
+ /** @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. */
3380
+ code?: string;
3002
3381
  };
3003
3382
  };
3004
3383
  };
@@ -3011,6 +3390,8 @@ export interface paths {
3011
3390
  "application/json": {
3012
3391
  error: string;
3013
3392
  details?: unknown;
3393
+ /** @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. */
3394
+ code?: string;
3014
3395
  };
3015
3396
  };
3016
3397
  };
@@ -3067,6 +3448,8 @@ export interface paths {
3067
3448
  "application/json": {
3068
3449
  error: string;
3069
3450
  details?: unknown;
3451
+ /** @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. */
3452
+ code?: string;
3070
3453
  };
3071
3454
  };
3072
3455
  };
@@ -3079,6 +3462,8 @@ export interface paths {
3079
3462
  "application/json": {
3080
3463
  error: string;
3081
3464
  details?: unknown;
3465
+ /** @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. */
3466
+ code?: string;
3082
3467
  };
3083
3468
  };
3084
3469
  };
@@ -3091,6 +3476,8 @@ export interface paths {
3091
3476
  "application/json": {
3092
3477
  error: string;
3093
3478
  details?: unknown;
3479
+ /** @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. */
3480
+ code?: string;
3094
3481
  };
3095
3482
  };
3096
3483
  };
@@ -3103,6 +3490,8 @@ export interface paths {
3103
3490
  "application/json": {
3104
3491
  error: string;
3105
3492
  details?: unknown;
3493
+ /** @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. */
3494
+ code?: string;
3106
3495
  };
3107
3496
  };
3108
3497
  };
@@ -3169,6 +3558,8 @@ export interface paths {
3169
3558
  "application/json": {
3170
3559
  error: string;
3171
3560
  details?: unknown;
3561
+ /** @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. */
3562
+ code?: string;
3172
3563
  };
3173
3564
  };
3174
3565
  };
@@ -3181,6 +3572,8 @@ export interface paths {
3181
3572
  "application/json": {
3182
3573
  error: string;
3183
3574
  details?: unknown;
3575
+ /** @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. */
3576
+ code?: string;
3184
3577
  };
3185
3578
  };
3186
3579
  };
@@ -3193,6 +3586,8 @@ export interface paths {
3193
3586
  "application/json": {
3194
3587
  error: string;
3195
3588
  details?: unknown;
3589
+ /** @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. */
3590
+ code?: string;
3196
3591
  };
3197
3592
  };
3198
3593
  };
@@ -3229,6 +3624,8 @@ export interface paths {
3229
3624
  campaignId: string;
3230
3625
  /** Format: email */
3231
3626
  email: string;
3627
+ /** @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. */
3628
+ language?: string;
3232
3629
  /** @description Trial length in days as reported by StoreKit; drives reminder scheduling. */
3233
3630
  trialDurationDays?: number | null;
3234
3631
  /**
@@ -3270,6 +3667,8 @@ export interface paths {
3270
3667
  "application/json": {
3271
3668
  error: string;
3272
3669
  details?: unknown;
3670
+ /** @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. */
3671
+ code?: string;
3273
3672
  };
3274
3673
  };
3275
3674
  };
@@ -3282,6 +3681,8 @@ export interface paths {
3282
3681
  "application/json": {
3283
3682
  error: string;
3284
3683
  details?: unknown;
3684
+ /** @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. */
3685
+ code?: string;
3285
3686
  };
3286
3687
  };
3287
3688
  };
@@ -3294,6 +3695,8 @@ export interface paths {
3294
3695
  "application/json": {
3295
3696
  error: string;
3296
3697
  details?: unknown;
3698
+ /** @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. */
3699
+ code?: string;
3297
3700
  };
3298
3701
  };
3299
3702
  };
@@ -3357,6 +3760,8 @@ export interface paths {
3357
3760
  "application/json": {
3358
3761
  error: string;
3359
3762
  details?: unknown;
3763
+ /** @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. */
3764
+ code?: string;
3360
3765
  };
3361
3766
  };
3362
3767
  };
@@ -3369,6 +3774,8 @@ export interface paths {
3369
3774
  "application/json": {
3370
3775
  error: string;
3371
3776
  details?: unknown;
3777
+ /** @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. */
3778
+ code?: string;
3372
3779
  };
3373
3780
  };
3374
3781
  };
@@ -3381,6 +3788,8 @@ export interface paths {
3381
3788
  "application/json": {
3382
3789
  error: string;
3383
3790
  details?: unknown;
3791
+ /** @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. */
3792
+ code?: string;
3384
3793
  };
3385
3794
  };
3386
3795
  };
@@ -3445,6 +3854,8 @@ export interface paths {
3445
3854
  "application/json": {
3446
3855
  error: string;
3447
3856
  details?: unknown;
3857
+ /** @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. */
3858
+ code?: string;
3448
3859
  };
3449
3860
  };
3450
3861
  };
@@ -3457,6 +3868,8 @@ export interface paths {
3457
3868
  "application/json": {
3458
3869
  error: string;
3459
3870
  details?: unknown;
3871
+ /** @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. */
3872
+ code?: string;
3460
3873
  };
3461
3874
  };
3462
3875
  };
@@ -3469,6 +3882,8 @@ export interface paths {
3469
3882
  "application/json": {
3470
3883
  error: string;
3471
3884
  details?: unknown;
3885
+ /** @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. */
3886
+ code?: string;
3472
3887
  };
3473
3888
  };
3474
3889
  };
@@ -3481,6 +3896,8 @@ export interface paths {
3481
3896
  "application/json": {
3482
3897
  error: string;
3483
3898
  details?: unknown;
3899
+ /** @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. */
3900
+ code?: string;
3484
3901
  };
3485
3902
  };
3486
3903
  };
@@ -3493,6 +3910,8 @@ export interface paths {
3493
3910
  "application/json": {
3494
3911
  error: string;
3495
3912
  details?: unknown;
3913
+ /** @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. */
3914
+ code?: string;
3496
3915
  };
3497
3916
  };
3498
3917
  };
@@ -3556,6 +3975,8 @@ export interface paths {
3556
3975
  "application/json": {
3557
3976
  error: string;
3558
3977
  details?: unknown;
3978
+ /** @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. */
3979
+ code?: string;
3559
3980
  };
3560
3981
  };
3561
3982
  };
@@ -3568,6 +3989,8 @@ export interface paths {
3568
3989
  "application/json": {
3569
3990
  error: string;
3570
3991
  details?: unknown;
3992
+ /** @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. */
3993
+ code?: string;
3571
3994
  };
3572
3995
  };
3573
3996
  };
@@ -3580,6 +4003,8 @@ export interface paths {
3580
4003
  "application/json": {
3581
4004
  error: string;
3582
4005
  details?: unknown;
4006
+ /** @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. */
4007
+ code?: string;
3583
4008
  };
3584
4009
  };
3585
4010
  };
@@ -3592,6 +4017,8 @@ export interface paths {
3592
4017
  "application/json": {
3593
4018
  error: string;
3594
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;
3595
4022
  };
3596
4023
  };
3597
4024
  };
@@ -3604,6 +4031,8 @@ export interface paths {
3604
4031
  "application/json": {
3605
4032
  error: string;
3606
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;
3607
4036
  };
3608
4037
  };
3609
4038
  };
@@ -3616,6 +4045,8 @@ export interface paths {
3616
4045
  "application/json": {
3617
4046
  error: string;
3618
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;
3619
4050
  };
3620
4051
  };
3621
4052
  };
@@ -3695,6 +4126,8 @@ export interface paths {
3695
4126
  "application/json": {
3696
4127
  error: string;
3697
4128
  details?: unknown;
4129
+ /** @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. */
4130
+ code?: string;
3698
4131
  };
3699
4132
  };
3700
4133
  };
@@ -3707,6 +4140,8 @@ export interface paths {
3707
4140
  "application/json": {
3708
4141
  error: string;
3709
4142
  details?: unknown;
4143
+ /** @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. */
4144
+ code?: string;
3710
4145
  };
3711
4146
  };
3712
4147
  };
@@ -3719,6 +4154,8 @@ export interface paths {
3719
4154
  "application/json": {
3720
4155
  error: string;
3721
4156
  details?: unknown;
4157
+ /** @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. */
4158
+ code?: string;
3722
4159
  };
3723
4160
  };
3724
4161
  };
@@ -3799,6 +4236,8 @@ export interface paths {
3799
4236
  "application/json": {
3800
4237
  error: string;
3801
4238
  details?: unknown;
4239
+ /** @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. */
4240
+ code?: string;
3802
4241
  };
3803
4242
  };
3804
4243
  };
@@ -3811,6 +4250,8 @@ export interface paths {
3811
4250
  "application/json": {
3812
4251
  error: string;
3813
4252
  details?: unknown;
4253
+ /** @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. */
4254
+ code?: string;
3814
4255
  };
3815
4256
  };
3816
4257
  };
@@ -3823,6 +4264,8 @@ export interface paths {
3823
4264
  "application/json": {
3824
4265
  error: string;
3825
4266
  details?: unknown;
4267
+ /** @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. */
4268
+ code?: string;
3826
4269
  };
3827
4270
  };
3828
4271
  };
@@ -3835,6 +4278,8 @@ export interface paths {
3835
4278
  "application/json": {
3836
4279
  error: string;
3837
4280
  details?: unknown;
4281
+ /** @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. */
4282
+ code?: string;
3838
4283
  };
3839
4284
  };
3840
4285
  };
@@ -3894,6 +4339,8 @@ export interface paths {
3894
4339
  "application/json": {
3895
4340
  error: string;
3896
4341
  details?: unknown;
4342
+ /** @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. */
4343
+ code?: string;
3897
4344
  };
3898
4345
  };
3899
4346
  };
@@ -3906,6 +4353,8 @@ export interface paths {
3906
4353
  "application/json": {
3907
4354
  error: string;
3908
4355
  details?: unknown;
4356
+ /** @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. */
4357
+ code?: string;
3909
4358
  };
3910
4359
  };
3911
4360
  };
@@ -3918,6 +4367,8 @@ export interface paths {
3918
4367
  "application/json": {
3919
4368
  error: string;
3920
4369
  details?: unknown;
4370
+ /** @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. */
4371
+ code?: string;
3921
4372
  };
3922
4373
  };
3923
4374
  };
@@ -3930,6 +4381,8 @@ export interface paths {
3930
4381
  "application/json": {
3931
4382
  error: string;
3932
4383
  details?: unknown;
4384
+ /** @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. */
4385
+ code?: string;
3933
4386
  };
3934
4387
  };
3935
4388
  };
@@ -3994,6 +4447,8 @@ export interface paths {
3994
4447
  "application/json": {
3995
4448
  error: string;
3996
4449
  details?: unknown;
4450
+ /** @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. */
4451
+ code?: string;
3997
4452
  };
3998
4453
  };
3999
4454
  };
@@ -4006,6 +4461,8 @@ export interface paths {
4006
4461
  "application/json": {
4007
4462
  error: string;
4008
4463
  details?: unknown;
4464
+ /** @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. */
4465
+ code?: string;
4009
4466
  };
4010
4467
  };
4011
4468
  };
@@ -4018,6 +4475,8 @@ export interface paths {
4018
4475
  "application/json": {
4019
4476
  error: string;
4020
4477
  details?: unknown;
4478
+ /** @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. */
4479
+ code?: string;
4021
4480
  };
4022
4481
  };
4023
4482
  };
@@ -4030,6 +4489,8 @@ export interface paths {
4030
4489
  "application/json": {
4031
4490
  error: string;
4032
4491
  details?: unknown;
4492
+ /** @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. */
4493
+ code?: string;
4033
4494
  };
4034
4495
  };
4035
4496
  };
@@ -4042,6 +4503,8 @@ export interface paths {
4042
4503
  "application/json": {
4043
4504
  error: string;
4044
4505
  details?: unknown;
4506
+ /** @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. */
4507
+ code?: string;
4045
4508
  };
4046
4509
  };
4047
4510
  };
@@ -4160,6 +4623,8 @@ export interface paths {
4160
4623
  "application/json": {
4161
4624
  error: string;
4162
4625
  details?: unknown;
4626
+ /** @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. */
4627
+ code?: string;
4163
4628
  };
4164
4629
  };
4165
4630
  };
@@ -4172,6 +4637,8 @@ export interface paths {
4172
4637
  "application/json": {
4173
4638
  error: string;
4174
4639
  details?: unknown;
4640
+ /** @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. */
4641
+ code?: string;
4175
4642
  };
4176
4643
  };
4177
4644
  };
@@ -4184,6 +4651,8 @@ export interface paths {
4184
4651
  "application/json": {
4185
4652
  error: string;
4186
4653
  details?: unknown;
4654
+ /** @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. */
4655
+ code?: string;
4187
4656
  };
4188
4657
  };
4189
4658
  };
@@ -4266,6 +4735,8 @@ export interface paths {
4266
4735
  "application/json": {
4267
4736
  error: string;
4268
4737
  details?: unknown;
4738
+ /** @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. */
4739
+ code?: string;
4269
4740
  };
4270
4741
  };
4271
4742
  };
@@ -4278,6 +4749,8 @@ export interface paths {
4278
4749
  "application/json": {
4279
4750
  error: string;
4280
4751
  details?: unknown;
4752
+ /** @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. */
4753
+ code?: string;
4281
4754
  };
4282
4755
  };
4283
4756
  };
@@ -4290,6 +4763,8 @@ export interface paths {
4290
4763
  "application/json": {
4291
4764
  error: string;
4292
4765
  details?: unknown;
4766
+ /** @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. */
4767
+ code?: string;
4293
4768
  };
4294
4769
  };
4295
4770
  };
@@ -4367,6 +4842,8 @@ export interface paths {
4367
4842
  "application/json": {
4368
4843
  error: string;
4369
4844
  details?: unknown;
4845
+ /** @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. */
4846
+ code?: string;
4370
4847
  };
4371
4848
  };
4372
4849
  };
@@ -4379,6 +4856,8 @@ export interface paths {
4379
4856
  "application/json": {
4380
4857
  error: string;
4381
4858
  details?: unknown;
4859
+ /** @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. */
4860
+ code?: string;
4382
4861
  };
4383
4862
  };
4384
4863
  };
@@ -4391,6 +4870,8 @@ export interface paths {
4391
4870
  "application/json": {
4392
4871
  error: string;
4393
4872
  details?: unknown;
4873
+ /** @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. */
4874
+ code?: string;
4394
4875
  };
4395
4876
  };
4396
4877
  };
@@ -4473,6 +4954,16 @@ export interface components {
4473
4954
  rewardHeadline?: string | null;
4474
4955
  /** @description Subheadline for the reward template. NON-NULL whenever ui.useCase is 'post-action-reward', for the same reason as rewardHeadline — the template references ${rewardSubheadline} unconditionally. Resolution: app_use_cases.subheadline, else the shipped default. */
4475
4956
  rewardSubheadline?: string | null;
4957
+ /** @description Primary button label for the reward template. Resolution: the variant's own defaultCopy.cta. Null when the variant declares none, in which case its template carries a literal instead. An SDK that predates this field receives the wording inlined in the template, not a token. */
4958
+ rewardCta?: string | null;
4959
+ /** @description Decline button label for the reward template. Same resolution and same null meaning as rewardCta. */
4960
+ rewardDecline?: string | null;
4961
+ /** @description Badge on the highlighted offer card, e.g. 'Most claimed'. Same resolution and same null meaning as rewardCta. */
4962
+ rewardBadge?: string | null;
4963
+ /** @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. */
4964
+ rewardMoreGifts?: string | null;
4965
+ /** @description Header above the rest of the offer list, e.g. 'Other gifts'. Same resolution and same null meaning as rewardCta. */
4966
+ rewardOtherGifts?: string | null;
4476
4967
  };
4477
4968
  /** @description Appearance values */
4478
4969
  appearance: {
@@ -4491,6 +4982,21 @@ export interface components {
4491
4982
  /** @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. */
4492
4983
  appstoreIcon: string | null;
4493
4984
  };
4985
+ /** @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`. */
4986
+ strings?: {
4987
+ [key: string]: string;
4988
+ };
4989
+ /** @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`. */
4990
+ plurals?: {
4991
+ [key: string]: {
4992
+ zero?: string;
4993
+ one?: string;
4994
+ two?: string;
4995
+ few?: string;
4996
+ many?: string;
4997
+ other: string;
4998
+ };
4999
+ };
4494
5000
  };
4495
5001
  };
4496
5002
  /** @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. */
@@ -4541,6 +5047,16 @@ export interface components {
4541
5047
  rewardHeadline?: string | null;
4542
5048
  /** @description Subheadline for the reward template. NON-NULL whenever ui.useCase is 'post-action-reward', for the same reason as rewardHeadline — the template references ${rewardSubheadline} unconditionally. Resolution: app_use_cases.subheadline, else the shipped default. */
4543
5049
  rewardSubheadline?: string | null;
5050
+ /** @description Primary button label for the reward template. Resolution: the variant's own defaultCopy.cta. Null when the variant declares none, in which case its template carries a literal instead. An SDK that predates this field receives the wording inlined in the template, not a token. */
5051
+ rewardCta?: string | null;
5052
+ /** @description Decline button label for the reward template. Same resolution and same null meaning as rewardCta. */
5053
+ rewardDecline?: string | null;
5054
+ /** @description Badge on the highlighted offer card, e.g. 'Most claimed'. Same resolution and same null meaning as rewardCta. */
5055
+ rewardBadge?: string | null;
5056
+ /** @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. */
5057
+ rewardMoreGifts?: string | null;
5058
+ /** @description Header above the rest of the offer list, e.g. 'Other gifts'. Same resolution and same null meaning as rewardCta. */
5059
+ rewardOtherGifts?: string | null;
4544
5060
  };
4545
5061
  /** @description Appearance values */
4546
5062
  appearance: {
@@ -4559,6 +5075,21 @@ export interface components {
4559
5075
  /** @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. */
4560
5076
  appstoreIcon: string | null;
4561
5077
  };
5078
+ /** @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`. */
5079
+ strings?: {
5080
+ [key: string]: string;
5081
+ };
5082
+ /** @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`. */
5083
+ plurals?: {
5084
+ [key: string]: {
5085
+ zero?: string;
5086
+ one?: string;
5087
+ two?: string;
5088
+ few?: string;
5089
+ many?: string;
5090
+ other: string;
5091
+ };
5092
+ };
4562
5093
  };
4563
5094
  };
4564
5095
  "post-action-reward"?: {
@@ -4607,6 +5138,16 @@ export interface components {
4607
5138
  rewardHeadline?: string | null;
4608
5139
  /** @description Subheadline for the reward template. NON-NULL whenever ui.useCase is 'post-action-reward', for the same reason as rewardHeadline — the template references ${rewardSubheadline} unconditionally. Resolution: app_use_cases.subheadline, else the shipped default. */
4609
5140
  rewardSubheadline?: string | null;
5141
+ /** @description Primary button label for the reward template. Resolution: the variant's own defaultCopy.cta. Null when the variant declares none, in which case its template carries a literal instead. An SDK that predates this field receives the wording inlined in the template, not a token. */
5142
+ rewardCta?: string | null;
5143
+ /** @description Decline button label for the reward template. Same resolution and same null meaning as rewardCta. */
5144
+ rewardDecline?: string | null;
5145
+ /** @description Badge on the highlighted offer card, e.g. 'Most claimed'. Same resolution and same null meaning as rewardCta. */
5146
+ rewardBadge?: string | null;
5147
+ /** @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. */
5148
+ rewardMoreGifts?: string | null;
5149
+ /** @description Header above the rest of the offer list, e.g. 'Other gifts'. Same resolution and same null meaning as rewardCta. */
5150
+ rewardOtherGifts?: string | null;
4610
5151
  };
4611
5152
  /** @description Appearance values */
4612
5153
  appearance: {
@@ -4625,6 +5166,21 @@ export interface components {
4625
5166
  /** @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. */
4626
5167
  appstoreIcon: string | null;
4627
5168
  };
5169
+ /** @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`. */
5170
+ strings?: {
5171
+ [key: string]: string;
5172
+ };
5173
+ /** @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`. */
5174
+ plurals?: {
5175
+ [key: string]: {
5176
+ zero?: string;
5177
+ one?: string;
5178
+ two?: string;
5179
+ few?: string;
5180
+ many?: string;
5181
+ other: string;
5182
+ };
5183
+ };
4628
5184
  };
4629
5185
  };
4630
5186
  };
@@ -4667,6 +5223,8 @@ export interface components {
4667
5223
  };
4668
5224
  /** @description Resolved locale served in this response (language-only, e.g. 'es'). Absent on pre-localization responses. */
4669
5225
  locale?: string;
5226
+ /** @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. */
5227
+ ruledPlacements?: string[];
4670
5228
  };
4671
5229
  OffersSearchResponse: {
4672
5230
  success: boolean;
@@ -4735,6 +5293,10 @@ export interface components {
4735
5293
  heroImageUrl?: string | null;
4736
5294
  /** @description https link to the advertiser offer terms. Null or absent: render terms copy as plain text. */
4737
5295
  termsUrl?: string | null;
5296
+ /** @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. */
5297
+ displayProperties?: {
5298
+ [key: string]: unknown;
5299
+ };
4738
5300
  /** Format: date-time */
4739
5301
  createdAt: string;
4740
5302
  /** Format: date-time */
@@ -4783,6 +5345,8 @@ export interface components {
4783
5345
  title: string;
4784
5346
  subtitle: string;
4785
5347
  ctaButtonText?: string;
5348
+ /** @description Optional https image for this step. Absent: the step has none. */
5349
+ imageUrl?: string;
4786
5350
  }[] | null;
4787
5351
  /** @description Short, actionable phrases (max 1-3) that guide users. Examples: "sign up, create registry", "add to cart" */
4788
5352
  quickInstructions: string | null;
@@ -4849,11 +5413,41 @@ export interface components {
4849
5413
  category?: string | null;
4850
5414
  /** @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. */
4851
5415
  categoryGroup?: string | null;
5416
+ /** @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. */
5417
+ categoryDisplayName?: string | null;
5418
+ /** @description `categoryGroup` in the response locale, for display only. Group on `categoryGroup`, which stays English. /offers/search only. */
5419
+ categoryGroupDisplayName?: string | null;
4852
5420
  /** @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. */
4853
5421
  rewardConfirmationTime?: {
4854
5422
  medianSeconds: number;
4855
5423
  p90Seconds: number;
4856
5424
  } | null;
5425
+ /** @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 unless the campaign offer fields flag is on; null means the campaign has none. */
5426
+ trackingParameters?: {
5427
+ [key: string]: unknown;
5428
+ } | null;
5429
+ /** @description Campaign call-to-action text. Absent unless the campaign offer fields flag is on; null means the campaign has none. */
5430
+ ctaText?: string | null;
5431
+ /** @description Campaign description, localized like creatives. Absent unless the campaign offer fields flag is on; null means the campaign has none. */
5432
+ description?: string | null;
5433
+ /** @description Campaign step-by-step instructions, same shape as a creative's. Absent unless the campaign offer fields flag is on; null means the campaign has none. */
5434
+ instructions?: {
5435
+ title: string;
5436
+ subtitle: string;
5437
+ ctaButtonText?: string;
5438
+ /** @description Optional https image for this step. Absent: the step has none. */
5439
+ imageUrl?: string;
5440
+ }[] | null;
5441
+ /** @description Campaign one-line instructions. Absent unless the campaign offer fields flag is on; null means the campaign has none. */
5442
+ quickInstructions?: string | null;
5443
+ /** @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 unless the campaign offer fields flag is on; null means the campaign has none. */
5444
+ logoUrl?: string | null;
5445
+ /** @description Campaign card title. Absent unless the campaign offer fields flag is on; null means the campaign has none. */
5446
+ title?: string | null;
5447
+ /** @description Campaign card subtitle. Absent unless the campaign offer fields flag is on; null means the campaign has none. */
5448
+ subtitle?: string | null;
5449
+ /** @description Campaign tooltip text. Absent unless the campaign offer fields flag is on; null means the campaign has none. */
5450
+ tooltipText?: string | null;
4857
5451
  }[];
4858
5452
  metadata: {
4859
5453
  /** @description Total offers available */
@@ -4871,6 +5465,8 @@ export interface components {
4871
5465
  };
4872
5466
  /** @description Resolved locale served in this response (language-only, e.g. 'es'). Absent on pre-localization responses. */
4873
5467
  locale?: string;
5468
+ /** @description Whether this user may still be granted the app's prize for a reward-for-trying Yes: true while the prizes granted to them in the last 24 hours (rolling) are under publisherRewardDailyLimit. 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: the self-report's granted answer is final. */
5469
+ publisherRewardPromise?: boolean;
4874
5470
  error?: string | null;
4875
5471
  };
4876
5472
  Campaign: {
@@ -4938,6 +5534,10 @@ export interface components {
4938
5534
  heroImageUrl?: string | null;
4939
5535
  /** @description https link to the advertiser offer terms. Null or absent: render terms copy as plain text. */
4940
5536
  termsUrl?: string | null;
5537
+ /** @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. */
5538
+ displayProperties?: {
5539
+ [key: string]: unknown;
5540
+ };
4941
5541
  /** Format: date-time */
4942
5542
  createdAt: string;
4943
5543
  /** Format: date-time */
@@ -4986,6 +5586,8 @@ export interface components {
4986
5586
  title: string;
4987
5587
  subtitle: string;
4988
5588
  ctaButtonText?: string;
5589
+ /** @description Optional https image for this step. Absent: the step has none. */
5590
+ imageUrl?: string;
4989
5591
  }[] | null;
4990
5592
  /** @description Short, actionable phrases (max 1-3) that guide users. Examples: "sign up, create registry", "add to cart" */
4991
5593
  quickInstructions: string | null;
@@ -5052,11 +5654,41 @@ export interface components {
5052
5654
  category?: string | null;
5053
5655
  /** @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. */
5054
5656
  categoryGroup?: string | null;
5657
+ /** @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. */
5658
+ categoryDisplayName?: string | null;
5659
+ /** @description `categoryGroup` in the response locale, for display only. Group on `categoryGroup`, which stays English. /offers/search only. */
5660
+ categoryGroupDisplayName?: string | null;
5055
5661
  /** @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. */
5056
5662
  rewardConfirmationTime?: {
5057
5663
  medianSeconds: number;
5058
5664
  p90Seconds: number;
5059
5665
  } | null;
5666
+ /** @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 unless the campaign offer fields flag is on; null means the campaign has none. */
5667
+ trackingParameters?: {
5668
+ [key: string]: unknown;
5669
+ } | null;
5670
+ /** @description Campaign call-to-action text. Absent unless the campaign offer fields flag is on; null means the campaign has none. */
5671
+ ctaText?: string | null;
5672
+ /** @description Campaign description, localized like creatives. Absent unless the campaign offer fields flag is on; null means the campaign has none. */
5673
+ description?: string | null;
5674
+ /** @description Campaign step-by-step instructions, same shape as a creative's. Absent unless the campaign offer fields flag is on; null means the campaign has none. */
5675
+ instructions?: {
5676
+ title: string;
5677
+ subtitle: string;
5678
+ ctaButtonText?: string;
5679
+ /** @description Optional https image for this step. Absent: the step has none. */
5680
+ imageUrl?: string;
5681
+ }[] | null;
5682
+ /** @description Campaign one-line instructions. Absent unless the campaign offer fields flag is on; null means the campaign has none. */
5683
+ quickInstructions?: string | null;
5684
+ /** @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 unless the campaign offer fields flag is on; null means the campaign has none. */
5685
+ logoUrl?: string | null;
5686
+ /** @description Campaign card title. Absent unless the campaign offer fields flag is on; null means the campaign has none. */
5687
+ title?: string | null;
5688
+ /** @description Campaign card subtitle. Absent unless the campaign offer fields flag is on; null means the campaign has none. */
5689
+ subtitle?: string | null;
5690
+ /** @description Campaign tooltip text. Absent unless the campaign offer fields flag is on; null means the campaign has none. */
5691
+ tooltipText?: string | null;
5060
5692
  };
5061
5693
  Creative: {
5062
5694
  /** Format: uuid */
@@ -5088,6 +5720,8 @@ export interface components {
5088
5720
  title: string;
5089
5721
  subtitle: string;
5090
5722
  ctaButtonText?: string;
5723
+ /** @description Optional https image for this step. Absent: the step has none. */
5724
+ imageUrl?: string;
5091
5725
  }[] | null;
5092
5726
  /** @description Short, actionable phrases (max 1-3) that guide users. Examples: "sign up, create registry", "add to cart" */
5093
5727
  quickInstructions: string | null;