# Direct Ferries Scraper - Schedules & Operators (`jungle_synthesizer/direct-ferries-scraper`) Actor

Scrape directferries.com global ferry aggregator (2,500+ routes, 800+ ports, 400+ operators). Extract timetables, operators, vessels, and aggregate fares for Mediterranean, UK-EU, Scandinavian, and worldwide ferry routes.

- **URL**: https://apify.com/jungle\_synthesizer/direct-ferries-scraper.md
- **Developed by:** [BowTiedRaccoon](https://apify.com/jungle_synthesizer) (community)
- **Categories:** Travel, Business, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN 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.

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.md):

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

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.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/platform/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

## Direct Ferries Scraper

Scrapes ferry routes, schedules, and operator data from [Direct Ferries](https://www.directferries.com) — the world's largest ferry-ticket aggregator. Returns 2,500+ routes across 800+ ports and 400+ operators, covering Mediterranean island-hopping, UK-EU crossings, Scandinavian, Baltic, and worldwide ferry traffic.

---

### Direct Ferries Scraper Features

- Returns one aggregate route record per route — operators, average price, daily and weekly sailing counts, fastest and average duration, distance in nautical miles, first and last ferry of the day.
- Returns one record per scheduled crossing in the published timetable — operator, departure time, arrival time, duration, sailing days.
- Names the vessels operating each route. P&O Liberté, Spirit of France, Calais Seaways, the lot.
- Four input modes — single route lookup, every outbound route from a port, every route an operator runs, every route within a country.
- Pure HTML scraping over the public site. No headless browser, no booking-widget reverse engineering, no theatrics.
- Apify residential proxy by default. Cloudflare is permissive on Direct Ferries, but residential keeps origin throttling out of the picture.

---

### Who Uses Direct Ferries Data?

- **Travel-tech startups** — wire ferry routes into multi-modal trip planners alongside flights and trains, instead of stopping the user at the coast.
- **Island-hopping & RV travel apps** — power Greek-island, Croatian-island, Balearic, and Cycladic itinerary builders with real schedules and operator coverage.
- **Comparison & booking sites** — keep a refreshed reference of every published ferry route, average fare, and sailing frequency.
- **RO-RO freight planners** — cross-reference truck-and-trailer routes (Dover-Calais, Dunkirk, Portsmouth-Santander, Adriatic Ro-Pax) without scraping each operator separately.
- **Travel research** — study network coverage, seasonal frequency, and operator competition across the global ferry market.

---

### How Direct Ferries Scraper Works

1. Pick a mode — single route, port departures, operator routes, or country routes.
2. The scraper visits the appropriate Direct Ferries page (e.g. `/dover_calais_ferry.htm`, `/france.htm`, `/dfds.htm`) and walks the listed routes.
3. For each route page it pulls the aggregate route summary, the published timetable, and the vessel list.
4. Emits one `route_summary` record per route plus one `sailing` record per timetable row, capped by `maxItems`.

The actor uses standard Cheerio HTML scraping with the Apify residential proxy preset. Per-sailing live fares come from the booking widget API and are intentionally out of scope — the actor returns the published static data, which is enough for catalog work, route research, and comparison feeds.

---

### Input

```json
{
  "mode": "route_search",
  "originPort": "Dover",
  "destinationPort": "Calais",
  "maxItems": 15,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"]
  }
}
````

| Field | Type | Default | Description |
|-------|------|---------|-------------|
| `mode` | string | `route_search` | One of `route_search`, `port_departures`, `operator_routes`, `country_routes`. |
| `originPort` | string | `Dover` | Origin port name. Used in `route_search` and `port_departures`. Examples: Dover, Calais, Piraeus, Naples. |
| `destinationPort` | string | `Calais` | Destination port name. Used in `route_search` only. |
| `country` | string | `france` | Country slug. Used in `country_routes`. Examples: `france`, `greece`, `italy`, `croatia`, `united-kingdom`. |
| `operator` | string | `dfds` | Operator slug. Used in `operator_routes`. Examples: `dfds`, `poferries`, `irish`, `brittany`, `stena`, `minoan`, `grimaldi`, `vikingline`. |
| `maxItems` | integer | `15` | Cap on total records (route summaries + sailings combined). Set higher to fan out across a country or operator. |
| `proxyConfiguration` | object | Apify residential | Standard Apify proxy block. Residential is recommended for sustained crawls. |

#### Single route

```json
{
  "mode": "route_search",
  "originPort": "Piraeus",
  "destinationPort": "Mykonos",
  "maxItems": 20
}
```

#### Every outbound route from a port

```json
{
  "mode": "port_departures",
  "originPort": "Piraeus",
  "maxItems": 50
}
```

#### Every route an operator runs

```json
{
  "mode": "operator_routes",
  "operator": "dfds",
  "maxItems": 100
}
```

#### Every route within a country

```json
{
  "mode": "country_routes",
  "country": "greece",
  "maxItems": 200
}
```

***

### Direct Ferries Scraper Output Fields

Records carry a `record_type` of either `route_summary` (aggregate route stats) or `sailing` (one timetable row). Summary fields are populated for summaries; sailing fields are populated for sailings; the unused side is empty.

#### Route summary record example

```json
{
  "record_type": "route_summary",
  "route_url": "https://www.directferries.com/dover_calais_ferry.htm",
  "route_name": "Dover - Calais",
  "origin_port": "Dover",
  "origin_country": "England",
  "destination_port": "Calais",
  "destination_country": "France",
  "operator": "Irish Ferries, P&O Ferries & DFDS Seaways",
  "operators_count": 3,
  "avg_price_text": "$258",
  "avg_price_value": 258,
  "avg_price_currency": "$",
  "avg_daily_sailings": 31,
  "avg_weekly_sailings": 211,
  "duration_text": "1 h 30 m",
  "duration_minutes": 90,
  "fastest_duration_text": "1 h 25 m",
  "fastest_duration_minutes": 85,
  "first_ferry": "00:15",
  "last_ferry": "23:55",
  "distance_nautical_miles": 33,
  "vessels": "Spirit of France, P&O Liberté, P&O Pioneer, Calais Seaways, Malo Seaways, C Class, Isle Of Innisfree, Isle of Inisheer",
  "booking_url": "https://www.directferries.com/dover_calais_ferry.htm",
  "scraped_at": "2026-05-02T13:32:58.533Z"
}
```

#### Sailing record example

```json
{
  "record_type": "sailing",
  "route_url": "https://www.directferries.com/dover_calais_ferry.htm",
  "route_name": "Dover - Calais",
  "origin_port": "Dover",
  "origin_country": "England",
  "destination_port": "Calais",
  "destination_country": "France",
  "operator": "DFDS Seaways",
  "departure_time": "10:40",
  "arrival_time": "12:20",
  "duration_text": "1 hour 40 minutes",
  "duration_minutes": 100,
  "sailing_days": "Mon, Tue, Wed, Fri, Sat, Sun",
  "booking_url": "https://www.directferries.com/dover_calais_ferry.htm",
  "scraped_at": "2026-05-02T13:32:58.533Z"
}
```

| Field | Type | Description |
|-------|------|-------------|
| `record_type` | string | `route_summary` or `sailing`. |
| `route_url` | string | Direct Ferries route page URL. |
| `route_name` | string | Route name in `Origin - Destination` form. |
| `origin_port` | string | Origin port name. |
| `origin_country` | string | Origin country (as Direct Ferries lists it — e.g. `England`, `France`, `Greece`). |
| `destination_port` | string | Destination port name. |
| `destination_country` | string | Destination country. |
| `operator` | string | Comma-joined operator list (summary rows) or single operator (sailing rows). |
| `operators_count` | number | Number of operators on this route (summary rows). |
| `departure_time` | string | Scheduled departure `HH:MM` (sailing rows). |
| `arrival_time` | string | Scheduled arrival `HH:MM` (sailing rows). |
| `duration_text` | string | Crossing duration as displayed (`1 hour 30 minutes`, `1 h 30 m`). |
| `duration_minutes` | number | Crossing duration in minutes, parsed. |
| `sailing_days` | string | Days the sailing operates (`Everyday`, `Mon, Fri, Sat, Sun`, etc.). |
| `avg_price_text` | string | Average route fare as displayed by Direct Ferries (summary rows). |
| `avg_price_value` | number | Average route fare numeric value (summary rows). |
| `avg_price_currency` | string | Currency symbol or ISO (summary rows). |
| `avg_daily_sailings` | number | Average daily sailings on this route. |
| `avg_weekly_sailings` | number | Average weekly sailings on this route. |
| `fastest_duration_text` | string | Fastest crossing duration as displayed. |
| `fastest_duration_minutes` | number | Fastest crossing duration in minutes, parsed. |
| `first_ferry` | string | First daily sailing (summary rows, `HH:MM`). |
| `last_ferry` | string | Last daily sailing (summary rows, `HH:MM`). |
| `distance_nautical_miles` | number | Route distance in nautical miles. |
| `vessels` | string | Comma-joined vessel list operating the route. |
| `booking_url` | string | Direct Ferries booking page URL. |
| `scraped_at` | string | ISO 8601 timestamp when the record was scraped. |

***

### FAQ

#### How do I scrape Direct Ferries?

Direct Ferries Scraper takes a mode and a target — a port pair, a single port, an operator slug, or a country — and returns the route summary plus every published timetable row. Pick a mode in the input, set `maxItems`, and run it.

#### Does Direct Ferries Scraper return live per-sailing fares?

No. Per-sailing prices are only computed at booking time by the Direct Ferries widget — they're not in the static page HTML. The actor returns the published average fare per route plus the full timetable, which is enough for catalog work, route comparison, and aggregate market analysis.

#### Does Direct Ferries Scraper need proxies?

Direct Ferries Scraper ships with the Apify residential proxy preset enabled by default. Cloudflare is permissive on Direct Ferries — plain GETs come back with full HTML — but residential keeps origin-side throttling out of the picture for sustained crawls.

#### Can I scrape every route in Greece or every route DFDS operates?

Yes. Use `mode: country_routes` with `country: greece` to fan out across every Greek route, or `mode: operator_routes` with `operator: dfds` to fan out across every DFDS Seaways crossing. Set `maxItems` high enough to cover what you need.

#### How many records does a full run produce?

A single Dover-Calais run yields about 33 records — one summary plus 32 timetable rows. A full country fan-out (e.g. France) covers ~70 routes and runs into the low thousands of records once each route's timetable is included. Set `maxItems` accordingly. Default is 15 to keep test runs fast.

#### How fresh is the data?

Route topology and operator coverage are stable year-over-year. Timetables refresh weekly on Direct Ferries' side. Aggregate fare averages are published with a footnote naming the 30-day window they're sampled from.

***

### Need More Features?

Need vessel-level cabin and amenity matrices, the Ferryhopper Mediterranean dataset, or a different operator slug list? File an issue or get in touch.

### Why Use Direct Ferries Scraper?

- **Only ferry scraper on the Apify store** — zero competing actors, zero supply for a $150B global market.
- **Clean flat output** — one record per route summary, one record per sailing, consistent field names, durations parsed to minutes, fares parsed to numeric value plus currency. You spend less time normalizing and more time using the data.
- **Cheap and stable** — pay-per-event pricing at the standard $0.001/record. No headless browser, no captcha solving, no booking-widget reverse engineering. Just public HTML over HTTP.

# Actor input Schema

## `sp_intended_usage` (type: `string`):

Please describe how you plan to use the data extracted by this crawler.

## `sp_improvement_suggestions` (type: `string`):

Provide any feedback or suggestions for improvements.

## `sp_contact` (type: `string`):

Provide your email address so we can get in touch with you.

## `mode` (type: `string`):

How to scope the crawl.

## `originPort` (type: `string`):

Origin port name. Used in route\_search and port\_departures modes. Examples: Dover, Calais, Piraeus, Naples.

## `destinationPort` (type: `string`):

Destination port name. Used in route\_search mode only. Example: Calais.

## `country` (type: `string`):

Country name slug. Used in country\_routes mode. Examples: france, greece, italy, spain, croatia, united-kingdom.

## `operator` (type: `string`):

Operator slug. Used in operator\_routes mode. Examples: dfds, poferries, irish, brittany, stena, minoan, grimaldi, color, vikingline.

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

Maximum number of records to emit. Use small values (5-15) for fast preview runs. Each route page emits one summary record plus one record per scheduled crossing.

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

Apify residential proxy is recommended for sustained crawls. Cloudflare is permissive on directferries.com but residential keeps origin throttling at bay.

## Actor input object example

```json
{
  "sp_intended_usage": "Describe your intended use...",
  "sp_improvement_suggestions": "Share your suggestions here...",
  "sp_contact": "Share your email here...",
  "mode": "route_search",
  "originPort": "Dover",
  "destinationPort": "Calais",
  "country": "france",
  "operator": "dfds",
  "maxItems": 15,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

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

No description

# 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 = {
    "sp_intended_usage": "Describe your intended use...",
    "sp_improvement_suggestions": "Share your suggestions here...",
    "sp_contact": "Share your email here...",
    "mode": "route_search",
    "originPort": "Dover",
    "destinationPort": "Calais",
    "country": "france",
    "operator": "dfds",
    "maxItems": 15,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("jungle_synthesizer/direct-ferries-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 = {
    "sp_intended_usage": "Describe your intended use...",
    "sp_improvement_suggestions": "Share your suggestions here...",
    "sp_contact": "Share your email here...",
    "mode": "route_search",
    "originPort": "Dover",
    "destinationPort": "Calais",
    "country": "france",
    "operator": "dfds",
    "maxItems": 15,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("jungle_synthesizer/direct-ferries-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 '{
  "sp_intended_usage": "Describe your intended use...",
  "sp_improvement_suggestions": "Share your suggestions here...",
  "sp_contact": "Share your email here...",
  "mode": "route_search",
  "originPort": "Dover",
  "destinationPort": "Calais",
  "country": "france",
  "operator": "dfds",
  "maxItems": 15,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call jungle_synthesizer/direct-ferries-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=jungle_synthesizer/direct-ferries-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Direct Ferries Scraper - Schedules & Operators",
        "description": "Scrape directferries.com global ferry aggregator (2,500+ routes, 800+ ports, 400+ operators). Extract timetables, operators, vessels, and aggregate fares for Mediterranean, UK-EU, Scandinavian, and worldwide ferry routes.",
        "version": "1.0",
        "x-build-id": "dIpnf8akiXSaeKQ3k"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/jungle_synthesizer~direct-ferries-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-jungle_synthesizer-direct-ferries-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/jungle_synthesizer~direct-ferries-scraper/runs": {
            "post": {
                "operationId": "runs-sync-jungle_synthesizer-direct-ferries-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/jungle_synthesizer~direct-ferries-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-jungle_synthesizer-direct-ferries-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": [
                    "sp_intended_usage",
                    "sp_improvement_suggestions"
                ],
                "properties": {
                    "sp_intended_usage": {
                        "title": "What is the intended usage of this data?",
                        "minLength": 1,
                        "type": "string",
                        "description": "Please describe how you plan to use the data extracted by this crawler."
                    },
                    "sp_improvement_suggestions": {
                        "title": "How can we improve this crawler for you?",
                        "minLength": 1,
                        "type": "string",
                        "description": "Provide any feedback or suggestions for improvements."
                    },
                    "sp_contact": {
                        "title": "Contact Email",
                        "minLength": 1,
                        "type": "string",
                        "description": "Provide your email address so we can get in touch with you."
                    },
                    "mode": {
                        "title": "Mode",
                        "enum": [
                            "route_search",
                            "port_departures",
                            "operator_routes",
                            "country_routes"
                        ],
                        "type": "string",
                        "description": "How to scope the crawl.",
                        "default": "route_search"
                    },
                    "originPort": {
                        "title": "Origin Port",
                        "type": "string",
                        "description": "Origin port name. Used in route_search and port_departures modes. Examples: Dover, Calais, Piraeus, Naples."
                    },
                    "destinationPort": {
                        "title": "Destination Port",
                        "type": "string",
                        "description": "Destination port name. Used in route_search mode only. Example: Calais."
                    },
                    "country": {
                        "title": "Country",
                        "type": "string",
                        "description": "Country name slug. Used in country_routes mode. Examples: france, greece, italy, spain, croatia, united-kingdom."
                    },
                    "operator": {
                        "title": "Operator",
                        "type": "string",
                        "description": "Operator slug. Used in operator_routes mode. Examples: dfds, poferries, irish, brittany, stena, minoan, grimaldi, color, vikingline."
                    },
                    "maxItems": {
                        "title": "Max Records",
                        "type": "integer",
                        "description": "Maximum number of records to emit. Use small values (5-15) for fast preview runs. Each route page emits one summary record plus one record per scheduled crossing.",
                        "default": 15
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Apify residential proxy is recommended for sustained crawls. Cloudflare is permissive on directferries.com but residential keeps origin throttling at bay."
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
