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.
{ "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:
| Code | When |
|---|---|
use_run_action | run got a method that changes something; call run_action. |
use_run | run_action got a method that only reads; call run. |
read_only | A method that changes something was called on the read-only server. |
sign_in_failed | A sign-in ended without signing in. |
stopped | The run was stopped. Over HTTP: 409 conflict, reason: "stopped". |
Limits
| Limit | Value |
|---|---|
| Requests per minute, concurrent runs | Your plan's, in GET /v1/account. A run at the limit waits 10 s, then 429. |
| Wait for a result | 60 s, then 202 while it keeps going. |
| Query | About 3 minutes. |
| Run input and result | Kept 24 hours. |
| Result | 10 MB, then cut and marked truncated. |
| Request body | 4 MB. |
Runs and queries count against both plan limits; searches, builds and sign-ins against requests per minute.
Error codes
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.
No API key, or the key is invalid, revoked or expired; reason says which. Send Authorization: Bearer <key>.
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.
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.
The key lacks the scope this call needs; the message names it.
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.
No such method, run, build or connection. For a method, did_you_mean names the one most likely meant and suggestions lists close matches.
The answer took longer than the server waits. A run may still finish: run with a shorter wait and poll GET /v1/runs/{id}.
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).
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.
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.
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.
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.
Something failed inside Fous. Try again shortly.
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.
The site refused the request on every route Fous tried.
The site did not answer in time, or no browser was free in time.
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.