{"openapi":"3.1.0","info":{"title":"oassis — web scraping, crawling and browser control for AI agents","version":"1","description":"Scrape any page or document to markdown, map and crawl whole sites, drive a real browser, and search the web. Pay per call with a wallet and no account at all (x402, USDC on Base), or with an API key. POST any route unpaid and it answers 402 with the exact price of that call.","x-mcp":"https://web.oassis.dev/mcp"},"servers":[{"url":"https://web.oassis.dev"}],"paths":{"/v1/scrape":{"get":{"summary":"What /v1/scrape expects","description":"Free and cacheable: the endpoint describes itself, so no key is needed to read it.","responses":{"200":{"description":"The description of this endpoint."}}},"post":{"summary":"Read a page or a document","description":"Processes a page and returns every output you ask for in `formats` at once. A partial failure does not void the rest.","operationId":"web_scrape","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","description":"page to process (or `html`)"},"html":{"type":"string","description":"raw HTML instead of `url`"},"formats":{"type":"array","description":"html, markdown, links, screenshot, pdf, elements, json, accessibility, controls (defaults to [\"markdown\"])"},"selectors":{"type":"array","description":"required with the `elements` format"},"json":{"type":"object","description":"{ prompt, schema } — required with the `json` format"},"screenshot":{"type":"object","description":"{ fullPage, type, quality, omitBackground, selector, viewport }"},"pdf":{"type":"object","description":"{ format, landscape, printBackground, scale }"},"links":{"type":"object","description":"{ visibleOnly, excludeExternal }"},"controls":{"type":"object","description":"{ visibleOnly, limit } — options for the `controls` format"},"wait":{"type":"object","description":"{ until, selector, timeout }"},"request":{"type":"object","description":"{ headers, cookies, userAgent, auth }"},"block":{"type":"object","description":"{ resourceTypes, urlPatterns }"},"documents":{"type":"string","description":"a url pointing at a PDF, Word, Excel, CSV or OpenDocument file is converted to markdown without a browser. Only `markdown` comes out of a document"},"maxAge":{"type":"number","description":"accept an answer up to this many ms old. A cache hit costs $0.0002 instead of the format price, and the price already says so"},"binaryAs":{"type":"string","description":"base64 (the only value for now; \"url\" arrives with storage)"},"viewport":{"type":"object","description":"{ width, height, deviceScaleFactor }"}}},"example":{"url":"https://example.com/product","formats":["markdown","links","pdf","json"],"json":{"prompt":"Product name, price and availability"},"pdf":{"format":"a4"},"wait":{"until":"networkidle0"}}}}},"responses":{"200":{"description":"success: true when at least one format came out · data: one key per requested format that succeeded · errors: one key per format that failed, with the reason · metadata: url, formats, renders, browserMsUsed, ms, title"},"402":{"description":"Payment required. The challenge travels in the PAYMENT-REQUIRED header."}},"x-x402":{"scheme":"exact","network":"eip155:8453","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","payTo":"0x23Fc725e8EAa1c58900C6507Ba89be99a6DFc75d","price":"from $0.001","note":"POST the route unpaid to be quoted the exact price of that call."},"x-mcp-tool":"web_scrape"}},"/v1/session":{"get":{"summary":"What /v1/session expects","description":"Free and cacheable: the endpoint describes itself, so no key is needed to read it.","responses":{"200":{"description":"The description of this endpoint."}}},"post":{"summary":"Open a browser session","description":"Opens a session and navigates. Same fields as /scrape; `formats` defaults to [\"controls\"]. Returns `sessionId`.","operationId":"web_session_open","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"responses":{"200":{"description":"The result."},"402":{"description":"Payment required. The challenge travels in the PAYMENT-REQUIRED header."}},"x-x402":{"scheme":"exact","network":"eip155:8453","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","payTo":"0x23Fc725e8EAa1c58900C6507Ba89be99a6DFc75d","price":"from $0.005","note":"POST the route unpaid to be quoted the exact price of that call."},"x-mcp-tool":"web_session_open"}},"/v1/act":{"get":{"summary":"What /v1/act expects","description":"Free and cacheable: the endpoint describes itself, so no key is needed to read it.","responses":{"200":{"description":"The description of this endpoint."}}},"post":{"summary":"Act on an open browser session","description":"Runs actions against an open session and returns the outputs of the resulting state. The `ref`s from `controls` are what you act on.","operationId":"web_act","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"sessionId":{"type":"string","description":"the session to act on, from POST /session"},"actions":{"type":"array","description":"what to do, in order. One to 25 of the forms listed in `actions`"},"formats":{"type":"array","description":"what to return of the resulting state (defaults to the session's)"}}},"example":{"sessionId":"…","actions":[{"type":{"ref":"input#0","text":"cloudflare workers"}},{"press":"Enter"}],"formats":["controls","markdown"]}}}},"responses":{"200":{"description":"success: true when every action ran · actions: what ran and where it stopped · data: one key per requested format of the state after acting"},"402":{"description":"Payment required. The challenge travels in the PAYMENT-REQUIRED header."}},"x-x402":{"scheme":"exact","network":"eip155:8453","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","payTo":"0x23Fc725e8EAa1c58900C6507Ba89be99a6DFc75d","price":"$0.0005 per action, plus $0.004 per minute the session stays open past the first","note":"POST the route unpaid to be quoted the exact price of that call."},"x-mcp-tool":"web_act"}},"/v1/scrape/batch":{"get":{"summary":"What /v1/scrape/batch expects","description":"Free and cacheable: the endpoint describes itself, so no key is needed to read it.","responses":{"200":{"description":"The description of this endpoint."}}},"post":{"summary":"Read a list of urls","description":"A batch of scrapes: queues one scrape per url you give it. Same fields as /scrape but with `urls` (2–50) and no `url`. Returns a `jobId`. It discovers nothing — for that, use /crawl.","operationId":"web_scrape_batch","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"responses":{"200":{"description":"The result."},"402":{"description":"Payment required. The challenge travels in the PAYMENT-REQUIRED header."}},"x-x402":{"scheme":"exact","network":"eip155:8453","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","payTo":"0x23Fc725e8EAa1c58900C6507Ba89be99a6DFc75d","price":"from $0.001","note":"POST the route unpaid to be quoted the exact price of that call."},"x-mcp-tool":"web_scrape_batch"}},"/v1/map":{"get":{"summary":"What /v1/map expects","description":"Free and cacheable: the endpoint describes itself, so no key is needed to read it.","responses":{"200":{"description":"The description of this endpoint."}}},"post":{"summary":"List a site's urls","description":"Every url of a site: its sitemap, plus the links on the page itself.","operationId":"web_map","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","description":"the site to map"},"limit":{"type":"number","description":"urls to return (default 1000, max 5000)"},"includePage":{"type":"boolean","description":"render the page too, to catch what the sitemap misses (default true)"},"search":{"type":"string","description":"keep only urls containing this text"},"includeSubdomains":{"type":"boolean","description":"default false"},"includePaths":{"type":"array","description":"keep only paths containing one of these"},"excludePaths":{"type":"array","description":"drop paths containing one of these"}}}}}},"responses":{"200":{"description":"The result."},"402":{"description":"Payment required. The challenge travels in the PAYMENT-REQUIRED header."}},"x-x402":{"scheme":"exact","network":"eip155:8453","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","payTo":"0x23Fc725e8EAa1c58900C6507Ba89be99a6DFc75d","price":"from $0.0003","note":"POST the route unpaid to be quoted the exact price of that call."},"x-mcp-tool":"web_map"}},"/v1/crawl":{"get":{"summary":"What /v1/crawl expects","description":"Free and cacheable: the endpoint describes itself, so no key is needed to read it.","responses":{"200":{"description":"The description of this endpoint."}}},"post":{"summary":"Follow a site's links and read it","description":"Starts a crawl from `url`. Same fields as /scrape plus `limit` (pages, default 25, max 200), `maxDepth` (default 2) and the site filters. Returns a `jobId`.","operationId":"web_crawl","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"responses":{"200":{"description":"The result."},"402":{"description":"Payment required. The challenge travels in the PAYMENT-REQUIRED header."}},"x-x402":{"scheme":"exact","network":"eip155:8453","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","payTo":"0x23Fc725e8EAa1c58900C6507Ba89be99a6DFc75d","price":"from $0.001","note":"POST the route unpaid to be quoted the exact price of that call."},"x-mcp-tool":"web_crawl"}},"/v1/search/exa":{"get":{"summary":"What /v1/search/exa expects","description":"Free and cacheable: the endpoint describes itself, so no key is needed to read it.","responses":{"200":{"description":"The description of this endpoint."}}},"post":{"summary":"Search the web","description":"Search the web with Exa's index. A query instead of a url, for when you do not know where to look.","operationId":"web_search_exa","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"query":{"type":"string","description":"what to search for"},"limit":{"type":"number","description":"results (default 10, max 50)"},"snippets":{"type":"boolean","description":"text alongside each result (default true)"},"domains":{"type":"array","description":"only these domains"},"excludeDomains":{"type":"array","description":"never these domains"},"since":{"type":"string","description":"only results published after this ISO date"}}}}}},"responses":{"200":{"description":"The result."},"402":{"description":"Payment required. The challenge travels in the PAYMENT-REQUIRED header."}},"x-x402":{"scheme":"exact","network":"eip155:8453","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","payTo":"0x23Fc725e8EAa1c58900C6507Ba89be99a6DFc75d","price":"from $0.007","note":"POST the route unpaid to be quoted the exact price of that call."},"x-mcp-tool":"web_search_exa"}}},"x-payment":{"protocol":"x402","version":2,"network":"eip155:8453","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","payTo":"0x23Fc725e8EAa1c58900C6507Ba89be99a6DFc75d","note":"No account, no card, no signup: answer the 402 challenge and the call runs."}}