Skip to content
Fous Docs
MarkdownStudio

Errors and limits

The error object, the codes only the MCP server sends, the limits that apply, and every error code with what to do about it.

A failure answers an HTTP status and an error object. Branch on error.code; message says what happened and next_step what to do. Failures cost nothing.

JSON
{  "error": {    "code": "invalid_input",    "message": "2 inputs don't fit date.nager.at/list_public_holidays: \"contry\" is not one of its inputs (did you mean \"country\"?), and \"year\" must be an integer from 1 to 9999.",    "next_step": "Send the inputs below and run it again. Nothing was charged.",    "param": "input.contry",    "errors": [      {        "field": "contry",        "problem": "unknown",        "message": "Not an input of this method. Did you mean \"country\"?",        "did_you_mean": "country"      },      {        "field": "year",        "problem": "type",        "message": "Must be an integer from 1 to 9999; got \"next\".",        "expected": "integer"      },      { "field": "country", "problem": "missing", "message": "Required." }    ],    "method": "date.nager.at/list_public_holidays",    "input_schema": {      "type": "object",      "required": ["country"],      "properties": {        "year": {          "type": "integer",          "minimum": 1,          "maximum": 9999,          "description": "Calendar year, for example 2026. Defaults to the current year."        },        "country": {          "type": "string",          "description": "Country name or two-letter country code, for example Germany or DE."        }      }    },    "example": {      "method": "date.nager.at/list_public_holidays",      "input": { "country": "Germany", "year": 2026 }    },    "doc_url": "https://docs.fous.com/guides/errors#invalid_input",    "request_id": "req_mh7c2k9xQ1v3Zt8LbN0pRwY4"  }}

Each code adds the fields that help with it, listed under Error codes. A failed run also carries run_id, retryable, and may_have_run: true when a write may have reached the site. When you contact support, share request_id and the code, never a key. The Error object lists every field.

Over MCP

A tool error returns the same object in structuredContent.error, with isError: true. These codes come only from MCP:

CodeWhen
use_run_actionrun got a method that changes something; call run_action.
use_runrun_action got a method that only reads; call run.
read_onlyA method that changes something was called on the read-only server.
sign_in_failedA sign-in ended without signing in.
stoppedThe run was stopped. Over HTTP: 409 conflict, reason: "stopped".

Limits

LimitValue
Requests per minute, concurrent runsYour plan's, in GET /v1/account. A run at the limit waits 10 s, then 429.
Wait for a result60 s, then 202 while it keeps going.
QueryAbout 3 minutes.
Run input and resultKept 24 hours.
Result10 MB, then cut and marked truncated.
Request body4 MB.

Runs and queries count against both plan limits; searches, builds and sign-ins against requests per minute.

Error codes

invalid_request400Not retryable

The request itself is malformed: a missing or invalid parameter or body field, or (413, reason body_too_large) a body over 4 MB. Fix it and send again.

unauthorized401Not retryable

No API key, or the key is invalid, revoked or expired; reason says which. Send Authorization: Bearer <key>.

insufficient_credits402Not retryable

Not enough credits: required_credits is what the run, query or build costs and available_credits what you have; a build also shows free_builds, and a private one private: true. reason spend_limit (with spend_limit) means the monthly spend limit is reached. billing_url says where to add credits. Nothing was charged.

forbidden403Not retryable

Not allowed for this credential: removing a connection with an API key (people remove them in Fous Studio), or for Studio’s session not a member of the organization, a role that may only read (owners and admins build, run, connect and change methods), or a failed CSRF check.

insufficient_scope403Not retryable

The key lacks the scope this call needs; the message names it.

connection_required403Not retryable

The method runs with an account on its site and none is connected, or it signed out. connect names the platform and type (and connection_id and its status when you have a connection there); connect_url is the Fous Studio page where a person connects it. Sign in there or with POST /v1/connections/{id}/sign-in, or connect one with POST /v1/connections, then run again.

not_found404Not retryable

No such method, run, build or connection. For a method, did_you_mean names the one most likely meant and suggestions lists close matches.

request_timeout408Retryable

The answer took longer than the server waits. A run may still finish: run with a shorter wait and poll GET /v1/runs/{id}.

conflict409Not retryable

Not possible in the state it is in: a method that is not your organization’s (reason not_owned), deleting a public method, publishing under a slug another public method has, a run that was stopped (reason stopped; a write that was already sent carries may_have_run), cancelling a run or build that already ended, dismissing a build that is still running, or a sign-in answer while it still works on the last one (reason sign_in_busy) or for a step that is no longer the current one (reason step_expired).

invalid_input422Not retryable

The input does not fit the method’s input_schema. errors lists every problem at once (unknown names with did_you_mean, missing, wrong types, values outside an enum or range); input_schema is the method’s own and example a call that fits. Nothing was charged.

request_refused422Not retryable

The request check turned a build or a query away; reason is its verdict: unclear or (a query) unsupported, with an example of a request it takes, or explicit, harmful, platform_probe or refused, with doc_url the acceptable use policy. Nothing started or was charged.

not_buildable422Not retryable

A build request that involves no website, app, account or API, so no method can do it; example shows a request that can be built. Nothing started or was charged.

rate_limited429Retryable

Too many requests, searches or runs at once for your plan: limit says which (and its value), retry_after and the Retry-After header when to retry. A site limiting Fous is upstream_error with reason site_rate_limited.

server_error500Retryable

Something failed inside Fous. Try again shortly.

upstream_error503Retryable

The site answered with an error, or its answer no longer fits the method (Fous checks the method on its saved examples and repairs it when they break too). reason site_rate_limited means the site itself slowed you down.

upstream_blocked503Retryable

The site refused the request on every route Fous tried.

upstream_timeout503Retryable

The site did not answer in time, or no browser was free in time.

method_unavailable503Not retryable

The method’s spec itself failed (Fous checks it on its saved examples and repairs it when they fail too). Search for another method or send a query.

method_repairing503Retryable

The version is under repair, confirmed broken: runs are refused until the repair ends, usually within minutes. repair says when it is back at the latest (also Retry-After), version and latest_version which version this is, alternatives which methods do the same. Nothing was charged.

Fous itself (the builder, billing, queries) is briefly unavailable; nothing was started or charged. Retry after retry_after seconds.