Outcrawl

A web API: 34 capabilities over REST under https://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.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 produced, because downloads do not exist.
profiles.createPOST /v1/profilesMint a durable identity with pinned exit and persistent storage. Use to keep a login across sessions; the identity itself is minted, never chosen.
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 sessions by status, outcome, task or age — twenty replays to watch rather than twenty log lines to guess from.
sessions.getGET /v1/sessions/{id}Fetch one session with its replay URL, duration, page count and usage. This is how a charge is disputed: watch what it bought.
sessions.exportPOST /v1/sessions/{id}/exportExport a session as a portable bundle that plays offline.
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.
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.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.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.

What costs credits

4 of those 34 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, npx @outcrawl/mcp for MCP, or get.outcrawl.ai for the CLI. The SDK is ergonomics, never the only door: an unmodified Playwright script pointed at /connect works.