@encorekit/web-sdk 2.2.1 → 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 (39) hide show
  1. package/dist/cjs/index.cjs +1 -1
  2. package/dist/cjs/index.cjs.map +1 -1
  3. package/dist/esm/index.js +1 -1
  4. package/dist/esm/index.js.map +1 -1
  5. package/dist/umd/encore.min.js +1 -1
  6. package/dist/umd/encore.min.js.map +1 -1
  7. package/package.json +1 -1
  8. package/types/analytics/events.d.ts +3 -3
  9. package/types/analytics/events.d.ts.map +1 -1
  10. package/types/api/APIClient.d.ts +12 -30
  11. package/types/api/APIClient.d.ts.map +1 -1
  12. package/types/api/generated/types.d.ts +604 -8
  13. package/types/api/generated/types.d.ts.map +1 -1
  14. package/types/api/models.d.ts +12 -7
  15. package/types/api/models.d.ts.map +1 -1
  16. package/types/api/offerBuilder.d.ts +45 -0
  17. package/types/api/offerBuilder.d.ts.map +1 -0
  18. package/types/core/Configuration.d.ts +9 -0
  19. package/types/core/Configuration.d.ts.map +1 -1
  20. package/types/core/Encore.d.ts.map +1 -1
  21. package/types/core/OfferManager.d.ts +2 -2
  22. package/types/core/OfferManager.d.ts.map +1 -1
  23. package/types/core/claimScreenVariant.d.ts +3 -0
  24. package/types/core/claimScreenVariant.d.ts.map +1 -0
  25. package/types/core/giftVariant.d.ts.map +1 -1
  26. package/types/core/unlockCode.d.ts +4 -1
  27. package/types/core/unlockCode.d.ts.map +1 -1
  28. package/types/core/version.d.ts +1 -1
  29. package/types/types.d.ts +91 -3
  30. package/types/types.d.ts.map +1 -1
  31. package/types/ui/ClaimScreen.d.ts +62 -0
  32. package/types/ui/ClaimScreen.d.ts.map +1 -0
  33. package/types/ui/CodeUnlock.d.ts +14 -0
  34. package/types/ui/CodeUnlock.d.ts.map +1 -1
  35. package/types/ui/GiftSheet.d.ts +1 -1
  36. package/types/ui/OfferCard.d.ts.map +1 -1
  37. package/types/ui/OfferModal.d.ts +0 -6
  38. package/types/ui/OfferModal.d.ts.map +1 -1
  39. 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
  };
@@ -2427,6 +2704,10 @@ export interface paths {
2427
2704
  rewardDecline?: string | null;
2428
2705
  /** @description Badge on the highlighted offer card, e.g. 'Most claimed'. Same resolution and same null meaning as rewardCta. */
2429
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;
2430
2711
  };
2431
2712
  /** @description Appearance values */
2432
2713
  appearance: {
@@ -2445,6 +2726,21 @@ export interface paths {
2445
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. */
2446
2727
  appstoreIcon: string | null;
2447
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
+ };
2448
2744
  };
2449
2745
  };
2450
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. */
@@ -2501,6 +2797,10 @@ export interface paths {
2501
2797
  rewardDecline?: string | null;
2502
2798
  /** @description Badge on the highlighted offer card, e.g. 'Most claimed'. Same resolution and same null meaning as rewardCta. */
2503
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;
2504
2804
  };
2505
2805
  /** @description Appearance values */
2506
2806
  appearance: {
@@ -2519,6 +2819,21 @@ export interface paths {
2519
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. */
2520
2820
  appstoreIcon: string | null;
2521
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
+ };
2522
2837
  };
2523
2838
  };
2524
2839
  "post-action-reward"?: {
@@ -2573,6 +2888,10 @@ export interface paths {
2573
2888
  rewardDecline?: string | null;
2574
2889
  /** @description Badge on the highlighted offer card, e.g. 'Most claimed'. Same resolution and same null meaning as rewardCta. */
2575
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;
2576
2895
  };
2577
2896
  /** @description Appearance values */
2578
2897
  appearance: {
@@ -2591,6 +2910,21 @@ export interface paths {
2591
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. */
2592
2911
  appstoreIcon: string | null;
2593
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
+ };
2594
2928
  };
2595
2929
  };
