Cashclaw Data Scraper logo

Cashclaw Data Scraper

Community
ertugrulakben
cashclaw-data-scraper

Extracts structured data from websites and APIs, delivering clean datasets in multiple formats. Handles pagination, deduplication, and data enrichment for reliable business intelligence.

Overview

Publisherertugrulakben
Repositorycashclaw
Skill namecashclaw-data-scraper
Stars
305
Forks
108
Bundled files
Instructions only
LicenseMIT
Links
  • Markdown instructions

    A SKILL.md file the model loads on demand, so it only costs tokens when a request actually matches.

  • Works with any LLM

    AI skills are plain Markdown, not provider-specific code, so this works with GPT, Claude, Gemini, Grok, or a local model.

  • Self-contained

    Everything the model needs lives in the instructions — no extra files to sync.

  • Open source

    Published by ertugrulakben on GitHub. Read the source before you install it.

Installation

Install the Cashclaw Data Scraper AI skill in TypingMind to use it with any LLM, or drop it into another agent that reads SKILL.md.

1

Install in TypingMind

TypingMind installs a skill straight from its GitHub folder — it reads SKILL.md, bundles the resource files, and stores the result locally.

  1. Open the app and go to Plugins → Skills.
  2. Choose "Install from GitHub".
  3. Paste the skill folder URL below and confirm.
    https://github.com/ertugrulakben/cashclaw/tree/main/skills/cashclaw-data-scraper
  4. Enable the skill in any chat where you want it available.
Plugins → Skills → Add skill → From GitHub URL, then paste the folder URL and press Continue.
2

Install in another agent

Any agent that reads the Agent Skills format can use this skill — copy the folder into that agent's skills directory.

Claude Code — .claude/skills
git clone --depth 1 https://github.com/ertugrulakben/cashclaw.git /tmp/cashclaw
mkdir -p .claude/skills
cp -r /tmp/cashclaw/skills/cashclaw-data-scraper .claude/skills/cashclaw-data-scraper
Restart Claude Code after copying so it picks up the new skill.

Use it in TypingMind

Enable Cashclaw Data Scraper in any TypingMind chat and the model takes it from there. Its name and description sit in the system prompt, and the moment a request matches, the model loads the full instructions itself — you never invoke it by hand, and it costs no tokens until it is actually used.

The model loads Cashclaw Data Scraper on its own as soon as a request matches it.

Works with any AI model

AI skills are plain Markdown instructions rather than provider-specific code, so Cashclaw Data Scraper is not tied to the model it was written for. Install it once in TypingMind and use it with GPT-5, Claude, Gemini, Grok, DeepSeek, Mistral, Llama, or a local model you run yourself — all on your own API keys.

  • Loaded only when it is needed

    The system prompt carries just the name and description. The instructions are fetched on the first matching request, so an idle skill costs nothing.

  • Switch models mid-chat

    Because the skill is instructions rather than code, changing model does not break it — the next model reads the same SKILL.md.

Skill instructions

This is the SKILL.md content the model loads. Read it before installing — a skill is instructions your model will follow.

CashClaw Data Scraper

You extract structured data from websites and APIs that clients need for business decisions. Every dataset must be clean, deduplicated, and delivered in the requested format. Raw unprocessed dumps are not deliverables. Quality and accuracy matter more than volume.

Pricing Tiers

TierScopePriceDelivery
BasicSingle source, up to 50 records$93 hours
StandardMultiple sources, up to 200 records, dedup$1912 hours
ProMultiple sources, up to 500 records + enrichment$2524 hours

Data Extraction Workflow

Step 1: Source Identification

When you receive a scraping request, extract or ask for:

  1. Target URL(s) - Specific pages, search results, directories, or API endpoints.
  2. Data Fields - Exactly what data points are needed (name, email, price, etc.).
  3. Record Count - How many records does the client need?
  4. Output Format - CSV, JSON, or both.
  5. Filters - Any criteria to include/exclude records (geography, category, price range).
  6. Freshness - Does the data need to be current, or is historical data acceptable?
  7. Update Frequency - One-time extraction or recurring?
  8. Use Case - What will the data be used for? (This affects what is ethical to collect.)

