Every change Wellknown observed on this MCP server, newest first, with what it was before and what it became. Tool-surface changes carry the definition diff. Nothing here is edited after the fact.
Changed the definition of "foura_auto", "foura_browser", "foura_proxy" and 1 more
⟨132 unchanged words⟩ reach for another tool: a strict exit country,a pinned exitand apremiumpinned exit live on foura_proxy (auto can only avoid exits, through ignoreProxies, or escalate to a premium exit with exitClass); choosing which browser is presented to the ⟨70 unchanged words⟩
⟨18 unchanged words⟩ sent as-is; objects auto-serialized to JSON."},"exitClass":{"description":"Exit class the call may use, as on foura_proxy. premium lets auto escalate to a premium exit once the standard pool cannot reach the page; it needs a plan with premium exits, and the result's exitClass says which class delivered. standard never escalates; omit for no preference.","enum":["standard","premium"],"type":"string"},"followRedirects":{"description":"Follow up to N ⟨445 unchanged words⟩
⟨176 unchanged words⟩ the budget.","type":"string"},"exitClass":{"description":"Which class of exit delivered, when the request named exitClass: premium or standard. `standard` means the standard pool delivered, which is also the answer once the premium allowance is spent. Neither is an error.","enum":["standard","premium"],"type":"string"},"headers":{"anyOf":[{"items":{" ⟨306 unchanged words⟩ of the session (e.g. `4DZ3VE`) - pass it to foura_single.proxy/orfoura_proxy.proxyfoura_browser.proxy to replay through the same exit. Never a ⟨70 unchanged words⟩
⟨232 unchanged words⟩ , which happens when `proxy` replays one fromfoura_proxy.foura_proxy or foura_auto.","enum":["standard","premium"], ⟨145 unchanged words⟩
⟨556 unchanged words⟩ string"},"profile":{"description":"Thebrowsercataloguefamilyprofile id the rotation moved to after the target refused theonebrowser this request sent. Absent means it went out as written; when present,replay withpass itorasrepeat`profile` to present theversionsamethatbrowserfailed.on the next call.","type":"string"},"proxy":{ ⟨157 unchanged words⟩
⟨247 unchanged words⟩ , which happens when `proxy` replays one fromfoura_proxy.foura_proxy or foura_auto.","enum":["standard","premium"], ⟨234 unchanged words⟩
Certificate changed, valid to 2026-12-22
Changed the definition of "foura_auto", "foura_browser", "foura_proxy" and 1 more
{"$schema":"http://json-schema.org/draft-07/schema#","properties":{"data":{"anyOf":[{" ⟨87 unchanged words⟩ \"Bearer ...\"]]","items":{"additionalItems":false,"items":[{"type":"string"},{"type":"string"}],"maxItems":2,"minItems":2,"type" ⟨373 unchanged words⟩
{"$schema":"http://json-schema.org/draft-07/schema#","additionalProperties":false,"properties":{"attempts":{" ⟨574 unchanged words⟩
Changed the definition of "foura_auto", "foura_browser", "foura_proxy" and 1 more
Give it a public URL and get the content back.ThisUseisit when only thedefaultcontentwhenmattersyouanddon'tnotwanthowtoitchooseis
Certificate recorded, valid to 2026-10-22
Authorization not required
First tool surface recorded: 4 tools (server version 0.6.0)
Showing the latest 7 events. The API returns up to 500 and filters by kind: ?kind=tool_surface_changed
{"$schema":"http://json-schema.org/draft-07/schema#","properties":{"checkStatus":{"description":"Expected ⟨290 unchanged words⟩
{"$schema":"http://json-schema.org/draft-07/schema#","additionalProperties":false,"properties":{"body":{" ⟨384 unchanged words⟩
{"$schema":"http://json-schema.org/draft-07/schema#","properties":{"exitClass":{"description":"Allow ⟨377 unchanged words⟩ , \"application/json\"]]","items":{"additionalItems":false,"items":[{"type":"string"},{"type":"string"}],"maxItems":2,"minItems":2,"type" ⟨505 unchanged words⟩
{"$schema":"http://json-schema.org/draft-07/schema#","additionalProperties":false,"properties":{"attemptReport":{" ⟨748 unchanged words⟩
{"$schema":"http://json-schema.org/draft-07/schema#","properties":{"accept_timeout_ms":{"description":"Timeout ⟨161 unchanged words⟩ \"https://google.com/\"]]","items":{"additionalItems":false,"items":[{"type":"string"},{"type":"string"}],"maxItems":2,"minItems":2,"type" ⟨568 unchanged words⟩
{"$schema":"http://json-schema.org/draft-07/schema#","additionalProperties":false,"properties":{"code":{" ⟨488 unchanged words⟩
⟨93 unchanged words⟩ \"Bearer ...\"]]","items":{"additionalItems":false,"items":[{"type":"string"},{"type":"string"}],"maxItems":2,"minItems":2,"type":"array"},"type":"array ⟨370 unchanged words⟩
⟨64 unchanged words⟩ upstream_client_error (other 4xx), upstream_unknown (defensive). A plan_limit_* code is the caller's own FourA plan refusing (credits, bandwidth, rate, concurrency, browser_daily, premium, feature), not the target: wait out retryAfter or change the plan, never retry the same work through another tool.","type":"string"},"credits":{"description":"Credits this call spent. Reported on failures too: the work was done either way.","type":"number"},"current":{"additionalProperties":false,"description":"Caller's ⟨235 unchanged words⟩ URI to resources/read to retrieve the offloaded body.","type":"string"},"request_id":{"description":"FourA's id for this call, for a support request.","type":"string"},"retryAfter":{ ⟨192 unchanged words⟩
⟨25 unchanged words⟩ apps, lazy-loaded content, or supported browser challenges. You can set your own headers, cookies and userAgent, and checkStatus or checkText turn a navigation that rendered the wrong page into a failure instead of returning it as content. For a protected page, call foura_proxy first and pass its returned proxy ID here to reuse thatexit.same exit, instead of starting a new selection here; with no proxy the session leaves from one fixed address. Set unblocker:false when you want the page exactly as itloads.loads, challenge included. It is the most expensive of the four tools and the slowest, so prefer foura_single or foura_proxy whenever the content is already in the HTML. One FourA API key authenticates every call, the result reports the credits it spent, and a refusal by your own plan arrives as a plan_limit_ code, including plan_limit_browser_daily when the daily browser allowance is spent.
⟨88 unchanged words⟩ upstream_client_error (other 4xx), upstream_unknown (defensive). A plan_limit_* code is the caller's own FourA plan refusing (credits, bandwidth, rate, concurrency, browser_daily, premium, feature), not the target: wait out retryAfter or change the plan, never retry the same work through another tool.","type":"string"},"cookies":{ ⟨53 unchanged words⟩ :"object"},"type":"array"},"credits":{"description":"Credits this call spent. Reported on failures too: the work was done either way.","type":"number"},"current":{"additionalProperties":false,"properties":{" ⟨11 unchanged words⟩ error message","type":"string"},"exitClass":{"description":"`premium` when a premium exit served this call, which happens when `proxy` replays one from foura_proxy.","enum":["standard","premium"],"type":"string"},"headers":{"additionalProperties":{},"description":" ⟨41 unchanged words⟩ URI to resources/read to retrieve the offloaded body.","type":"string"},"request_id":{"description":"FourA's id for this call, for a support request.","type":"string"},"retryAfter":{ ⟨75 unchanged words⟩
Route an HTTP request through rotating proxies,withretryingautomaticonretry.another exit until one delivers. Use it when foura_single is blocked,orand whenever thetargetexitrequiresitself matters: this is the only tool that takes aspecificstrict exit-country allowlist (exitCountries, which never falls back to another country), presents a named browser family per attempt, excludes exits you already know are dead (ignoreProxies), and may escalate to a premium exitcountry.(exitClass, an allowance rather than an instruction). maxTries bounds how many exits are tried and timeout_ms bounds the whole rotation, so a short timeout can end it before maxTries is reached; protected targets often need 25 to 30. validate decides what counts as delivered, and an attempt it rejects is retried on the next exit. The responseincludesreturns theproxyidIDof the exit thatsucceeded;succeeded:reusepassitthatwithreturnedfoura_singleid to foura_single.proxy orfoura_browserfoura_browser.proxy to send the next request from the same exit. A failed rotation returns attemptReport,orwhichexcludeseparatesitexitswiththatignoreProxies.never answered from exits a bot check refused from pages your own rule threw away. Use foura_browser when the page needs JavaScript.SetRotationexitCountriescostsforseveral times astrictsinglecountryrequest.allowlist,OneandFourArequest.browserAPI key authenticates every call,request.osthe result reports the credits it spent,orandrequest.versionatorefusalpresentby your own plan arrives as adifferentplan_limit_browser.code with retryAfter rather than as a block by the target.
{"$schema":"http://json-schema.org/draft-07/schema#","properties":{"exitClass":{"description":"Allow escalation to a premium exit for a target the standard pool cannot deliver. An allowance, not an instruction: the pool still races and usually wins, and the response reports which class served. `standard` forbids escalation. Without premium exits in the plan the call is refused with code plan_limit_premium.","enum":["standard","premium"],"type":"string"},"exitCountries":{"description":"Optional target-visible proxy countries ⟨318 unchanged words⟩ , \"application/json\"]]","items":{"additionalItems":false,"items":[{"type":"string"},{"type":"string"}],"maxItems":2,"minItems":2,"type":"array"},"type":"array ⟨502 unchanged words⟩
{"$schema":"http://json-schema.org/draft-07/schema#","additionalProperties":false,"properties":{"attemptReport":{"additionalProperties":false,"description":"Why a failed rotation ran out of tries. Read `summary` first. Counts over `total` attempts: noResponse (the exit never answered), defense (a bot check was recognised, named in `vendors`), contentRejected (HTTP 200, no bot check, rejected only by your validate.data), statusRejected (rejected by your validate.status), other. `profilesTried` lists the browsers sent, `default` meaning the request went out as written. High contentRejected means the pages arrived and your own rule threw them away: fetch once with foura_single and no validate, then rewrite it.","properties":{"contentRejected":{"maximum":9007199254740991,"minimum":-9007199254740991,"type":"integer"},"defense":{"maximum":9007199254740991,"minimum":-9007199254740991,"type":"integer"},"noResponse":{"maximum":9007199254740991,"minimum":-9007199254740991,"type":"integer"},"other":{"maximum":9007199254740991,"minimum":-9007199254740991,"type":"integer"},"profilesTried":{"items":{"type":"string"},"type":"array"},"statusRejected":{"maximum":9007199254740991,"minimum":-9007199254740991,"type":"integer"},"summary":{"type":"string"},"total":{"maximum":9007199254740991,"minimum":-9007199254740991,"type":"integer"},"vendors":{"items":{"type":"string"},"type":"array"}},"type":"object"},"code":{"description":"Stable error code for ⟨31 unchanged words⟩ do not propose or perform an unscoped fallback. A plan_limit_* code is the caller's own FourA plan refusing (credits, bandwidth, rate, concurrency, browser_daily, premium, feature), not the target: wait out retryAfter or change the plan, never retry the same work through another tool.","type":"string"},"credits":{"description":"Credits this call spent. Reported on failures too: the work was done either way.","type":"number"},"current":{"additionalProperties":false,"properties":{" ⟨127 unchanged words⟩ error message","type":"string"},"exitClass":{"description":"Which class delivered, when the request named exitClass. `standard` means the standard pool answered first, which is also the answer once the premium allowance is spent. Neither is an error.","enum":["standard","premium"],"type":"string"},"exitCountry":{"description":"Latest available two-letter target-visible
⟨10 unchanged words⟩ for static pages, JSON APIs, and server-renderedHTML.HTML, with your own headers, body and cookies. Set browser, os, or version when a target refuses the default Chrome. Pass a proxy id returned by foura_proxy to leave from that same exit. validate decides what counts as success, so a response it rejects comes back as a failure instead of as content; the timeouts nest, with timeout_ms bounding the whole request and the connect, accept and server_response ones bounding stages inside it. Switch to foura_proxyifwhen the response is blocked or the exit country matters, anduseto foura_browser when the page needs JavaScript. One FourA API key authenticates every call, the result reports the credits it spent, and a refusal by your own plan arrives as a plan_limit_ code with retryAfter rather than as a block by the target.
⟨168 unchanged words⟩ \"https://google.com/\"]]","items":{"additionalItems":false,"items":[{"type":"string"},{"type":"string"}],"maxItems":2,"minItems":2,"type":"array"},"type":"array ⟨565 unchanged words⟩
⟨49 unchanged words⟩ upstream_client_error (other 4xx), upstream_unknown (defensive). A plan_limit_* code is the caller's own FourA plan refusing (credits, bandwidth, rate, concurrency, browser_daily, premium, feature), not the target: wait out retryAfter or change the plan, never retry the same work through another tool.","type":"string"},"credits":{"description":"Credits this call spent. Reported on failures too: the work was done either way.","type":"number"},"current":{"additionalProperties":false,"description":"Caller's ⟨121 unchanged words⟩ error message","type":"string"},"exitClass":{"description":"`premium` when a premium exit served this call, which happens when `proxy` replays one from foura_proxy.","enum":["standard","premium"],"type":"string"},"headers":{"anyOf":[{"items":{" ⟨117 unchanged words⟩ offloaded body.","type":"string"},"request_id":{"description":"FourA's id for this call, for a support request.","type":"string"},"retryAfter":{"description":"Seconds to wait before ⟨61 unchanged words⟩ ,"type":"integer"},"total_time":{"anyOf":[{"type":"number"},{"type":"string"},{"type":"null"}],"description":"Wall-clock request duration in seconds. Number when present; string in some variants; null when the request never started.","type":["number","string","null"]}},"type":"object"}