2596
2930
  };
@@ -2633,6 +2967,8 @@ export interface paths {
2633
2967
  };
2634
2968
  /** @description Resolved locale served in this response (language-only, e.g. 'es'). Absent on pre-localization responses. */
2635
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[];
2636
2972
  };
2637
2973
  };
2638
2974
  };
@@ -2645,6 +2981,8 @@ export interface paths {
2645
2981
  "application/json": {
2646
2982
  error: string;
2647
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;
2648
2986
  };
2649
2987
  };
2650
2988
  };
@@ -2657,6 +2995,8 @@ export interface paths {
2657
2995
  "application/json": {
2658
2996
  error: string;
2659
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;
2660
3000
  };
2661
3001
  };
2662
3002
  };
@@ -2729,6 +3069,8 @@ export interface paths {
2729
3069
  "application/json": {
2730
3070
  error: string;
2731
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;
2732
3074
  };
2733
3075
  };
2734
3076
  };
@@ -2741,6 +3083,8 @@ export interface paths {
2741
3083
  "application/json": {
2742
3084
  error: string;
2743
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;
2744
3088
  };
2745
3089
  };
2746
3090
  };
@@ -2765,7 +3109,7 @@ export interface paths {
2765
3109
  delete?: never;
2766
3110
  options?: never;
2767
3111
  head?: never;
2768
- /** @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. */
2769
3113
  patch: {
2770
3114
  parameters: {
2771
3115
  query?: never;
@@ -2815,6 +3159,8 @@ export interface paths {
2815
3159
  "application/json": {
2816
3160
  error: string;
2817
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;
2818
3164
  };
2819
3165
  };
2820
3166
  };
@@ -2827,6 +3173,8 @@ export interface paths {
2827
3173
  "application/json": {
2828
3174
  error: string;
2829
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;
2830
3178
  };
2831
3179
  };
2832
3180
  };
@@ -2848,7 +3196,9 @@ export interface paths {
2848
3196
  *
2849
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.
2850
3198
  *
2851
- * AGE. Send `age` as a whole-number integer. If you hold only a RANGE, send its LOWEST end — "13-17" is sent as 13, never 15 and never 17. Sending the middle of a range silently defeats the under-age check: flooring can never mask a minor, a midpoint can. An age below 18 restricts that user to age-appropriate inventory ranked by the app-level bandit, with NO per-user personalisation — offers are still served. For such a user only `age`, `countryCode` and `language` are STORED — the attributes that decide where an offer may legally appear and which creative locale renders; everything else you sent is discarded, `custom` included, and the response reports `minor`. The instant you sent the set is recorded, so a stored age is aged forward rather than frozen. `dateOfBirth` is refused: `age` carries the same targeting value with far less identifying power.
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.
2852
3202
  *
2853
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_*).
2854
3204
  */
@@ -2868,6 +3218,7 @@ export interface paths {
2868
3218
  attributes: {
2869
3219
  /** @description ISO 3166-1 alpha-2 country code (e.g., "US", "GB", "CA"). */
2870
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. */
2871
3222
  language?: string;
2872
3223
  city?: string;
2873
3224
  state?: string;
@@ -2915,7 +3266,7 @@ export interface paths {
2915
3266
  userId: string;
2916
3267
  /** @description ISO 8601 instant the set was recorded; what a stored age is aged forward from */
2917
3268
  storedAt: string;
2918
- /** @description True when the supplied age was under 18. Offers are STILL served to this user — from age-appropriate inventory only, ranked by the app-level bandit, with no per-user personalisation. Only `age`, `countryCode` and `language` are kept for this user. Everything else you sent is DISCARDED, including `custom`, `city`, `state`, `region` and the subscription and billing fields — a profile that may not be targeted on has no purpose. Re-send the set once they are 18 and it is stored in full. */
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. */
2919
3270
  minor: boolean;
2920
3271
  };
2921
3272
  };
@@ -2929,6 +3280,8 @@ export interface paths {
2929
3280
  "application/json": {
2930
3281
  error: string;
2931
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;
2932
3285
  };
2933
3286
  };
2934
3287
  };
@@ -2941,6 +3294,8 @@ export interface paths {
2941
3294
  "application/json": {
2942
3295
  error: string;
2943
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;
2944
3299
  };
2945
3300
  };
2946
3301
  };
