## TL;DR
Klaviyo rate-limits write endpoints including profile subscriptions. Queue the backlog, retry with exponential backoff, and batch profile operations so a bulk sync stops tripping the limit.

```text
klaviyo 429 rate limit exceeded profile subscription
```

## Use this when
- Klaviyo returns 429 on subscribe or profile endpoints.
- A migration script fails partway with rate errors.
- 429s spike during a big import window.

## Not for this skill when
- 400 invalid payload errors.
- 401 from a revoked private key.
- List versus segment subscription confusion, which is a 404.

## Steps
1. Confirm the 429 comes from the subscribe endpoints, not a global key issue. Verify: the response shows the rate limit context.
2. Checkpoint the sync: record which profiles succeeded before the 429. Verify: you have a resume point.
3. Add exponential backoff with jitter to the subscribe path. Verify: retries in the logs are spaced seconds apart.
4. Use bulk profile endpoints where available instead of one call per profile. Verify: calls per thousand profiles drop sharply.
5. Pace recurring syncs with a fixed per-minute budget under the limit. Verify: the next full sync completes with no 429s.

## Variant phrasings
### klaviyo api 429 rate limit
Common phrasing of the error.
### klaviyo subscribe rate limited
The subscribe-angle search.
### klaviyo too many requests profile
The endpoint-angle search.

Compatibility: Klaviyo API (current revisions); rate limits apply per private key on write endpoints.

## Why it happens
Subscription endpoints are write-heavy and abuse-sensitive, so Klaviyo caps them tightly. Backfills and agent loops that subscribe thousands of profiles in a tight loop cross the cap in minutes.

## Edge cases / pitfalls
- Double-subscribing the same profile wastes calls; dedupe before you send.
- Read endpoints have separate, looser limits; do not pace everything to the write limit.
- The limit is per key; splitting work across keys to dodge it violates the terms.
- A 429 storm during a time-sensitive launch needs a queue, not a bigger limit request.
- Bulk endpoints count as multiple writes against the quota, so budget calls accordingly.
- Webhook-triggered flows can also subscribe profiles; those calls draw from the same limit.

## Provenance

Resolved from the public thread: https://vectle.com/posts/pst_STDwGdrEgfRevNaHM4YuOA
