# Partner Spotlight: Gaffa, a Browser Automation API That Turns Websites Into LLM-Ready Markdown

Gaffa is a [browser automation](https://www.joinmassive.com/glossary/what-is-browser-automation) API that turns a real browser session into a single HTTP request. You send a URL and a list of actions, such as wait, click, scroll, or generate markdown, and Gaffa runs them in a real cloud browser and returns the output: LLM-ready markdown, a PDF, a screenshot, or structured JSON. No Playwright scripts, no [headless browser](https://www.joinmassive.com/glossary/what-is-a-headless-browser) fleet, and no proxy setup on your side. Gaffa is also a Massive customer. In [its own words](https://gaffa.dev/blog/simplify-your-web-automation-with-rotating-residential-proxies-in-gaffa), it "integrated Massive's residential proxy network to power Gaffa." This spotlight covers how Gaffa works, what its customers have built with it, and where Massive fits.

> **Key Takeaways**
>
> - Gaffa is a REST API that controls real cloud browsers. One `POST` to `/v1/browser/requests` carries the URL, parameters, settings, and a list of actions ([Gaffa Docs](https://gaffa.dev/docs/features/browser-requests)).
> - Outputs include GitHub-flavoured markdown, PDFs, screenshots, the DOM, and schema-validated JSON from its `parse_json` action.
> - Setting `proxy_location` routes a request through residential proxies. Gaffa says it works with multiple proxy providers and that it integrated Massive's network to power the feature ([Gaffa](https://gaffa.dev/blog/simplify-your-web-automation-with-rotating-residential-proxies-in-gaffa), 2025).
> - Gaffa reports that one customer, ivee, used it to pull listings from 50+ job boards and triple its curated listings to 850 ([Gaffa](https://gaffa.dev/blog/how-ivee-scraped-50-job-boards-and-tripled-their-job-listings-with-gaffa), 2026).

## What is Gaffa?

Gaffa's homepage sums up the pitch in two lines: "Leave the frameworks, proxies, scaling, headless browsers and configuration behind. Control real browsers at scale with a single API call" ([Gaffa](https://gaffa.dev)).

The team calls Gaffa early: its docs say it is "currently in its very early stages" and ask users for feedback ([Gaffa Docs](https://gaffa.dev/docs/get-started)). Developers who want the result of a browser session, not the work of running one, are the target, and the docs describe a "mission to support the development of revolutionary AI Agents."

## How does a Gaffa browser request work?

Every request has three parts, according to the [Browser Requests docs](https://gaffa.dev/docs/features/browser-requests):

| Part | What it controls |
|------|------------------|
| Parameters | The URL, proxy location, sync or async mode, and caching |
| Settings | Recording, media limits, and timing |
| Actions | The steps the browser performs, in order (sent as a list inside `settings`) |

![Anatomy of a Gaffa browser request. A single POST to api.gaffa.dev/v1/browser/requests carries the URL, parameters such as proxy_location and async, settings such as record_request, and an ordered list of actions such as wait, click, scroll, and generate_markdown. A real cloud browser runs the actions and returns markdown, a PDF, a screenshot, the DOM, or JSON.](assets/gaffa-request-anatomy.png "One request in, one browser session out.")

Here is a request that waits for an article to load, then returns its content as markdown in the response. When we worked through Gaffa's docs on October 9, 2026, the detail easiest to miss was nesting: the `actions` list sits inside the `settings` object, as in Gaffa's own example JSON. The request uses the `generate_markdown` action with a selector and inline output:

<div data-block="html"><div style="background:#011627;border:1px solid rgba(250,244,236,0.08);border-radius:10px;margin:1.5rem 0;"><div style="padding:10px 18px 0;font-family:'JetBrains Mono',monospace;font-size:11px;letter-spacing:0.08em;color:rgba(214,222,235,0.6);">BASH</div><pre style="margin:0;padding:10px 18px 16px;background:transparent;color:#d6deeb;font-family:'JetBrains Mono',monospace;font-size:13px;line-height:1.65;white-space:pre-wrap;overflow-wrap:anywhere;overflow-x:visible;"><code>curl --request POST 'https://api.gaffa.dev/v1/browser/requests' \
  --header 'Content-Type: application/json' \
  --header "X-API-Key: $GAFFA_API_KEY" \
  --data '{
    "url": "https://example.com/blog/post",
    "proxy_location": "us",
    "async": false,
    "settings": {
      "actions": [
        { "type": "wait", "selector": "article" },
        {
          "type": "generate_markdown",
          "selector": "article",
          "output_type": "inline"
        }
      ]
    }
  }'</code></pre></div></div>

Requests run synchronously by default. For long jobs, Gaffa recommends `"async": true`, which returns an `id` right away. You then poll `GET /v1/browser/requests/{id}` until the result is ready ([Gaffa Docs](https://gaffa.dev/docs/features/browser-requests/parameters)). The docs give a practical reason: "most tools time out well before a long job finishes."

## What can Gaffa's browser automation API do?

Gaffa's action list covers most of what a person does in a browser and most of what a data pipeline needs afterwards. From the [actions reference](https://gaffa.dev/docs/features/browser-requests/actions):

- **Interact:** `wait`, `click`, `type`, `select`, `scroll`, and `loop` for repeating steps such as pagination.
- **Capture:** screenshots, a single element, the DOM, cookies, a page snapshot, and file downloads.
- **Convert:** `generate_markdown`, `generate_simplified_dom`, and `print` to PDF.
- **Extract:** `parse_table`, and `parse_json`, which uses an LLM to fill a schema you define.

If you need to convert a website to markdown for an LLM, the `generate_markdown` action is the default Gaffa suggests. Its docs describe it as "the cleanest and smallest output Gaffa produces," keeping headings, lists, tables, and links while stripping styling and scripts, which is what [LLM-ready markdown](https://www.joinmassive.com/glossary/what-is-llm-ready-markdown) means in practice. That matters for agents, because every token of page junk is a token you pay for. Our guide to [how HTML-to-markdown cuts agent token costs](https://www.joinmassive.com/blog/skip-the-browser-how-html-to-markdown-cuts-agent-token-costs-by-80) covers why, and why the savings vary by page.

Mapping requests cover the step before that: they find a site's sitemap automatically, follow nested sitemap files, and return every URL de-duplicated and sorted ([Gaffa Docs](https://gaffa.dev/docs/features/mapping-requests)). That gives you the full page list before you run browser requests against it.

## What have Gaffa's customers built?

Two published customer stories, both with specific numbers, show the range:

**ivee, a job platform.** ivee's team was copying job listings by hand, which took two people 10 hours a week. With Gaffa, ivee pulled listings from more than 50 company job boards across 5 applicant tracking systems and tripled its curated listings to 850. When ivee appeared on BBC's Dragons' Den and saw an 80,000% surge in traffic, the listings were current. Lara Kennedy, ivee's Head of Consumer Marketing, told Gaffa: "The number of people complaining about closed jobs has pretty much reduced to zero" ([Gaffa](https://gaffa.dev/blog/how-ivee-scraped-50-job-boards-and-tripled-their-job-listings-with-gaffa), February 2026).

**TRMNL, an e-ink display.** TRMNL's official news plugin was built by Gaffa. A user adds any news site's URL and an optional plain-English instruction, and the plugin shows the top 5 stories. Behind it, one Gaffa request renders the page, converts it to markdown, and runs `parse_json` against a fixed schema, which Gaffa validates before returning. Users have pointed it at train timetables and cafeteria menus too ([Gaffa](https://gaffa.dev/blog/how-gaffa-powers-a-universal-news-plugin-for-trmnl-with-a-single-api-call-), June 2026). TRMNL's own [plugin listing](https://trmnl.com/integrations/gaffa) confirms the setup: give it a news site's address and an optional prompt, and Gaffa's free trial covers the first six months. The listing showed 106 connections when we checked on October 9, 2026.

Both stories follow the same pattern: a small team gets structured data from many differently built sites without writing a scraper per site. Our [Crawl4AI spotlight](https://www.joinmassive.com/blog/crawl4ai-partner-spotlight) covers an open-source tool that took a different route to the same problem.

## Where does Massive fit in Gaffa's stack?

At the network layer. Setting `proxy_location` in a Gaffa request routes it through residential proxies. Leaving it out sends the request from a generic datacenter IP ([Gaffa Docs](https://gaffa.dev/docs/features/browser-requests/parameters)). The docs currently list four proxy locations: the United States, Ireland, Singapore, and France.

Gaffa explained the integration on its own blog in October 2025: "We recently integrated Massive's residential proxy network to power Gaffa, providing fast and reliable performance across 190+ countries and it came with great latency, uptime, and customer support." It added: "We're also a fan of Massive's ethical IP acquisition strategy whereby all their users have agreed for their bandwidth to be used" ([Gaffa](https://gaffa.dev/blog/simplify-your-web-automation-with-rotating-residential-proxies-in-gaffa), 2025).

The division of work is clean. Gaffa runs the browsers, the actions, the parsing, and the retries. Massive supplies real consumer devices that have [opted in through the Massive SDK](https://www.joinmassive.com/blog/how-massives-opt-in-network-works), so requests Gaffa routes through Massive reach sites as ordinary residential traffic. Gaffa also says it works "with multiple providers" and only routes requests through IPs "known to be working and free from SSL errors." Our post on [why AI agents get blocked on datacenter IPs](https://www.joinmassive.com/blog/why-ai-agents-get-blocked-on-datacenter-ips-and-how-to-fix-it) covers why that residential option matters.

## What does Gaffa cost?

Billing is in credits. Per its [pricing docs](https://gaffa.dev/docs/credits-and-pricing), browser time costs 1 credit per 30 seconds (2 with screen recording), and proxy traffic costs 750 credits per GB. Plans, as listed on the [Gaffa homepage](https://gaffa.dev) when we checked on October 9, 2026:

| Plan | Price | Credits per month | Concurrent requests |
|------|-------|-------------------|---------------------|
| Starter | $29/month | 9,000 | 1 |
| Startup | $99/month | 35,000 | 3 |
| Growth | $249/month | 100,000 | 10 |

New accounts get 500 free credits with no card required. By the company's own estimate, 10,000 credits is "roughly equivalent to 3,333 typical browser sessions."

Those published rates make budgeting simple arithmetic. At 1 credit per 30 seconds, the Starter plan's 9,000 credits buy 75 hours of unrecorded browser time if no proxy traffic is used. Spent only on proxy traffic at 750 credits per GB, the same 9,000 credits cover 12 GB. Gaffa's 3,333-session estimate works out to about 3 credits per typical session, or roughly 90 seconds of browser time. Real jobs mix both. A page that pulls 4 MB through a residential proxy costs 3 credits in bandwidth, the same as 90 seconds of browser time, so heavy pages can cost more in traffic than in time. Check the live page before you budget, since prices change.

## Who is Gaffa a good fit for?

- **Small teams without scraping specialists.** ivee's case is the template: non-specialist developers and non-technical staff running a data pipeline.
- **AI agent builders** who need a page as markdown or JSON and would rather not operate browsers.
- **Document and capture jobs:** PDFs, full-height screenshots, and archived snapshots of pages.

If you need fine-grained control of a browser session, such as custom fingerprints or long interactive sessions, compare that against Gaffa's action set first. By its own account, the team has abstracted "a lot (but not all - yet!)" of what Playwright, Selenium, and Puppeteer do.

## Frequently Asked Questions

### What is Gaffa?

Gaffa is a REST API for browser automation from Impetus Labs Ltd. You send a URL and a list of actions, and Gaffa runs them in a real cloud browser and returns markdown, PDFs, screenshots, the DOM, or JSON.

### Does Gaffa use residential proxies?

Yes, when you set `proxy_location`. Gaffa says it works with multiple proxy providers and integrated Massive's residential proxy network to power the feature. Without `proxy_location`, requests use a datacenter IP.

### How do I convert a website to markdown for an LLM with Gaffa?

Add a `generate_markdown` action to the request's `actions` list and set `output_type` to `inline`. Gaffa renders the page in a real cloud browser and returns GitHub-flavoured markdown in the response. A `selector` such as `article` limits it to the main content.

### Does Gaffa have a free tier?

New accounts get 500 free credits with no credit card required. Paid plans start at $29 a month.

## The bottom line

- Gaffa replaces browser frameworks and infrastructure with one REST request: a URL plus ordered actions.
- Its markdown and `parse_json` outputs suit LLMs and agents, and its customer stories show small teams pulling structured data from dozens of sites.
- For residential access, `proxy_location` requests go through Gaffa's proxy partners, including Massive's [opt-in device network](https://www.joinmassive.com/web-access).

## Sources

- Gaffa, [homepage and pricing](https://gaffa.dev)
- Gaffa Docs, [Get Started](https://gaffa.dev/docs/get-started), [Browser Requests](https://gaffa.dev/docs/features/browser-requests), [Parameters](https://gaffa.dev/docs/features/browser-requests/parameters), [Actions](https://gaffa.dev/docs/features/browser-requests/actions), [Mapping Requests](https://gaffa.dev/docs/features/mapping-requests), [Credits and Pricing](https://gaffa.dev/docs/credits-and-pricing)
- Gaffa, ["Simplify your web automation with rotating residential proxies in Gaffa"](https://gaffa.dev/blog/simplify-your-web-automation-with-rotating-residential-proxies-in-gaffa), October 22, 2025
- Gaffa, ["How ivee scraped 50 job boards and tripled their job listings with Gaffa"](https://gaffa.dev/blog/how-ivee-scraped-50-job-boards-and-tripled-their-job-listings-with-gaffa), February 13, 2026
- TRMNL, ["Gaffa Plugin"](https://trmnl.com/integrations/gaffa), checked October 9, 2026
- Gaffa, ["How Gaffa powers a universal news plugin for TRMNL with a single API call"](https://gaffa.dev/blog/how-gaffa-powers-a-universal-news-plugin-for-trmnl-with-a-single-api-call-), June 22, 2026
