Which Platforms?
iOS
Which React Native Version?
0.81.4
Which @braze/react-native-sdk SDK version?
20.1.0
Repro Rate
100%
Steps To Reproduce
Our use case
We surface Content Cards in two places in the app:
- A badge on Screen A showing the number of (unread) Content Cards.
- A Content Cards list screen that displays the cards.
Because we always want the latest data, we call Braze.getContentCards() on every screen focus for each of these screens (i.e. we intentionally fetch fresh, not
cached, every time the user navigates in). This means several getContentCards() calls happen as the user moves between screens.
Describe the bug
On iOS, getContentCards() (which internally calls contentCards.requestRefresh) occasionally returns rate-limited and does not deliver fresh cards. The SDK logs:
getContentCards called
[http] request POST sdk.jp-01.braze.com/api/v3/data ...
Failed to send API request (rate-limited).
- rate-limited until: { "content_cards/sync" : "2026-06-05T08:32:32Z" }
On iOS, when getContentCards() hits the client-side content_cards/sync rate limit, the returned promise never resolves or rejects for the entire rate-limit window (~1–2 minutes). Our list screen is stuck on its loading indicator the whole time. The promise only settles once the rate-limit window expires and BrazeKit auto-retries the sync successfully.
Expected Behavior
- iOS: under normal screen-focus navigation, getContentCards() intermittently triggers the content_cards/sync rate limit and then hangs for ~1–2 minutes (the
rate-limit window). No resolve, no reject, no timeout. try/catch never fires. UI loading state never clears until the limit expires.
- Android: never rate-limits for the same usage; resolves immediately.
iOS to be the same as Android
Actual Incorrect Behavior
iOS throw rate-limit warning / error
Verbose Logs
Additional Information
No response
Which Platforms?
iOS
Which React Native Version?
0.81.4
Which @braze/react-native-sdk SDK version?
20.1.0
Repro Rate
100%
Steps To Reproduce
Our use case
We surface Content Cards in two places in the app:
Because we always want the latest data, we call Braze.getContentCards() on every screen focus for each of these screens (i.e. we intentionally fetch fresh, not
cached, every time the user navigates in). This means several getContentCards() calls happen as the user moves between screens.
Describe the bug
On iOS, getContentCards() (which internally calls contentCards.requestRefresh) occasionally returns rate-limited and does not deliver fresh cards. The SDK logs:
getContentCards called
[http] request POST sdk.jp-01.braze.com/api/v3/data ...
Failed to send API request (rate-limited).
On iOS, when getContentCards() hits the client-side content_cards/sync rate limit, the returned promise never resolves or rejects for the entire rate-limit window (~1–2 minutes). Our list screen is stuck on its loading indicator the whole time. The promise only settles once the rate-limit window expires and BrazeKit auto-retries the sync successfully.
Expected Behavior
rate-limit window). No resolve, no reject, no timeout. try/catch never fires. UI loading state never clears until the limit expires.
iOS to be the same as Android
Actual Incorrect Behavior
iOS throw rate-limit warning / error
Verbose Logs
Additional Information
No response