Skip to content

Errors, Pagination, and Rate Limits

The exact error response shape, error codes, paginated list format, and the real rate limits the iSearchFrom API enforces.

Every API client should handle four things: errors (with stable machine-readable codes), paginated lists, rate limits, and plan/usage limits. This page documents each precisely, with the real shapes and numbers the API uses.

Every error returns JSON with a consistent shape and the failing request’s HTTP status code:

{
"statusCode": 402,
"code": 39012,
"message": "Insufficient token balance for this action.",
"timestamp": "2026-07-07T14:05:00.000Z",
"path": "/v1/tools/serp/proxy-search"
}
FieldTypeNotes
statusCodenumberThe HTTP status (also on the response itself).
codenumberStable, machine-readable application code. Branch on this — the message can change.
messagestringHuman-readable explanation. For display and logs; never parse it.
timestampstringISO-8601 time the error was produced.
pathstringThe request path, for correlating with your logs.

Validation errors (a malformed body or query parameter) return HTTP 400 with a message describing the invalid field.

Codes are grouped by domain. The code ranges you’ll encounter as an API client:

RangeDomainTypical statuses
33xxxAPI keys / authentication401, 403, 404
39xxxEntitlements & tokens402, 403, 404
40xxxBilling & subscriptions400, 403, 404, 409
41xxxSearch & tracking tools400, 404, 409, 429

The codes you’re most likely to handle in an integration:

CodeStatusMeaningWhat to do
33002401API key invalidCheck the X-API-Key header and the key value
33003403API key disabledRe-enable or create a new key
33004403API key expiredCreate a new key
33005403Key requests a permission the creator doesn’t holdReduce the requested permissions
CodeStatusMeaningWhat to do
39005403Plan doesn’t include this featureUpgrade or change the workflow
39006403Feature usage limit reached (e.g. daily quota)Wait for reset, upgrade, or reduce usage
39007400No organization context on the requestEnsure the key/session is bound to an organization
39012402Insufficient token balanceTop up tokens, then retry
CodeStatusMeaningWhat to do
41001404Search not foundCheck the id and organization
41002404Campaign not foundCheck the id and organization
41003409Campaign name already existsChoose a unique name
41008400Cannot run an archived campaignUnarchive first
41011409A run is already active for this campaignWait for it to finish
41013429Demo rate limit exceededSign in / use an authenticated request

List endpoints return a consistent envelope:

{
"data": [{ "id": "...", "...": "..." }],
"pagination": {
"total": 128,
"hasMore": true,
"nextCursor": "eyJzIjoiY3JlYXRlZEF0Iiwi..."
}
}
FieldNotes
dataThe page of results.
pagination.totalTotal matching records (omitted on a few very large tables for speed).
pagination.hasMoretrue when more pages exist.
pagination.nextCursorOpaque cursor for the next page. Absent on the last page.
ParameterDefaultNotes
limitendpointPage size, 1–100. Values outside the range are clamped.
cursorPass the previous response’s nextCursor to get the next page.
sortendpointField to sort by (allowed fields vary per endpoint).
orderdescasc or desc.

Paginate by following nextCursor until hasMore is false:

Terminal window
curl "$BASE_URL/tools/serp/proxy-search?limit=50" -H "X-API-Key: $ISEARCHFROM_API_KEY"
# then, using nextCursor from the response:
curl "$BASE_URL/tools/serp/proxy-search?limit=50&cursor=eyJz...=" -H "X-API-Key: $ISEARCHFROM_API_KEY"

Limits are enforced per identity (your user or API key). When you exceed one, the API returns HTTP 429 with a Retry-After header (seconds) telling you when to try again.

Limit groupLimitApplies to
Default600 / minuteAlmost every authenticated endpoint, including the tools
Authentication5 / minuteLogin, sign-up, password reset, OTP
Public (unauthenticated)30 / minuteAnonymous reads of public resources
Email triggers10 / hourInvites and other outbound-email actions

The 600 requests/minute default (≈10/sec) is generous for normal automation. If an agent or job sustains bursts near the limit, add small delays or backoff. On a 429, honor Retry-After rather than retrying immediately.

Separate from rate limits, your plan can cap:

  • daily direct searches and daily proxy searches
  • API and MCP access
  • project count and member count
  • token allocation and which product features are enabled

A request that would exceed a plan limit fails with an entitlement error (39005/39006) or, when you’re out of tokens, 39012. There are also per-request product guardrails — for example a maximum number of proxy pages per search, or checks per campaign run — that return a 400 when exceeded.

Retry only transient failures. Never blindly retry a client error.

RetryDon’t retry
Transient network failuresInvalid parameters (e.g. bad country) — 400
Provider timeoutsMissing permission — 403
429 (after Retry-After)Plan doesn’t include feature — 39005
Polling a pending/runningInsufficient tokens — 39012
statusCampaign exceeds a size limit — 400