@@ -2953,6 +3308,8 @@ export interface paths {
2953
3308
  "application/json": {
2954
3309
  error: string;
2955
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;
2956
3313
  };
2957
3314
  };
2958
3315
  };
@@ -3019,6 +3376,8 @@ export interface paths {
3019
3376
  "application/json": {
3020
3377
  error: string;
3021
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;
3022
3381
  };
3023
3382
  };
3024
3383
  };
@@ -3031,6 +3390,8 @@ export interface paths {
3031
3390
  "application/json": {
3032
3391
  error: string;
3033
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;
3034
3395
  };
3035
3396
  };
3036
3397
  };
@@ -3087,6 +3448,8 @@ export interface paths {
3087
3448
  "application/json": {
3088
3449
  error: string;
3089
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;
3090
3453
  };
3091
3454
  };
3092
3455
  };
@@ -3099,6 +3462,8 @@ export interface paths {
3099
3462
  "application/json": {
3100
3463
  error: string;
3101
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;
3102
3467
  };
3103
3468
  };
3104
3469
  };
@@ -3111,6 +3476,8 @@ export interface paths {
3111
3476
  "application/json": {
3112
3477
  error: string;
3113
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;
3114
3481
  };
3115
3482
  };
3116
3483
  };
@@ -3123,6 +3490,8 @@ export interface paths {
3123
3490
  "application/json": {
3124
3491
  error: string;
3125
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;
3126
3495
  };
3127
3496
  };
3128
3497
  };
@@ -3189,6 +3558,8 @@ export interface paths {
3189
3558
  "application/json": {
3190
3559
  error: string;
3191
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;
3192
3563
  };
3193
3564
  };
3194
3565
  };
@@ -3201,6 +3572,8 @@ export interface paths {
3201
3572
  "application/json": {
3202
3573
  error: string;
3203
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;
3204
3577
  };
3205
3578
  };
3206
3579
  };
@@ -3213,6 +3586,8 @@ export interface paths {
3213
3586
  "application/json": {
3214
3587
  error: string;
3215
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;
3216
3591
  };
3217
3592
  };
3218
3593
  };
