# Finviz Stock Screener Scraper (`automation-lab/finviz-stock-screener-scraper`) Actor

📊 Export any public Finviz stock screen as typed, analysis-ready data. Preserve filters and sorting, paginate automatically, and retain source values.

- **URL**: https://apify.com/automation-lab/finviz-stock-screener-scraper.md
- **Developed by:** [Stas Persiianenko](https://apify.com/automation-lab) (community)
- **Categories:** Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js/docs.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/integrations/mcp.md).

If your project is in a different language, use 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

## Finviz Stock Screener Scraper

Turn any public Finviz stock screen into clean, typed data for watchlists, research notebooks, dashboards, and recurring market pipelines.

Paste the URL created by the Finviz screener UI. The Actor keeps its filter, view, and sort parameters, paginates the result set, and returns one dataset row per stock.

- 📊 Extract filtered stock universes, not just individual ticker pages
- 🔎 Keep arbitrary public Finviz filter and sorting parameters
- 🔁 Follow result pagination automatically
- 🧮 Receive normalized numbers plus the original Finviz display values
- 🔗 Trace every row to its quote page and source screen
- 🛡️ Detect challenge pages instead of returning them as fake records

### What does Finviz Stock Screener Scraper do?

Finviz Stock Screener Scraper reads public `finviz.com/screener.ashx` pages.

It extracts the overview fields used in common equity-screening workflows:

- result rank
- ticker symbol
- company name
- sector and industry
- issuer country
- market capitalization
- P/E ratio
- quoted price
- daily percentage change
- trading volume

The Actor supports screens built with Finviz filters such as sector, industry, country, valuation, growth, performance, liquidity, and technical criteria.

It also preserves Finviz sorting parameters, so a screen ordered by market cap or volume remains ordered the same way in the dataset.

### Who is it for?

#### Quantitative researchers

Refresh candidate universes before factor calculations, backtests, or deeper enrichment.

#### Investors and analysts

Export filtered watchlists without copying tables into spreadsheets by hand.

#### Financial-data teams

Feed structured stock-screen results into warehouses, notebooks, and internal APIs.

#### Market researchers

Compare sectors, countries, industries, valuation bands, or performance cohorts over time.

#### AI and agent builders

Give an AI workflow a bounded set of relevant tickers with readable company context and source provenance.

### Why use this Finviz scraper?

The useful unit is the filtered universe, not a single quote page.

A Finviz screen can represent a repeatable research rule such as:

- US technology companies sorted by market cap
- software stocks with high historical sales growth
- low-P/E companies with sufficient trading volume
- healthcare stocks matching a daily performance threshold
- country-specific stocks in a chosen industry

The Actor lets you save that rule as a URL and refresh it on a schedule.

Typed values remove common spreadsheet cleanup steps. Raw values remain available when exact source formatting matters.

### How to scrape a Finviz stock screen

1. Open the public Finviz screener.
2. Choose filters, view, and sorting.
3. Copy the resulting `https://finviz.com/screener.ashx?...` URL.
4. Add the URL to **Finviz screener URLs**.
5. Set a small `maxItems` value for your first run.
6. Run the Actor.
7. Export the default dataset as JSON, CSV, Excel, XML, or RSS.

For a scheduled monitor, save the input as an Apify task and attach a schedule or webhook integration.

### Input

The Actor accepts the following fields.

| Field | Type | Required | Default | Description |
|---|---|---:|---:|---|
| `startUrls` | array | yes | technology screen | Public Finviz screener URLs |
| `maxItems` | integer | no | `100` | Global maximum records across all screens |
| `maxPagesPerUrl` | integer | no | `20` | Pagination safety limit per screen |

Only HTTPS URLs on `finviz.com` or `www.finviz.com` with the `/screener.ashx` path are accepted.

Non-Finviz URLs, quote pages, news pages, and malformed URLs fail closed before extraction.

#### Small input example

