Errors & Retry Guidance

Overview

The MultiRoute API uses standard HTTP status codes and returns structured JSON error responses. This page describes:

Error response format

On non-2xx responses, the API returns a JSON body with at least an error object:

{
  "error": {
    "type": "invalid_request_error",
    "message": "The `model` field is required.",
    "code": "missing_model"
  }
}

Fields:

Deployments may include additional fields (such as request_id or details) to help with debugging.

Common HTTP status codes

Below are typical status codes and how to handle them:

200–299: Success

The request succeeded. For streaming endpoints, you may see 200 OK with a streamed body.

400 Bad Request

The request is malformed or violates validation rules (for example, missing fields, invalid parameter types, or unsupported values).

401 Unauthorized

Authentication failed—usually because:

403 Forbidden

The credential is valid but does not have permission to perform this action (for example, using an inference-only key for a config endpoint).

404 Not Found

The requested resource or endpoint does not exist.

409 Conflict

A conflict occurred, such as attempting to create a resource that already exists or update a config with conflicting changes.

429 Too Many Requests

You have hit a rate limit or quota.

5xx Server errors

Server-side errors such as:

These usually indicate transient issues in MultiRoute or an upstream provider.

Retry strategy

For robust clients, MultiRoute recommends:

Example: handling errors in Node

async function callWithRetries(fetchFn, maxRetries = 3) {
  let attempt = 0;

  while (true) {
    try {
      const res = await fetchFn();
      if (res.ok) return res;

      if (
        res.status === 429 ||
        (res.status >= 500 && res.status < 600)
      ) {
        if (attempt >= maxRetries) return res;
        const delayMs = Math.min(1000 * 2 ** attempt, 30000);
        await new Promise((r) => setTimeout(r, delayMs));
        attempt++;
        continue;
      }

      return res; // Non-retryable status
    } catch (err) {
      if (attempt >= maxRetries) throw err;
      const delayMs = Math.min(1000 * 2 ** attempt, 30000);
      await new Promise((r) => setTimeout(r, delayMs));
      attempt++;
    }
  }
}