Errors and limits
Error format, status codes, timeouts and request limits.
Error format
Most errors come from the API and return JSON in this shape:
{
"data": {
"message": "Please provide at least one holding",
"error": "Unknown error. Please contact support"
}
}data.message says what went wrong. data.error holds extra detail when there is any. It can be a string, an object or a list.
When the request body does not match the schema in the API reference, for example a required field is missing or a value has the wrong type, the API returns 400 with a fixed data.message and one entry per problem in data.error:
{
"data": {
"message": "An error occurred while processing your request",
"error": [
{
"path": ".body.snapshot_at",
"message": "should have required property 'snapshot_at'",
"errorCode": "required.openapi.validation"
}
]
}
}Errors raised by the gateway in front of the API use a shorter shape with a single message:
{
"message": "Endpoint request timed out"
}The gateway returns these for a missing or unknown API key (403, "Forbidden"), a request that takes too long (504), a request body that is too large (413) and some 429 responses. The API can also return 429 with its own body; see Limits for both shapes. A request to a path the gateway does not route, for example a mistyped path or the temperature score route, which is not yet available, gets 403 with {"message": "Missing Authentication Token"}.
Status codes
| Status | Meaning |
|---|---|
| 200, 201 | Success. Routes that compute results on the fly (sustainable investments insights, EU Taxonomy, reports, create portfolio) return 201. |
| 400 | The request is invalid, or the portfolio was not found. Read data.message. |
| 403 | Missing, unknown or disabled API key, no access to the data family, or too many instruments in one request. |
| 413 | The request body is larger than 10 MB. |
| 429 | Too many requests, or the monthly quota is used up. See Limits. |
| 500 | Unexpected error. Retry once. If it persists, contact customers@connect.earth with the time of the request. |
| 503 | A dependency is temporarily unavailable. Retry with backoff. |
| 504 | The request took longer than 29 seconds. Send fewer holdings per request. |
Limits
- Requests per key: 10,000 requests per key per calendar month.
- Short bursts: sending many requests in a short time is also limited.
- Instruments per request: up to 10,000 holdings on
/instruments/*routes. Above that the API returns403with "You can only request data for a maximum of 10000 instruments at a time." Send many ISINs in one request, up to this limit, rather than one request per ISIN. - Request timeout: 29 seconds at the gateway. Requests for large portfolios on computed routes (EU Taxonomy, reports) can hit this. Split them.
- Body size: 10 MB per request.
When a limit is hit, the API returns 429. The body tells you which limit:
| Body | Meaning | What to do |
|---|---|---|
{"message": "Too Many Requests"} | Too many requests in a short time. | Wait, then retry with backoff. |
{"status": 429, "error": "Too many requests, please try again later."} | Too many requests in a short time. | Wait, then retry with backoff. |
{"message": "Limit Exceeded"} | The monthly quota for your key is used up. | Do not retry. Contact customers@connect.earth. |
Other 400 messages
Some requests pass the schema check and are still rejected with 400. The reason is in data.message:
data.message | Cause |
|---|---|
| Snapshot date cannot be higher than actual date | snapshot_at is in a future year (POST /portfolios, DELETE /portfolios/{identifier}, POST /reports). |
| You are not using a valid date as snapshot parameter | snapshot_at cannot be read as a date. |
| No data found for the given parameters | POST /taxonomy/insights found neither taxonomy data nor market values for the holdings. |
| Some instruments are missing required properties | A holding sent to POST /sustainable-investments/insights or POST /taxonomy/insights has no isin, name, instrument_type or market_value, for example a cash row. |