Skip to main content

Error Handling

The iNwealth API returns errors in two ways depending on when they occur:
  • Before streaming starts — standard HTTP JSON errors
  • During streaming — SSE error events

HTTP errors

These are returned as standard JSON responses before any streaming begins.

401 — Authentication failed

{
  "detail": "Authentification requise"
}
Causes:
  • Missing Authorization header
  • Invalid or revoked API key
  • Malformed Bearer token

400 — Invalid parameters

{
  "detail": "Invalid effort: xyz. Must be one of ['low', 'medium', 'high', 'max']"
}
Returned when a parameter has an invalid value (e.g. unsupported effort level).

422 — Missing required fields

{
  "detail": [
    {
      "type": "missing",
      "loc": ["body", "messages"],
      "msg": "Field required"
    }
  ]
}
Returned when required fields (messages, session_id) are missing or have the wrong type.

SSE error events

Some errors occur after the stream has started (HTTP 200 already sent). These are delivered as SSE events:

429 — Rate limit exceeded

event: error
data: {"type": "error", "data": {"error": "Limite quotidienne organisation atteinte (1,000,000 tokens). Reset dans 3h42.", "error_type": "RateLimitExceeded"}}
Your organization’s daily token quota has been exhausted. The error message includes the time until reset (midnight UTC).

500 — Internal error

event: error
data: {"type": "error", "data": {"error": "Erreur interne du serveur"}}
An unexpected server-side error occurred during response generation. If this persists, contact your account manager.

Handling errors in code

JavaScript

const response = await fetch("https://api.inwealth.fr/api/agent", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "Authorization": "Bearer sk_live_your_key_here"
  },
  body: JSON.stringify({
    messages: [{ role: "user", content: "Your question" }],
    session_id: "session-001"
  })
});

// Handle HTTP errors (401, 400, 422)
if (!response.ok) {
  const error = await response.json();
  console.error(`HTTP ${response.status}:`, error.detail);
  return;
}

// Handle SSE stream (including SSE error events)
const reader = response.body.getReader();
const decoder = new TextDecoder();

while (true) {
  const { done, value } = await reader.read();
  if (done) break;

  const chunk = decoder.decode(value);
  for (const line of chunk.split("\n")) {
    if (!line.startsWith("data: ")) continue;
    const data = JSON.parse(line.slice(6));

    if (data.type === "error") {
      // SSE error (429 rate limit, 500 internal)
      console.error(data.data.error);
      if (data.data.error_type === "RateLimitExceeded") {
        // Wait until quota resets at midnight UTC
      }
      return;
    }

    if (data.text) {
      // Normal delta — append to display
    }
  }
}

Python

import httpx
import json

with httpx.stream(
    "POST",
    "https://api.inwealth.fr/api/agent",
    headers={"Authorization": "Bearer sk_live_your_key_here"},
    json={
        "messages": [{"role": "user", "content": "Your question"}],
        "session_id": "session-001",
    },
) as response:
    # Handle HTTP errors
    if response.status_code != 200:
        print(f"HTTP {response.status_code}: {response.read()}")
    else:
        # Handle SSE stream
        for line in response.iter_lines():
            if not line.startswith("data: "):
                continue
            data = json.loads(line[6:])
            if data.get("type") == "error":
                print(f"SSE error: {data['data']['error']}")
                break

Summary

CodeTypeWhenFormat
401HTTPBefore stream{"detail": "..."}
400HTTPBefore stream{"detail": "..."}
422HTTPBefore stream{"detail": [...]}
429SSE eventDuring streamevent: error with RateLimitExceeded
500SSE eventDuring streamevent: error