@@ -3249,6 +3624,8 @@ export interface paths {
3249
3624
  campaignId: string;
3250
3625
  /** Format: email */
3251
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;
3252
3629
  /** @description Trial length in days as reported by StoreKit; drives reminder scheduling. */
3253
3630
  trialDurationDays?: number | null;
3254
3631
  /**
@@ -3290,6 +3667,8 @@ export interface paths {
3290
3667
  "application/json": {
3291
3668
  error: string;
3292
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;
3293
3672
  };
3294
3673
  };
3295
3674
  };
@@ -3302,6 +3681,8 @@ export interface paths {
3302
3681
  "application/json": {
3303
3682
  error: string;
3304
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;
3305
3686
  };
3306
3687
  };
3307
3688
  };
@@ -3314,6 +3695,8 @@ export interface paths {
3314
3695
  "application/json": {
3315
3696
  error: string;
3316
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;
3317
3700
  };
3318
3701
  };
3319
3702
  };
@@ -3377,6 +3760,8 @@ export interface paths {
3377
3760
  "application/json": {
3378
3761
  error: string;
3379
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;
3380
3765
  };
3381
3766
  };
3382
3767
  };
@@ -3389,6 +3774,8 @@ export interface paths {
3389
3774
  "application/json": {
3390
3775
  error: string;
3391
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;
3392
3779
  };
3393
3780
  };
3394
3781
  };
@@ -3401,6 +3788,8 @@ export interface paths {
3401
3788
  "application/json": {
3402
3789
  error: string;
3403
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;
3404
3793
  };
3405
3794
  };
3406
3795
  };
@@ -3465,6 +3854,8 @@ export interface paths {
3465
3854
  "application/json": {
3466
3855
  error: string;
3467
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;
3468
3859
  };
3469
3860
  };
3470
3861
  };
@@ -3477,6 +3868,8 @@ export interface paths {
3477
3868
  "application/json": {
3478
3869
  error: string;
3479
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;
3480
3873
  };
3481
3874
  };
3482
3875
  };
@@ -3489,6 +3882,8 @@ export interface paths {
3489
3882
  "application/json": {
3490
3883
  error: string;
3491
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;
3492
3887
  };
3493
3888
  };
3494
3889
  };
@@ -3501,6 +3896,8 @@ export interface paths {
3501
3896
  "application/json": {
3502
3897
  error: string;
3503
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;
3504
3901
  };
3505
3902
  };
3506
3903
  };
@@ -3513,6 +3910,8 @@ export interface paths {
3513
3910
  "application/json": {
3514
3911
  error: string;
3515
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;
3516
3915
  };
3517
3916
  };
3518
3917
  };
@@ -3576,6 +3975,8 @@ export interface paths {
3576
3975
  "application/json": {
3577
3976
  error: string;
3578
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;
3579
3980
  };
3580
3981
  };
3581
3982
  };
@@ -3588,6 +3989,8 @@ export interface paths {
3588
3989
  "application/json": {
3589
3990
  error: string;
3590
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;
3591
3994
  };
3592
3995
  };
3593
3996
  };
@@ -3600,6 +4003,8 @@ export interface paths {
3600
4003
  "application/json": {
3601
4004
  error: string;
3602
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;
3603
4008
  };
3604
4009
  };
3605
4010
  };
@@ -3612,6 +4017,8 @@ export interface paths {
3612
4017
  "application/json": {
3613
4018
  error: string;
3614
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;
3615
4022
  };
3616
4023
  };
3617
4024
  };
@@ -3624,6 +4031,8 @@ export interface paths {
3624
4031
  "application/json": {
3625
4032
  error: string;
3626
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;
3627
4036
  };
3628
4037
  };
3629
4038
  };
@@ -3636,6 +4045,8 @@ export interface paths {
3636
4045
  "application/json": {
3637
4046
  error: string;
3638
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;
3639
4050
  };
3640
4051
  };
3641
4052
  };
@@ -3715,6 +4126,8 @@ export interface paths {
3715
4126
  "application/json": {
3716
4127
  error: string;
3717
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;
3718
4131
  };
3719
4132
  };
3720
4133
  };
@@ -3727,6 +4140,8 @@ export interface paths {
3727
4140
  "application/json": {
3728
4141
  error: string;
3729
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;
3730
4145
  };
3731
4146
  };
3732
4147
  };
@@ -3739,6 +4154,8 @@ export interface paths {
3739
4154
  "application/json": {
3740
4155
  error: string;
3741
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;
3742
4159
  };
3743
4160
  };
3744
4161
  };
@@ -3819,6 +4236,8 @@ export interface paths {
3819
4236
  "application/json": {
3820
4237
  error: string;
3821
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;
3822
4241
  };
3823
4242
  };
3824
4243
  };
@@ -3831,6 +4250,8 @@ export interface paths {
3831
4250
  "application/json": {
3832
4251
  error: string;
3833
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;
3834
4255
  };
3835
4256
  };
3836
4257
  };
@@ -3843,6 +4264,8 @@ export interface paths {
3843
4264
  "application/json": {
3844
4265
  error: string;
3845
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;
3846
4269
  };
3847
4270
  };
3848
4271
  };
@@ -3855,6 +4278,8 @@ export interface paths {
3855
4278
  "application/json": {
3856
4279
  error: string;
3857
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;
3858
4283
  };
3859
4284
  };
3860
4285
  };
@@ -3914,6 +4339,8 @@ export interface paths {
3914
4339
  "application/json": {
3915
4340
  error: string;
3916
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;
3917
4344
  };
3918
4345
  };
3919
4346
  };
@@ -3926,6 +4353,8 @@ export interface paths {
3926
4353
  "application/json": {
3927
4354
  error: string;
3928
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;
3929
4358
  };
3930
4359
  };
3931
4360
  };
@@ -3938,6 +4367,8 @@ export interface paths {
3938
4367
  "application/json": {
3939
4368
  error: string;
3940
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;
3941
4372
  };
3942
4373
  };
3943
4374
  };
@@ -3950,6 +4381,8 @@ export interface paths {
3950
4381
  "application/json": {
3951
4382
  error: string;
3952
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;
3953
4386
  };
3954
4387
  };
3955
4388
  };
@@ -4014,6 +4447,8 @@ export interface paths {
4014
4447
  "application/json": {
4015
4448
  error: string;
4016
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;
4017
4452
  };
4018
4453
  };
4019
4454
  };
@@ -4026,6 +4461,8 @@ export interface paths {
4026
4461
  "application/json": {
4027
4462
  error: string;
4028
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;
4029
4466
  };
4030
4467
  };
4031
4468
  };
@@ -4038,6 +4475,8 @@ export interface paths {
4038
4475
  "application/json": {
4039
4476
  error: string;
4040
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;
4041
4480
  };
4042
4481
  };
4043
4482
  };
@@ -4050,6 +4489,8 @@ export interface paths {
4050
4489
  "application/json": {
4051
4490
  error: string;
4052
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;
4053
4494
  };
4054
4495
  };
4055
4496
  };
@@ -4062,6 +4503,8 @@ export interface paths {
4062
4503
  "application/json": {
4063
4504
  error: string;
4064
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;
4065
4508
  };
4066
4509
  };
4067
4510
  };
@@ -4180,6 +4623,8 @@ export interface paths {
4180
4623
  "application/json": {
4181
4624
  error: string;
4182
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;
4183
4628
  };
4184
4629
  };
4185
4630
  };
@@ -4192,6 +4637,8 @@ export interface paths {
4192
4637
  "application/json": {
4193
4638
  error: string;
4194
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;
4195
4642
  };
4196
4643
  };
4197
4644
  };
@@ -4204,6 +4651,8 @@ export interface paths {
4204
4651
  "application/json": {
4205
4652
  error: string;
4206
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;
4207
4656
  };
4208
4657
  };
4209
4658
  };
@@ -4286,6 +4735,8 @@ export interface paths {
4286
4735
  "application/json": {
4287
4736
  error: string;
4288
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;
4289
4740
  };
4290
4741
  };
4291
4742
  };
@@ -4298,6 +4749,8 @@ export interface paths {
4298
4749
  "application/json": {
4299
4750
  error: string;
4300
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;
4301
4754
  };
4302
4755
  };
4303
4756
  };
@@ -4310,6 +4763,8 @@ export interface paths {
4310
4763
  "application/json": {
4311
4764
  error: string;
4312
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;
4313
4768
  };
4314
4769
  };
4315
4770
  };
@@ -4387,6 +4842,8 @@ export interface paths {
4387
4842
  "application/json": {
4388
4843
  error: string;
4389
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;
4390
4847
  };
4391
4848
  };
4392
4849
  };
@@ -4399,6 +4856,8 @@ export interface paths {
4399
4856
  "application/json": {
4400
4857
  error: string;
4401
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;
4402
4861
  };
4403
4862
  };
4404
4863
  };
@@ -4411,6 +4870,8 @@ export interface paths {
4411
4870
  "application/json": {
4412
4871
  error: string;
4413
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;
4414
4875
  };
4415
4876
  };
4416
4877
  };
@@ -4499,6 +4960,10 @@ export interface components {
4499
4960
  rewardDecline?: string | null;
4500
4961
  /** @description Badge on the highlighted offer card, e.g. 'Most claimed'. Same resolution and same null meaning as rewardCta. */
4501
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;
4502
4967
  };
