# Volotea Scraper — Flight Prices & Availability (`studio-amba/volotea-scraper`) Actor

Scrape live Volotea flight prices and availability: cheapest fares from any origin airport, or a specific route with a day-by-day price calendar. No login required.

- **URL**: https://apify.com/studio-amba/volotea-scraper.md
- **Developed by:** [Studio Amba](https://apify.com/studio-amba) (community)
- **Categories:** Travel
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 result scrapeds

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/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

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

## How to integrate an Actor?

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

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

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

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

# README

### What does Volotea Scraper do?

**Volotea Scraper** extracts live flight prices and availability from
[volotea.com](https://www.volotea.com), the Spain and Italy-based budget
airline with a route network spread across small and mid-sized European
cities. Give it an origin airport and it returns the cheapest upcoming fare
to every destination Volotea flies from there. Give it an origin and a
destination and it returns a day-by-day price calendar for that exact
route — every scheduled flight, fare class, and seat count Volotea has
cached for the date window you ask for. No login required.

Use it to collect structured flight data via the Apify platform with full
**API access, scheduling, integrations**, and no need to run a browser
yourself.

### Why use Volotea Scraper?

- **Price monitoring** — Track fares on specific routes over time and catch
  price drops before they disappear
- **Route exploration** — Find the cheapest destinations from any airport
  Volotea serves, in a single run
- **Fare analytics** — Build datasets for route pricing trends, seasonality,
  and seat availability across Volotea's network
- **Meta-search / travel apps** — Feed live Volotea pricing into your own
  booking tool or comparison site
- **Budget travel planning** — Compare prices across fare classes and dates
  before booking

### How to use Volotea Scraper

1. Go to the **Input** tab
2. Enter an **Origin airport** IATA code (e.g. `BCN`, `NAP`, `VCE`)
3. Leave **Destination airport** empty to get the cheapest fare to every
   destination from that origin, or fill it in for a specific route's price
   calendar
4. Optionally set a **Date from** / **Date to** window (`YYYY-MM-DD`)
5. Click **Start** and wait for the run to finish
6. Download your data from the **Output** tab in JSON, CSV, Excel, or other
   formats

### Two search modes

#### Explorer mode (destination left empty)

Returns one row per destination market: the cheapest fare(s) Volotea
currently shows from that origin within the date window. This is the
default behavior — running the actor with `{}` input scrapes cheap fares
from Barcelona (`BCN`), across whichever destinations Volotea flies from
there in the default ~120-day window.

#### Route calendar mode (destination set)

Returns one row per date/fare-class combination Volotea has cached for the
exact origin/destination pair, within the date window — a day-by-day price
calendar with flight number, times, price, and remaining seats for every
fare bucket. Not every airport pair is a real Volotea route; if a run comes
back empty, the two airports likely aren't connected (see Limitations).

### Input

| Field | Type | Required | Description |
|-------|------|----------|--------------|
| `origin` | String | No | Departure airport IATA code (default: `BCN`) |
| `destination` | String | No | Arrival airport IATA code. Leave empty for explorer mode |
| `dateFrom` | String | No | Start of the search window, `YYYY-MM-DD` (default: tomorrow) |
| `dateTo` | String | No | End of the search window, `YYYY-MM-DD` (default: 120 days out in explorer mode, 60 in route mode) |
| `maxResults` | Integer | No | Maximum result rows to return (default: 200) |

### Output

| Field | Type | Example |
|-------|------|---------|
| `searchType` | String | `"explore"` or `"route"` |
| `route` | String | `"BCN-OLB"` |
| `origin` | String | `"BCN"` |
| `destination` | String | `"OLB"` |
| `flightNumber` | String or null | `"1445"` |
| `departureTime` | String | `"2026-09-15T22:55:00"` |
| `arrivalTime` | String or null | `"2026-09-16T00:30:00"` |
| `price` | Number or null | `24.00` (includes booking fee) |
| `priceWithoutFee` | Number or null | `23.35` |
| `currency` | String | `"EUR"` |
| `taxes` | Number or null | `24.60` |
| `fareClass` | String or null | `"W"` |
| `availableSeats` | Number or null | `10` |
| `available` | Boolean or null | `true` |
| `searchDate` | String or null | `"2026-09-15"` |
| `url` | String | Best-effort deep link to this route on volotea.com |

### Example output

Explorer mode (`{"origin": "BCN"}`):

```json
{
    "searchType": "explore",
    "route": "BCN-OLB",
    "origin": "BCN",
    "destination": "OLB",
    "flightNumber": "1445",
    "departureTime": "2026-09-15T22:55:00",
    "arrivalTime": "2026-09-16T00:30:00",
    "price": 24.00,
    "priceWithoutFee": 23.35,
    "currency": "EUR",
    "taxes": 24.60,
    "fareClass": "W",
    "availableSeats": 10,
    "available": true,
    "searchDate": "2026-09-15",
    "url": "https://book.volotea.com/?from1=BCN&to1=OLB&tripType=0&adults=1&flight1Date=2026-09-15",
    "scrapedAt": "2026-08-29T14:10:00.000Z"
}
```

Route calendar mode (`{"origin": "BCN", "destination": "OLB"}`) returns
several rows like the one above, one per date/fare-class combination found
in the window.

### How much does it cost to scrape Volotea?

Volotea's site is protected by Imperva Incapsula and its pricing API by
Akamai, so this actor uses a real, JS-executing browser session (Bright Data
Scraping Browser) rather than a plain HTTP request. It charges $0.01 per run
start (based on its memory allocation) plus $0.005 per result. An explorer-
mode search (12+ destinations) costs a few cents; a route-mode price
calendar scales the same way with its result count. A run's usage cost only
settles after it reports SUCCEEDED.

### Limitations

- **Currency is always EUR.** Volotea's pricing API doesn't return a
  currency field; it only bases out of Eurozone countries (Spain, Italy,
  France, Greece), so EUR is hardcoded rather than guessed.
- **Not every airport pair is a real route.** Volotea's network is smaller
  than a major carrier's — check the airline's own route map if a
  route-mode run consistently comes back empty.
- **Fare classes, not passenger-level booking.** Results reflect Volotea's
  price cache (the same data that powers its own "cheapest fares" widgets),
  not a full multi-passenger checkout flow.
- Data is scraped from the public website and may change without notice.
- Respect Volotea's terms of service and use responsibly.

### FAQ and support

**Is it legal to scrape Volotea?**
Volotea Scraper accesses only publicly available flight pricing data that
any visitor can see, without logging in or bypassing payment. Always review
and comply with the target website's Terms of Service before use.

**Why did my run come back empty?**
Either the origin/destination pair isn't a real Volotea route, or the date
window falls outside Volotea's published schedule. The actor retries
automatically across fresh browser sessions if Incapsula/Akamai blocks an
individual attempt.

**I found a bug or need help**
Please submit an issue on the [Issues tab](https://console.apify.com/actors/volotea-scraper/issues) and we'll get back to you quickly. For custom scraping solutions, reach out via the same channel.

### How to scrape Volotea data

1. Go to this actor's page on the [Apify Store](https://apify.com/store).
2. Click **Try for free** to open it in Apify Console.
3. Enter your origin airport code, and optionally a destination.
4. Set a date window and the maximum number of results if needed.
5. Click **Start** and wait for the run to finish — most searches complete
   in under a minute.
6. Download your data in JSON, CSV, Excel, or connect it to your workflow
   via the Apify API.

You can also schedule daily runs to track fares on a route over time, set up
webhooks for price-drop notifications, or integrate results directly into
your own booking or comparison tool using the [Apify API](https://docs.apify.com/api).

### Need this data on a schedule, or a custom version?

We run this scraper as a managed service for businesses: scheduled runs,
price-drop alerts, delta detection, and delivery to your inbox, Google
Sheets, or API — maintenance included. We can also build a custom version
with round-trip search, multi-city routing, or your exact fields.

See [studioamba.dev/services](https://studioamba.dev/services/) or email
<hello@studioamba.dev> for a free data sample.
We maintain 300+ European web scrapers and answer within one business day.

# Actor input Schema

## `origin` (type: `string`):

Departure airport IATA code (e.g. 'BCN' for Barcelona, 'NAP' for Naples, 'VCE' for Venice).

## `destination` (type: `string`):

Arrival airport IATA code (e.g. 'OLB' for Olbia). Leave empty to get the cheapest upcoming fare to every destination Volotea flies from the origin — this is the default behaviour.

## `dateFrom` (type: `string`):

Start of the date window to search, in YYYY-MM-DD format. Defaults to tomorrow.

## `dateTo` (type: `string`):

End of the date window to search, in YYYY-MM-DD format. Defaults to 120 days after 'Date from' in explorer mode, or 60 days in route mode.

## `maxResults` (type: `integer`):

Maximum number of fare results to return.

## `sbrWsCdp` (type: `string`):

Optional: your own Bright Data Scraping Browser CDP endpoint. Leave empty to use the built-in unlocking service.

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

Legacy field, kept for backwards compatibility. Fetching goes through the built-in Bright Data Scraping Browser, so this is ignored.

## Actor input object example

```json
{
  "origin": "BCN",
  "maxResults": 20,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# 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 = {
    "origin": "BCN",
    "maxResults": 20,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("studio-amba/volotea-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 = {
    "origin": "BCN",
    "maxResults": 20,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("studio-amba/volotea-scraper").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "origin": "BCN",
  "maxResults": 20,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call studio-amba/volotea-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,studio-amba/volotea-scraper"
        }
    }
}

```

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

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/RYO3PUm6RNCdj1v3E/builds/4edKbgHkktmxeBCzw/openapi.json
