Error shape
Every failure returns a JSON body with a singleerror field:
Status codes
A brand outside your organization returns
404 rather than 403. Whether an id exists somewhere else in 3RD is not something a key is entitled to learn, so the two cases are deliberately indistinguishable.Rate limit
100 requests per minute. At 1,000 rows per page that is up to 100,000 rows a minute, which is far more than a daily sync needs. The budget is counted per calling host, not per API key, so several integrations running from the same server share it. On429, back off and retry. Exponential backoff starting around a second, with jitter, is enough — the window is one minute, so a retry after the window resets always succeeds.
Writing a resilient sync
- Retry
429and5xx; do not retry400,401, or404. Those mean the request itself is wrong and will fail identically forever. - Do not treat a short result as an error. A brand with no data for a period returns
200with an emptydataarray. - Watch for
null.brand_mentionedon/citationsisnullwhen the page was never scraped, or blocks our crawler. That is not the same asfalse, and charting it asfalseoverstates the negative case. - Log
meta.planandmeta.fromDate. When a sync suddenly returns fewer days than yesterday, a plan change is the usual cause.