202 Accepted and tell you where to poll, rather than making you
wait on a connection that a proxy, a client timeout, or a gateway may close first.
Status polling
The first three return anid and a poll path. Fetch that path and read status.
complete and failed for an audit report, and brief_ready, ready
and failed for a generation. A failed audit report carries the reason in error.
Watermark polling
POST /v1/brands/{id}/recommendations/generate has no row of its own to poll, because it
refreshes a whole set of recommendations rather than creating one object. It returns a
poll_after timestamp instead:
last_seen_at on every recommendation it finds, not only the new ones. So
the run has finished once any recommendation’s last_seen_at is later than poll_after.
That distinction matters: a run that turns up nothing new still updates last_seen_at, so
this tells you the run is done rather than leaving you unable to separate “still working”
from “finished with no changes”.
poll_after is read from the database clock, the same clock that stamps last_seen_at, so
you are never comparing two different clocks. Pass it back exactly as received.
Cost and rate limits
Every endpoint on this page runs a model and costs money, andPOST /v1/brands/{id}/recommendations/generate is the most expensive call in the API: it
crawls your site’s pages to check coverage. They carry their own per-endpoint limits on top
of the plan rate limit. Poll on an interval of 15 seconds or more rather than in a tight
loop, and let a run finish before starting another for the same brand.
Next steps
Rate limits
Per-endpoint ceilings
Errors
Handling failures