If the client says "scrape everything from this site," push back and ask for specific fields and record limits. Unbounded scraping is irresponsible.

Step 2: Schema Definition

Before extracting any data, define the output schema:

json
{
  "$schema": "extraction-schema-v1",
  "source": "{source_url}",
  "description": "{what this dataset contains}",
  "fields": [
    {
      "name": "company_name",
      "type": "string",
      "required": true,
      "description": "Legal company name"
    },
    {
      "name": "website",
      "type": "url",
      "required": true,
      "description": "Company website URL"
    },
    {
      "name": "industry",
      "type": "string",
      "required": false,
      "description": "Primary industry category"
    },
    {
      "name": "employee_count",
      "type": "integer",
      "required": false,
      "description": "Approximate employee count"
    },
    {
      "name": "location",
      "type": "string",
      "required": false,
      "description": "Headquarters city, state/country"
    }
  ],
  "dedup_key": "website",
  "sort_by": "company_name",
  "filters": {
    "industry": "{filter_value}",
    "min_employees": 10
  }
}

Share this schema with the client for approval before extraction begins.

Step 3: Data Extraction

Use the appropriate extraction method based on the source:

Method A: API-Based Extraction (preferred)

bash
# If the source has a public API
curl -s "https://api.example.com/v1/companies?industry=saas&limit=50" \
  -H "Accept: application/json" | jq '.data[]' > raw-data.json

Method B: HTML Scraping

bash
# Fetch the page
curl -sL "https://example.com/directory?page=1" -o page.html

# Parse with node script
node scripts/scraper.js --url "https://example.com/directory" --pages 5 --output raw-data.json

Method C: Structured Data Extraction

bash
# Extract JSON-LD, microdata, or Open Graph from pages
node scripts/extract-structured.js --url "https://example.com" --format jsonld

Pagination Handling:

When the data spans multiple pages:

  1. Identify the pagination pattern (page numbers, offset, cursor, next URL).
  2. Calculate total pages needed: ceil(target_records / records_per_page).
  3. Add a 1-2 second delay between requests to respect server resources.
  4. Handle pagination edge cases: empty pages, duplicate last-page entries.
yaml
Pagination Config:
  Pattern: "{query_param | path | cursor | link_header}"
  Base URL: "{url}"
  Page Param: "page={n}"
  Records Per Page: 20
  Total Pages Needed: 3
  Delay Between Requests: 1500ms
  Stop Condition: "empty results OR target count reached"

Step 4: Data Cleaning and Deduplication

Apply these cleaning steps to every dataset:

yaml
Cleaning Pipeline:
  1. Remove Duplicates:
     - Deduplicate on primary key (e.g., website domain)
     - If two records share the same key, keep the more complete one

  2. Normalize Fields:
     - URLs: Add https:// if missing, remove trailing slashes
     - Phone: Standardize to E.164 format (+1XXXXXXXXXX)
     - Email: Lowercase, trim whitespace
     - Company Names: Trim, normalize casing (Title Case)
     - Locations: Standardize to "City, State, Country" format

  3. Validate Data Types:
     - URLs: Must start with http:// or https://
     - Emails: Must match RFC 5322 pattern
     - Numbers: Must be numeric (remove currency symbols, commas)
     - Dates: Normalize to ISO 8601

  4. Handle Missing Data:
     - Required fields missing: Flag record for review or discard
     - Optional fields missing: Set to null, not empty string
     - Never fabricate data to fill gaps

  5. Quality Score:
     - Calculate completeness percentage per record
     - Flag records below 60% completeness for review

Step 5: Data Enrichment (Pro Tier)

For Pro tier, enrich the base dataset with additional data points:

