Only this pageAll pages
Powered by GitBook
1 of 39

Documentation

Introduction

What is Gaffa?

Gaffa is a powerful API for browser automation which allows you to control real web browsers at scale through a simple interface with no configuration necessary. We'll handle the complexities of managing infrastructure like virtual machines, proxies and caching so you can focus on building powerful and reliable web automation and AI applications!

API Playground

Start experimenting with the Gaffa API right now.

Get Started

The simple steps to get you started using Gaffa in your apps.

API Reference

Explore the API and docs for the finer details

Key features

Gaffa is ready to power your web automations:

  • Simplicity - there's no need to learn another new framework, Gaffa is accessible through a simple REST API - just tell it what site you want to visit and what actions you want to perform and it will be carried out as soon as you send the request.

  • Real browsers - headless browsers are popular but we make it simple to control real cloud-hosted browsers at scale which render JavaScript sites exactly as they would on a local machine, are harder to detect when doing scraping and allow full observability. We're also planning to allow you to go beyond just being able to control web browsers!

  • Proxies - you can easily choose to route your traffic through a network of residential proxy IP addresses to help avoid bot-detection on sites you are trying to automate.

  • Scalable - whether you want to control a single cloud browser or 100s in parallel with Gaffa you can do that easily without one thought about infrastructure management.

  • Powerful data processing - once you've accessed your desired site you can export your data in a constantly growing number of formats. If you want the page content in markdown to feed into a large language model or an image to feed into a vision modal we can help.

Ready to work with Gaffa?

Get Started

Stay up to date

We'll be sporadically announcing updates and new features in our newsletter - sign up here.

Get Started

An introduction to the Gaffa Browser API. Learn how you can get started building fast, powerful web automations!

Welcome to the Gaffa documentation site! You'll find everything you need here to get started using API including interactive API definitions, a comprehensive list of actions you can use to interact with our cloud browsers and breakdowns of our example requests you can run right away in our API Playground.

Gaffa is currently in it's very early stages, so we'd love to hear how we can improve our docs and API to make life easier for our users. If you have any questions or comments please email us or us the support tool on our site. To stay up to date with latest developments, features and news on mission to support the development of revolutionary AI Agents, sign up to sporadic newsletter updates.

1

Create an account

You can sign up to create a Gaffa account here. After signing up you'll immediately be able to use the API to start using our API Playground which has a number of pre-built automations for our demo site simulating a range of scenarios.

Accessing the open web

When you're ready to use Gaffa on the open web you'll need to choose a plan suitable for your needs and pay at which point the full internet will be available for you to automate.

In order to avoid scaling issues for our existing customers we are currently operating a queuing system for new accounts. Simply join the queue when prompted on your account dashboard and we'll let you know when you have access. If you want to jump the queue, you can fill out a short survey to help us better understand our users and we'll approve your account sooner!

2

Making your first browser request

The easiest way to make your first Gaffa browser request is to start using our API Playground where you can see several pre-made and interactive browser request examples of automations we've built against our test site which simulates some common scraping and web automation scenarios. You can run these examples without a paid account and also edit them easily to experiment - once you have a paid account you can also use the playground to build your automations for other sites.

Gaffa API Playground examples

Here are all the sample requests we've created for use in the API Playground.

Print to PDF

Export a web page to PDF and wait for elements to load with the Gaffa API.

Convert to Markdown

Export a web page to markdown format - useful feeding into LLM apps.

Infinitely Scroll

Scroll the bottom of a page that infinitely loads items and record the interaction.

Capture Screenshot

Interact with a page and capture the a screenshot of the whole page.

Form Completion

Fill out a form in a human-like way and record the interaction

3

Building your own browser requests

Credits and Pricing

View our current pricing plans on the Gaffa homepage

Browser Requests

Browser requests are charged in terms of credits based on the following factors:

  • Request length: Billed at 1 credit per 30 seconds the request takes to run on the browser.

    • If screen recording is enabled, this is doubled to 2 credits per 30 seconds.

  • Proxy bandwidth usage: All requests that use a proxy_location parameter use our network of residential proxies and are billed at 1500 credits per 1GB of bandwidth used.

  • Paid Actions: Some actions will incur additional costs for their usage in a browser request. These are:

    • JSON Parsing

Each successful request will deduct the corresponding number of credits from your monthly allowance. Be sure to use as many of your monthly credits as you want as they don't roll over month to month.

Features

Browser Requests

Making web automation requests has never been so simple.

Browser Requests are our first main product and allow you to send the Gaffa API a URL and a list of actions you want to be carried out, including any outputs you want from the page. We'll carry out the request on our cloud browsers and return you the response with no need to worry about proxies, IP rotation, web automation frameworks and scaling.

There's absolutely zero configuration needed and you can interact with Gaffa from any program that can send web requests. We think it's by far the simplest way to automate simple web tasks and the good news is, we're just getting started and have much more planned.


Example request


Proxy servers

Gaffa makes proxying your traffic through a global network of residential proxies super simple. Setting proxy_location in your request will allow you to utilize one of our partner third party proxy services to gain local access to a site.

Not setting a proxy_location will mean the request does not use a proxy server and will use a generic datacenter IP.

Available Locations

At the moment all our servers are in one location but we aim to introduce local machines to our proxy locations for a more realistic end-user load times. If this would interest you please contact support.

IP Types

Currently all our IP addresses are residential IP addresses which are procured through reputable third parties.

IP Rotation

IP rotation is an essential part of any web data, scraping or automation task. In Gaffa, each browser request is treated as unique. We regularly rotate the IP addresses used so you should assume that each request will be carried out from a different IP address from the last.

We are working to supporter a greater range of IP address scenarios, like static IPs in the future, as well as more trusted proxies for requests that require enhanced levels of security (logins etc.)

Restrictions

Whilst we'll do our best to provide access to as wide a range of sites as possible we may have to restrict access to certain sites to prevent abuse of our service or of other services. Our proxy partners may also enforce restrictions on certain sites and categories of sites which we don't have any control over.


Caching

When we were building Gaffa we noticed that a lot of pre-existing scraping tools don't allow users to easily share their scraped web data with each other, despite many users requesting the same web pages on the same sites. Not only is this a waste of a user's allowance, it also puts a burden on the site owners who are serving the same data to different users for the same purpose. Because of this in Gaffa we have created a service-wide cache.

How it works

When making a browser request you can provide a MaxCacheAge parameter which is a number in seconds equal or greater than 0. This values denotes the maximum age of data you would accept from the API. If another user of our service has requested the same URL with exactly the same parameters and actions as you in this chosen timeframe then the response will be returned to you immediately and the response will not be carried out on one of our browsers. If there are multiple identical requests in the given timeframe then the most recent will be returned. This will save you time waiting for the response, as well as credits, because requests returned from the cache don't use any bandwidth.