```json
{
  "startUrls": [
    {
      "url": "https://finviz.com/screener.ashx?v=111&f=sec_technology&o=-marketcap"
    }
  ],
  "maxItems": 20,
  "maxPagesPerUrl": 2
}
````

#### Multiple-screen example

```json
{
  "startUrls": [
    {
      "url": "https://finviz.com/screener.ashx?v=111&f=fa_pe_u15,geo_usa&o=-marketcap"
    },
    {
      "url": "https://finviz.com/screener.ashx?v=111&f=fa_sales5years_o15,geo_usa&o=-volume"
    }
  ],
  "maxItems": 500,
  "maxPagesPerUrl": 15
}
```

### Output data

Each dataset item represents one stock in one canonical input screen.

| Field | Type | Meaning |
|---|---|---|
| `rank` | integer | Finviz result rank |
| `ticker` | string | Stock ticker |
| `company` | string | Company name |
| `sector` | string | Finviz sector |
| `industry` | string | Finviz industry |
| `country` | string | Issuer country |
| `marketCap` | number or null | Normalized market cap in USD |
| `marketCapRaw` | string | Original display value |
| `peRatio` | number or null | Normalized P/E ratio |
| `peRatioRaw` | string | Original display value |
| `price` | number or null | Normalized quoted price |
| `priceRaw` | string | Original display value |
| `dailyChangePercent` | number or null | Change in percentage points |
| `dailyChangeRaw` | string | Original percentage text |
| `volume` | number or null | Normalized trading volume |
| `volumeRaw` | string | Original display value |
| `detailUrl` | string | Absolute Finviz quote URL |
| `sourceUrl` | string | Exact paginated page URL |
| `screenerUrl` | string | Canonical screen without page offset |
| `scrapedAt` | string | UTC extraction timestamp |

### Output example

```json
{
  "rank": 1,
  "ticker": "AAPL",
  "company": "Apple Inc.",
  "sector": "Technology",
  "industry": "Consumer Electronics",
  "country": "USA",
  "marketCap": 3000000000000,
  "marketCapRaw": "3.00T",
  "peRatio": 31.42,
  "peRatioRaw": "31.42",
  "price": 210.15,
  "priceRaw": "210.15",
  "dailyChangePercent": 0.82,
  "dailyChangeRaw": "0.82%",
  "volume": 48100200,
  "volumeRaw": "48,100,200",
  "detailUrl": "https://finviz.com/quote.ashx?t=AAPL",
  "sourceUrl": "https://finviz.com/screener.ashx?v=111&f=sec_technology&o=-marketcap",
  "screenerUrl": "https://finviz.com/screener.ashx?f=sec_technology&o=-marketcap&v=111",
  "scrapedAt": "2026-07-23T12:00:00.000Z"
}
```

Values in this example are illustrative. Market data changes continuously.

### Pagination and limits

Finviz overview screens normally show 20 stocks per page.

The Actor advances the Finviz `r` result-offset parameter while rows continue to appear.

`maxItems` is global across all input URLs.

`maxPagesPerUrl` protects against unexpectedly large screens and malformed pagination behavior.

The same ticker can appear once per materially different canonical input screen. Duplicate pages within the same screen do not create duplicate ticker rows.

### Numeric normalization

Market-cap suffixes are converted to USD magnitudes:

- `K` becomes thousands
- `M` becomes millions
- `B` becomes billions
- `T` becomes trillions

Commas, percent signs, and currency symbols are removed from normalized numeric fields.

A dash or unavailable source value becomes `null`, while its companion `Raw` field keeps the source text.

This makes numeric filtering and aggregation easier without losing auditability.

### How much does it cost to scrape Finviz stock screens?

The Actor uses pay-per-event pricing.

- A small start charge covers run initialization.
- A stock-record event is charged for each saved dataset row.
- Subscription tiers receive decreasing per-record prices.

The exact active prices are shown on the Actor page before every run.

Start with `maxItems: 20` to verify your screen at low cost, then scale only after reviewing the output.

Residential proxy traffic and compute are included in the event pricing; you do not configure a separate proxy bill for ordinary Actor runs.

### Scheduling a Finviz stock monitor

Create an Apify task with your stable screener URL.

Then choose a schedule appropriate for the workflow:

- before US market open
- after market close
- hourly during trading sessions
- weekly for broad universe reviews

Send the resulting dataset to a webhook, cloud function, spreadsheet workflow, or warehouse loader.

Use `screenerUrl` as the screen identity and `ticker` as the stock identity when comparing snapshots.

### Integrations

#### Google Sheets

Use an Apify integration or automation platform to append each scheduled dataset to a dated worksheet.

#### Data warehouses

Load JSON or CSV exports into BigQuery, Snowflake, Redshift, or PostgreSQL for longitudinal analysis.

#### Slack and email alerts

Compare the current ticker set with the prior snapshot, then notify a channel when stocks enter or leave a screen.

#### AI enrichment

Pass the filtered ticker list to a news, filings, quote, or company-intelligence workflow instead of asking an AI model to discover the universe itself.

#### Webhooks

Trigger a downstream process when a run succeeds and use the run's default dataset URL to fetch records.

### JavaScript API example

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

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('automation-lab/finviz-stock-screener-scraper').call({
  startUrls: [
    { url: 'https://finviz.com/screener.ashx?v=111&f=sec_technology&o=-marketcap' }
  ],
  maxItems: 100,
  maxPagesPerUrl: 5,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

### Python API example

```python
import os
from apify_client import ApifyClient

