Scrape — General-Purpose Web Scraping & Data Extraction

Scrape websites, extract structured data, and automate browsers.

How to use it

  1. Hit Copy the whole skill.
  2. Claude: ⋯ → Download .md, then Customize → Skills → Add → Upload skill.
    ChatGPT: make a Project and paste it into Instructions.
    Neither? Paste it at the top of a new chat — it works for that chat.
  3. Describe your job in plain words. The AI follows the skill from there.
Claude Code — installs the whole folder, not just SKILL.md
npx degit gooseworks-ai/goose-skills/skills/research-tools/capabilities/web-scraping#main ~/.claude/skills/web-scraping

For one project only, change the path to .claude/skills/web-scraping.

Not working?
  • Check which app you pasted it into — the steps above name the right one.
  • Some skills need the paid tier of Claude or ChatGPT.
Step-by-step guide with screenshots · Ask in the forum

Paste into Claude, ChatGPT or Cursor.

Show the full text442 lines
web-scraping/SKILL.md442 lines18.0 KBpushed 96d agoRawView on GitHub

Scrape — General-Purpose Web Scraping & Data Extraction

Setup

Read your credentials from ~/.gooseworks/credentials.json:

export GOOSEWORKS_API_KEY=$(python3 -c "import json;print(json.load(open('$HOME/.gooseworks/credentials.json'))['api_key'])")
export GOOSEWORKS_API_BASE=$(python3 -c "import json;print(json.load(open('$HOME/.gooseworks/credentials.json')).get('api_base','https://api.gooseworks.ai'))")

If ~/.gooseworks/credentials.json does not exist, tell the user to run: npx gooseworks login

All endpoints use Bearer auth: -H "Authorization: Bearer $GOOSEWORKS_API_KEY"

Scrape websites, extract structured data, and automate browser interactions. Pick the best API for the task — or combine several for comprehensive extraction.

1. Scrapegraph — AI-Powered Scraping with Natural Language

Best for: Extracting data using plain English prompts, converting pages to markdown, crawling with AI extraction, and search-based scraping.

AI-powered extraction (describe what you want in natural language):

curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"scrapegraph","path":"/v1/smartscraper"}'
  "website_url": "https://example.com/products",
  "user_prompt": "Extract all product names, prices, descriptions, and image URLs"
}'

With output schema (enforce structure):

curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"scrapegraph","path":"/v1/smartscraper"}'
  "website_url": "https://example.com/products",
  "user_prompt": "Extract all products",
  "output_schema": {
    "properties": {
      "products": {
        "type": "array",
        "items": {
          "type": "object",
          "properties": {
            "name": {"type": "string"},
            "price": {"type": "number"},
            "description": {"type": "string"}
          }
        }
      }
    }
  }
}'

Search + scrape (search the web and extract from results):

curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"scrapegraph","path":"/v1/searchscraper","body":{"user_prompt":"Find the latest iPhone prices from major retailers"}}'
# Poll for results:
curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"scrapegraph","path":"/v1/searchscraper/{request_id}"}'

Convert page to markdown:

curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"scrapegraph","path":"/v1/markdownify","body":{"website_url":"https://example.com/article"}}'

Crawl with AI extraction:

curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"scrapegraph","path":"/v1/crawl"}'
  "url": "https://docs.example.com",
  "prompt": "Extract all API endpoints and their descriptions",
  "max_pages": 20
}'
# Poll for results:
curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"scrapegraph","path":"/v1/crawl/{task_id}"}'

Raw HTML scrape:

curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"scrapegraph","path":"/v1/scrape","body":{"website_url":"https://example.com"}}'

Get sitemap:

curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"scrapegraph","path":"/v1/sitemap","body":{"website_url":"https://example.com"}}'

Key parameters: stealth (bypass bot protection, +4 credits), total_pages (paginate up to 100), number_of_scrolls (infinite scroll pages), render_heavy_js (React/Vue/Angular SPAs), steps (interaction steps before extraction).

2. Olostep — Scalable Scraping & Batch Jobs

Best for: High-volume scraping, batch processing, site crawling, URL discovery, and AI-powered answers from pages.

