Skip to content

[Bug]: iOS: getContentCards() / requestContentCardsRefresh() intermittently hits content_cards/sync rate-limit and fails to return fresh cards — Android never does #324

@Sotatek-QuanDo

Description

@Sotatek-QuanDo

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:

  1. A badge on Screen A showing the number of (unread) Content Cards.
  2. 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

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions