# 12Go Flights, Trains, Buses & Ferries Scraper – Worldwide Fares (`boring_internet_explorer/12go-travel-scraper`) Actor

Scrape 12go.asia travel prices worldwide: flights, trains, buses, ferries, vans and transfers. Search many origins, destinations and dates at once, with fares converted to your currency.

- **URL**: https://apify.com/boring_internet_explorer/12go-travel-scraper.md
- **Developed by:** [Boring Internet Explorer](https://apify.com/boring_internet_explorer) (community)
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.50 / 1,000 results

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

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## ✈️ 12Go Flights, Trains, Buses & Ferries Scraper — Worldwide Travel Prices

[12Go](https://12go.asia) is a multi-modal travel booking platform covering flights, trains, buses, ferries, shared vans and private transfers on one search, with routes across Asia and many other regions worldwide. This scraper searches it for you across **several origins, destinations and dates at once** and returns every trip with its operator, flight numbers, times, duration, fare classes and price. Prices are converted to **your own currency** (70+ currencies supported), so fares from different countries are directly comparable.

### Why use this scraper?

- ✈️ **Fare monitoring** — track flight prices on any route and see how they move before your travel dates
- 💱 **Prices in your currency** — compare fares in one currency instead of mixed THB / USD / local amounts
- 🧭 **Multi-route search** — add many origins and destinations in one run; every combination is searched
- 🚆 **Compare every mode** — flights vs trains vs buses vs ferries for the same route, with duration and price side by side
- 🏨 **Travel agency feeds** — build itineraries and quotes for customers travelling anywhere 12go operates
- 📊 **Market research** — study operators, fare classes, baggage allowances and seat availability per route
- 🔔 **Deal alerts** — schedule daily runs and alert on trips under your maximum price

### Supported URL types

You normally use the dedicated fields (origins, destinations, dates). Pasting a 12go search page is also supported:

| Type                        | Example                                                                   |
| --------------------------- | ------------------------------------------------------------------------- |
| Search page                 | `https://12go.asia/en/travel/bangkok/phuket?date=2026-12-01`              |
| Search page with passengers | `https://12go.asia/en/travel/bangkok/chiang-mai?date=2026-12-01&people=2` |

Origins and destinations can be a city name (`Bangkok`), an airport code (`BKK`) or Arabic / local names (`القاهرة`).

### Input fields

| Field                | Type    | Default                    | Description                                                                                                                                  |
| -------------------- | ------- | -------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- |
| `origins`            | array   | —                          | Departure cities, airports or stations. Use a name (Bangkok), an airport code (BKK) or a 12go place ID (1p). Add several to search each one. |
| `destinations`       | array   | —                          | Arrival cities, airports or stations (Phuket, HKT, 73p...). Add several to search each one.                                                  |
| `departureDates`     | array   | —                          | Travel dates in YYYY-MM-DD format. Leave empty to search tomorrow.                                                                           |
| `passengers`         | integer | `1`                        | Number of travelers (1-9). Prices are per passenger, except private transfers which are per vehicle.                                         |
| `transportTypes`     | array   | —                          | Only keep these transport types. Leave empty for all. A trip that mixes types is kept if any of its parts matches.                           |
| `country`            | string  | `OTHER`                    | Used to pick the default currency and to label results (country / market fields).                                                            |
| `currency`           | string  | `AUTO`                     | Currency for all prices. Auto uses the currency of your country, and falls back to USD when it is not supported by the site.                 |
| `sortBy`             | string  | `cheapest`                 | Applied before Max items is taken, so 'cheapest' returns the cheapest trips of each search.                                                  |
| `minPrice`           | number  | —                          | Only trips priced at or above this amount (in the selected currency).                                                                        |
| `maxPrice`           | number  | —                          | Only trips priced at or below this amount (in the selected currency).                                                                        |
| `departureAfter`     | string  | —                          | Earliest departure time, 24h format, e.g. 06:00.                                                                                             |
| `departureBefore`    | string  | —                          | Latest departure time, 24h format, e.g. 22:00.                                                                                               |
| `includeUnbookable`  | boolean | `false`                    | Also return trips that cannot currently be booked (no price).                                                                                |
| `startUrls`          | array   | —                          | Alternative to the fields above: 12go.asia search pages like https://12go.asia/en/travel/bangkok/phuket?date=2026-12-01                      |
| `maxItems`           | integer | `5`                        | Maximum trips returned for EACH origin / destination / date combination.                                                                     |
| `proxyConfiguration` | object  | `{"useApifyProxy": false}` | Your proxy configuration from Apify                                                                                                          |

### Example input

```json
{
  "origins": ["Bangkok", "Chiang Mai"],
  "destinations": ["Phuket", "Krabi"],
  "departureDates": ["2026-12-01"],
  "passengers": 1,
  "transportTypes": ["flight"],
  "country": "OTHER",
  "currency": "USD",
  "sortBy": "cheapest",
  "maxItems": 5,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

### Output

Each trip found is stored as one record in the default dataset. `maxItems` applies **per search** (origin × destination × date).

### Example output

```json
{
  "scrapedAt": "2026-10-08T10:00:13.900Z",
  "url": "https://12go.asia/en/travel/bangkok/phuket?date=2026-12-01&people=1",
  "title": "Flight with Thai Vietjet Suvarnabhumi Airport to Phuket Airport",
  "price": 48.19,
  "currency": "USD",
  "country": "Other",
  "market": "other",
  "priceMax": 48.19,
  "nativePrice": 48.19,
  "nativeCurrency": "USD",
  "priceBasis": "per_passenger",
  "passengers": 1,
  "transportType": "flight",
  "transportTypes": ["flight"],
  "operators": ["Thai Vietjet"],
  "flightNumbers": ["VZ2308"],
  "originQuery": "Bangkok",
  "destinationQuery": "Phuket",
  "origin": "Suvarnabhumi Airport",
  "originCode": "BKK",
  "originCountryCode": "TH",
  "destination": "Phuket Airport",
  "destinationCode": "HKT",
  "destinationCountryCode": "TH",
  "searchDate": "2026-12-01",
  "departure": "2026-12-01 18:45:00",
  "arrival": "2026-12-01 20:25:00",
  "durationMinutes": 100,
  "stops": 0,
  "className": "Economy",
  "seatsAvailable": 3,
  "isBookable": true,
  "instantConfirmation": null,
  "refundable": false,
  "checkedBaggageKg": 0,
  "carryOnBaggageKg": 7,
  "amenities": [],
  "rating": 4.73,
  "ratingCount": 11,
  "options": [
    {
      "className": "Economy",
      "price": 48.19,
      "seatsAvailable": 3,
      "refundable": false,
      "amenities": []
    }
  ],
  "segments": [
    {
      "transportType": "flight",
      "operator": "Thai Vietjet",
      "flightNumber": "VZ2308",
      "from": "Suvarnabhumi Airport",
      "fromCode": "BKK",
      "to": "Phuket Airport",
      "toCode": "HKT",
      "departure": "2026-12-01 18:45:00",
      "arrival": "2026-12-01 20:25:00",
      "durationMinutes": 100,
      "className": "Economy"
    }
  ],
  "tripKey": "TH01xL01y3aCHa00l01ndUrN",
  "tripId": "d7a07ee8da6f02c35caad8d7fa9b4789"
}
```

### Field reference

| Field                                        | Type     | Description                                                                          |
| -------------------------------------------- | -------- | ------------------------------------------------------------------------------------ |
| `scrapedAt`                                  | string   | ISO 8601 scrape timestamp                                                            |
| `url`                                        | string   | 12go.asia search page for this route and date                                        |
| `title`                                      | string   | Trip title                                                                           |
| `price`                                      | number   | null                                                                                 | Cheapest fare, converted to `currency`                       |
| `currency`                                   | string   | Currency of `price` (chosen currency, or the site's own when it cannot be converted) |
| `country`                                    | string   | Market country you selected                                                          |
| `market`                                     | string   | Market code of the selected country (e.g. us, gb, th)                                |
| `priceMax`                                   | number   | null                                                                                 | Highest fare for the same trip (other fare classes or times) |
| `nativePrice`                                | number   | null                                                                                 | Cheapest fare as returned by the site, before conversion     |
| `nativeCurrency`                             | string   | null                                                                                 | Currency the site returned                                   |
| `priceBasis`                                 | string   | `per_passenger` or `per_vehicle` (private transfers / taxis)                         |
| `passengers`                                 | number   | Passengers searched                                                                  |
| `transportType`                              | string   | null                                                                                 | flight, train, bus, ferry, van, taxi or multimodal           |
| `transportTypes`                             | string\[] | Every transport type in the trip                                                     |
| `operators`                                  | string\[] | Airlines / operators                                                                 |
| `flightNumbers`                              | string\[] | Flight numbers for every flight leg                                                  |
| `originQuery / destinationQuery`             | string   | Origin and destination as you entered them                                           |
| `origin / destination`                       | string   | null                                                                                 | Departure and arrival station or airport                     |
| `originCode / destinationCode`               | string   | null                                                                                 | IATA airport codes when available                            |
| `originCountryCode / destinationCountryCode` | string   | null                                                                                 | ISO country codes                                            |
| `searchDate`                                 | string   | Travel date searched                                                                 |
| `departure / arrival`                        | string   | null                                                                                 | Local departure and arrival date-time                        |
| `durationMinutes`                            | number   | null                                                                                 | Total travel time in minutes                                 |
| `stops`                                      | number   | Number of connections                                                                |
| `className`                                  | string   | null                                                                                 | Fare class of the cheapest option                            |
| `seatsAvailable`                             | number   | null                                                                                 | Seats left on the cheapest option                            |
| `isBookable`                                 | boolean  | Whether the trip can currently be booked                                             |
| `instantConfirmation`                        | boolean  | null                                                                                 | Instant confirmation flag                                    |
| `refundable`                                 | boolean  | null                                                                                 | Whether the fare is generally refundable                     |
| `checkedBaggageKg / carryOnBaggageKg`        | number   | null                                                                                 | Baggage allowance                                            |
| `amenities`                                  | string\[] | Amenities (aircon, wc, ...)                                                          |
| `rating / ratingCount`                       | number   | null                                                                                 | Operator rating                                              |
| `options`                                    | object\[] | All fare classes with converted prices                                               |
| `segments`                                   | object\[] | Each leg: operator, flight number, stations, times, class                            |
| `tripKey / tripId`                           | string   | null                                                                                 | 12go identifiers                                             |

### ❓ FAQ

**Can I search more than one origin or destination?** Yes. Every origin is combined with every destination and every date, and `maxItems` is applied to each of those searches separately.

**How are prices converted?** The site quotes each trip in its own currency (THB, USD, ...). The scraper converts to the currency you choose using the site's own exchange-rate table, and also returns the original amount in `nativePrice` / `nativeCurrency`. With currency set to `AUTO` it uses your country's currency and falls back to USD.

**Are prices per person?** Yes, per passenger. Private transfers and taxis are priced per vehicle (`priceBasis: per_vehicle`).

**Which transport types are included?** Flights, trains, buses, ferries, shared vans and taxis / private transfers. Use `transportTypes` to keep only some of them.

**What if a place is not found?** It is skipped with a warning and the other searches continue. Past or badly formatted dates are skipped too.

**Does it work for any country?** It covers every route 12go sells, mainly Asia plus Egypt, Turkey, Morocco and Europe. Pick your own country and currency regardless of where you travel.

**How fresh is the data?** Fares are read live at run time, so schedule the actor regularly to track price changes.

### 🔗 Want More Data?

Compare 12go fares with more flight scrapers from [boring_internet_explorer](https://apify.com/boring_internet_explorer):

- [Wingie Flights Scraper](https://apify.com/boring_internet_explorer/wingie-scraper) — flight prices, airlines and routes worldwide
- [Riyadh Air Flights Scraper](https://apify.com/boring_internet_explorer/riyadh-air-scraper) — fares for all Riyadh Air routes worldwide
- [Wego Flights Scraper](https://apify.com/boring_internet_explorer/wego-flights-scraper) — Wego flight fares
- [Almosafer Flights Scraper](https://apify.com/boring_internet_explorer/almosafer-flights-scraper) — Almosafer flight fares
- [flydubai Flights Scraper](https://apify.com/boring_internet_explorer/flydubai-flights-scraper) — compare and track daily flydubai fares
- [flynas Flight Fares Scraper](https://apify.com/boring_internet_explorer/flynas-scraper) — flynas fares
- [flyadeal Flight Fares Scraper](https://apify.com/boring_internet_explorer/flyadeal-scraper) — flyadeal fares

### 🛠️ Need a custom scraper?

Need this scraper adapted to your use case — extra fields, additional filters, a different output format, or a new website? Reach out at boringinternetexplorer@gmail.com and we'll make it happen.

# Actor input Schema

## `origins` (type: `array`):

Departure cities, airports or stations. Use a name (Bangkok), an airport code (BKK) or a 12go place ID (1p). Add several to search each one.

## `destinations` (type: `array`):

Arrival cities, airports or stations (Phuket, HKT, 73p...). Add several to search each one.

## `departureDates` (type: `array`):

Travel dates in YYYY-MM-DD format. Leave empty to search tomorrow.

## `passengers` (type: `integer`):

Number of travelers (1-9). Prices are per passenger, except private transfers which are per vehicle.

## `transportTypes` (type: `array`):

Only keep these transport types. Leave empty for all. A trip that mixes types is kept if any of its parts matches.

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

Used to pick the default currency and to label results (country / market fields). Choose Other for USD.

## `currency` (type: `string`):

Currency for all prices. Auto uses the currency of your country, and falls back to USD when it is not supported by the site.

## `sortBy` (type: `string`):

Applied before Max items is taken, so 'cheapest' returns the cheapest trips of each search.

## `minPrice` (type: `number`):

Only trips priced at or above this amount (in the selected currency).

## `maxPrice` (type: `number`):

Only trips priced at or below this amount (in the selected currency).

## `departureAfter` (type: `string`):

Earliest departure time, 24h format, e.g. 06:00.

## `departureBefore` (type: `string`):

Latest departure time, 24h format, e.g. 22:00.

## `includeUnbookable` (type: `boolean`):

Also return trips that cannot currently be booked (no price).

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

Alternative to the fields above: 12go.asia search pages like https://12go.asia/en/travel/bangkok/phuket?date=2026-12-01

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

Maximum trips returned for EACH origin / destination / date combination.

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

Your proxy configuration from Apify

## Actor input object example

```json
{
  "origins": [
    "Bangkok"
  ],
  "destinations": [
    "Phuket",
    "Chiang Mai"
  ],
  "departureDates": [],
  "passengers": 1,
  "transportTypes": [],
  "country": "OTHER",
  "currency": "AUTO",
  "sortBy": "cheapest",
  "includeUnbookable": false,
  "startUrls": [],
  "maxItems": 5,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `overview` (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 = {
    "origins": [
        "Bangkok"
    ],
    "destinations": [
        "Phuket",
        "Chiang Mai"
    ],
    "departureDates": [],
    "startUrls": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("boring_internet_explorer/12go-travel-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 = {
    "origins": ["Bangkok"],
    "destinations": [
        "Phuket",
        "Chiang Mai",
    ],
    "departureDates": [],
    "startUrls": [],
}

# Run the Actor and wait for it to finish
run = client.actor("boring_internet_explorer/12go-travel-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 '{
  "origins": [
    "Bangkok"
  ],
  "destinations": [
    "Phuket",
    "Chiang Mai"
  ],
  "departureDates": [],
  "startUrls": []
}' |
apify call boring_internet_explorer/12go-travel-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,boring_internet_explorer/12go-travel-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/zRMpzB0i2xED1vVAd/builds/C5hHbPsqcYzgJEsBo/openapi.json
