# Southwest Low Fare Calendar Scraper (`automation-lab/southwest-low-fare-calendar-scraper`) Actor

✈️ Extract exact Southwest Low Fare Calendar prices by route and date, with WGA, Plus, Anytime, Business Select, taxes, dollar or points totals, and lowest-fare summaries.

- **URL**: https://apify.com/automation-lab/southwest-low-fare-calendar-scraper.md
- **Developed by:** [Stas Persiianenko](https://apify.com/automation-lab) (community)
- **Categories:** Travel
- **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 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

## Southwest Low Fare Calendar Scraper

Extract exact Southwest Airlines Low Fare Calendar prices by route and date.

This Apify Actor opens Southwest's public calendar, captures its structured fare response, and saves one clean record per travel date. Each row includes Wanna Get Away, Wanna Get Away Plus, Anytime, and Business Select prices—without continuing into booking.

Use the results in fare alerts, travel-deal workflows, spreadsheets, dashboards, repricing checks, or scheduled monitors.

### What does Southwest Low Fare Calendar Scraper do?

Southwest Low Fare Calendar Scraper turns a monthly fare calendar into export-ready data.

For each requested route, it returns:

- ✈️ origin and destination airport codes
- 📅 one record per calendar date
- 💵 exact base fare, total fare, and taxes/fees
- 🎟️ WGA, Plus, Anytime, and Business Select buckets
- 🪙 dollar or Rapid Rewards points fares
- 🏷️ the lowest available total and fare bucket
- 🌎 domestic or international route status
- 🔗 the public source URL and retrieval timestamp

The Actor uses an anonymous browser session to let Southwest generate the required client headers, then reads the exact JSON response. It does not estimate prices from rounded display text.

### Who is this Southwest fare scraper for?

#### Fare-alert and travel-deal products

Monitor route calendars repeatedly and notify subscribers when a lower travel date appears.

#### Travelers checking repricing opportunities

Compare current calendar prices with a booked fare to identify possible Southwest flight-credit opportunities. Always verify eligibility and final pricing directly with Southwest.

#### Travel agencies

Export flexible-date fare options for clients before building an itinerary.

#### Corporate travel analysts

Track route-level price movements and identify lower-cost travel windows.

#### Data and automation teams

Feed structured fare data into BigQuery, Snowflake, Google Sheets, Airtable, or internal travel dashboards.

### Why use this actor?

- **Southwest-specific inventory:** Southwest fares are not consistently represented in third-party flight aggregators.
- **Exact decimal strings:** values such as `97.40` remain exact instead of becoming floating-point approximations.
- **All major fare buckets:** compare product tiers, not only the cheapest visible headline price.
- **Points support:** retrieve Rapid Rewards points totals and their separate USD taxes/fees.
- **Multi-route batches:** check up to 20 routes in one run.
- **Repeatable automation:** schedule runs and connect outputs without maintaining a browser scraper.
- **Safe scope:** the Actor stops at fare-calendar extraction and never attempts booking.

### What Southwest fare data can you extract?

| Field group | Example | Meaning |
|---|---|---|
| Route | `LAS` → `LAX` | Southwest airport pair |
| Date | `2026-08-18` | Calendar travel date |
| Currency | `USD` or `POINTS` | Unit used for fare totals |
| Taxes currency | `USD` | Especially important for points fares |
| WGA | base, total, taxes | Wanna Get Away bucket |
| PLU | base, total, taxes | Wanna Get Away Plus bucket |
| ANY | base, total, taxes | Anytime bucket |
| BUS | base, total, taxes | Business Select bucket |
| Lowest fare | `97.40`, `WGA` | Lowest available total and bucket |
| Availability | `4` | Number of populated fare buckets |
| Source metadata | URL, timestamp | Traceability for every record |

All fare amounts are strings. This preserves the exact formatting returned by Southwest.

### How to scrape Southwest Low Fare Calendar prices

1. Open the Actor input page.
2. Add one or more origin/destination airport-code pairs.
3. Enter a departure date using `YYYY-MM-DD` or `today+N`.
4. Choose **Dollars** or **Points**.
5. Set the passenger count and date limit.
6. Click **Start**.
7. Open the Dataset tab to preview, filter, or export results.

A one-route, 31-date run is a good first test.

### Input parameters

| Parameter | Type | Required | Default | Description |
|---|---|---:|---|---|
| `routes` | array | Yes | LAS→LAX | One to 20 `{ origin, destination }` IATA pairs |
| `departureDate` | string | Yes | `today+30` | Date or relative date selecting the calendar month |
| `fareMode` | string | No | `DOLLARS` | `DOLLARS` or `POINTS` |
| `currencyCode` | string | No | `USD` | Three-letter currency for dollar fares |
| `adultPassengersCount` | integer | No | `1` | Adult passengers, from 1 to 8 |
| `maxDatesPerRoute` | integer | No | `31` | Maximum records emitted per route |
| `proxyConfiguration` | object | No | direct | Optional Apify Proxy settings |

Example input:

```json
{
  "routes": [
    { "origin": "LAS", "destination": "LAX" },
    { "origin": "DAL", "destination": "HOU" }
  ],
  "departureDate": "today+45",
  "fareMode": "DOLLARS",
  "currencyCode": "USD",
  "adultPassengersCount": 1,
  "maxDatesPerRoute": 31,
  "proxyConfiguration": { "useApifyProxy": false }
}
```

### Output example

```json
{
  "origin": "LAS",
  "destination": "LAX",
  "date": "2026-08-01",
  "currencyCode": "USD",
  "taxesCurrencyCode": "USD",
  "international": false,
  "fareMode": "DOLLARS",
  "adultPassengersCount": 1,
  "wgaBaseFare": "133.95",
  "wgaTotalFare": "159.40",
  "wgaTaxesAndFees": "25.45",
  "pluBaseFare": "166.51",
  "pluTotalFare": "194.40",
  "pluTaxesAndFees": "27.89",
  "anyBaseFare": "231.63",
  "anyTotalFare": "264.40",
  "anyTaxesAndFees": "32.77",
  "busBaseFare": "268.84",
  "busTotalFare": "304.40",
  "busTaxesAndFees": "35.56",
  "lowestTotalFare": "159.40",
  "lowestFareBucket": "WGA",
  "availableFareBuckets": 4,
  "sourceUrl": "https://www.southwest.com/air/low-fare-calendar/...",
  "retrievedAt": "2026-07-17T18:00:55.252Z"
}
```

Unavailable fare buckets are returned as `null`. A points result uses `currencyCode: "POINTS"`; its taxes may still use `taxesCurrencyCode: "USD"`.

### Understanding Southwest fare bucket codes

The dataset uses compact stable codes:

- `WGA` — Wanna Get Away
- `PLU` — Wanna Get Away Plus
- `ANY` — Anytime
- `BUS` — Business Select

The Actor normalizes the corresponding points-mode response codes into the same four columns, so dollar and points datasets are easy to compare.

### How much does it cost to scrape Southwest fares?

This Actor uses pay-per-event pricing:

- a small charge starts each run;
- each route/date record is charged as one result;
- subscription tiers receive automatic volume discounts.

The final price is visible in Apify Console before each run. A typical one-route monthly calendar returns about 28–31 result records. Browser runtime and proxy usage are included in the platform run cost shown by Apify.

To control spend:

- begin with one route;
- set `maxDatesPerRoute` to 5 for a small test;
- group routes into one scheduled run rather than launching many single-route runs;
- enable a proxy only when a direct session is blocked.

### Fare monitoring workflow

For repeated price checks:

1. Create an Apify Task with your routes.
2. Schedule it daily or weekly.
3. Export each dataset to your preferred storage.
4. Compare `lowestTotalFare` with the prior run.
5. Trigger an alert when the value decreases.

Use `origin`, `destination`, `date`, and `fareMode` as a stable comparison key.

### Tips for reliable results

- Use valid Southwest-served three-letter airport codes.
- Choose a future departure month with published inventory.
- Keep route batches conservative; the Actor intentionally uses low browser concurrency.
- Use a US proxy country when a direct session is repeatedly blocked.
- Compare like with like: dollar totals and points totals have different units.
- Treat fare data as a snapshot; availability and prices can change at any time.
- Confirm final fare rules, availability, and checkout totals directly on Southwest.

### Integrations

#### Google Sheets fare tracker

Schedule the Actor, connect the dataset through Make or Zapier, and append each run to a sheet. Use a formula to highlight lower `lowestTotalFare` values.

#### Slack or email price alerts

Send a webhook when a route/date price falls below your threshold.

#### BigQuery or Snowflake history

Store every snapshot for route-level trend analysis and travel-budget forecasting.

#### Airtable travel-deal queue

Create one record per route/date and let editors review the strongest deals before publication.

#### Webhook-driven repricing checks

Trigger the Actor from an internal itinerary system, then compare current calendar values with recorded booking prices.

### Run via the Apify API with JavaScript

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

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('automation-lab/southwest-low-fare-calendar-scraper').call({
  routes: [{ origin: 'LAS', destination: 'LAX' }],
  departureDate: 'today+30',
  fareMode: 'DOLLARS',
  currencyCode: 'USD',
  adultPassengersCount: 1,
  maxDatesPerRoute: 31
});

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

### Run via the Apify API with Python

```python
import os
from apify_client import ApifyClient

client = ApifyClient(os.environ['APIFY_TOKEN'])
run = client.actor('automation-lab/southwest-low-fare-calendar-scraper').call(run_input={
    'routes': [{'origin': 'DAL', 'destination': 'HOU'}],
    'departureDate': 'today+45',
    'fareMode': 'POINTS',
    'adultPassengersCount': 1,
    'maxDatesPerRoute': 31,
})

for item in client.dataset(run['defaultDatasetId']).iterate_items():
    print(item)
```

### Run via cURL

```bash
curl -X POST \
  "https://api.apify.com/v2/acts/automation-lab~southwest-low-fare-calendar-scraper/runs?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "routes": [{"origin":"BWI","destination":"MCO"}],
    "departureDate":"today+60",
    "fareMode":"DOLLARS",
    "currencyCode":"USD",
    "adultPassengersCount":1,
    "maxDatesPerRoute":31
  }'
```

Poll the returned run ID, then download items from its default dataset.

### Use with Apify MCP and AI agents

Connect this Actor to Claude Code:

```bash
claude mcp add --transport http apify "https://mcp.apify.com?tools=automation-lab/southwest-low-fare-calendar-scraper"
```

For Claude Desktop, Cursor, or VS Code, add this HTTP server to your MCP configuration:

```json
{
  "mcpServers": {
    "apify": {
      "type": "http",
      "url": "https://mcp.apify.com?tools=automation-lab/southwest-low-fare-calendar-scraper"
    }
  }
}
```

Example prompts:

- “Find the lowest Southwest LAS to LAX date next month.”
- “Compare dollar fares for DAL to HOU across the returned calendar.”
- “Extract points fares for BWI to MCO and show the cheapest five dates.”
- “Build a daily route-price monitor using these Southwest records.”

### Proxy configuration

Direct browser sessions are the default and cheapest route. Southwest uses anti-automation controls, so a session can occasionally be blocked.

If that happens, enable Apify Proxy in the input. A US residential session is the strongest fallback, but it costs more bandwidth than direct access or datacenter proxy traffic.

The Actor reuses one browser conservatively and performs bounded fresh-context retries. It does not retry indefinitely.

### Error handling

The Actor fails closed when:

- a route does not contain valid IATA codes;
- origin and destination are identical;
- the date format is invalid;
- the requested fare mode is unsupported;
- the Southwest API response is blocked or incomplete;
- no calendar records can be extracted.

A total extraction failure returns a failed run, not a misleading successful empty dataset.

### Is it legal to scrape Southwest fare data?

This Actor accesses publicly visible fare-calendar data without logging in. Web scraping can be regulated by website terms, database rights, privacy law, contract law, and your intended use.

You are responsible for:

- reviewing Southwest's current terms and robots policies;
- using reasonable request volumes;
- avoiding resale or presentation that implies Southwest endorsement;
- complying with laws that apply to your location and use case;
- verifying fares before making purchasing or customer-facing decisions.

This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by Southwest Airlines Co.

### FAQ

#### Does this Actor book Southwest flights?

No. It only extracts the public Low Fare Calendar and stops before booking.

#### Does it return every flight departure time?

No. The product returns daily calendar fare buckets, not individual flight itineraries or schedules.

#### Can it return Rapid Rewards points fares?

Yes. Set `fareMode` to `POINTS`. Points totals use `currencyCode: "POINTS"`, while taxes and fees may remain denominated in USD.

#### Why did a route return no records?

Check that both airport codes are valid Southwest destinations and that the selected future month has published inventory. If the run log reports a block, enable a US proxy session.

#### Why did the Actor fail while the website opens for me?

Southwest applies session-level anti-automation controls. Retry with Apify Proxy enabled and keep the route batch small. A failed extraction is intentionally reported as failed rather than silently returning zero rows.

#### Are displayed prices guaranteed?

No. Fares and availability change. Always confirm the latest total and fare rules directly with Southwest before purchase.

#### Can I schedule this as a fare monitor?

Yes. Save the input as an Apify Task, add a schedule, and compare successive datasets by route and date.

### Related travel scrapers

- [Google Flights Scraper](https://apify.com/automation-lab/google-flights-scraper) — individual flight options across airlines.
- [Ryanair Flight Price Scraper](https://apify.com/automation-lab/ryanair-flight-price-scraper) — Ryanair route/date fare records.
- [Booking Scraper](https://apify.com/automation-lab/booking-scraper) — accommodation search results and prices.
- [Booking Reviews Scraper](https://apify.com/automation-lab/booking-reviews-scraper) — hotel review datasets.

### Data quality and support

The Actor reads structured Southwest response fields and keeps source URLs and timestamps for traceability. Selectors and response shapes are monitored through build and QA checks, but source websites can change without notice.

If you find a reproducible issue, include:

- the origin and destination codes;
- departure date and fare mode;
- run URL;
- whether proxy use was enabled;
- the expected and actual result.

That context makes investigation faster while avoiding the disclosure of private travel or account information.

# Actor input Schema

## `routes` (type: `array`):

Enter origin and destination as 3-letter IATA airport codes.

## `departureDate` (type: `string`):

Use YYYY-MM-DD. Southwest returns the surrounding Low Fare Calendar month.

## `fareMode` (type: `string`):

Choose dollar fares or Rapid Rewards points fares.

## `currencyCode` (type: `string`):

Three-letter currency code used when fare mode is Dollars.

## `adultPassengersCount` (type: `integer`):

Number of adult passengers for the public calendar search.

## `maxDatesPerRoute` (type: `integer`):

Limit records emitted for each route. Use 31 for one complete month.

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

Optionally use Apify Proxy when Southwest blocks the direct browser session.

## Actor input object example

```json
{
  "routes": [
    {
      "origin": "LAS",
      "destination": "LAX"
    }
  ],
  "departureDate": "today+30",
  "fareMode": "DOLLARS",
  "currencyCode": "USD",
  "adultPassengersCount": 1,
  "maxDatesPerRoute": 5,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

No description

## `fullFares` (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 = {
    "routes": [
        {
            "origin": "LAS",
            "destination": "LAX"
        }
    ],
    "departureDate": "today+30",
    "fareMode": "DOLLARS",
    "currencyCode": "USD",
    "adultPassengersCount": 1,
    "maxDatesPerRoute": 5,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("automation-lab/southwest-low-fare-calendar-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 = {
    "routes": [{
            "origin": "LAS",
            "destination": "LAX",
        }],
    "departureDate": "today+30",
    "fareMode": "DOLLARS",
    "currencyCode": "USD",
    "adultPassengersCount": 1,
    "maxDatesPerRoute": 5,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("automation-lab/southwest-low-fare-calendar-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 '{
  "routes": [
    {
      "origin": "LAS",
      "destination": "LAX"
    }
  ],
  "departureDate": "today+30",
  "fareMode": "DOLLARS",
  "currencyCode": "USD",
  "adultPassengersCount": 1,
  "maxDatesPerRoute": 5,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call automation-lab/southwest-low-fare-calendar-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/IKcVzdttgslQx7g4X/builds/dtLr3bNyQR19e3mS8/openapi.json