Screen Recording

By specifying record_request you can ask Gaffa to screen record your automation and return a video in the response allowing you to view the magic happening or to debug your automation.


Max Media Bandwidth

If you are using Gaffa on a site with lots of images and videos and more interested in the text data on the page, you can cap how much data a page loads in MB using the max_media_bandwidth setting. This makes your automation faster and prevents spending credits on data you aren't interested in. With the max_media_bandwidth value set, Gaffa monitors data being downloaded by the page and when downloaded data exceeds the given number of MB, all further downloads of images or video will be cancelled. max_media_bandwidth defaults to null meaning downloads are not capped.

Setting a value of 0 will cause no images to load which can work on some sites but on others this could lead to the site thinking you are using an ad blocker.


Time Limit

Using the setting time_limit caps the maximum running time of the request in milliseconds. If this time expires all incomplete actions will be cancelled and the request will return an error. This cap has to be less than the maximum request running time dictated by your plan and if not set, will default to this value.


Actions


Stealth

We believe your AI Agents should be able to use the internet exactly how humans would. Gaffa can help you get access to sites with some of the most challenging anti-bot restrictions using a combination of proxies, human-like behavior, captcha solving and a custom browser implementation. We handle and maintain all of that so you can focus on building your solution!


Examples


API Endpoints

Loading...

Loading...

Capture DOM

Type: capture_dom

This action will capture and return the raw dom of the site which you can then extract data from on your end.

Parameters

Usage

Capture the raw DOM of the current page

Example Output

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

API Reference

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Tutorials

Loading...

Once you have a paid account and are ready to start building your own browser requests you'll want to read about all the other actions you can use for your solution as well as how you can easily use , as well as the other endpoints that are part of the API.

Running a new browser request is as simple as sending the following . Below, you can see the url () and a list of actions which instruct Gaffa to wait for a table to load and print the page to PDF.

You can read more about this particular example and how you can run it right now in our API Playground

In order to access public sites and use proxy servers you'll need to sign up for a but after that you'll be able to build automations for any site you wish.

Proxy Server Location
Country Code

Recording requests comes at an .

We currently support ten different types of actions which you can read more about .

We've created a number of sample browser requests you can read about or you can jump straight into the to start running them right now.

Check out our API reference for more details about the endpoints available, particularly .

For common AI scenarios you may find this returns too much data so we have provided a action which distills the DOM to only the important elements.

See .

{
  "url": "https://demo.gaffa.dev/simulate/table?loadTime=3&rowCount=20",
  "proxy_location": null,
  "async": false,
  "max_cache_age": 0,
  "max_media_bandwidth": null,
  "settings": {
    "record_request": false,
    "actions": [
      {
        "type": "wait",
        "selector": "table"
      },
      {
        "type": "print",
        "size": "A4",
        "margin": 20,
        "orientation": "portrait"
      }
    ]
  }
}

United States

us

Ireland

ie

Singapore

sg

France

fr

"actions": [
    {
      "type": "capture_dom"
    }
]
POST body to our endpoint
our demo site
here
paid account
additional cost
here
here
API Playground
those you can use to query for past requests by id or status
generate_simplified_dom

Actions

Universal Parameters

All actions have the following parameters:

Action Execution

Actions are carried out in the order they are submitted. Every action type has a continue_on_fail parameter which defaults to false, this means that if any action fails the execution of the browser request ends and an error will be returned. Setting continue_on_fail to true ensures that all actions are carried out, regardless of previous action results and an error will not be returned.

Custom Id

As shown above, you can submit a customId with each action you submit to the API. We'll include this Id in the outputs from the browser request so you can find a certain action's output and/or status easily in the response.

Response Format

When a browser request has completed, information on an action's execution

Supported Actions

The Gaffa API supports the following actions detailed below. Click the "read more" buttons to read more information about each type.

Actions without outputs

Actions with outputs

POST v1/browser/requests

The following endpoint creates a browser request and either runs it synchronously or returns immediately with an ID so you can check it status later using this endpoint.

GET v1/browser/requests

The following endpoint allows you to query for multiple browser requests, either by status or a list of particular ids, submitting a request with neither of these will return all requests for your account.

GET v1/browser/requests/{id}

The following endpoint allows you to query browser request for your account by ID.

DELETE v1/schemas/{id}

The following endpoint allows you to delete a schema from your account.

PUT v1/schemas

The following endpoint allows you to update a data schema by ID.

Capture Snapshot

Type: capture_snapshot

This output type will return a HTML file which captures a static version of the page state. The page will load offline and can be saved to your local machine.

This will:

  • Load and embed all images on the page.

  • Embed all css files

Currently, Javascript will be disabled and interactivity might not worked as expected but this feature should be useful for preserving the page state as it was and allowing you to view it offline.

Parameters

Usage

The following captures the current section of the page currently visible in the browser.

Example Output

Here's an example that shows an offline snapshot of a site

POST v1/schemas

The following endpoint allows you to describe a data schema for parsing an online PDF to JSON.

Capture Cookies

Type: capture_cookies

This action will capture the browser cookies currently saved for the web page you are on and return them as a JSON object with key/values.

Parameters

Usage

Capture the cookies of the current page

When you can specify a list of actions you wish for us to carry out on the requested web page. These actions conform to the following format:

Name
Type
Required
Description

For more information on browser requests, .

For more information on browser requests, .

For more information on browser requests, .

See

See .

{
    "type": "", //the type of the action
    //other params follow as key value pairs
    "key": value //string, number etc. 
}

type

string

The type name of the action.

continue_on_fail

boolean

Should execution of further actions continue or throw an error if this action fails. Default: false

customId

string

A customId to help you find the action in the response. Default: null

{
    "id": "", //a unique id given to the action by Gaffa
    "type": "capture_screenshot", //the type of the action
    "query": "", //a representation of the action in querystring format
    "timestamp": "", //the UTC timestamp the action was executed
    "output": "" //if the action has an output you will find a url for this here,
    "error": "" //if the requesst fails the error message will be returned here
}
"actions": [
    {
        "type": "capture_snapshot",
    }
]
"actions": [
    {
      "type": "capture_cookies"
    }
]
making a Browser Request
see here
see here
see here
Type

click

Description

Click on a given element

Read More
Type

scroll

Description

Scroll to a particular point on the page or, in the case of pages with infinite scrolling, scroll until a given time has elapsed.

Read More
Type

type

Description

Type the provided text into a given element

Read More
Type

wait

Description

Wait for a given time to elapse or an element to appear on page before proceeding to the next action.

Read More
Type

capture_cookies

Description

Save a JSON object of cookies for the current page

Read More
Type

capture_dom

Description

