Trawlspace runs the whole crawl-to-warehouse pipeline for you: on-page and AEO data, LLM enrichment, and change tracking. Clean, complete, and queryable through one API, so your team spends its time on decisions, not plumbing.
/v1/page?url=https://ramp.com/pricing
{
"url": "https://ramp.com/pricing",
"status": 200,
"title": "Ramp Pricing, Free Corporate Cards",
"title_len": 58, "meta_description_len": 149,
"h1": "Pricing that scales with you",
"canonical": "self", "lang": "en-US",
"category": "pricing", // semantic
"entities": ["Ramp", "corporate cards", "spend"],
"topics": ["pricing", "expense mgmt"],
"structured_data": ["Product"],
"headings": { "h2": 6, "h3": 11 },
"word_count": 940, "images_missing_alt": 3,
"links": { "internal": 41, "external": 5, "broken": 0 },
"core_web_vitals": { "lcp_ms": 2100, "cls": 0.02 },
"answer_readiness": 72,
"issues": ["title_too_long", "missing_faq_schema"]
}
You run Screaming Frog, export the CSVs, and wire them into your warehouse by hand. It works until the crawl hangs overnight, an export changes a column and breaks your loader, and every client report is written from scratch. The £199 license was never the cost. Your engineers' and analysts' hours are.
The API is the product. A dashboard sits on top of it, not the other way around.
Start a crawl of any client site with one call. It runs in the cloud and scales from a few hundred pages to millions, rendering JavaScript when a page needs it. Nothing to install, nothing to babysit.
Titles, meta, headings, canonicals, hreflang, robots directives, redirect chains, broken links, Core Web Vitals, structured data, and the internal link graph. Clean JSON, not a desktop export.
Every page mapped to a type and segment, sensible defaults (PDP, PLP, blog, hub) out of the box, plus your own rules by URL pattern, template, or extracted field. Every issue, score, export, and alert rolls up by your categories.
Every page enriched for you: semantic categories, entities, summaries, answer-readiness scores, and schema validation. Want a fix drafted? Trawlspace will draft the JSON-LD, titles, meta, and FAQ too, as an optional output your team takes or leaves.
Clean tables through the API, plus a JSON, CSV, or Parquet export to a signed URL, and a bulk export for big result sets. Provider-agnostic, no lock-in: pipe it into your warehouse, your dashboards, or your own AI agent. Native BigQuery and Snowflake connectors are on the roadmap.
Query the entire indexed site, by field, issue, or category, and full-text across the crawled content. "Every blog post that mentions SOC 2 and is missing FAQ schema" is a single call.
Not a feature list. The real page, the data we pull off it, the issues we rank, and the enrichment we layer on. (Homepage crawled live with Trawlspace; enrichment values illustrative.)
One fetch of the live page, parsed into the fields your audit and your warehouse actually use, with issues flagged inline.
Every finding normalized, typed, and severity-ranked across the whole crawl, filterable and roll-up-able by your own page segments. The critical one first.
For ramp.com/pricing, if you ask, Trawlspace drafts the rewritten title and meta, the schema, and the FAQ block. Your analyst takes it, edits it, or ignores it. You keep the judgment.
Can the AI crawlers reach the page, and is the content answer-ready? We report and score both. This is the part you control, not just a visibility score.
Trawlspace keeps a timestamped snapshot of every crawl, so any two can be diffed field by field, with a plain-language read of what moved and why it matters, an audit log of what changed between publishes. Regressions fire an alert the moment they ship.
Crawl, audit, fix, track change, analyze, and deliver, a request in, a structured result out. Click through the endpoints.
# any live URL, no job required.
# audit + AI recommendation in one call{
"url": "https://ramp.com/pricing",
"status": 200,
"category": "pricing",
"issues": ["title_too_long","missing_faq_schema"],
"recommend": { // AI-generated
"title": "Ramp Pricing: Free Corporate
Cards & Spend Plans",
"faq_schema": { "@type": "FAQPage", "...": "..." }
},
"answer_readiness": { "before": 38, "after": 72 }
}{
"start_url": "https://ramp.com",
"limit": 50000,
"render": "auto",
"checks": ["technical","on_page","aeo"],
"enrich": ["schema","meta","faq"]
}{
"job": "job_9f2a",
"status": "queued",
"estimated_pages": 18400,
"links": { "self": "/v1/jobs/job_9f2a" }
}
# poll for live progress:
GET /v1/jobs/job_9f2a
{ "status": "running", "crawled": 12480,
"discovered": 18400, "percent": 68 }{
"mode": "semantic", // LLM reads each page
"taxonomy": ["PDP","PLP","Blog","Hub",
"Docs","Legal"],
"rules": [ // optional: pin / override
{ "name": "PDP",
"match": "path ~ '^/products/' AND has(price)" },
{ "name": "Blog", "match": "regex:^/blog/" }
]
}{
"mode": "semantic",
"categorized": 18400,
"example": { "url": "/pricing",
"category": "pricing", "confidence": 0.97,
"via": "semantic" },
"custom_rules_applied": 2,
"note": "everything rolls up by category, filter with ?segment=pdp"
}# any field, any filter,
# cursor-paginated{
"url": "https://ramp.com/",
"status": 200,
"title": "Spend Management, Corporate Cards & Accounts Payable ... | Ramp",
"title_len": 69, // may truncate
"meta_description_len": 192, // over 160
"h1": "Time is money. Save both.",
"lang": "en-US",
"links": { "on_page": 90 },
"issues": ["title_too_long","meta_too_long"]
}{
"where": {
"category": "blog",
"content_contains": "SOC 2",
"issue": "missing_faq_schema"
},
"select": ["url","title"],
"limit": 100
}{
"matched": 37,
"results": [
{ "url": "/blog/soc-2-compliance",
"title": "Ramp is SOC 2 Type II ..." },
{ "url": "/blog/security-at-ramp",
"title": "Security at Ramp" }
]
}
# the whole crawl is queryable,
# find the pages that match, then fix them# &type=... &segment=pdp
# &since_job=job_prev[
{ "type": "cdn_blocks_retrieval_bots",
"severity": "critical", "scope": "site",
"detail": "Claude-SearchBot & PerplexityBot
blocked at CDN" },
{ "type": "missing_product_schema",
"severity": "warning", "count": 214 },
{ "type": "meta_description_too_long",
"severity": "warning", "count": 88 }
]# also: redirects, orphans, anchors.
# ?to=/pricing = who links to a page{
"internal_edges": 48210,
"orphans": 37,
"redirect_chains": 12,
"broken": [
{ "from": "/blog/old-guide",
"to": "/resources/gone", "status": 404 }
],
"top_anchors": [
{ "text": "pricing", "count": 210 },
{ "text": "book a demo", "count": 96 }
],
"link_score": { "/pricing": 0.91, "/": 1.0 }
}{
"url": "/pricing",
"tasks": ["schema","meta","faq"],
"brand_voice": "direct, no fluff"
}{
"title": "Ramp Pricing, Free Corporate Cards & Spend Plans",
"meta": "See Ramp's plans: free corporate cards, bill pay, spend controls...",
"schema_jsonld": { "@type": "Product",
"offers": { "price": "0" } },
"answer_readiness": { "before": 34, "after": 71 }
}# diff any two crawls;
# alerts fire on regressions{
"summary": { "regressions": 3,
"improvements": 27, "net_health_delta": -1.4 },
"narrative": "27 pages gained Product schema
(readiness 44 → 61). 3 regressions: the
/pricing canonical now points to a staging
URL, the blog hub went noindex, 8 pages
slowed past LCP 4s.",
"changed_pages": [{ "url": "/pricing",
"field": "canonical", "from": "self",
"to": "staging.ramp.com/pricing" }]
}# site-altitude summary,
# generated across the crawl{
"what_it_is": "Spend-management SaaS: product, pricing, blog; ~18k pages.",
"health": 72,
"answer_readiness": 61,
"coverage_gaps": ["no competitor comparison pages","thin help content"],
"top_fixes": [
{ "fix": "Unblock retrieval AI bots at the CDN",
"impact": "high" },
{ "fix": "Add Product/FAQ schema",
"impact": "high", "pages": 214 }
]
}# robots.txt + CDN, per bot,
# training vs retrieval{
"site_score": 61,
"llm_bot_access": {
"gptbot": "allowed",
"oai-searchbot": "allowed",
"claudebot": "allowed",
"claude-searchbot": "blocked_at_cdn",
"perplexitybot": "blocked_at_cdn",
"google-extended": "allowed"
},
"top_fix": "Allow Claude-SearchBot &
PerplexityBot in your CDN bot rules"
}{
"format": "parquet",
"resource": "pages",
"filter": { "category": "pdp" }
}{
"export": "exp_7",
"status": "ready",
"rows": 18400,
"download_url": "https://.../signed.parquet"
}{
"cadence": "weekly",
"checks": ["technical","aeo"],
"alert": ["slack","email"]
}{
"schedule": "sch_3",
"next_run": "2026-07-17T04:00Z",
"alerts_on": ["noindex_added",
"broken_canonical","ai_bot_blocked"]
}POST /v1/sites then POST /v1/sites/{id}/jobs. Import your existing Screaming Frog scope. We crawl in the cloud and report progress.
We compute every SEO signal, rank the issues, and run the enrichment you asked for across the pages that need it, schema, rewrites, FAQ, answer-readiness.
The moment a job finishes, the results are queryable through the API and exportable as JSON, CSV, or Parquet. Your dashboards keep working; your analysts review, not rebuild.
AEO is part of the job now. Trawlspace audits the site-side of it, the part you can actually fix, and drafts the recommended fix.
We check whether GPTBot, OAI-SearchBot, ClaudeBot, Claude-SearchBot, and PerplexityBot can actually reach each page, at robots.txt and the CDN, and flag the common mistake of blocking the retrieval bots that feed AI answers.
A per-page score for how liftable your content is into an AI answer, schema, server-rendered content, clear headings, extractable Q&A, with the specific fixes to raise it, written for you.
Most AI-visibility tools stop at a score. Trawlspace does the part that moves it, the site-side fix. Measurement finds the gap; we close it.
No keyword research or rank tracking. Keep your Semrush/Ahrefs seat; feed Trawlspace into your stack alongside it.
No local install, no per-seat license games, no single machine that hangs at 2am on a big crawl.
Trawlspace learns your brand voice and positioning from your best pages, scores every page for how well it conveys them, and flags the ones drifting off-message with the exact passages that break. Give AI the right material to describe you the way you mean, not the way it guesses. You decide what to rewrite.
Auto-infer the voice rubric from your best pages, or define it: tone, formality, reading level, sentence structure, vocabulary, and a do/don't lexicon.
Score every page, and watch the Human Edit Rate, the share of drafts your team still has to fix. Alerts fire the moment a page drifts after a CMS edit.
Fine-tune a per-brand model (LoRA adapters) on a curated golden set, so agencies get a cheap, swappable voice model per client.
You pay per page by render tier, with enrichment as a clear add-on, so cost tracks value. No five-figure quotes, no per-URL surprises. Prices are indicative.
Model your book: how many client sites, how big, and how often you crawl. Crawl is cheap. Enrichment is the value. Everything is usage-based, bundled into a plan allowance with overage.
You replace the brittle export-and-ETL pipeline you built around it. Run Trawlspace in parallel against the same seed lists for a cycle, diff the output, and cut over when you trust the data. Keep Screaming Frog on a desktop for one-off manual work if you like.
Yes. Trawlspace doesn't do keyword research or rank tracking. Keep those tools for research; use Trawlspace to crawl, audit, fix, and deliver into your own stack alongside them.
No. Tracking your citations across AI answers is where most tools stop. Trawlspace works the fixable, site-side part: can the AI crawlers reach your pages, is the content answer-ready, and we draft the fix. Measurement finds the gap; moving it is the product.
Today, clean structured results come through the API plus a JSON, CSV, or Parquet export, with a bulk export for large result sets, a far simpler load than parsing Screaming Frog CSVs. Native BigQuery and Snowflake connectors that auto-load each crawl are on the near roadmap.
For flagged pages we generate the real artifact, the JSON-LD, the rewritten title and meta, the FAQ block, the internal-linking suggestion, as reviewable output. Your analyst approves and ships it instead of writing each one from scratch.
We'll run it in parallel with your current pipeline so you can see the difference on your own data: the crawl, the enriched data, and the prioritized issues.