Every failing request returns a standard HTTP status code and a JSON body with a
single error object:
message wording may change at any time; code values are part of the API
contract and only change with a new API version. Treat an unrecognized code as
a generic failure of its HTTP status class rather than failing hard.
Error codes
404 is also returned instead of 403 for objects a token can’t see, so that
the API doesn’t reveal whether an id exists. A 404 on an id you expect to
exist usually means the token’s permissions don’t cover it.
Handling errors
400 / 422 — the request is wrong; fix it and don’t retry as-is. On
invalid_cursor, drop the cursor and restart the iteration from the first
page with the same filters.
401 / 403 — check the token and its permissions; retrying won’t help.
429 — back off for at least the Retry-After seconds returned with the
response before retrying.
5xx — retry with exponential backoff and jitter. Feed requests are
idempotent, so replaying a page is safe.