Scrape a single page:

curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"olostep","path":"/v1/scrapes","body":{"url_to_scrape":"https://example.com/page"}}'

AI-powered answer from the web:

curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"olostep","path":"/v1/answers","body":{"task":"What is the pricing for Stripe?"}}'

Discover all URLs on a site:

curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"olostep","path":"/v1/maps","body":{"url":"https://example.com","search_query":"pricing"}}'

Crawl a site (async):

# Step 1: Start crawl
curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"olostep","path":"/v1/crawls"}'
  "start_url": "https://docs.example.com",
  "max_pages": 100,
  "include_urls": ["/docs/**"]
}'
# Step 2: Check status
curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"olostep","path":"/v1/crawls/{crawl_id}"}'
# Step 3: Get pages
curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"olostep","path":"/v1/crawls/{crawl_id}/pages"}'
# Step 4: Retrieve content
curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"olostep","path":"/v1/retrieve","body":{"retrieve_id":"RETRIEVE_ID"}}'

Batch scrape (process many URLs at once):

curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"olostep","path":"/v1/batches"}'
  "items": [
    {"url_to_scrape": "https://example.com/page1"},
    {"url_to_scrape": "https://example.com/page2"},
    {"url_to_scrape": "https://example.com/page3"}
  ]
}'
# Check status:
curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"olostep","path":"/v1/batches/{batch_id}"}'
# Get items:
curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"olostep","path":"/v1/batches/{batch_id}/items"}'

Key parameters: formats (markdown/html/text), country (US, CA, IT, IN, GB, JP, etc.), actions (page interactions before scraping), wait_before_scraping, remove_css_selectors, llm_extract.

3. Riveter — Structured Extraction with Defined Schemas

Best for: Extracting data into a consistent, predefined structure. Define input URLs and output fields with prompts.

Simple page scrape:

curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"riveter","path":"/v1/scrape","body":{"url":"https://example.com/article"}}'

Structured extraction (define your output schema):

curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"riveter","path":"/v1/run"}'
  "input": {
    "urls": ["https://example.com/products"]
  },
  "output": {
    "name": {"prompt": "Product name", "contexts": ["urls"]},
    "price": {"prompt": "Product price", "contexts": ["urls"], "format": "number"},
    "description": {"prompt": "Product description", "contexts": ["urls"]}
  }
}'
# Check status:
curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"riveter","path":"/v1/run_status","query":{"run_key":"RUN_KEY"}}'
# Get data:
curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"riveter","path":"/v1/run_data","query":{"run_key":"RUN_KEY"}}'

Multi-URL extraction with tools:

curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"riveter","path":"/v1/run"}'
  "input": {
    "company_urls": ["https://stripe.com", "https://vercel.com"]
  },
  "output": {
    "company_name": {"prompt": "Company name", "contexts": ["company_urls"]},
    "pricing_url": {"prompt": "URL to pricing page", "contexts": ["company_urls"], "format": "url"},
    "pricing_details": {"prompt": "Pricing tiers and costs", "contexts": ["pricing_url"], "tools": ["web_scrape"]}
  }
}'

Key parameters: Output format options (number/json/url/text/email/tag/date/boolean), tools (web_search/web_scrape/query_pdf/query_image), max_tool_calls (0-10), run_when (always/any_filled/all_filled).

4. Brand.dev — Brand Assets, Logos & Company Data

Best for: Extracting brand logos, colors, fonts, design systems, screenshots, and AI-powered data extraction from company websites.

Get full brand data:

curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"brand-dev","path":"/v1/brand/retrieve","query":{"domain":"stripe.com"}}'

By company name / email / ticker:

curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"brand-dev","path":"/v1/brand/retrieve-by-name","query":{"name":"Stripe"}}'
curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"brand-dev","path":"/v1/brand/retrieve-by-email","query":{"email":"[email protected]"}}'
curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"brand-dev","path":"/v1/brand/retrieve-by-ticker","query":{"ticker":"AAPL"}}'

Extract design system / styleguide:

curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"brand-dev","path":"/v1/brand/styleguide","query":{"domain":"linear.app"}}'

