List endpoints take two query parameters and return a consistent envelope:
All four fields are always present. Page until offset + items.length >= totalCount. Both SDKs auto-paginate internally - their list-style methods return the complete array.
Error envelope
Every non-200 response carries the same JSON body:
details appears only on field-level validation failures (400, errorCode: "VALIDATION_ERROR").
POST /v1/tools/{toolSlug}/execute is special: tool-runtime failures (the downstream API errored) return 200 with isSuccess: false and an errorMessage - not the error envelope. Branch on isSuccess, not just the HTTP status.
Rate limits
Limits are enforced per account with two budgets that must both pass: a per-second burst and a sustained hourly window. Search-backed discovery calls (GET /v1/tools or GET /v1/applications with a non-empty ?search=) have their own, stricter budget because they trigger semantic search.
On 429, honor the Retry-After response header (seconds): 1 when the burst window tripped, 3600 when the hourly window tripped. Back off and retry - don’t hammer.