Outcrawl

A web API: 63 capabilities over REST under https://api.outcrawl.ai/v1, the same capabilities as MCP tools at POST /mcp, and stealth browsers driven over CDP at GET /connect. Authentication is Authorization: Bearer ock_… on every route.

This page is generated from the capability registry at request time, so it lists what this deployment serves and nothing else.

Capabilities

CapabilityRouteSummary
scrapePOST /v1/scrapeFetch one URL and return clean content in the requested formats. Use for a single known page; not for following links, and not for tasks that need decisions.
crawlPOST /v1/crawlWalk a site from a seed URL and stream every page as it is scraped. Use when the set of URLs is unknown; not for one page, and not for content behind a login flow.
crawl.getGET /v1/crawl/{id}Where one crawl has got to: status, pages discovered, pages completed, what it has spent, and the per-URL failures. A row read and not a browser, so it is safe to poll. Use it to learn whether a crawl is still running, or what it reached after a connection dropped; not to fetch the pages, which is /v1/crawl/{id}/results.
crawl.resultsGET /v1/crawl/{id}/resultsThe pages a crawl has delivered, a page at a time, oldest first. Pages land DURING the crawl, so this answers before it has finished, and a cancelled crawl still delivers what it bought. Resume with the `cursor` you last saw. Use it for the content; not for whether the crawl is done, which is /v1/crawl/{id}.
crawl.cancelPOST /v1/crawl/{id}/cancelStop a crawl. It settles with the pages it had reached and everything already delivered stays yours; pages already fetched are still billed, because the `limit` is the protection and not a refund argued afterwards. Use it to stop spending; not to delete the pages.
searchPOST /v1/searchWeb search, optionally with every hit rendered through our scrape pipeline. Use to find pages; not to read one you already have a URL for.
monitors.createPOST /v1/monitorsWatch a URL on a schedule and notify on real change via Discord, Slack or webhook. Use for recurring checks; not for a one-off comparison.
monitors.listGET /v1/monitorsList monitors with their last check status.
monitors.deleteDELETE /v1/monitors/{id}Delete a monitor and stop its schedule. Snapshots are discarded.
agentPOST /v1/agentSubmit a natural-language browser task as a JOB and get an id back in milliseconds. The run is not held open on this call and hours are normal: read outcrawl_agent_status for the answer, outcrawl_agent_results for the records it appended, and outcrawl_agent_cancel to stop it. Use when the page needs decisions or interaction; not for plain reading, where scrape is far cheaper.
agent.listGET /v1/agentYour agent runs, newest first, by status and age: id, task, status, steps, records, credits and replay URL, without the answer. Use to find a run you did not keep the id of; not to read one run's answer, which is outcrawl_agent_status.
agent.getGET /v1/agent/{id}Where one run has got to: status, the plan it stated, what it has spent, and its answer once it has one. Safe to call as often as you like: it is a row read, not a browser. Use it to find out whether a submitted run has finished; not to fetch the records it produced, which is outcrawl_agent_results.
agent.eventsGET /v1/agent/{id}/eventsEverything a run has done, in order, from a cursor: steps, findings, dead ends, plan changes. Ask for the verbosity you want with `level`, and resume with the `after` sequence you last saw rather than re-reading from the start. Use it to watch or audit a run; not to get its answer, which is outcrawl_agent_status.
agent.resultsGET /v1/agent/{id}/resultsThe records a run appended, a page at a time, oldest first. Records land DURING the run, so this answers before the run has finished and a killed run still delivers what it bought. Use it for the data; not for whether the run is done, which is outcrawl_agent_status.
agent.cancelPOST /v1/agent/{id}/cancelStop a run. It settles with whatever it had reached and everything it already appended stays yours; work already performed is still billed, because caps are the protection and not a refund argued afterwards. Use it to stop spending; not to delete the output.
agent.controlPOST /v1/agent/{id}/controlTake the wheel of a live run, or hand it back. Taking it PAUSES the agent where it stands with the browser still open, and answers the URL a person drives it at; handing it back resumes the same run on whatever page you left it on. Use it when a run needs a human for one step (a login you will not automate, a form only you can fill); not to stop a run, which is outcrawl_agent_cancel, and not to answer a question the agent asked, which is outcrawl_agent_answer.
agent.answerPOST /v1/agent/{id}/answerAnswer the question a paused run is waiting on, and it carries on from where it stopped. A run parks when it needs something only you know (which of two options, a detail you did not give it) and reports the question on its status and its event stream. Use it to unblock a run whose status is paused; not to send a run new instructions, which no route does, and not to take over the browser yourself, which is outcrawl_agent_control.
agent.filesPOST /v1/agent/{id}/filesHand a file to a run so it can attach it to a page: at submit time, mid-run, or before its first step. Answers a HANDLE the agent uses with attachFile; you never send the bytes twice and the model never sees them. The file is destroyed when the run ends, on every ending. Use it for something the task needs to upload; not to fetch a file the run downloaded, which is outcrawl_agent_downloads.
agent.downloadsGET /v1/agent/{id}/downloadsEvery file the run's browser downloaded, kept 7 days, up to 200 MB each: name, content type, size, the URL it came from, and a link to the bytes that works for an hour with no API key. Use it to get a file the run downloaded, such as an invoice PDF or a CSV export; not for the run's extracted data, which is outcrawl_agent_results.
agent.secrets.addPOST /v1/agent/{id}/secretsGive a live run one temporary secret, held only in the memory of the machine running it and dropped when the run ends: a text value, a whole card (which may carry its security code), a billing profile (kind details), or one card field such as a stored card’s security code (kind card_field). Answers 204. Use it to answer a run asking for a security code, or to hand a running checkout a card or billing details for this run only; not to store a credential, which is secrets.create.
agent.secrets.intentPOST /v1/agent/{id}/secret-intentsGet a single-use upload URL and token (at most five minutes, dead when the run ends) that let a browser add ONE temporary secret to ONE live run without the value passing through your server: a security code, a whole card, a billing profile or a text value. Name your checkout page’s origin when you mint it to send from your own page; without one, only the Outcrawl console may send it. Not for a value your server holds, which is agent.secrets.add.
profiles.createPOST /v1/profilesCreate a profile with a pinned exit and persistent storage. Use to keep a login across sessions.
profiles.listGET /v1/profilesList profiles, optionally filtered by a label glob.
profiles.getGET /v1/profiles/{id}Fetch one profile: its label, pinned exit and creation time.
profiles.deleteDELETE /v1/profiles/{id}Delete a profile and its stored cookies and site data. Irreversible.
sessions.listGET /v1/sessionsQuery past agent runs and browser sessions by status, outcome, task or age, each with its replay URL, duration, charges and who may watch it. Use to find the session behind a charge or a failure; not for what happened inside one, which is outcrawl_session_network.
sessions.getGET /v1/sessions/{id}Fetch one session with its replay URL, share URL, tabs, duration, page count and charges. This is how a charge is disputed: watch what it bought. Use for one session you hold the id of; not for its requests, which is outcrawl_session_network.
sessions.exportPOST /v1/sessions/{id}/exportExport a session as a portable bundle that plays offline.
sessions.eventsGET /v1/sessions/{id}/eventsEvery event a session recorded, in order, as a stream: tabs, navigations, console, network phases, pointer, video chunks and agent marks, filtered by `kind` and `tab`, resumable with `after`, and kept open on a live session with `follow`. Use to replay or audit a session programmatically; not for a summary of what went wrong, which is the digest.
sessions.networkGET /v1/sessions/{id}/networkEvery request a session made, as a stream of folded rows with headers, timing, protocol, remote address, initiator and sizes; filter by url, method, status, type, tab or duration, opt into stored bodies with `bodies`, and follow a live session with `follow`. Use to debug a session's traffic; not for a summary, which is the digest, and not for one request, which is sessions.request.
sessions.network.digestGET /v1/sessions/{id}/digestWhat went wrong in a session, compactly: failed, blocked and 4xx/5xx requests, the slowest ones, the site's own XHR/fetch calls, per-origin totals, console errors and the tabs, every list capped and no headers or bodies. Use first when a run failed or a page misbehaved; then fetch one request in full with outcrawl_session_request.
sessions.requestGET /v1/sessions/{id}/requestOne request of a session in full, by the `requestId` the digest or the network stream named: request and response headers, timing, protocol, remote address, initiator, redirect, sizes and its stored body when there is one. Not for listing requests.
sessions.consoleGET /v1/sessions/{id}/consoleThe console lines a session's pages produced, a page at a time, oldest first, filtered by level and tab, with the script URL and line when the browser knew them.
sessions.harGET /v1/sessions/{id}/harA session's network as a HAR 1.2 file that opens in a browser's developer tools, with stored bodies inline. Use to hand traffic to a tool that reads HAR; not for reading in code, which is sessions.network.
sessions.videosGET /v1/sessions/{id}/videosLinks to a session's video, one per recorded stretch of each tab, with its time range and size, plus the tabs. Fetch a link with the same API key.
sessions.downloadsGET /v1/sessions/{id}/downloadsEvery file a browser session you drove over /connect downloaded, kept 7 days, up to 200 MB each: name, content type, size, the URL it came from, and a link to the bytes that works for an hour with no API key. Use it to get a file your own script downloaded; not for an agent run's files, which is outcrawl_agent_downloads.
sessions.sharePOST /v1/sessions/{id}/shareChoose who may watch a session besides your own API keys: `private` (your organization, the default), `link` (anyone holding the returned share URL) or `people` (named Outcrawl users, by email). Setting `private` revokes sharing and rotates the link.
sessions.deleteDELETE /v1/sessions/{id}End a live browser session now, a /connect session held for reattach or not: its browser, pages and connections close and billing stops. Use to free a concurrency slot or stop paying for an idle session; not for deleting its recording, which is kept.
usageGET /v1/usageAggregate the same usage numbers already attached to each call. Nothing appears here that was not visible on the call that caused it.
creditsGET /v1/creditsWhat this account has been granted, what it has spent against the grant, and what is left. Use to see a promotional or student balance and when it lapses; not for the monthly plan allowance, and not for per-call cost, which every response already carries.
secrets.createPOST /v1/secretsStore a credential under a handle an agent can reference but never read. Use to save a card or an environment variable for a run to use; not to read one back, which nothing can do.
secrets.listGET /v1/secretsList stored credentials by handle, with the last four digits of a card and nothing else. No route returns a value, and that absence is the point.
secrets.deleteDELETE /v1/secrets/{id}Delete a credential and the record of which runs used it. Takes effect on the next fill: a run holding a grant finds nothing to resolve.
secrets.intentPOST /v1/secrets/intentsGet a single-use, five-minute upload URL and token that let a browser store ONE secret under ONE name without the value passing through your server. Use when a person types a credential into your own web page; not to store a value you already hold, which is secrets.create.
secrets.batchPOST /v1/secrets/batchStore up to 500 credentials in one call, with one result per item and never a value. Use to import a wallet of cards or payment details, retry-safe per handle (onConflict skip or replace); not for one secret, which is secrets.create.
rules.getGET /v1/rulesThe workspace rules and, for each one, whether it is ENFORCED as a gate that blocks a dispatch or is only GUIDANCE in the prompt. Use it to check that a rule you wrote is actually enforced; the class is the answer, not the text.
rules.setPUT /v1/rulesReplace the workspace rules with these plain-language sentences and get the classification back on the same call. Use to forbid something in your own words; a rule that could not be compiled into a gate comes back as guidance with the reason.
integrations.connectPOST /v1/integrationsConnect an MCP server (Gmail, Slack, Twilio) so a run can call its tools mid-task. HTTPS endpoints only, authenticated by a secret handle, and no run reaches it unless the run names it. Use to give an agent a way past a wall the browser cannot climb; not to store the credential itself, which is a secret and has no tool.
integrations.testPOST /v1/integrations/testCheck an MCP server before connecting it: calls its tool list with the credential a secret handle names, and answers ok with the tools it offers, or not ok with the reason (not_mcp, unauthorized, unreachable, missing_secret) and what to do. Stores nothing and grants nothing.
integrations.listGET /v1/integrationsEverything an agent can reach outside the browser: each connected server, the tools it exposes, and the secret handle it authenticates with. This is the blast radius, and a customer who cannot see it cannot consent to it.
integrations.updatePATCH /v1/integrations/{id}Change a connected server's tool list or the secret handle it authenticates with, without disconnecting it. A new secret is checked against the server first and refused if it does not work.
integrations.deleteDELETE /v1/integrations/{id}Disconnect an MCP server. Takes effect on the next call: a run already holding a grant finds the connector gone and is told so. The credential is untouched: it lives in the secrets store and is deleted there.
agent.purchasesGET /v1/agent/{id}/purchasesList the purchases one run opened: merchant, amount, the card by handle and last four, and how each ended (completed, declined, abandoned, unknown, or still reserved). Use to reconcile a run's checkout; not for the run's credits, which are on agent.get.
purchases.listGET /v1/purchasesList every purchase your runs made, newest first, filtered by card, merchant, status or time. Use to reconcile spending across runs; not one run's purchases, which is agent.purchases.
wallet.settings.getGET /v1/wallet/settingsRead the workspace wallet settings: approvalAbove, the purchase amount above which a run pauses for a person's yes. Null means off, the default.
wallet.settings.setPUT /v1/wallet/settingsSet approvalAbove { amount, currency }, or null to turn it off: a purchase within a run's spend cap and above this amount pauses the run until a person answers approve true or false. It never lets a purchase past the cap.
wallet.providers.listGET /v1/wallet/providersList the five card providers a workspace can connect (Privacy.com, Brex, Slash, Stripe Issuing, Airwallex): regions, currencies, the credential fields each needs, what its cards can do, and whether this deployment can connect it now. Use before connecting one; not your connected accounts, which is wallet.connections.list.
wallet.connections.listGET /v1/wallet/connectionsList the card provider accounts this workspace has connected, newest first: handle, provider, account name, status (active, failing, revoked, pending), warnings and cards made this period. Never a credential, and no route returns one.
wallet.connections.getGET /v1/wallet/connections/{id}Read one connected card provider account by id: its status and the reason for it, the account name, warnings from the last test, and when it was last used and tested. Never a credential.
wallet.connections.createPOST /v1/wallet/connectionsConnect a card provider account with a credential your server holds: the provider's test runs first and the credential is sealed only if it passes (422 provider_test_failed, nothing stored, if not). The same handle again rotates the credential, replacing the old one only if the new one passes. Runs then mint one card per run from it.
wallet.connections.intentPOST /v1/wallet/connections/intentsGet a single-use upload URL and token (at most five minutes) that let a browser connect ONE card provider under ONE handle without the credential passing through your server. Name your page's origin to send from your own page; without one, only the Outcrawl console may send it. Not for a credential your server holds, which is wallet.connections.create.
wallet.connections.testPOST /v1/wallet/connections/{id}/testRun the provider's read-only test again on a connected account and get ok, the account name, warnings and the reason it failed. Answers 200 either way, and the connection's status follows the result.
wallet.connections.deleteDELETE /v1/wallet/connections/{id}Disconnect a card provider account: every card a run made from it that is still open is closed first, then the credential is deleted. A run using it fails its next fill with a sentence naming the connection.

What costs credits

4 of those 63 capabilities bill; the rest are free, each for a stated reason. Pricing has the rates, the plans and the reasons.

Clients

npm i @outcrawl/sdk for TypeScript, https://api.outcrawl.ai/mcp for MCP, get.outcrawl.ai for the CLI, or pip install outcrawl for Python. The SDK is ergonomics, never the only door: an unmodified Playwright script pointed at /connect works.