client = ApifyClient(os.environ['APIFY_TOKEN'])
run = client.actor('automation-lab/finviz-stock-screener-scraper').call(run_input={
    'startUrls': [
        {'url': 'https://finviz.com/screener.ashx?v=111&f=sec_technology&o=-marketcap'}
    ],
    'maxItems': 100,
    'maxPagesPerUrl': 5,
})

items = client.dataset(run['defaultDatasetId']).list_items().items
print(items)
```

### cURL API example

```bash
curl -X POST \
  "https://api.apify.com/v2/acts/automation-lab~finviz-stock-screener-scraper/runs?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "startUrls": [{
      "url": "https://finviz.com/screener.ashx?v=111&f=sec_technology&o=-marketcap"
    }],
    "maxItems": 100,
    "maxPagesPerUrl": 5
  }'
```

Poll the returned run ID or use an Apify client that waits for completion.

### Use with Apify MCP

Connect AI clients to the Apify MCP server and expose this Actor as a tool.

#### Claude Code

```bash
claude mcp add --transport http apify "https://mcp.apify.com?tools=automation-lab/finviz-stock-screener-scraper"
```

#### Claude Desktop, Cursor, and VS Code

Use this MCP configuration in Claude Desktop, Cursor, or VS Code. Add authentication according to your client's current remote-MCP instructions.

```json
{
  "mcpServers": {
    "apify-finviz-screener": {
      "url": "https://mcp.apify.com?tools=automation-lab/finviz-stock-screener-scraper"
    }
  }
}
```

Example prompts:

- “Run my US technology Finviz screen and summarize the largest companies.”
- “Export the tickers and P/E ratios from this Finviz screener URL.”
- “Refresh these two screens and identify tickers appearing in both.”
- “Build a CSV of software stocks sorted by market capitalization.”

### Tips for reliable runs

- Copy the final URL from the Finviz screener after filters are applied.
- Keep the `v=111` overview view when you need all documented fields.
- Test with 20 records before requesting a large universe.
- Preserve your preferred Finviz `o` sorting parameter.
- Use separate input URLs for separate business rules.
- Schedule repeated screens rather than launching manual duplicate runs.
- Inspect raw fields when validating a source-format change.

The Actor manages residential proxy sessions automatically. A custom proxy field is intentionally not exposed because Finviz access depends on a controlled strategy.

### Error handling

The Actor retries Cloudflare-style blocks with a rotated residential session.

It fails rather than returning a challenge page as market data.

A malformed or out-of-scope URL fails input processing.

If one of several screens fails, the Actor logs that screen and continues with the others.

If no screen can be parsed, the run exits non-zero so schedules and integrations can detect the failure.

A valid screen with naturally zero matching stocks is not treated as an extraction failure.

### Limitations

- The source is public Finviz HTML, not an exchange-certified market-data feed.
- Prices, volume, and daily changes reflect the freshness shown by Finviz.
- The initial output contract targets the Finviz overview columns.
- Other Finviz views may contain extra columns that are not emitted yet.
- Finviz can change its layout or anti-bot controls without notice.
- The Actor does not provide investment advice or trading execution.
- Historical screen membership is available only if you schedule and retain snapshots.

For real-time trading decisions, verify values against a licensed market-data source.

### Is scraping Finviz legal?

This Actor extracts publicly accessible screener pages without logging into a private account.

You are responsible for your use case, requested volume, data retention, and compliance with applicable laws, contracts, and Finviz terms.

Do not use the Actor to overload the source, evade access controls, redistribute data unlawfully, or make misleading financial claims.

Financial data may be licensed or delayed. Confirm downstream redistribution rights for your jurisdiction and product.

### Troubleshooting

#### Why did my URL fail validation?

Confirm that it starts with `https://finviz.com/screener.ashx` or `https://www.finviz.com/screener.ashx`.

Quote URLs such as `quote.ashx?t=AAPL` belong to ticker-detail workflows and are intentionally rejected.

#### Why are some numeric fields null?

Finviz may display `-` or another unavailable value. Check the matching raw field to see the exact source text.

#### Why did I receive fewer rows than maxItems?

The filtered screen may contain fewer stocks, `maxPagesPerUrl` may be reached, or duplicate rows may have been removed.

#### Why did the run fail instead of returning an empty dataset?

