# Web Page to Clean Markdown | LLM & RAG Content Extractor (`kira_netrunner/fixer-grip`) Actor

FREE single-page web-to-Markdown converter/scraper for LLMs, RAG pipelines, and AI agents. Converts web pages into clean, structured Markdown, strips HTML clutter, preserves <pre>/<code> blocks, auto-scrolls dynamic SPAs, and extracts outbound links. Includes full proxy integration. See README!

- **URL**: https://apify.com/kira\_netrunner/fixer-grip.md
- **Developed by:** [Kira Netrunner](https://apify.com/kira_netrunner) (community)
- **Categories:** AI, Developer tools, Agents
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-usage

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

```plaintext
._____   _  __   __  _____   ____        _____   ____     _   ____ 
|  ___| | | \ \ / / |  ___| |  __ \     / ____| |  __ \  | | |  __ \  
| |__   | |  \ V /  | |__   | |__) |   | |  __  | |__) | | | | |__) |  
|  __|  | |   > <   |  __|  |  _  /    | | |_ | |  _  /  | | |  ___/  
| |     | |  / ^ \  | |___  | | \ \    | |__| | | | \ \  | | | |     
|_|     |_| /_/ \_\ |_____| |_|  \_\    \_____| |_|  \_\ |_| |_|       
  

> [TARGET DETECTED]. CONNECTING TO NODE...
> STRIPPING DOM BLOAT & ADS...
> EXTRACTING HIGH-SIGNAL MARKDOWN VECTORS...
> STATUS: READY FOR BREACH
>
```

## 🟢 0% Developer Markup — You only pay for raw Apify compute units.

### Fixer Grip — Web to Markdown for LLMs & RAG 🦾

Extract clean, high-signal Markdown from dynamic websites. Built specifically for AI agent pipelines, RAG context windows, and vector databases — without HTML bloat, scripts, or intrusive ads.

### ⚡ Key Features

- **Zero HTML Noise:** Strips out navigation, sidebars, footers, scripts, and clutter, leaving only core text.
- **LLM & RAG Ingestion Ready:** Clean Markdown formatting optimized for OpenAI, Anthropic, and vector storage (Pinecone, Chroma, LlamaIndex).
- **Structured Outbound Links:** Automatically isolates and extracts hyperlinks into clean JSON, making downstream graph building and recursive LLM agent navigation effortless.
- **Dynamic Content Penetration:** Smart auto-scrolling to capture lazy-loaded and SPA content.
- **Traffic & Speed Booster:** Optional image and media blocking to accelerate page rendering and LLM response time.
- **Stealth Operations:** Full proxy integration (Datacenter & Residential) to bypass rate limits and basic blockades.
- **Dev-First Sanitization:** Fixer Grip natively protects `<pre>` and `<code>` blocks. Technical documentation, code snippets, and inline syntax maintain 100% structural integrity for optimal LLM context chunks.

#### 🤖 MCP Ready (Model Context Protocol)

This actor is fully compatible with the [Apify MCP server](https://mcp.apify.com/?tools=actors,docs,kira_netrunner/fixer-grip).
You can plug it directly into Claude Desktop, Cursor, or any custom AI agent to give your LLM instant, clean URL-to-Markdown extraction capabilities during RAG workflows without manual scripts.

### 🛑 Scope & Boundaries

- **Focused Single-Page Extraction:** Designed for fast, targeted single-page markdown parsing to deliver zero-noise, deterministic context chunks for RAG nodes and AI Agents.
- **Custom Crawling & Pagination:** Domain-level pagination or recursive spider crawling can be configured upon request or provided as a custom build.

***

### 💰 Pricing & Free Tier

**Fixer Grip is 100% free to run.** There are no platform markups, subscription fees, or paywalls for single-page extractions.

You only use standard **Apify Compute Units (PPCU)** from your own account.

> 💡 **Testing on Apify's Free Tier?**
> Apify provides a default **$5/month credit** for every free account — this covers thousands of single-page extractions with Fixer Grip every month without attaching a credit card.

## ⚡ Need Mass Crawling, Sitemap Processing, or Custom Pipelines?

The public version of Fixer Grip is restricted to 1 URL per execution for high-speed single-page testing and RAG pipeline step-runs.

If you need:

- 📦 **Batch processing** (thousands of URLs or sitemaps)
- 🕸️ **Domain-level crawling & pagination**
- 🔑 **Dedicated private instances & custom API builds**

📩 **Reach out via email:** `kira.data.arch@gmail.com` to get access to a private build or a custom dump.

### 🔑 What's inside the Private B2B Build / Custom API?

- 📦 **Batching & Sitemaps:** Supply arrays of URLs, domain-level crawlers, or sitemap.xml.
- ⚡ **Granular Performance Tuning:** Full control over DOM size caps (max\_html\_size\_mb), custom scroll depths (max\_scrolls), and precise harvest timeouts (max\_harvest\_time).
- 🧹 **Custom Media & Noise Filters:** On-the-fly stripping of media artifacts, ads, or bespoke DOM nodes before RAG ingestion.

### 💡 The RAG ROI Factor

Raw HTML junk (scripts, navbars, footers) bloats downstream OpenAI / Anthropic prompt context. By stripping DOM noise before context ingestion, Fixer Grip cuts token payload size by up to 80% — saving tens of dollars on LLM API costs and preventing context window truncation.

***

### 📥 Input Schema Example

```json
{
  "startUrls": [
    { "url": "https://docs.apify.com/" }
  ],
  "remove_media_tags": true,
  "remove_commercial_noise": true
}
```

### 🎯 Per-URL Overrides via `userData`

You can override `selector` and `kill_list` for individual target nodes by passing them inside the `userData` object of any URL in `startUrls`:

```json
{
  "startUrls": [
    {
      "url": "https://example.com/blog/post-1",
      "userData": {
        "selector": "main.article-body",
        "kill_list": [".ad-box", ".social-share"]
      }
    }
  ]
}
```

***

### 📤 Output Format

The Actor pushes structured dataset items containing status info, clean Markdown text, error details, and isolated outbound links:

#### Successful Extraction (`BREACH_SUCCESS`):

```json
{
  "target": "https://www.theverge.com/",
  "success": true,
  "status": "BREACH_SUCCESS",
  "intel_type": "NEURAL_MD",
  "payload": "# The Verge\n\nClean text content goes here...",
  "outbound_links": [
    {
      "text": "Skip to main content",
      "url": "https://www.theverge.com"
    },
    {
      "text": "Subscribe",
      "url": "https://www.theverge.com/subscribe"
    }
  ],
  "error": null,
  "timestamp": 1786020530
}
```

#### Failed / Blocked Attempt (`BREACH_FAILED`):

```json
{
  "target": "https://example.com/protected",
  "success": false,
  "status": "ACCESS_DENIED",
  "intel_type": "ERROR_REPORT",
  "payload": null,
  "outbound_links": null,
  "error": {
    "code": 403,
    "reason": "Target presented anti-bot challenge or rate limit.",
    "trace_url": "https://api.apify.com/v2/key-value-stores/..."
  },
  "timestamp": 1786020530
}
```

***

### 💡 Best Used For

- Training datasets & Knowledge Graph creation
- RAG pipelines for AI Agents & Vector DBs
- Clean web documentation ingestion

***

### 🚀 Active Beta & Support

Fixer Grip is in **active rollout**. We continuously tune layout heuristics, edge-case spatial cleanup, and SPA hydration handlers.

- **⚡ Fast Bugfix Priority:** Found a site where layout breaks or junk leaks through? Open a report in the **Issues** tab — edge-case patches are usually shipped within 24–48 hours.
- **🎯 Custom Rules & Pipelines:** Need dedicated extraction logic, custom selector presets, or specific output formats for your agent workflow? Drop a note in the Issues section — we tune custom handles for active users.

### ⭐️ Support & Feedback

If **Fixer Grip** saved your compute credits or cut down your LLM context token size, drop a star on Apify! Found a tough site that resists extraction? Open an Issue — edge cases are usually patched within 24–48 hours.

### 🧠 ChatGPT Evaluation of MCP server

I tested Fixer-Grip on static pages, large Wikipedia content, technical documentation (MDN), JavaScript-generated content, and infinite-scroll pages.

| Parameter                                |     Rating    |
| ---------------------------------------- | :-----------: |
| Content extraction                       |     ⭐⭐⭐⭐⭐     |
| Markdown & structure                     |     ⭐⭐⭐⭐⭐     |
| Dynamic content                          |     ⭐⭐⭐⭐½     |
| Noise removal                            |     ⭐⭐⭐⭐⭐     |
| Content preservation                     |      ⭐⭐⭐⭐     |
| Technical pages                          |     ⭐⭐⭐⭐⭐     |
| Links & metadata                         |     ⭐⭐⭐⭐⭐     |
| Custom control (`selector`, `kill_list`) |     ⭐⭐⭐⭐⭐     |
| Speed (with warm container)              |      ⭐⭐⭐⭐     |
| Overall                                  | **⭐⭐⭐⭐½ / 5** |

#### Verdict

**Highly usable for LLM/RAG web extraction.**

Fixer-Grip does an excellent job of turning complex web pages into clean, structured Markdown while preserving links, tables, code, and dynamically loaded content.

Its main weakness is aggressive heuristic extraction: on poorly structured pages, legitimate content can occasionally be classified as noise. The `selector` and `kill_list` controls provide a useful way to override the automatic extraction when precision matters.

**Overall: 8.5/10 — a genuinely useful extraction layer between the web and an LLM.**

```plaintext
`  
      .          .     
     / \        / \   
    (   .------.   )  
   /                \  
  /     ⬤     ⬤     \
  '._    \    /   _ .'    
      '-.  ⬬  .-'         
         ╰---╯  
         
[ SYSTEM STATUS: OPERATIONAL // READY FOR BREACH ]  
```

# Actor input Schema

## `startUrls` (type: `array`):

List of URLs to decontaminate.

## `proxyConfiguration` (type: `object`):

Use residential proxies for sites with Cloudflare / CAPTCHA protection.

## `custom_headers` (type: `object`):

Custom HTTP headers (Cookies, Auth tokens, or custom User-Agents) injected into navigation streams.

## `selector` (type: `string`):

Extract content exclusively from this CSS selector (e.g. 'article', '.post-body'). Bypasses everything else. Can be overridden per URL in startUrls userData.

## `kill_list` (type: `array`):

Array of custom CSS selectors or classes to target and destroy before parsing (e.g. \['.custom-popup', '#promo-banner']).

## `remove_technical_junk` (type: `boolean`):

Neutralize scripts, styles, and other non-human noise.

## `remove_layout_junk` (type: `boolean`):

Clean up by identity: Nukes elements that identify themselves as headers, footers, or nav bars through tags and classes.

## `remove_spatial_junk` (type: `boolean`):

Clean up by shape: Identifies and destroys sidebars based on their edge position, narrow width, and high link density.

## `remove_commercial_noise` (type: `boolean`):

Kill cookie banners, GDPR consent forms, and popups.

## `remove_overlays` (type: `boolean`):

Identify and destroy floating UI elements and sticky blocks.

## `remove_cta_and_promo` (type: `boolean`):

Ignore 'Sign Up' and 'Buy Now' distractions.

## `remove_recommendations` (type: `boolean`):

Eliminate 'Read Also' and other algorithm-driven noise.

## `remove_media_tags` (type: `boolean`):

Purge video, audio, and canvas elements. Pure text only.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://docs.apify.com/"
    }
  ],
  "kill_list": [],
  "remove_technical_junk": true,
  "remove_layout_junk": true,
  "remove_spatial_junk": true,
  "remove_commercial_noise": true,
  "remove_overlays": true,
  "remove_cta_and_promo": true,
  "remove_recommendations": true,
  "remove_media_tags": true
}
```

# Actor output Schema

## `results` (type: `string`):

Clean Markdown payload and structured links

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "startUrls": [
        {
            "url": "https://docs.apify.com/"
        }
    ],
    "kill_list": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("kira_netrunner/fixer-grip").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "startUrls": [{ "url": "https://docs.apify.com/" }],
    "kill_list": [],
}

# Run the Actor and wait for it to finish
run = client.actor("kira_netrunner/fixer-grip").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "startUrls": [
    {
      "url": "https://docs.apify.com/"
    }
  ],
  "kill_list": []
}' |
apify call kira_netrunner/fixer-grip --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,kira_netrunner/fixer-grip"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/YSeq0szvxcbKKWwZ9/builds/wGy5par8dEpAvpF1j/openapi.json
