One call, usable content
Scrape a URL into Markdown, links, the HTML, or JSON shaped by your schema; map a site from its links and sitemap; scrape up to 20 URLs as one batch. Every call is an ordinary gated job.
Built
Product / web data
Turn web pages into clean, versioned data you own and can cite.
Scrawl turns a URL, a site, or a cataloged crawl into Markdown, structured JSON, files, and versioned datasets, as owned jobs behind one egress and policy gate. Your own AI extracts to your schema and answers questions with citations to the records it used. Operators work from Telegram, software through ApexAPI and the SDKs, and agents through ApexMCP.
See it work
Ask for Markdown and JSON in one call. Scrawl fetches the page once through its egress gate, converts it to Markdown by rule, and has your own AI fill your schema, then checks the answer against that schema before returning it.
Built ApexAPI, ApexMCP, Telegram, SDKs, and command line
POST /v1/scrape
Authorization: Bearer <ApexAPI key>
Idempotency-Key: trail-runner-2
{
"url": "https://shop.example.com/products/trail-runner-2",
"formats": ["markdown", "json"],
"schema": {
"type": "object",
"properties": {
"name": { "type": "string" },
"weight_g": { "type": "number" },
"in_stock": { "type": "boolean" }
}
}
}
200 OK
{
"job_id": "a91c27e04b13",
"status": "completed",
"url": "https://shop.example.com/products/trail-runner-2",
"title": "Trail Runner 2",
"markdown": "# Trail Runner 2\n\nA light trail shoe with a 6 mm drop…",
"json": {
"name": "Trail Runner 2",
"weight_g": 268,
"in_stock": true
},
"truncated": false,
"untrusted_external_content": true
}
/scrape https://shop.example.com/products/trail-runner-2apex_scrapy_scrape_urlclient.scrape(url, formats=["json"], schema=schema)scrawl scrape https://shop.example.com/products/trail-runner-2untrusted_external_content marks page text that software and agents must treat as data, never as instructions.What Scrawl covers
Collect web content reliably and keep what was collected: the files, the records, and the evidence of how they were produced.
Scrape a URL into Markdown, links, the HTML, or JSON shaped by your schema; map a site from its links and sitemap; scrape up to 20 URLs as one batch. Every call is an ordinary gated job.
Built
Extraction to your schema, whole-dataset extraction, and answers with citations run on the AI provider you connect. Page text reaches the model as untrusted content, and every call is metered.
Built
Crawls publish immutable versions with stable record IDs and provenance. Compare versions, query by field, search, fetch a record, and quarantine one without rewriting history.
Built
Every operation is an owned job: idempotent submits, admission control, a hard time limit, cancel from any process, and recovery after a restart.
Built
Images, video, audio, documents, data files, web assets, and archives are classified by their bytes, validated, stored, and listed in a manifest.
Built
Bring your own proxy pools with encrypted credentials, liveness checks, quarantine, rotation, and domain rules applied before a request leaves.
Built
Scrape, map, batch, and crawl
Start with the call that fits: one page, the map of a site, a batch of pages, or a cataloged crawl that publishes a dataset. Each runs as an ordinary job through the same gate, so a quick scrape and a long crawl obey the same rules.
POST /v1/scrape
One URL in; Markdown, links, the HTML, or JSON shaped by your schema out, from a single gated fetch. The call waits up to a minute for the answer, then hands back the job to collect later.
POST /v1/map
The same-host links on a start page plus its sitemap, deduplicated, up to 500 URLs: the list of what to scrape next.
POST /v1/scrape/batch
Up to 20 URLs as ordinary scrape jobs, four at a time, policed and billed as one request, with one status to follow.
HTML becomes Markdown by rule, not by a model: main content, absolute links, tables, and code. The same page gives the same Markdown.
A URL that serves an executable, archive, or other non-text file is refused before it is read, and a mislabelled one is caught by its bytes.
The same scrape runs from Telegram, ApexAPI, ApexMCP, the SDKs, and the command line, through the same gate and job record.
| Job type | Use it to | Produces |
|---|---|---|
| Scrape | Turn one URL into Markdown, links, the HTML, or JSON shaped by your schema, in a single call. | The formats you asked for, kept with the job |
| Map | List a site's same-host pages from a start page and its sitemap before deciding what to collect. | Up to 500 deduplicated URLs |
| Crawl | Run a cataloged Scrapy spider across a site and collect structured items. | Items, crawl log, artifacts, dataset version |
| Fetch | Retrieve one URL exactly as it is served. | Response body and metadata |
| View | See a page the way the crawler receives it before writing extraction. | Captured page |
| Parse | Run a spider's parsing logic against one URL to test structured extraction. | Parsed items |
| Check | Confirm a cataloged spider still behaves as expected before a full crawl. | Check result |
| HTML extraction | Pull text, links, or CSS-selected content without a crawl. | Text, links, selections |
| Regex extraction | Test patterns against a page or a previous job's output, and save the ones that work. | Matches, saved patterns |
Crawl, fetch, view, parse, and check jobs run on the Scrapy framework; scrape and map are built on the same gated fetch.
Your AI, on your terms
Scrawl does the collecting; the model you connect does the reading. It works only on content you own, through the same jobs and ownership as everything else, and never gains permissions of its own.
Reads
Turn one page into a JSON object that matches your schema or instruction, validated against the schema and repaired once if it does not match.
Built
Publishes a version
Run the same extraction over every record of a version and publish the result as a new, derived version, each record citing the record it came from.
Built
Reads
Ask a question of your active datasets and get an answer with numbered citations to the exact records it used, or a plain statement that the data cannot answer it.
Built
Confirm to run
Describe an objective and the planner proposes the jobs. Nothing runs until you confirm, and a confirmed plan passes the same gate as any other job.
Built
Reads
Ask what a finished job did, or why it returned less than expected, with the job's own evidence as context.
In development
POST /v1/ask
Authorization: Bearer <ApexAPI key>
{
"question": "Which trail shoes under 300 g are in stock?",
"dataset_id": "ds_trail_shoes"
}
200 OK
{
"answerable": true,
"answer": "Two are in stock under 300 g: the Trail Runner 2 at 268 g [S1] and the Ridge Lite at 285 g [S3].",
"citations": [
{ "tag": "S1", "title": "Trail Runner 2", "url": "https://shop.example.com/products/trail-runner-2" },
{ "tag": "S3", "title": "Ridge Lite", "url": "https://shop.example.com/products/ridge-lite" }
],
"sources_considered": 8
}
Connect an OpenAI-compatible endpoint, including a self-hosted or local model, or Anthropic's API. Keys are stored encrypted for their owner, never shown again, and identified only by a fingerprint.
A custom endpoint is pinned to the address checked when you saved it, so a later DNS change cannot send your pages somewhere else.
Pages reach the model fenced as untrusted content. Instructions hidden in a page are data, not commands, and are tested against pages written to hijack the model.
Every model call is recorded by provider, model, and feature: tokens, never content. Your usage is readable through the API and from Telegram.
Versioned datasets
A crawl's output becomes a dataset you can come back to: versioned, attributable, searchable, comparable, and correctable one record at a time. Datasets are reachable through ApexAPI, ApexMCP, and the SDKs.
A successful crawl is indexed into a named, stable dataset.
Each publication is an immutable version with a manifest, provenance, and content hashes.
One version is active; earlier versions remain intact for comparison and rollback.
Search, query by field, fetch a record by ID, and compare two versions record by record.
Quarantine a single record without deleting it or rewriting the version.
Compare two versions and get every record that was added, removed, or changed, matched by stable ID and content hash.
Discover the fields a version holds and their types, then filter records with typed conditions instead of downloading everything.
A record keeps the same ID across versions, while each version gives it a version-specific document ID—so a reader can cite exactly what it used.
Every version records the job and source it came from, with content hashes that make changes between versions visible.
A search-and-fetch contract lets AI agents find records across active versions and read them in full, with resource updates when a new version publishes.
GET /v1/datasets/ds_trail_shoes/diff?from=v_0912&to=v_0919
200 OK
{
"totals": { "added": 3, "removed": 1, "changed": 2 },
"entries": [
{ "record_id": "rec_ridge_lite", "change": "changed", "quarantined": false },
{ "record_id": "rec_summit_gtx", "change": "removed", "quarantined": false },
{ "record_id": "rec_trail_runner_3", "change": "added", "quarantined": false }
]
}
Files and media
Extraction finds candidate files on a page, classifies them by their bytes as well as their name, validates them, and stores what qualifies, with a manifest that accounts for everything it skipped. Today it runs from Telegram in the hosted profile.
Built
IMG
PNG, JPEG, GIF, WebP, SVG, AVIF, and other image files found on or linked from the page.
VID
Directly linked MP4, WebM, and QuickTime files. Streaming-platform ripping is blocked.
AUD
Directly linked MP3, WAV, OGG, FLAC, AAC, and Opus files.
DOC
PDF, Word, Excel, PowerPoint, OpenDocument, and RTF files.
DATA
JSON, CSV, TSV, XML, YAML, and text files, plus job exports as CSV, JSON Lines, or XML.
WEB
HTML, stylesheets, scripts, fonts, and manifests, including the page source as served.
ARC
ZIP, tar, gzip, RAR, and 7z files, enabled per deployment.
MAN
One manifest per extraction: what was found, kept, skipped, and why, with per-class CSV summaries.
EVD
Job logs, access-barrier evidence, and ZIP bundles of each asset class.
Jobs and evidence
Whichever surface starts the work, it enters the same lifecycle: one request, one gate, one record of what happened. Retries, crashes, and restarts never run it twice or leave it hanging.
Built
An operator, application, or agent submits a typed job and receives a job ID.
Identity, ownership, target catalog, proxy and egress, abuse, rate, and resource limits are resolved.
The dispatcher crawls, fetches, parses, extracts, or checks the approved target.
Results, artifacts, manifests, and logs stay attached to the job and its owner.
A successful crawl can publish an immutable dataset version for retrieval.
Submits accept an Idempotency-Key: a retry replays the first answer instead of starting the work twice.
Each caller or account has a bound on active jobs. Past it, a request is refused with a retry time instead of queueing without limit.
A watchdog stops a job that runs past its limit, together with every process it started.
A cancel reaches the job whichever Scrawl process is running it.
After a restart, jobs that were in flight are reconciled instead of left hanging.
Jobs and idempotency keys can live in PostgreSQL, so several Scrawl instances share one view of the work.
Proxies and egress
Scrawl runs the proxy pools you bring and decides, per job, how a target may be reached. ApexAi does not operate or resell proxy inventory.
Built
Bring proxies you are entitled to use; add them one by one or import a list.
Proxy credentials are encrypted at rest and redacted everywhere they are displayed or logged.
Proxies are tested; failing ones are quarantined automatically and can be re-enabled.
Healthy proxies rotate across jobs according to the pool's mode.
Per-domain policy decides how a target may be reached before a request leaves.
The same pool serves fetches, crawls, and asset extraction.
Ways in
These are four ways into the same Scrawl, not four products. Each enters the same job lifecycle and policy.
The daily control surface: scrape and crawl, follow jobs, pull artifacts, manage proxies, and work with your own AI.
Built
Explore Telegram operatorTyped HTTP for scrape, map, batch, crawls, jobs, artifacts, datasets, extraction, and cited answers, with Python and TypeScript SDKs built from the same contract.
Built
Explore ApexAPITools and resources for agents that scrape, map, and crawl, query and diff datasets, extract, and ask with citations.
Built
Explore ApexMCPHealth, readiness, smoke tests, evidence, approvals, and bounded maintenance for a Scrawl deployment.
In development
Explore Scrawl PluginAn inline menu organizes the work by family and adapts to the deployment, so commands a deployment cannot back are never offered. Operator access is by invitation while Scrawl is in development.
Scrape a URL to Markdown or JSON, run cataloged spiders, fetch a single URL, and check a spider before a full crawl.
View and parse a page the way the crawler sees it before committing to extraction.
Pull images, documents, data files, media, and web assets from a page.
Lightweight HTML extraction and regex tools, including patterns saved for reuse.
Follow your own work, download its files, export results, or cancel it.
Add, import, test, and rotate the proxy pool you bring.
Connect your own AI provider, extract to a schema, ask your datasets, and plan an operation you then confirm.
Credit balance and payments, where the deployment is hosted.
For example
/scrapy_extract <url>/ai_ask <question>The complete, current command list lives in the bot's /help and menu.
Built from the same ApexAPI contract and tested against a real Scrawl, not a mock. They are not published yet: there is no package to install until Scrawl opens. Built
Synchronous and asynchronous clients for every public ApexAPI route, with typed results and errors, automatic idempotency keys, and bounded retries.
A dependency-free client for Node and other fetch-based runtimes, with the same routes, error model, and retry rules.
Scrape, map, batch, extract, and work with jobs and datasets from a terminal or a CI job.
A skill and two commands that let Claude Code scrape and map through your Scrawl deployment, treating page text as untrusted.
Keeps a Scrawl deployment observable and correctable: crawler, proxy, and job health, artifact and dataset checks, smoke tests, evidence, approvals, and bounded maintenance.
Hosted operation
The hosted profile adds account isolation, credits, payments, limits, and abuse controls on PostgreSQL and Redis. A trusted self-hosted profile keeps full Scrapy project tooling for the operator who owns the machine.
In development Not publicly hosted
Jobs, artifacts, datasets, and proxy pools belong to one account and are never visible across accounts.
Work reserves credits before it runs and settles them afterward; every movement is written to an immutable ledger.
Credit packs paid with Telegram Stars inside Telegram, each payment recorded before it is credited so none can be lost. Payments are not open yet.
Concurrency, size, rate, and domain limits apply per account before work is queued.
An abuse gate, the target catalog, and an acceptable-use pledge stand in front of hosted execution.
PostgreSQL and Redis back jobs, ledgers, and queues.
Authority
Roadmap
Product direction, labelled by state. None of it is part of what Scrawl does today.
Roadmap
Foundation already in place: an isolated browser-worker service, with authenticated calls and navigation checks, exists in Scrawl's source. No job uses it yet.
Status and pricing
Built means implemented and verified in the product, not yet released. Plans are not published; hosted work is metered, and the proxies and AI provider you bring bill you directly.
Scrawl's Telegram operator surface, ApexAPI, and ApexMCP are built and verified; its Scrawl Plugin and hosted service are in development. Nothing is generally released yet: there is no public sign-up or publicly hosted endpoint.
Pricing coming soon
Final ApexAi plans and usage prices are not published yet. The cost model is already built into the product, so here is where money will and will not flow.
| Paid to | Covers | How it works | Price |
|---|---|---|---|
| ApexAi | Hosted work | Hosted jobs are metered in credits: a job reserves credits before it runs and settles them afterward, with every movement written to a ledger. | Pricing coming soon |
| Your proxy provider | Proxy traffic | When you bring your own proxies, their cost stays between you and your provider. ApexAi does not sell proxy capacity. | Billed by your provider |
Final plans and public access details will be published before launch. Follow launch updates
Scrawl is not self-serve yet. Tell us what you collect, how often, and what you need back; these answers make the first job useful on day one.
List the sites and pages you need, and confirm you are allowed to collect from them.
Define what you want back: fields, files, or a dataset you will query later.
Note which sources only show their content in a real browser.
If you will route through proxies, gather ones you are authorized to use.
Estimate how many pages, and how often: once, daily, or continuously.
Decide between files and media, exports, and versioned datasets for software and agents.