4503
4968
  /** @description Appearance values */
4504
4969
  appearance: {
@@ -4517,6 +4982,21 @@ export interface components {
4517
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. */
4518
4983
  appstoreIcon: string | null;
4519
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
+ };
4520
5000
  };
4521
5001
  };
4522
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. */
@@ -4573,6 +5053,10 @@ export interface components {
4573
5053
  rewardDecline?: string | null;
4574
5054
  /** @description Badge on the highlighted offer card, e.g. 'Most claimed'. Same resolution and same null meaning as rewardCta. */
4575
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;
4576
5060
  };
4577
5061
  /** @description Appearance values */
4578
5062
  appearance: {
@@ -4591,6 +5075,21 @@ export interface components {
4591
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. */
4592
5076
  appstoreIcon: string | null;
4593
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
+ };
4594
5093
  };
4595
5094
  };
4596
5095
  "post-action-reward"?: {
@@ -4645,6 +5144,10 @@ export interface components {
4645
5144
  rewardDecline?: string | null;
4646
5145
  /** @description Badge on the highlighted offer card, e.g. 'Most claimed'. Same resolution and same null meaning as rewardCta. */
4647
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;
4648
5151
  };
4649
5152
  /** @description Appearance values */
4650
5153
  appearance: {
@@ -4663,6 +5166,21 @@ export interface components {
4663
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. */
4664
5167
  appstoreIcon: string | null;
4665
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
+ };
4666
5184
  };
4667
5185
  };