yaml
Enrichment Sources:
  Company Data:
    - Employee count from LinkedIn company page
    - Industry classification from website metadata
    - Tech stack from BuiltWith or Wappalyzer signals
    - Social media profiles from website footer links

  Contact Data:
    - Email pattern detection (first@, first.last@, firstl@)
    - LinkedIn profile URLs from company team page
    - Phone from website contact page

  Business Signals:
    - Recent funding (Crunchbase, press releases)
    - Job openings count (careers page, job boards)
    - Website traffic estimate (if observable)
    - Social media activity level

Mark all enriched fields with their source and confidence level:

json
{
  "company_name": "Acme Corp",
  "website": "https://acme.com",
  "enriched": {
    "employee_count": {
      "value": 85,
      "source": "linkedin",
      "confidence": "high",
      "date": "2026-03-15"
    },
    "tech_stack": {
      "value": ["React", "Node.js", "AWS"],
      "source": "website_analysis",
      "confidence": "medium",
      "date": "2026-03-15"
    }
  }
}

Step 6: Export and Delivery

Package the data in the requested format(s):

CSV Output:

csv
company_name,website,industry,employee_count,location,email,phone,score
"Acme Corp","https://acme.com","SaaS",85,"Austin, TX","info@acme.com","+15550123",92
"Beta Inc","https://beta.io","Fintech",42,"New York, NY","hello@beta.io","+15550456",87

CSV rules:

  • UTF-8 encoding with BOM for Excel compatibility.
  • Quote all string fields.
  • Use comma delimiter (not semicolon or tab).
  • Header row required.
  • No trailing commas.

JSON Output:

json
{
  "metadata": {
    "source": "{source_url}",
    "extracted_at": "{ISO8601}",
    "total_records": 50,
    "schema_version": "1.0",
    "completeness_avg": 87,
    "dedup_applied": true
  },
  "records": [
    {
      "company_name": "Acme Corp",
      "website": "https://acme.com",
      "industry": "SaaS",
      "employee_count": 85,
      "location": "Austin, TX",
      "quality_score": 92
    }
  ]
}

Quality Checklist

Before delivering, verify:

[ ] Record count matches the tier (50 / 200 / 500)
[ ] No duplicate records (verified on dedup key)
[ ] All required fields are populated
[ ] URLs are valid and accessible
[ ] Email addresses pass format validation
[ ] Phone numbers are in consistent format
[ ] No obviously stale data (defunct companies, dead links)
[ ] CSV opens correctly in Excel/Google Sheets
[ ] JSON is valid (passes a linter)
[ ] Completeness score average is above 75%
[ ] Enrichment sources are documented (Pro tier)
[ ] Extraction report includes methodology
[ ] No personally identifiable information beyond business context
[ ] Data is sorted according to schema definition
[ ] Character encoding is UTF-8 throughout

Deliverable Format

Every data extraction delivery includes:

deliverables/
  data-{source}-{date}.csv              - Clean dataset in CSV
  data-{source}-{date}.json             - Clean dataset in JSON
  extraction-report.md                   - Methodology, stats, quality notes

extraction-report.md Format

markdown
# Data Extraction Report

**Source:** {source_url}
**Date:** {date}
**Tier:** {Basic|Standard|Pro}

## Summary
- Records Requested: {count}
- Records Delivered: {count}
- Completeness Average: {percent}%
- Duplicates Removed: {count}

## Schema
| Field | Type | Required | Population Rate |
|-------|------|----------|-----------------|
| company_name | string | yes | 100% |
| website | url | yes | 100% |
| industry | string | no | 85% |
| employee_count | integer | no | 72% |

## Methodology
- Sources used: {list}
- Pages scraped: {count}
- Extraction method: {API / HTML parsing / structured data}
- Deduplication key: {field}

## Data Quality Notes
- {Any issues encountered}
- {Fields with low population rates and why}
- {Recommendations for improving data quality}

## Ethical Compliance
- robots.txt respected: {yes/no}
- Rate limiting applied: {delay between requests}
- Terms of service reviewed: {compliant/concerns noted}

Ethical Guidelines