Extract fonts:

curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"brand-dev","path":"/v1/brand/fonts","query":{"domain":"vercel.com"}}'

Take website screenshot:

curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"brand-dev","path":"/v1/brand/screenshot","query":{"domain":"github.com","fullScreenshot":"true"}}'

AI-powered data extraction:

curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"brand-dev","path":"/v1/brand/ai/query"}'
  "domain": "anthropic.com",
  "data_to_extract": [{"name": "products", "description": "What products does this company offer?"}]
}'

Extract products:

curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"brand-dev","path":"/v1/brand/ai/products","body":{"domain":"stripe.com"}}'

5. Notte — Browser Automation & Page Interaction

Best for: Scraping pages that require browser interaction, CAPTCHAs, login flows, or complex JavaScript rendering. Also supports autonomous AI agents for multi-step browser tasks.

Quick scrape (no session needed):

curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"notte","path":"/scrape","body":{"url":"https://example.com"}}'

Session-based scraping (for complex interactions):

# Step 1: Start a browser session
curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"notte","path":"/sessions/start","body":{"url":"https://example.com","proxies":true,"solve_captchas":true}}'

# Step 2: Observe available actions
curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"notte","path":"/sessions/{session_id}/page/observe","body":{"instruction":"Find the search box"}}'

# Step 3: Execute actions
curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"notte","path":"/sessions/{session_id}/page/execute","body":{"instruction":"Click the search button"}}'

# Step 4: Scrape the page
curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"notte","path":"/sessions/{session_id}/page/scrape","body":{"only_main_content":true}}'

# Step 5: Stop session
curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"notte","path":"/sessions/{session_id}/stop"}'

AI agent (autonomous multi-step browser task):

curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"notte","path":"/agents/start"}'
  "task": "Go to Google, search for AI news, and summarize the top 5 results",
  "url": "https://google.com",
  "max_steps": 20
}'
# Check status:
curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"notte","path":"/agents/{agent_id}"}'

Take screenshot:

curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"notte","path":"/sessions/{session_id}/page/screenshot","body":{"full_page":true}}'

Key parameters: proxies (rotate proxies), solve_captchas (auto-solve), headless (default true), browser_type (chromium/chrome/firefox), viewport_width/viewport_height.

Tips

  • Simple page scrape: Start with Olostep for raw content or Scrapegraph SmartScraper for AI-extracted data
  • Natural language extraction: Scrapegraph is the go-to — describe what you want in English, optionally pass an output_schema
  • Structured/schema-based extraction: Riveter lets you define exact fields and formats for consistent output
  • Brand assets & logos: Brand.dev for logos, colors, fonts, design systems, and screenshots
  • Bot protection: Use Scrapegraph's stealth: true or Notte's proxies: true + solve_captchas: true
  • JavaScript-heavy SPAs: Use Scrapegraph's render_heavy_js: true or Notte browser sessions
  • Batch/bulk scraping: Olostep batches for processing many URLs at once with constant processing time
  • Async crawls: Olostep and Scrapegraph crawls are async — start with POST, poll for results
  • Page interactions: Use Scrapegraph steps for simple interactions before extraction, or Notte sessions for complex multi-step flows
  • Pagination: Scrapegraph's total_pages (up to 100) handles multi-page extraction automatically
  • Convert to markdown: Scrapegraph /v1/markdownify for clean markdown from any page
  • Combine APIs: For maximum data, use Scrapegraph for AI extraction + Riveter for structured validation + Olostep for raw content

Discover More

List all endpoints for any API, or add a path for parameter details:

curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/search \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"prompt":"scrapegraph API endpoints"}' api show olostep
curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/search \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"prompt":"riveter API endpoints"}' api show brand-dev
curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/search \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"prompt":"notte API endpoints"}'