4668
5186
  };
@@ -4705,6 +5223,8 @@ export interface components {
4705
5223
  };
4706
5224
  /** @description Resolved locale served in this response (language-only, e.g. 'es'). Absent on pre-localization responses. */
4707
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[];
4708
5228
  };
4709
5229
  OffersSearchResponse: {
4710
5230
  success: boolean;
@@ -4773,6 +5293,10 @@ export interface components {
4773
5293
  heroImageUrl?: string | null;
4774
5294
  /** @description https link to the advertiser offer terms. Null or absent: render terms copy as plain text. */
4775
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
+ };
4776
5300
  /** Format: date-time */
4777
5301
  createdAt: string;
4778
5302
  /** Format: date-time */
@@ -4821,6 +5345,8 @@ export interface components {
4821
5345
  title: string;
4822
5346
  subtitle: string;
4823
5347
  ctaButtonText?: string;
5348
+ /** @description Optional https image for this step. Absent: the step has none. */
5349
+ imageUrl?: string;
4824
5350
  }[] | null;
4825
5351
  /** @description Short, actionable phrases (max 1-3) that guide users. Examples: "sign up, create registry", "add to cart" */
4826
5352
  quickInstructions: string | null;
@@ -4887,11 +5413,41 @@ export interface components {
4887
5413
  category?: string | null;
4888
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. */
4889
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;
4890
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. */
4891
5421
  rewardConfirmationTime?: {
4892
5422
  medianSeconds: number;
4893
5423
  p90Seconds: number;
4894
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;
4895
5451
  }[];
4896
5452
  metadata: {
4897
5453
  /** @description Total offers available */
@@ -4909,6 +5465,8 @@ export interface components {
4909
5465
  };
4910
5466
  /** @description Resolved locale served in this response (language-only, e.g. 'es'). Absent on pre-localization responses. */
4911
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;
4912
5470
  error?: string | null;
4913
5471
  };
4914
5472
  Campaign: {
@@ -4976,6 +5534,10 @@ export interface components {
4976
5534
  heroImageUrl?: string | null;
4977
5535
  /** @description https link to the advertiser offer terms. Null or absent: render terms copy as plain text. */
4978
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
+ };
4979
5541
  /** Format: date-time */
4980
5542
  createdAt: string;
4981
5543
  /** Format: date-time */
@@ -5024,6 +5586,8 @@ export interface components {
5024
5586
  title: string;
5025
5587
  subtitle: string;
5026
5588
  ctaButtonText?: string;
5589
+ /** @description Optional https image for this step. Absent: the step has none. */
5590
+ imageUrl?: string;
5027
5591
  }[] | null;
5028
5592
  /** @description Short, actionable phrases (max 1-3) that guide users. Examples: "sign up, create registry", "add to cart" */
5029
5593
  quickInstructions: string | null;
@@ -5090,11 +5654,41 @@ export interface components {
5090
5654
  category?: string | null;
5091
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. */
5092
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;
5093
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. */
5094
5662
  rewardConfirmationTime?: {
5095
5663
  medianSeconds: number;
5096
5664
  p90Seconds: number;
5097
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;
5098
5692
  };
5099
5693
  Creative: {
5100
5694
  /** Format: uuid */
@@ -5126,6 +5720,8 @@ export interface components {
5126
5720
  title: string;
5127
5721
  subtitle: string;
5128
5722
  ctaButtonText?: string;
5723
+ /** @description Optional https image for this step. Absent: the step has none. */
5724
+ imageUrl?: string;
5129
5725
  }[] | null;
5130
5726
  /** @description Short, actionable phrases (max 1-3) that guide users. Examples: "sign up, create registry", "add to cart" */
5131
5727
  quickInstructions: string | null;