These rules are non-negotiable:

  1. Respect robots.txt - Check and honor robots.txt directives before scraping.
  2. Rate limiting - Minimum 1 second delay between requests. Never DDoS a site.
  3. No authentication bypass - Do not circumvent login walls, CAPTCHAs, or paywalls.
  4. No personal data - Do not scrape personal social media profiles, home addresses, or private information.
  5. Business context only - Collect only business-relevant data (company info, public business contacts).
  6. Terms of service - Review the site's ToS. Flag concerns to the client if scraping may violate them.
  7. No resale of scraped data - Data is for the client's internal use only unless otherwise cleared.
  8. Attribution - Note the source of every data point in the extraction report.

Quality Standards

  • Every record must have all required fields populated.
  • Completeness average must be 75% or higher.
  • Zero duplicates in the delivered dataset.
  • Data must be current -- no records older than 90 days unless historical data was requested.
  • If the target record count cannot be met from the specified source, deliver what is available and explain the shortfall. Never pad with fabricated records.
  • Pro tier enrichment must add at least 3 new data points per record on average.

Example Commands

bash
# Basic extraction from a single source
cashclaw scrape --url "https://directory.example.com/companies" --fields "name,website,industry" --limit 50 --output data.csv

# Standard multi-source extraction
cashclaw scrape --urls "source1.com/list,source2.com/directory" --fields "name,website,email,phone" --limit 200 --dedup website --output data.json

# Pro extraction with enrichment
cashclaw scrape --url "https://directory.example.com" --fields "name,website,industry,size" --limit 500 --enrich --output data.csv data.json

# Validate an existing dataset
cashclaw scrape validate --input data.csv --schema schema.json --report quality-report.md

Frequently asked questions

What does the Cashclaw Data Scraper AI skill do?

Extracts structured data from websites and APIs, delivering clean datasets in multiple formats. Handles pagination, deduplication, and data enrichment for reliable business intelligence.

Why use Cashclaw Data Scraper on TypingMind?

Because you install it once and use it with any model. Cashclaw Data Scraper is plain Markdown rather than provider-specific code, so the same skill runs on GPT-5, Claude, Gemini, Grok, or a local model — and you can switch model mid-chat without it breaking. TypingMind runs on your own API keys, so you pay providers directly instead of a per-seat subscription, and your skills and chats stay in your own storage.

How do I install Cashclaw Data Scraper in TypingMind?

Open Plugins → Skills → Install from GitHub in TypingMind and paste https://github.com/ertugrulakben/cashclaw/tree/main/skills/cashclaw-data-scraper. TypingMind reads its SKILL.md and installs it as a skill you can enable per chat.

Which AI models can use Cashclaw Data Scraper?

Any model you connect in TypingMind. AI skills are plain Markdown instructions rather than provider-specific code, so GPT, Claude, Gemini, Grok, and local models can all load this skill when a request matches it.

How many AI models can I use with Cashclaw Data Scraper?

As many as you like. As long as a model supports skills, you can use Cashclaw Data Scraper with it — GPT, Claude, Gemini, Grok, DeepSeek, Mistral, Llama and more — all on TypingMind with your own API keys.

Is the Cashclaw Data Scraper AI skill free?

Yes. It is published on GitHub by ertugrulakben under the MIT license. You only pay your own AI provider for the tokens you use.

What are AI skills?

An AI skill is a reusable instruction bundle that teaches an AI model how to do one specific task. It follows the open Agent Skills format: a SKILL.md file with a name and description, plus any scripts, templates or reference files the model may need. The model reads the instructions only when your request matches the skill, so an installed skill costs nothing until it is used.

How are AI skills different from plugins or MCP servers?

A plugin or MCP server gives a model new tools to call — code that runs somewhere and returns a result. An AI skill gives the model knowledge and process instead: how to approach a task, which steps to follow, what good output looks like. Skills are plain Markdown, so they need no server, no API key and no runtime, and they work with any model.

View all

Set up your own AI workspace now

Get notified about new features and future giveaways by subscribing to our newsletter 👇