Example: `curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/details \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"scrapegraph","path":"/v1/smartscraper`"}' for full parameter details.
1---
2name: web-scraping
3description: Scrape websites, extract structured data, and automate browsers. Use when asked to scrape, extract, crawl, parse, or pull data from web pages or any URL.
4source: orthogonal
5---
6 
7 
8# Scrape — General-Purpose Web Scraping & Data Extraction
9 
10## Setup
11 
12Read your credentials from ~/.gooseworks/credentials.json:
13```bash
14export GOOSEWORKS_API_KEY=$(python3 -c "import json;print(json.load(open('$HOME/.gooseworks/credentials.json'))['api_key'])")
15export GOOSEWORKS_API_BASE=$(python3 -c "import json;print(json.load(open('$HOME/.gooseworks/credentials.json')).get('api_base','https://api.gooseworks.ai'))")
16```
17 
18If ~/.gooseworks/credentials.json does not exist, tell the user to run: `npx gooseworks login`
19 
20All endpoints use Bearer auth: `-H "Authorization: Bearer $GOOSEWORKS_API_KEY"`
21 
22 
23Scrape websites, extract structured data, and automate browser interactions. Pick the best API for the task — or combine several for comprehensive extraction.
24 
25## 1. Scrapegraph — AI-Powered Scraping with Natural Language
26 
27Best for: Extracting data using plain English prompts, converting pages to markdown, crawling with AI extraction, and search-based scraping.
28 
29**AI-powered extraction** (describe what you want in natural language):
30```bash
31curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
32 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
33 -H "Content-Type: application/json" \
34 -d '{"api":"scrapegraph","path":"/v1/smartscraper"}'
35 "website_url": "https://example.com/products",
36 "user_prompt": "Extract all product names, prices, descriptions, and image URLs"
37}'
38```
39 
40**With output schema** (enforce structure):
41```bash
42curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
43 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
44 -H "Content-Type: application/json" \
45 -d '{"api":"scrapegraph","path":"/v1/smartscraper"}'
46 "website_url": "https://example.com/products",
47 "user_prompt": "Extract all products",
48 "output_schema": {
49 "properties": {
50 "products": {
51 "type": "array",
52 "items": {
53 "type": "object",
54 "properties": {
55 "name": {"type": "string"},
56 "price": {"type": "number"},
57 "description": {"type": "string"}
58 }
59 }
60 }
61 }
62 }
63}'
64```
65 
66**Search + scrape** (search the web and extract from results):
67```bash
68curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
69 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
70 -H "Content-Type: application/json" \
71 -d '{"api":"scrapegraph","path":"/v1/searchscraper","body":{"user_prompt":"Find the latest iPhone prices from major retailers"}}'
72# Poll for results:
73curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
74 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
75 -H "Content-Type: application/json" \
76 -d '{"api":"scrapegraph","path":"/v1/searchscraper/{request_id}"}'
77```
78 
79**Convert page to markdown:**
80```bash
81curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
82 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
83 -H "Content-Type: application/json" \
84 -d '{"api":"scrapegraph","path":"/v1/markdownify","body":{"website_url":"https://example.com/article"}}'
85```
86 
87**Crawl with AI extraction:**
88```bash
89curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
90 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
91 -H "Content-Type: application/json" \
92 -d '{"api":"scrapegraph","path":"/v1/crawl"}'
93 "url": "https://docs.example.com",
94 "prompt": "Extract all API endpoints and their descriptions",
95 "max_pages": 20
96}'
97# Poll for results:
98curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
99 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
100 -H "Content-Type: application/json" \
101 -d '{"api":"scrapegraph","path":"/v1/crawl/{task_id}"}'
102```
103 
104**Raw HTML scrape:**
105```bash
106curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
107 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
108 -H "Content-Type: application/json" \
109 -d '{"api":"scrapegraph","path":"/v1/scrape","body":{"website_url":"https://example.com"}}'
110```
111 
112**Get sitemap:**
113```bash
114curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
115 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
116 -H "Content-Type: application/json" \
117 -d '{"api":"scrapegraph","path":"/v1/sitemap","body":{"website_url":"https://example.com"}}'
118```
119 
120Key parameters: `stealth` (bypass bot protection, +4 credits), `total_pages` (paginate up to 100), `number_of_scrolls` (infinite scroll pages), `render_heavy_js` (React/Vue/Angular SPAs), `steps` (interaction steps before extraction).
121 
122## 2. Olostep — Scalable Scraping & Batch Jobs
123 
124Best for: High-volume scraping, batch processing, site crawling, URL discovery, and AI-powered answers from pages.
125 
126**Scrape a single page:**
127```bash
128curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
129 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
130 -H "Content-Type: application/json" \
131 -d '{"api":"olostep","path":"/v1/scrapes","body":{"url_to_scrape":"https://example.com/page"}}'
132```
133 
134**AI-powered answer from the web:**
135```bash
136curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
137 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
138 -H "Content-Type: application/json" \
139 -d '{"api":"olostep","path":"/v1/answers","body":{"task":"What is the pricing for Stripe?"}}'
140```
141 
142**Discover all URLs on a site:**
143```bash
144curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
145 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
146 -H "Content-Type: application/json" \
147 -d '{"api":"olostep","path":"/v1/maps","body":{"url":"https://example.com","search_query":"pricing"}}'
148```
149 
150**Crawl a site** (async):
151```bash
152# Step 1: Start crawl
153curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
154 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
155 -H "Content-Type: application/json" \
156 -d '{"api":"olostep","path":"/v1/crawls"}'
157 "start_url": "https://docs.example.com",
158 "max_pages": 100,
159 "include_urls": ["/docs/**"]
160}'
161# Step 2: Check status
162curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
163 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
164 -H "Content-Type: application/json" \
165 -d '{"api":"olostep","path":"/v1/crawls/{crawl_id}"}'
166# Step 3: Get pages
167curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
168 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
169 -H "Content-Type: application/json" \
170 -d '{"api":"olostep","path":"/v1/crawls/{crawl_id}/pages"}'
171# Step 4: Retrieve content
172curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
173 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
174 -H "Content-Type: application/json" \
175 -d '{"api":"olostep","path":"/v1/retrieve","body":{"retrieve_id":"RETRIEVE_ID"}}'
176```
177 
178**Batch scrape** (process many URLs at once):
179```bash
180curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
181 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
182 -H "Content-Type: application/json" \
183 -d '{"api":"olostep","path":"/v1/batches"}'
184 "items": [
185 {"url_to_scrape": "https://example.com/page1"},
186 {"url_to_scrape": "https://example.com/page2"},
187 {"url_to_scrape": "https://example.com/page3"}
188 ]
189}'
190# Check status:
191curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
192 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
193 -H "Content-Type: application/json" \
194 -d '{"api":"olostep","path":"/v1/batches/{batch_id}"}'
195# Get items:
196curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
197 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
198 -H "Content-Type: application/json" \
199 -d '{"api":"olostep","path":"/v1/batches/{batch_id}/items"}'
200```
201 
202Key parameters: `formats` (markdown/html/text), `country` (US, CA, IT, IN, GB, JP, etc.), `actions` (page interactions before scraping), `wait_before_scraping`, `remove_css_selectors`, `llm_extract`.
203 
204## 3. Riveter — Structured Extraction with Defined Schemas
205 
206Best for: Extracting data into a consistent, predefined structure. Define input URLs and output fields with prompts.
207 
208**Simple page scrape:**
209```bash
210curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
211 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
212 -H "Content-Type: application/json" \
213 -d '{"api":"riveter","path":"/v1/scrape","body":{"url":"https://example.com/article"}}'
214```
215 
216**Structured extraction** (define your output schema):
217```bash
218curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
219 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
220 -H "Content-Type: application/json" \
221 -d '{"api":"riveter","path":"/v1/run"}'
222 "input": {
223 "urls": ["https://example.com/products"]
224 },
225 "output": {
226 "name": {"prompt": "Product name", "contexts": ["urls"]},
227 "price": {"prompt": "Product price", "contexts": ["urls"], "format": "number"},
228 "description": {"prompt": "Product description", "contexts": ["urls"]}
229 }
230}'
231# Check status:
232curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
233 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
234 -H "Content-Type: application/json" \
235 -d '{"api":"riveter","path":"/v1/run_status","query":{"run_key":"RUN_KEY"}}'
236# Get data:
237curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
238 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
239 -H "Content-Type: application/json" \
240 -d '{"api":"riveter","path":"/v1/run_data","query":{"run_key":"RUN_KEY"}}'
241```
242 
243**Multi-URL extraction with tools:**
244```bash
245curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
246 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
247 -H "Content-Type: application/json" \
248 -d '{"api":"riveter","path":"/v1/run"}'
249 "input": {
250 "company_urls": ["https://stripe.com", "https://vercel.com"]
251 },
252 "output": {
253 "company_name": {"prompt": "Company name", "contexts": ["company_urls"]},
254 "pricing_url": {"prompt": "URL to pricing page", "contexts": ["company_urls"], "format": "url"},
255 "pricing_details": {"prompt": "Pricing tiers and costs", "contexts": ["pricing_url"], "tools": ["web_scrape"]}
256 }
257}'
258```
259 
260Key parameters: Output `format` options (number/json/url/text/email/tag/date/boolean), `tools` (web_search/web_scrape/query_pdf/query_image), `max_tool_calls` (0-10), `run_when` (always/any_filled/all_filled).
261 
262## 4. Brand.dev — Brand Assets, Logos & Company Data
263 
264Best for: Extracting brand logos, colors, fonts, design systems, screenshots, and AI-powered data extraction from company websites.
265 
266**Get full brand data:**
267```bash
268curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
269 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
270 -H "Content-Type: application/json" \
271 -d '{"api":"brand-dev","path":"/v1/brand/retrieve","query":{"domain":"stripe.com"}}'
272```
273 
274**By company name / email / ticker:**
275```bash
276curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
277 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
278 -H "Content-Type: application/json" \
279 -d '{"api":"brand-dev","path":"/v1/brand/retrieve-by-name","query":{"name":"Stripe"}}'
280curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
281 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
282 -H "Content-Type: application/json" \
283 -d '{"api":"brand-dev","path":"/v1/brand/retrieve-by-email","query":{"email":"[email protected]"}}'
284curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
285 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
286 -H "Content-Type: application/json" \
287 -d '{"api":"brand-dev","path":"/v1/brand/retrieve-by-ticker","query":{"ticker":"AAPL"}}'
288```
289 
290**Extract design system / styleguide:**
291```bash
292curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
293 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
294 -H "Content-Type: application/json" \
295 -d '{"api":"brand-dev","path":"/v1/brand/styleguide","query":{"domain":"linear.app"}}'
296```
297 
298**Extract fonts:**
299```bash
300curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
301 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
302 -H "Content-Type: application/json" \
303 -d '{"api":"brand-dev","path":"/v1/brand/fonts","query":{"domain":"vercel.com"}}'
304```
305 
306**Take website screenshot:**
307```bash
308curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
309 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
310 -H "Content-Type: application/json" \
311 -d '{"api":"brand-dev","path":"/v1/brand/screenshot","query":{"domain":"github.com","fullScreenshot":"true"}}'
312```
313 
314**AI-powered data extraction:**
315```bash
316curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
317 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
318 -H "Content-Type: application/json" \
319 -d '{"api":"brand-dev","path":"/v1/brand/ai/query"}'
320 "domain": "anthropic.com",
321 "data_to_extract": [{"name": "products", "description": "What products does this company offer?"}]
322}'
323```
324 
325**Extract products:**
326```bash
327curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
328 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
329 -H "Content-Type: application/json" \
330 -d '{"api":"brand-dev","path":"/v1/brand/ai/products","body":{"domain":"stripe.com"}}'
331```
332 
333## 5. Notte — Browser Automation & Page Interaction
334 
335Best for: Scraping pages that require browser interaction, CAPTCHAs, login flows, or complex JavaScript rendering. Also supports autonomous AI agents for multi-step browser tasks.
336 
337**Quick scrape** (no session needed):
338```bash
339curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
340 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
341 -H "Content-Type: application/json" \
342 -d '{"api":"notte","path":"/scrape","body":{"url":"https://example.com"}}'
343```
344 
345**Session-based scraping** (for complex interactions):
346```bash
347# Step 1: Start a browser session
348curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
349 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
350 -H "Content-Type: application/json" \
351 -d '{"api":"notte","path":"/sessions/start","body":{"url":"https://example.com","proxies":true,"solve_captchas":true}}'
352 
353# Step 2: Observe available actions
354curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
355 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
356 -H "Content-Type: application/json" \
357 -d '{"api":"notte","path":"/sessions/{session_id}/page/observe","body":{"instruction":"Find the search box"}}'
358 
359# Step 3: Execute actions
360curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
361 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
362 -H "Content-Type: application/json" \
363 -d '{"api":"notte","path":"/sessions/{session_id}/page/execute","body":{"instruction":"Click the search button"}}'
364 
365# Step 4: Scrape the page
366curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
367 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
368 -H "Content-Type: application/json" \
369 -d '{"api":"notte","path":"/sessions/{session_id}/page/scrape","body":{"only_main_content":true}}'
370 
371# Step 5: Stop session
372curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
373 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
374 -H "Content-Type: application/json" \
375 -d '{"api":"notte","path":"/sessions/{session_id}/stop"}'
376```
377 
378**AI agent** (autonomous multi-step browser task):
379```bash
380curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
381 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
382 -H "Content-Type: application/json" \
383 -d '{"api":"notte","path":"/agents/start"}'
384 "task": "Go to Google, search for AI news, and summarize the top 5 results",
385 "url": "https://google.com",
386 "max_steps": 20
387}'
388# Check status:
389curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
390 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
391 -H "Content-Type: application/json" \
392 -d '{"api":"notte","path":"/agents/{agent_id}"}'
393```
394 
395**Take screenshot:**
396```bash
397curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
398 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
399 -H "Content-Type: application/json" \
400 -d '{"api":"notte","path":"/sessions/{session_id}/page/screenshot","body":{"full_page":true}}'
401```
402 
403Key parameters: `proxies` (rotate proxies), `solve_captchas` (auto-solve), `headless` (default true), `browser_type` (chromium/chrome/firefox), `viewport_width`/`viewport_height`.
404 
405## Tips
406 
407- **Simple page scrape**: Start with Olostep for raw content or Scrapegraph SmartScraper for AI-extracted data
408- **Natural language extraction**: Scrapegraph is the go-to — describe what you want in English, optionally pass an `output_schema`
409- **Structured/schema-based extraction**: Riveter lets you define exact fields and formats for consistent output
410- **Brand assets & logos**: Brand.dev for logos, colors, fonts, design systems, and screenshots
411- **Bot protection**: Use Scrapegraph's `stealth: true` or Notte's `proxies: true` + `solve_captchas: true`
412- **JavaScript-heavy SPAs**: Use Scrapegraph's `render_heavy_js: true` or Notte browser sessions
413- **Batch/bulk scraping**: Olostep batches for processing many URLs at once with constant processing time
414- **Async crawls**: Olostep and Scrapegraph crawls are async — start with POST, poll for results
415- **Page interactions**: Use Scrapegraph `steps` for simple interactions before extraction, or Notte sessions for complex multi-step flows
416- **Pagination**: Scrapegraph's `total_pages` (up to 100) handles multi-page extraction automatically
417- **Convert to markdown**: Scrapegraph `/v1/markdownify` for clean markdown from any page
418- **Combine APIs**: For maximum data, use Scrapegraph for AI extraction + Riveter for structured validation + Olostep for raw content
419 
420## Discover More
421 
422List all endpoints for any API, or add a path for parameter details:
423 
424```bash
425curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/search \
426 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
427 -H "Content-Type: application/json" \
428 -d '{"prompt":"scrapegraph API endpoints"}' api show olostep
429curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/search \
430 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
431 -H "Content-Type: application/json" \
432 -d '{"prompt":"riveter API endpoints"}' api show brand-dev
433curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/search \
434 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
435 -H "Content-Type: application/json" \
436 -d '{"prompt":"notte API endpoints"}'
437 
438Example: `curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/details \
439 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
440 -H "Content-Type: application/json" \
441 -d '{"api":"scrapegraph","path":"/v1/smartscraper`"}' for full parameter details.
442 

Discussion

Alternatives

Also in Scraping & extraction