Export the raw DOM page data

Read More
Type

capture_screenshot

Description

Capture a screenshot of the web page

Read More
Type

capture_snapshot

Description

Create a completely static version of the web page which can be accessed offline

Read More
Type

download_file

Description

Download an online file using Gaffa

Read More
Type

generate_markdown

Description

Convert the page into markdown

Read More
Type

generate_simplified_dom

Description

Generate a simplified version of the DOM

Read More
Type

json_parse

Description

Parse online data to a defined JSON schema

Read More
Type

print

Description

Print the web page to a PDF

Read More

Generate Markdown

Type: generate_markdown

The markdown output format can export the data of the page (an article, table etc.) in a human and LLM readable format which removes unnecessary styling data and other "junk" that is only relevant for the site to work properly.

Parameters

Usage

The following converts the current page to markdown:

"actions": [
    {
        "type": "generate_markdown"
    }
]

Example Output

Capture Element

Type: capture_element

Parameters

Name
Type
Required
Description

selector

string

timeout

integer

The maximum amount of time the browser should wait for the element defined by the selector to appear. Default: 5000 (5s)

Usage

Click an element on the page

The following code will wait 1 second for the .page_contents element to appear and return an html file containg the div's innerHTML.

"actions": [
    {
      "type": "capture_element",
      "selector": ".page_contents",
      "timeout": 1000
    }
]

JSON Parsing

Type: json_parse

Use AI to parse web content from text into a pre-defined data schema and return it as a JSON object.

Currently this feature only works with online PDFs but we are working to expand it to webpages.

Parameters

Name
Type
Required
Description

data_schema

string

The id of the data schema you have defined that you want to transform the content into.

instruction

string

A custom instruction, in addition to any detail you have added to the data schema, that you want to include with this particular parse.

model

