Skip to content
i4seaAPI documentation

Errors

Every error the API returns is a problem document (RFC 9457) with the content type application/problem+json:

{
  "type": "https://developers.i4sea.com.br/errors/quota_exceeded",
  "title": "Monthly quota exceeded",
  "status": 429,
  "detail": "Company quota of 100000 units for 2026-10 is used up.",
  "code": "quota_exceeded",
  "request_id": "6f1c0e9e-..."
}
FieldMeaning
codestable, machine-readable error code; branch on this
statusthe HTTP status, repeated
titleshort human-readable summary of the code; the same for every occurrence
detailexplanation of this occurrence; meant for people, may change wording
typeURI of the code's page in the error catalogue
request_ididentifier of this request; quote it when you contact i4sea

The error catalogue lists every code, its status and what to do about it.

Invalid parameters

A 400 invalid_request adds invalid_params, one entry per rejected parameter:

{
  "type": "https://developers.i4sea.com.br/errors/invalid_request",
  "title": "Invalid request",
  "status": 400,
  "detail": "One or more parameters are invalid.",
  "code": "invalid_request",
  "request_id": "6f1c0e9e-...",
  "invalid_params": [{ "name": "hours", "reason": "must be between 1 and 360" }]
}

Request ids

Every response, successful or not, carries an X-Request-Id header, and error bodies repeat it as request_id. Log it with your own request; it lets i4sea find that exact request when you report a problem.

When to retry

StatusCodesRetry?
400invalid_request, key_in_queryNo. Fix the request.
401unauthenticatedNo. Check the key.
403insufficient_scope, subscription_inactive, product_not_in_plan, outside_coverageNo. These need a change of key, plan or coverage; contact i4sea.
404not_foundNo. Check the path against the API reference.
413payload_too_largeNo. Reduce the request body.
429rate_limitedYes, after Retry-After seconds.
429quota_exceededNot before Retry-After, which points at the next monthly reset.
500internal_errorYes, a few times with exponential backoff; if it persists, contact i4sea with the request_id.
503provider_unavailableYes, after Retry-After seconds.
504timeoutYes; if it repeats, ask for fewer hours or variables.

Errors cost no units, but most count toward your per-minute limit, so a tight retry loop can end in 429 rate_limited. Always honour Retry-After when it is present, and add random jitter to your backoff when several workers retry at once.

No data is not an error

A point inside your coverage with no forecast for the requested type is a 200 with "status": "no_data" and empty series. It is a stable answer about that point, so retrying will not change it. A temporary failure to produce the forecast is a 503 provider_unavailable instead.

Unknown codes

New error codes can be added to v1 (see Versioning policy). Handle a code you do not recognize by its HTTP status.