The Actor distinguishes a real zero-result screen from an unparseable or challenged page. Extraction failures exit non-zero to protect automated pipelines.

### Related Automation Lab actors

- [Finviz Stock Quote & News Scraper](https://apify.com/automation-lab/finviz-stock-quote-news-scraper) for known ticker detail pages and related news
- [Nasdaq Stock Screener Scraper](https://apify.com/automation-lab/nasdaq-stock-screener-scraper) for a comparable universe from Nasdaq public data
- [TradingView Stock Screener](https://apify.com/automation-lab/tradingview-stock-screener) for TradingView-based screening workflows

Choose this Actor when your selection rules already exist as a public Finviz screener URL.

### FAQ

#### Does it support arbitrary Finviz filters?

Yes. The Actor preserves public query parameters supplied in each validated screener URL and controls only the pagination offset.

#### Can I scrape multiple screens in one run?

Yes. Add multiple entries to `startUrls`; `maxItems` remains a global cap.

#### Are normalized numbers guaranteed to be non-null?

No. Unavailable or unparseable display values become `null`, while the raw text is retained.

#### Does it require Finviz login credentials?

No. The supported scope is the public stock screener.

#### Does it scrape individual quote details or news?

It returns each quote URL, but detailed quote and news extraction belongs to the related Finviz quote/news Actor.

#### Can I export to Excel?

Yes. Open the default dataset and choose Excel, CSV, JSON, XML, or another supported Apify export format.

#### Can I run it every day?

Yes. Save the input as an Apify task and attach a schedule.

#### Is this investment advice?

No. It is a data-extraction tool. Validate data and make investment decisions independently.

# Actor input Schema

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

Public https://finviz.com/screener.ashx URLs. Build filters on Finviz, then paste the resulting URL here.

## `maxItems` (type: `integer`):

Global maximum number of unique stock records across all screener URLs.

## `maxPagesPerUrl` (type: `integer`):

Safety limit for pagination of each Finviz screen. Each page normally contains 20 stocks.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://finviz.com/screener.ashx?v=111&f=sec_technology&o=-marketcap"
    }
  ],
  "maxItems": 20,
  "maxPagesPerUrl": 2
}
```

# Actor output Schema

## `overview` (type: `string`):

Open the default dataset using the overview table view.

# 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://finviz.com/screener.ashx?v=111&f=sec_technology&o=-marketcap"
        }
    ],
    "maxItems": 20,
    "maxPagesPerUrl": 2
};

// Run the Actor and wait for it to finish
const run = await client.actor("automation-lab/finviz-stock-screener-scraper").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://finviz.com/screener.ashx?v=111&f=sec_technology&o=-marketcap" }],
    "maxItems": 20,
    "maxPagesPerUrl": 2,
}

# Run the Actor and wait for it to finish
run = client.actor("automation-lab/finviz-stock-screener-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).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://finviz.com/screener.ashx?v=111&f=sec_technology&o=-marketcap"
    }
  ],
  "maxItems": 20,
  "maxPagesPerUrl": 2
}' |
apify call automation-lab/finviz-stock-screener-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=automation-lab/finviz-stock-screener-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Finviz Stock Screener Scraper",
        "description": "📊 Export any public Finviz stock screen as typed, analysis-ready data. Preserve filters and sorting, paginate automatically, and retain source values.",
        "version": "0.1",
        "x-build-id": "Thr0kNsxqwabN8FiN"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/automation-lab~finviz-stock-screener-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-automation-lab-finviz-stock-screener-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/automation-lab~finviz-stock-screener-scraper/runs": {
            "post": {
                "operationId": "runs-sync-automation-lab-finviz-stock-screener-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/automation-lab~finviz-stock-screener-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-automation-lab-finviz-stock-screener-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "startUrls"
                ],
                "properties": {
                    "startUrls": {
                        "title": "📊 Finviz screener URLs",
                        "type": "array",
                        "description": "Public https://finviz.com/screener.ashx URLs. Build filters on Finviz, then paste the resulting URL here.",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "maxItems": {
                        "title": "Maximum stock records",
                        "minimum": 1,
                        "maximum": 10000,
                        "type": "integer",
                        "description": "Global maximum number of unique stock records across all screener URLs.",
                        "default": 100
                    },
                    "maxPagesPerUrl": {
                        "title": "Maximum pages per screener",
                        "minimum": 1,
                        "maximum": 500,
                        "type": "integer",
                        "description": "Safety limit for pagination of each Finviz screen. Each page normally contains 20 stocks.",
                        "default": 20
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