string`

The AI model you wish to use to parse the content into JSON. Default: gpt-4o-mini Accepted: ["gpt-4o-mini"]

input_token_cap

int

The max number of source input tokens that will be passed to the AI model to parse. This can be used to prevent unnecessary credit usage. If your source input is longer than the token cap, it will be abbreviated. Default: 1,000,000

Pricing

The credits this action uses depends on the model used. Here are the current supported models and their pricing:

Model
Input Token Cost
Output Token Cost

gpt-4o-mini

1 credit per 10,000 input tokens

4 credits per 10,000 output tokens

Export Web Page to PDF

An example request that uses Gaffa to convert an HTML page to a PDF. There are lots of HMTL to PDF API's but Gaffa handles it easily, as well as doing much more.

Gaffa's print to PDF feature allows you to export web pages as PDF files easily. Unlike the standard "Print to PDF" in your local browser, Gaffa's feature waits for specific items to load, uses proxies, and scales with your product's growth. Enhance your customer experience and streamline your PDF export process

API Request

{
  "url": "https://demo.gaffa.dev/simulate/table?loadTime=3&rowCount=20",
  "proxy_location": null,
  "async": false,
  "max_cache_age": 0,
  "settings": {
    "record_request": false,
    "actions": [
      {
        "type": "wait",
        "selector": "table"
      },
      {
        "type": "print",
        "size": "A4",
        "margin": 20,
        "orientation": "portrait"
      }
    ]
  }
}

Actions

Read the full documentation for these actions here.

Response

Here's an example of the PDF returned by the request after waiting for the table to load.

Type

Type: type

Request that the browser type a particular bit of text into a field.

Parameters

Name
Type
Required
Description

selector

string

text

string

The text the browser should enter into the text field.

timeout

integer

The maximum amount of time the browser should wait for the element that needs to be typed in to appear. Default: 5000 (5s)

Sites that use more advanced bot detection often use keyboard events to detect unusual activity on their site, rather than immediately dropping all characters of the text into a field our platform types the text in a human-like manner.

Usage

Type into a text box

The following action will type into a particular text field.

"actions": [
      {
            "name": "type",
            "selector": "#postform-text",
            "text": "Hello world!"
      }
]

Wait for an element to appear before typing

The following code will wait a maximum of 10 seconds for the email input to appear in the field and then type in the provided email.

"actions": [
      {
         "name": "type",
         "selector": "form input[name="email"]",
         "text": "test@test.com"
         "timeout": 10000
      }
]

Parse Table

Type: parse_table

Finds a table on the page with a given selector and then converts the table data into a JSON object.

This action first fins the table headers and converts them into property names by converting them to lower case and replacing non-alphanumeric characters with underscores. It then processes each table row and for each cell is extracts the contents and saves a value. At the moment, all values will be string types.

Parameters

Name
Type
Required
Description

selector

string

timeout

integer

The maximum amount of time the browser should wait for the table defined by the selector to appear. Default: 5000 (5s)

Usage

Extract a table on the page

The following code will wait 1 second for the .large_table element to appear and return a JSON file with the headers and rows converted.

"actions": [
    {
      "type": "parse_table",
      "selector": ".large_table",
      "timeout": 1000
    }
]

Click

Type: click

Request that the browser clicks a particular element on the page.

Parameters

Name
Type
Required
Description

selector

string

timeout

integer

The maximum amount of time the browser should wait for the element defined by the selector to appear. Default: 5000 (5s)

Usage

Click an element on the page

The following code will wait 1 second and then continue with the next action, if provided.

"actions": [
    {
      "type": "click",
      "selector": "a.header__logo"
    }
]

Wait for a particular element to appear

The following code will wait for the logo to appear for a maximum of 5 seconds and it will continue with the list of actions

"actions": [
      {
        "type": "wait",
        "selector": "a.header__logo",
          "timeout": 5000,
          "continueOnFail": true
      }
]

Generate Simplified DOM

Type: generate_simplified_dom

When you're looking at the DOM of a web page, there's a lot of unnecessary data that can be discarded if you are only interested in the page's elements or looking to export the data into a LLM. The generate_simplified_dom output format processes the HTML in the following way:

  • Removes all links in the head

  • Removes all script nodes and links to scripts

  • Removes all style nodes

  • Remove style attributes from all elements

  • Remove all links to stylesheets

  • Remove all noscript elements outside of the body

  • Finds all hrefs with query strings and removes the query strings

  • Important meta tags are kept, all others are removed

  • Remove all alternate links

  • Remove all SVG paths

  • Remove empty text nodes and excessive spacing

Parameters

Usage

The following JSON captures the DOM of the page and simplifies it.

"actions": [
    {
        "type": "generate_simplified_dom"
    }
]

We are actively working to improve this and to make this process more configurable - let us know if there's something you think we can improve.

Example Output

Convert Web Page to Markdown

An example request that uses Gaffa to convert a web page page to markdown. This could be used to export web page reports or to print the content of a page in a readable format.

Gaffa converts web pages to clean markdown, stripping away styling, scripts, and images. This optimizes content for LLM applications by reducing token usage while preserving essential information.

API Request

{
  "url": "https://demo.gaffa.dev/simulate/article?loadTime=3&paragraphs=10&images=3",
  "proxy_location": null,
  "async": false,
  "max_cache_age": 0,
  "settings": {
    "record_request": false,
    "actions": [
      {
        "type": "wait",
        "selector": "article"
      },
      {
        "type": "generate_markdown"
      }
    ]
  }
}

Actions

Response

Here's an example of the PDF returned by the request after waiting for the article to load.

Capture Screenshot

Type: capture_screenshot

Takes a screenshot of the current page. You can choose to take a full screen screenshot showing the whole page or just the current view.

Parameters

Name
Type
Required
Description

size

string

The size of paper the page should be printed to. Default: view Accepted: ["view", "fullscreen"]

Usage

The following captures the current section of the page currently visible in the browser.

"actions": [
    {
        "type": "capture_screenshot",
        "size": "view"
    }
]

Example Output

An example screenshot in fullscreen mode.

Print

Type: print

Request that the browser prints the page to a PDF.

Parameters

Name
Type
Required
Description

size

string

The size of paper the page should be printed to. Default: A4 Accepted: ["A4"]

margin

integer

The margin of the page in pixels when the page is printed to PDF. Default: 20

orientation

string

Should execution of further actions continue or throw an error if this action fails. Default: portrait Accepted: ["portrait", "landscape"]

continue_on_fail

boolean

Should execution of further actions continue or throw an error if this action fails. Default: true

Usage

Print a page in landscape to PDF

The following JSON prints the page to a PDF in landscape with margins of 20px.

"actions": [
    {
        "type": "print",
        "page_size": "A4",
        "orientation": "landscape",
        "margin": 20
    }
]

Example Output

Wait

Type: wait

Request that the browser waits a given amount of time or for a particular item to appear on the page.

Parameters

Name
Type
Required
Description

time

integer

The time in milliseconds that the browser should wait.

selector

string

timeout

integer

The maximum amount of time the browser should wait for the provided selector to appear. Default: 5,000 (5s)

Usage

Wait for a particular amount of time

The following code will wait 1 second and then continue with the next action, if provided.

"actions": [
      {
        "name": "wait",
        "time": 1000,
      }
]

Wait for a particular element to appear

The following code will wait for a table to appear on the page for a maximum of 5 seconds. If the table has not appeared after 5 seconds the next action will be executed, if provided.

"actions": [
      {
        "name": "wait",
        "selector": "table",
        "timeout": 5000,
        "continueOnFail": true
      }
]

Beta Endpoints

The following features are currently in beta and only avaialble to select users. If you are interested in trying out any of these features, please contact support and we can enable them for you.

JSON Data Parsing

Allows you to describe a JSON data schema for your data and then convert an online PDF into this data format using AI.

Endpoints:

Automated Form Filling

An example request that uses Gaffa to automate the completion of a form and waits for a success modal to appear.

Filling forms is tedious, Gaffa can be used to fill out a form in a human-like manner so you can spend time doing much more interesting things.

API Request

{
  "url": "https://demo.gaffa.dev/simulate/form?loadTime=3&showModal=false&modalDelay=0&formType=address&firstName=John&lastName=Doe&address1=123%20Main%20Street&city=London&country=UK",
  "proxy_location": null,
  "async": false,
  "max_cache_age": 0,
  "settings": {
    "record_request": true,
    "actions": [
      {
        "type": "type",
        "selector": "#email",
        "text": "johndoe@example.com"
      },
      {
        "type": "type",
        "selector": "#state",
        "text": "CA"
      },
      {
        "type": "type",
        "selector": "#zipCode",
        "text": "12345"
      },
      {
        "type": "click",
        "selector": "button[type='submit']"
      },
      {
        "type": "wait",
        "selector": "[role=\"dialog\"] h2:has-text(\"Success!\")",
        "timeout": 10000
      }
    ]
  }
}

Actions

Response

Here's a video showing Gaffa filling out the page and waiting for the success modal.

Read More

Read more about screen recording here (TODO).

Infinitely Scroll an Ecommerce Site

An example request that uses Gaffa to infinitely scroll down a simulated ecommerce site whilst recording the interaction.

Gaffa automates infinite scrolling on dynamic pages like e-commerce storefronts. Set a duration, and Gaffa will capture all content as it scrolls. Each session can be recorded as a video for playback, letting you debug or review the interaction.

API Request

{
  "url": "https://demo.gaffa.dev/simulate/ecommerce?loadTime=3&showModal=true&modalDelay=0&itemCount=infinite",
  "proxy_location": null,
  "async": false,
  "max_cache_age": 0,
  "settings": {
    "record_request": true,
    "actions": [
      {
        "type": "wait",
        "selector": "div[role=\"dialog\"]",
        "timeout": 10000
      },
      {
        "type": "click",
        "selector": "[data-testid=\"accept-all-button\"]"
      },
      {
        "type": "wait",
        "selector": "[data-testid^=\"product-1\"]",
        "timeout": 5000
      },
      {
        "type": "scroll",
        "percentage": 100,
        "max_scroll_time": 20000
      }
    ]
  }
}

Actions

Response

Here's a video showing Gaffa scrolling the page for 20 seconds as more items load.

Read More

Read more about screen recording here. (TODO)

API Authentication

We use API Keys for authenticating requests to our API. In this document we'll explain how you can manage and use the keys for your account.

Creating Keys

You can create as many keys as wish but always remember to treat the key as a secret and do not reveal in public blog posts or GitHub repositories. If someone uses your key to make requests with your leaked key we won't be responsible!

Deleting Keys

If you are worried you have exposed your Gaffa API key or just want to periodically rotate your keys you can create another key and then delete your old keys. Deleted keys will immediately stop working for new requests to the API but past browser requests made using old keys will still be available.

Authenticating Requests

Our API is secured with a customer header X-API-Key whose value should be any current API key in your account. That's all you need to add to your request!

API Playground Examples

In the following pages you can view all the pre-built requests we've built to show what is possible with the Gaffa web automation API.

GET v1/schemas

The following endpoint allows you to list data schemas for your account in a paged list.

Capture a Full Height Screenshot

An example request that uses Gaffa to dismiss a modal, scroll to the bottom of a page and then capture a full height screenshot.

Gaffa can also capture screenshots at any point during your interaction for use in your app or just to work out exactly was being shown at a given point in time. You can capture just what is shown as if you were looking at the screen or the full height of the page.

API Request

Actions

Response

The export full height screenshot of the page showing all items.

Download File

Type: download_file

Request a copy of the most recent file viewed in the browser.

Parameters

Files Supported

Currently this only works with PDF files.

Usage

Download a copy of a PDF open in the Browser

The following waits 20s for a file to download and then returns it.

And the service responds with the file being in the action output:

Gaffa exports with comments removed and unknown tags ignored.

See .

Returns the , essentially the contents, of a particular element on the page. This can be used when you are only interested in the contents of a particular element.

The that defines the element whose contents you want to capture.

See .

Paid Action: This action will consume credits based on the amount of content being parsed, see more .

See .

The following example is a request we've pre-built to show you Gaffa's capabilities against our You can run this request right now in the .

The request below uses the to open the demo site on the table page, wait for the table to load and then print the webpage to a PDF in size A4 with a margin of 20 and using the portrait orientation.

The that defines the page element that the browser should click on.

See .

The that defines the table whose contents you want to parse.

See .

The that defines the page element that the browser should click on.

See .

See .

The following example is a request we've pre-built to show you Gaffa's capabilities against our You can run this request right now in the .

The request below uses the to open the demo site on the article simulator, wait for the article to load and then generate a markdown from the page's content which you can download for use in your program.

See .

See .

The that defines the page element that the browser should wait to appear.

See .

The following example is a request we've pre-built to show you Gaffa's capabilities against our You can run this request right now in the .

The request below uses the to open the demo site on the form simulator page with some sections pre-filled (for speed). After typing in the required information and clicking submit, Gaffa waits for the success dialog to show before returning a video of the interaction.

The following example is a request we've pre-built to show you Gaffa's capabilities against our You can run this request right now in the .

The request below uses the to open the demo site on the ecommerce site simulator with an infinitely scrolling storefront. It will wait for and dismiss a dialog box, wait for a product to load and then scroll down the page for a maximum of 20 seconds - if new items load it will keep scrolling.

Once your account is approved, you will need to create an API key to send your requests to our API. Go to your account and create a new key with a name. Once the key is created, copy the value and you will immediately be free to start using it to make requests.

You can start using these in the once you've created an account.

The following example is a request we've pre-built to show you Gaffa's capabilities against our You can run this request right now in the .

The request below uses the to open the demo site on the ecommerce page with 20 items, wait for and dismiss the dialog, scroll to the bottom of the page and capture a full height screenshot.

Name
Type
Required
Description

See .

GitHub flavoured markdown
innerHTML
demo site.
Gaffa API Playground
POST endpoint
Wait
Print
demo site.
Gaffa API Playground
POST endpoint
Wait
Generate Markdown
POST v1/schemas
PUT v1/schemas
DELETE v1/schemas/{id}
GET v1/schemas
demo site.
Gaffa API Playground
POST endpoint
Type
Click
Wait
demo site.
Gaffa API Playground
POST endpoint
Wait
Click
Scroll
Get Started
Dashboard > API Keys
API Playground
{
  "url": "https://demo.gaffa.dev/simulate/ecommerce?loadTime=3&showModal=true&modalDelay=0&itemCount=20",
  "proxy_location": null,
  "async": false,
  "max_cache_age": 0,
  "settings": {
    "record_request": false,
    "actions": [
      {
        "type": "wait",
        "selector": "div[role=\"dialog\"]",
        "timeout": 10000
      },
      {
        "type": "click",
        "selector": "[data-testid=\"accept-all-button\"]"
      },
      {
        "type": "wait",
        "selector": "[data-testid^=\"product-1\"]",
        "timeout": 5000
      },
      {
        "type": "scroll",
        "percentage": 100
      },
      {
        "type": "capture_screenshot",
        "size": "fullscreen"
      }
    ]
  }
}

timeout

integer

The maximum amount of time the browser should wait for a file to download. Default: 5,000 (5s)

"actions": [
    {
        "type": "download_file",
        "timeout": 20000
    }
]
"actions": [
      {
        "id": "act_VHhrUbXjZSaYCPTqbBYD4acCzzeFGH",
        "type": "download_file",
        "query": "download_file?continue_on_fail=false&timeout=20000",
        "timestamp": "2025-05-30T15:02:06.6615306Z",
        "output": "https://storage.gaffa.dev/brq/downloads/5845df07-3749-424e-9c64-9602be19a857.pdf"
      }
    ]
Click
Scroll
Type
Wait
Capture Cookies
DOM
Screenshot
Snapshot
Download File
Markdown
Simplified DOM
JSON Parsing
Print
selector
selector
selector
selector
selector
demo site.
Gaffa API Playground
POST endpoint
Wait
Click
Scroll
Capture Screenshot
13KB
GaffaDOMSample.txt

Scroll

Type: scroll

Request that the browser scrolls to a certain point on the page or, in the case of pages with infinite scrolling, scrolls for a particular amount of time.

Parameters

Scroll Speed & Interval

Gaffa gives you a flexibility about how fast you scroll down the page which can be really useful to get around restrictions enforced by some sites which detect and limit fast scrolling. By experimenting with scroll_speed and interval you will be able to create the perfect scrolling action for your scenario. The speed settings are as follows:

  • instant- the page will smoothly scroll to the desired position immediately, useful for sites with no rate limits or loading events caused by scroll actions.

  • medium - human-like scrolling at a normal speed to the desired position. Gaffa will scroll in much the same way as you would using a mouse.

  • slow- human-like scrolling at a very slow speed to the desired position. The speed is comparable to scrolling whilst reading a page.

intervalallows you to adjust the scroll speed further by inserting pauses between scroll events.

We've found some sites with infinite scrolling and strict rate limits respond better to immediate speed scroll events to the bottom of the page with large intervalsbetween these scrolls to keep within rate limits.

Wait Time

If wait_time is set to 0 and Gaffa arrives at the desired location then Gaffa will immediately mark the action as succeeded. However, if another value is set then the page will be monitored for the desired amount of time to check for further expansions. If, during this period, the page expands again then Gaffa will continue scrolling to the desired location and the wait will reset.

This can be really useful if you find that the site takes some time to load more items when you reach the bottom of the page and more will be loaded after the action has suceeded.

Usage

Scroll a particular percentage down the page

The following code will scroll half way down the page.

Scroll an infinitely scrolling webpage

The following code will scroll to the bottom of the page and then keep scrolling when new content loads for a maximum of 25 seconds, waiting 1 second for new content and scrolling at a slow pace with 1 second between scroll actions.

Name
Type
Required
Description

See .

"actions": [
      {
        "name": "scroll",
        "percentage": 50,
      }
]
"actions": [
      {
        "name": "scroll",
        "percentage": 100,
        "scroll_speed": "slow",
        "max_scroll_time": 25000,
        "interval": 1000,
        "wait_time": 1000
      }
]
518KB
GaffaSnapshotSample.mhtml
5KB
GaffaMarkdownExample.md
51KB
GaffaPrintPdfExample.pdf
pdf
6KB
GaffaSimplifiedDOMSample.txt
5KB
GaffaMarkdownExample.md
51KB
GaffaPrintPdfExample.pdf
pdf

percentage

integer

The percentage the page should scroll up or down (+/-) Range: [-100 - 0 - 100] Default: 100 (% - scroll to bottom)

wait_time

integer

max_scroll_time

integer

The maximum amount of time the page should be scrolled for, in milliseconds. After this time passes, the action will be cancelled. This doesn't cause the action to fail. Default: 20,000 (20s)

scroll_speed

string

interval

integer

Convert any webpage into LLM-ready Markdown using Gaffa

By the end of this guide, you’ll be able to:

  • Render web pages using Gaffa’s API.

  • Extract clean page content.

  • Generate structured markdown suitable for LLM-based Q&A or summarization.

Prerequistes

  1. Install Python 3.10 or newer.

  2. Create a virtual environment

python -m venv venv && source venv/bin/activate
  1. Install the required libraries

pip install requests openai
GAFFA_API_KEY=your_gaffa_api_key
OPENAI_API_KEY=your_openai_api_key

Convert a webpage to Markdown

import requests
import openai

GAFFA_API_KEY = os.getenv("GAFFA_API_KEY")
OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")

# Fetch the markdown content from Gaffa
def fetch_markdown_with_gaffa(url):
    payload = {
        "url": url,
        "proxy_location": None,
        "async": False,
        "max_cache_age": 0,
        "settings": {
            "record_request": False,
            "actions": [
                {
                    "type": "wait",
                    "selector": "article"
                },
                {
                    "type": "generate_markdown"
                }
            ]
        }
    }
   
    # Set the headers for the request
    headers = {
        "x-api-key": GAFFA_API_KEY,
        "Content-Type": "application/json"
    }
    # Make the POST request to the Gaffa API
    print("Calling Gaffa API to generate markdown...")
    response = requests.post("https://api.gaffa.dev/v1/browser/requests", json=payload, headers=headers)
    response.raise_for_status()
   
    # Extract the markdown URL from the response
    markdown_url = response.json()["data"]["actions"][1]["output"]
   
    # Fetch the markdown content from the generated URL
    print(f"📥 Fetching markdown from: {markdown_url}")
    markdown_response = requests.get(markdown_url)
    markdown_response.raise_for_status()
   
    return markdown_response.text

Ask questions using OpenAI

def ask_question(markdown, question):
    openai.api_key = OPENAI_API_KEY
    prompt = (
        f"You are an assistant helping analyze different webpages.\n\n"
        f"Markdown content:\n{markdown[:3000]}\n\n"
        f"Question: {question}\nAnswer as clearly as possible."
    )

    response = openai.ChatCompletion.create(
        model="gpt-3.5-turbo",
        messages=[
            {"role": "user", "content": prompt}
        ]
    )
    return response.choices[0].message["content"]

The markdown becomes the model’s context, enabling accurate answers about the original web content.

User Interaction and Execution

Having defined the functions, we can now create a simple command-line interface that allows users to input a URL and ask questions about the content.

def main():
    url = input("Enter the URL of the article: ")
    try:
        markdown = fetch_markdown_with_gaffa(url)
        print("\n✅ Markdown successfully retrieved from Gaffa.\n")

        while True:
            question = input("Ask a question about the content (or type 'exit'): ")
            if question.lower() == "exit":
                break
            answer = ask_question(markdown, question)
            print(f"\n💬 Answer: {answer}\n")

    except Exception as e:
        print(f"⚠️ Error: {e}")

 if __name__ == "__main__":
    main()

Full Script

Running the Script

To run the script, simply execute it in your terminal:

python your_script_name.py

With your script running, you can enter any URL of any web page, and the script will fetch the markdown content and allow you to ask questions about it.

After arriving at the desired scroll location this the time Gaffa should monitor for changes to the page height before marking the action as succeeded. Read more . Default: 0

The speed which the page should scroll to the desired point. You can read more about this . Default: medium Accepted: [slow, medium, instant]

The amount of time, in milliseconds, that scrolling should pause between scroll events. Read more about this . Default: 0

The ability to convert websites into LLM-friendly markdown is powerful when building applications for summarization, Q&A, or knowledge extraction. In this guide, you'll learn how to use the to extract the main content of any web page using browser rendering and convert it into structured markdown.

Get your key and key, and store them as environment variables:

In the code below, we define a function that takes a URL as input, makes a POST request to the Gaffa API, invoking the action, which uses the browser rendering engine to extract the main content of the page and convert it into markdown.

Now that we have the markdown content, we can ask questions about it using the OpenAI API. The function below takes the markdown content and a question as input and uses the OpenAI API to generate a summary based on the provided content. In this case, we are using the model, but you can choose any other model.

The full script is available to download from the .

Gaffa API
Gaffa API
OpenAI API
generate_markdown
gpt-3.5-turbo
Gaffa Python Examples GitHub repo
Gaffa scrolling to the bottom of a simulated ecommerce page!
Gaffa's full height screenshot
below
Gaffa can help automatically fill out your forms!
our cache
proxy servers
universal parameters

Beta Feature: This feature is currently in beta and restricted to approved users. If you're are interested in trying it, please and we can enable this feature for your account.

Beta Feature: This feature is currently in beta and restricted to approved users. If you're are interested in trying it, please and we can enable this feature for your account.

Beta Feature: This feature is currently in beta and restricted to approved users. If you're are interested in trying it, please and we can enable this feature for your account.

Delete a data schema

delete

Deletes a data schema by its ID.

Authorizations
Path parameters
idstringRequired
Responses
204
No description
delete
204

No description

No content

Beta Feature: This feature is currently in beta and restricted to approved users. If you're are interested in trying it, please and we can enable this feature for your account.

contact support
contact support
universal parameters
universal parameters
universal parameters
universal parameters
DELETE /v1/schemas/{id} HTTP/1.1
Host: api.gaffa.dev
X-API-Key: YOUR_API_KEY
Accept: */*

Get multiple browser requests

get

This endpoint retrieves browser requests in bulk by id or status.

Authorizations
Query parameters
idsstringOptional

The unique identifiers of the browser requests to retrieve.

Example: {"value":"brq_V2P6PqrZpycFtbc7mtXE4tsNbeg2N6,brq_V2P6X38RDRMRyYcNJ82qPSH5eFfQRD"}
statusstringOptional

The statuses of the browser requests to filter by. Valid values: pending, running, completed, failed

Example: {"value":"completed,running"}
pageSizeinteger · int32Optional

Items to return per page (default: 30).

Example: {"value":20}
pageinteger · int32Optional

Page number of the pagination (default: 1).

Example: {"value":1}
Responses
200
A collection of browser requests that match the criteria
application/json
400
Invalid query parameters
application/json
get
GET /v1/browser/requests HTTP/1.1
Host: api.gaffa.dev
X-API-Key: YOUR_API_KEY
Accept: */*
{"data":{"total_pages":1,"total_records":2,"results":[{"id":"brq_V2PUfFA8AQPAQ5VEsewpxdGUSZkgKP","url":"https://demo.gaffa.dev/simulate/table?loadTime=3&rowCount=20","proxy_location":null,"state":"completed","credit_usage":4,"error":null,"error_reason":null,"actual_url":null,"http_status_code":200,"from_cache":false,"started_at":"2024-11-22T16:31:13.128103+00:00","completed_at":"2024-11-22T16:31:47.020851+00:00","running_time":null,"page_load_time":"00:00:03.4705813","actions":[{"id":"act_V2PUfETiTdXwzEgAW2NPURnATW7we9","type":"wait","query":"wait?selector=.loadingSelector&timeout=20000&continue_on_fail=True","custom_id":null,"timestamp":"2024-11-22T16:31:16.6080484+00:00","output":null,"reference":null,"error":null},{"id":"act_V2PUfBreQxHR2SNqGXuPzzWoiyRsrm","type":"print","query":"print?size=A4&margin=20&orientation=landscape&continue_on_fail=True","custom_id":null,"timestamp":"2024-11-22T16:31:40.5760333+00:00","output":"https://storage.gaffa.dev/brq/pdf/brq_V2PUfFA8AQPAQ5VEsewpxdGUSZkgKP/act_V2PUfBreQxHR2SNqGXuPzzWoiyRsrm.pdf","reference":null,"error":null}],"video":"https://storage.gaffa.dev/brq/video/brq_V2PUfFA8AQPAQ5VEsewpxdGUSZkgKP.mp4"},{"id":"brq_V2NmHY9FsvPQEGbfVBSeV6UCp2SXjC","url":"https://demo.gaffa.dev/simulate/article?loadTime=3&paragraphs=10&images=3","proxy_location":null,"state":"completed","credit_usage":1,"error":null,"error_reason":null,"actual_url":null,"http_status_code":200,"from_cache":false,"started_at":"2024-11-22T12:52:48.708264+00:00","completed_at":"2024-11-22T12:52:54.25994+00:00","running_time":null,"page_load_time":"00:00:00.8094888","actions":[{"id":"act_V2NmHijnQa9iPDNcvhjS2GGFt5se8j","type":"wait","query":"wait?selector=article&timeout=20000&continue_on_fail=True","custom_id":null,"timestamp":"2024-11-22T12:52:49.5690537+00:00","output":null,"reference":null,"error":null},{"id":"act_V2NmHgs27VJKB49YavtK4CcyErdfvD","type":"generate_markdown","query":"generate_markdown?continue_on_fail=True","custom_id":null,"timestamp":"2024-11-22T12:52:52.8353136+00:00","output":"https://storage.gaffa.dev/brq/md/brq_V2NmHY9FsvPQEGbfVBSeV6UCp2SXjC/act_V2NmHgs27VJKB49YavtK4CcyErdfvD.md","reference":null,"error":null}],"video":null},{"id":"brq_V2HvS2cw4Z2wonqEAwbxoxjrkmRdEM","url":"https://demo.gaffa.dev/simulate/article","proxy_location":null,"state":"failed","credit_usage":0,"error":null,"error_reason":null,"actual_url":null,"http_status_code":null,"from_cache":false,"started_at":null,"completed_at":null,"running_time":null,"page_load_time":null,"actions":null,"video":null}],"page":1,"page_size":30},"error":null,"httpCode":0}
contact support
contact support
universal parameters
universal parameters
universal parameters
universal parameters
universal parameters
universal parameters
universal parameters

Update an existing data schema

put

Updates an existing data schema by its ID and returns the updated schema.

Authorizations
Path parameters
idstringRequired
Body
idstring | nullableOptional

The unique identifier for the data schema.

namestring | nullableOptional

The name of the schema or field.

descriptionstring | nullableOptional

A description of the schema or field.

Responses
200
Payload of DataSchema
application/json
put
200

Payload of DataSchema

Create a new browser request

post

This endpoint loads the required URL in our browser and then performs the selected actions.

Authorizations
Body
proxy_locationstring | nullableOptional

The location of the proxy server that your request will be routed through, null means no proxy is used

Default: null
urlstringOptional

The url you want our browsers to visit on your behalf

asyncbooleanOptional

Whether the request should be processed asynchronously, synchronous requests can be maximum 60 seconds long.

Default: true
max_cache_ageinteger · int32 | nullableOptional

The maximum age of a cached result in seconds. 0 means the cache will never be used

Default: 0
Responses
200
The browser request response detailing the state and output of the request
application/json
408
The browser request timed out - an example error
application/json
post
universal parameters
PUT /v1/schemas/{id} HTTP/1.1
Host: api.gaffa.dev
X-API-Key: YOUR_API_KEY
Content-Type: application/json
Accept: */*
Content-Length: 1082

"{\"name\":\"Updated Product Schema\",\"description\":\"Enhanced schema for product information with additional fields\",\"fields\":[{\"type\":\"string\",\"name\":\"productName\",\"description\":\"Name of the product\",\"fields\":[]},{\"type\":\"decimal\",\"name\":\"price\",\"description\":\"Product price\",\"fields\":[]},{\"type\":\"boolean\",\"name\":\"inStock\",\"description\":\"Whether the product is in stock\",\"fields\":[]},{\"type\":\"array\",\"name\":\"tags\",\"description\":\"Product tags\",\"fields\":[{\"type\":\"string\",\"name\":\"tagItem\",\"description\":null,\"fields\":[]}]},{\"type\":\"array\",\"name\":\"categories\",\"description\":\"Product categories\",\"fields\":[{\"type\":\"string\",\"name\":\"category\",\"description\":null,\"fields\":[]}]},{\"type\":\"object\",\"name\":\"specifications\",\"description\":\"Technical specifications\",\"fields\":[{\"type\":\"string\",\"name\":\"dimensions\",\"description\":\"Product dimensions\",\"fields\":[]},{\"type\":\"double\",\"name\":\"weight\",\"description\":\"Product weight in grams\",\"fields\":[]}]}]}"
{
  "id": "text",
  "name": "text",
  "description": "text",
  "fields": [
    {
      "type": 0,
      "name": "text",
      "description": "text",
      "fields": [
        {
          "type": 0,
          "name": "text",
          "description": "text",
          "fields": [
            "[Circular Reference]"
          ]
        }
      ]
    }
  ]
}
POST /v1/browser/requests HTTP/1.1
Host: api.gaffa.dev
X-API-Key: YOUR_API_KEY
Content-Type: application/json
Accept: */*
Content-Length: 334

"{\"proxy_location\":null,\"url\":\"https://demo.gaffa.dev/simulate/table?loadTime=3&rowCount=20\",\"async\":false,\"max_cache_age\":0,\"settings\":{\"record_request\":false,\"actions\":[{\"type\":\"wait\",\"selector\":\"table\"},{\"type\":\"print\",\"size\":\"A4\",\"margin\":20}],\"time_limit\":60000,\"max_media_bandwidth\":null}}"
{"data":{"id":"brq_V2P6PqrZpycFtbc7mtXE4tsNbeg2N6","url":"https://demo.gaffa.dev/simulate/table?loadTime=3&rowCount=20","proxy_location":null,"state":"completed","credit_usage":1,"error":null,"error_reason":null,"actual_url":null,"http_status_code":200,"from_cache":false,"started_at":"2024-11-22T14:33:38.7762685+00:00","completed_at":"2024-11-22T14:33:42.7135779+00:00","running_time":null,"page_load_time":"00:00:00.1902889","actions":[{"id":"act_V2P6Q3fSHhBWAhf4BQJxj9oYbQF1V9","type":"wait","query":"wait?selector=table&timeout=20000&continue_on_fail=True","custom_id":null,"timestamp":"2024-11-22T14:33:38.9665719+00:00","output":null,"reference":null,"error":null},{"id":"act_V2P6Q6BuQhoYDAVkQMVSKkkwmUrArb","type":"print","query":"print?size=A4&margin=20&orientation=portrait&continue_on_fail=True","custom_id":null,"timestamp":"2024-11-22T14:33:42.3025888+00:00","output":"https://storage.gaffa.dev/brq/pdf/brq_V2P6PqrZpycFtbc7mtXE4tsNbeg2N6/....","reference":null,"error":null}],"video":null},"error":null,"httpCode":0}
universal parameters

List data schemas

get

Retrieves a paginated list of data schemas.

Authorizations
Query parameters
pageSizeinteger · int32Optional
pageinteger · int32Optional
Responses
200
Payload of PagedResult containing DataSchema
application/json
get
GET /v1/schemas HTTP/1.1
Host: api.gaffa.dev
X-API-Key: YOUR_API_KEY
Accept: */*
200

Payload of PagedResult containing DataSchema

{"data":{"total_pages":1,"total_records":3,"results":[{"id":"schema_abc123def456","name":"Customer Schema","description":"Data schema for customer information","fields":[{"type":"string","name":"firstName","description":"Customer's first name","fields":[]},{"type":"string","name":"lastName","description":"Customer's last name","fields":[]},{"type":"integer","name":"age","description":"Customer's age in years","fields":[]},{"type":"boolean","name":"isActive","description":"Whether the customer account is active","fields":[]}]},{"id":"schema_xyz789uvw123","name":"Product Schema","description":"Data schema for product information","fields":[{"type":"string","name":"productName","description":"Name of the product","fields":[]},{"type":"decimal","name":"price","description":"Product price","fields":[]},{"type":"boolean","name":"inStock","description":"Whether the product is in stock","fields":[]},{"type":"array","name":"tags","description":"Product tags","fields":[{"type":"string","name":"tagItem","description":null,"fields":[]}]}]},{"id":"schema_hij456klm789","name":"Order Schema","description":"Data schema for order processing","fields":[{"type":"string","name":"orderId","description":"Unique order identifier","fields":[]},{"type":"datetime","name":"orderDate","description":"Date when order was placed","fields":[]},{"type":"object","name":"customer","description":"Customer information","fields":[{"type":"string","name":"customerId","description":"Customer identifier","fields":[]},{"type":"string","name":"email","description":"Customer email address","fields":[]}]},{"type":"decimal","name":"totalAmount","description":"Total order amount","fields":[]}]}],"page":1,"page_size":30},"error":null,"httpCode":0}
below
below
universal parameters
below

Create a new data schema

post

Creates a new data schema definition and returns the created schema.

Authorizations
Body
idstring | nullableOptional

The unique identifier for the data schema.

namestring | nullableOptional

The name of the schema or field.

descriptionstring | nullableOptional

A description of the schema or field.

Responses
200
Payload of DataSchema
application/json
post
POST /v1/schemas HTTP/1.1
Host: api.gaffa.dev
X-API-Key: YOUR_API_KEY
Content-Type: application/json
Accept: */*
Content-Length: 518

"{\"name\":\"Customer Schema\",\"description\":\"Data schema for customer information\",\"fields\":[{\"type\":\"string\",\"name\":\"firstName\",\"description\":\"Customer's first name\",\"fields\":[]},{\"type\":\"string\",\"name\":\"lastName\",\"description\":\"Customer's last name\",\"fields\":[]},{\"type\":\"integer\",\"name\":\"age\",\"description\":\"Customer's age in years\",\"fields\":[]},{\"type\":\"boolean\",\"name\":\"isActive\",\"description\":\"Whether the customer account is active\",\"fields\":[]}]}"
200

Payload of DataSchema

{"id":"schema_abc123def456","name":"Customer Schema","description":"Data schema for customer information","fields":[{"type":"string","name":"firstName","description":"Customer's first name","fields":[]},{"type":"string","name":"lastName","description":"Customer's last name","fields":[]},{"type":"integer","name":"age","description":"Customer's age in years","fields":[]},{"type":"boolean","name":"isActive","description":"Whether the customer account is active","fields":[]}]}

Get a browser request by ID

get

This endpoint retrieves a browser request by its ID.

Authorizations
Path parameters
idstringRequired

The unique identifier of the browser request to retrieve.

Query parameters
idstringRequired

The unique identifiers of the browser request to retrieve.

Responses
200
The browser request
application/json
404
Browser request not found
application/json
get
GET /v1/browser/requests/{id} HTTP/1.1
Host: api.gaffa.dev
X-API-Key: YOUR_API_KEY
Accept: */*
{
  "id": "text",
  "url": "text",
  "proxy_location": "text",
  "state": "text",
  "credit_usage": 1,
  "error": "text",
  "error_reason": "text",
  "actual_url": "text",
  "http_status_code": 100,
  "from_cache": true,
  "started_at": "2025-06-05T23:28:53.889Z",
  "completed_at": "2025-06-05T23:28:53.889Z",
  "running_time": "text",
  "page_load_time": "text",
  "actions": [
    {
      "id": "text",
      "type": "text",
      "query": "text",
      "custom_id": "text",
      "timestamp": "2025-06-05T23:28:53.889Z",
      "output": "text",
      "reference": "text",
      "error": "text"
    }
  ],
  "video": "text"
}