# Norwegian Air Flights Scraper: Low-Fare Prices (`scrapers_lat/norwegian-flights-scraper`) Actor

Scrape Norwegian Air (norwegian.com) cheapest daily fares between two airports by IATA code over a date range. Get price, currency, cabin, stops, sold-out flags and booking deep links. Export to JSON, CSV or Excel.

- **URL**: https://apify.com/scrapers\_lat/norwegian-flights-scraper.md
- **Developed by:** [Scrapers Lat](https://apify.com/scrapers_lat) (community)
- **Categories:** Automation, Travel, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $8.32 / 1,000 results

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

[![Norwegian Air Flights Scraper](https://scrapers.lat/banners/norwegian-flights-scraper.png)](https://apify.com/scrapers_lat/norwegian-flights-scraper)

## Norwegian Air Flights Scraper

Here is one real result, with every field the actor returns:

```json
{
  "origin": "OSL",
  "originName": "Oslo",
  "destination": "LON",
  "destinationName": "London (All airports)",
  "departureDate": "2026-09-15",
  "departureDateTime": "2026-09-15T00:00:00",
  "flightNumber": null,
  "currency": "GBP",
  "stops": 0,
  "transit": false,
  "isInterliningRoute": false,
  "soldOut": false,
  "direction": "outbound",
  "isLowestFareOfDay": true,
  "recordType": "fare",
  "priceMin": 39,
  "priceMax": 129,
  "priceAvg": 71.5,
  "cheapestDay": "2026-09-15",
  "pricedDays": 8,
  "aiCheapestDays": null,
  "aiPriceRange": null,
  "aiVolatility": null,
  "aiRecommendation": null,
  "aiInsight": null,
  "source": "fare-calendar",
  "deepLink": "https://www.norwegian.com/uk/booking/flight-tickets/select-flight/?adults=1&children=0&infants=0&currency=GBP&origin=OSL&destination=LON&outbound=2026-09-15&isRoundTrip=false",
  "observedAt": "2026-08-16T03:26:59.016Z",
  "error": null,
  "fareType": "LowFare",
  "cabin": "Economy",
  "price": 39,
  "displayPrice": "39.00",
  "standardPrice": null,
  "isAgreementPrice": false,
  "fareOptions": null
}
```

This actor reads Norwegian Air's public low-fare calendar and returns the cheapest available fare for every day on a route over the date range you choose, for one-way or round trips, in the currency and cabin you pick.

**📥 [Input](https://apify.com/scrapers_lat/norwegian-flights-scraper/input-schema) · 📤 [Output](https://apify.com/scrapers_lat/norwegian-flights-scraper#output) · 💰 [Pricing](https://apify.com/scrapers_lat/norwegian-flights-scraper/pricing) · ▶️ [Examples](https://apify.com/scrapers_lat/norwegian-flights-scraper)**

![Platform](https://img.shields.io/badge/platform-Apify-5b3df5) ![Coverage](https://img.shields.io/badge/coverage-Norwegian%20Air%20network-1e88e5) ![Output](https://img.shields.io/badge/output-JSON%20%7C%20CSV%20%7C%20Excel-16a34a) ![Billing](https://img.shields.io/badge/billing-Pay%20per%20result-f59e0b)

### Table of contents

- [What it does](#what-it-does)
- [Use cases](#use-cases)
- [Quickstart](#quickstart)
- [Input reference](#input-reference)
- [Output reference](#output-reference)
- [Example output record](#example-output-record)
- [Run via API and CLI](#run-via-api-and-cli)
- [Fetch results](#fetch-results)
- [Billing and limits](#billing-and-limits)
- [FAQ and troubleshooting](#faq-and-troubleshooting)
- [More scrapers at scrapers.lat](#more-scrapers-at-scraperslat)

### What it does

Give it two airport IATA codes and a date range and it returns the cheapest Norwegian Air fare for each day in that range, not just the single cheapest day. Each day is one priced row by default.

- Every day of the route across your date range, with the lowest fare Norwegian sells that day.
- Prices in GBP, NOK, EUR, USD, SEK or DKK, for Economy or Premium cabin.
- Round trips in one run: enable Include return flights to also scan the return leg (tagged `direction: "inbound"`).
- Sold-out days, transit/connection flags, agreement-price flag and a ready-to-open booking deep link per day.
- `isLowestFareOfDay` marks the cheapest day across the range for each leg.

Every run also adds a free per-route price summary on each row: `priceMin`, `priceMax`, `priceAvg`, `cheapestDay` and `pricedDays` across your date range, so you can spot the cheapest day to fly without any extra processing.

What it does not do: Norwegian's public low-fare calendar exposes the cheapest fare per day, not each individual flight number or a per-flight seat map, so those fields are not populated. The `source` field is always `fare-calendar` so you know which tier produced each row.

### Use cases

- Norwegian Air fare tracking and flight price monitoring for a route over weeks or months.
- Find the cheapest day to fly Oslo to London (and any other Norwegian route) from a single run.
- Cheap flight deal alerts and fare drop detection for travel deal sites and newsletters.
- Feed a travel metasearch, fare comparison or price prediction dataset with daily low-fare data.
- Build a flexible-dates fare calendar for a booking tool or trip planner app.
- Budget travel research: compare Economy vs Premium fares across GBP, NOK, EUR, USD, SEK or DKK.
- Airline revenue and competitor pricing analysis across the Norwegian Air network.
- Get an AI book-now-vs-wait recommendation per route to decide whether fares are likely to rise.

### Quickstart

```json
{
  "origin": "OSL",
  "destination": "LON",
  "departureDateFrom": "2026-09-15",
  "departureDateTo": "2026-09-22",
  "currency": "GBP",
  "maxFlights": 50
}
```

Round trip in NOK, one row per flight with fares nested:

```json
{
  "origin": "OSL",
  "destination": "LON",
  "departureDateFrom": "2026-09-15",
  "departureDateTo": "2026-09-18",
  "includeReturn": true,
  "returnDateFrom": "2026-09-25",
  "returnDateTo": "2026-09-28",
  "currency": "NOK",
  "collapseFares": true
}
```

### Input reference

| Name | Type | Required | Description | Example |
|---|---|---|---|---|
| `origin` | string | yes | Departure airport IATA code. Use `LON` for all London airports. | `"OSL"` |
| `destination` | string | yes | Arrival airport IATA code. | `"LON"` |
| `departureDateFrom` | string | no | Earliest outbound date (YYYY-MM-DD). Empty picks a near-future date; past dates move forward. | `"2026-09-15"` |
| `departureDateTo` | string | no | Latest outbound date (YYYY-MM-DD). Empty uses the same day as from. | `"2026-09-22"` |
| `tripType` | string | no | `oneWay` or `round`. `round` also scans the return leg. | `"oneWay"` |
| `includeReturn` | boolean | no | Also scan the return leg over the return date range, tagged `inbound`. | `true` |
| `returnDateFrom` | string | no | Earliest inbound date (YYYY-MM-DD). Round trips only. | `"2026-09-25"` |
| `returnDateTo` | string | no | Latest inbound date (YYYY-MM-DD). Round trips only. | `"2026-09-28"` |
| `collapseFares` | boolean | no | Nest the day's fare in a `fareOptions` array instead of flat fields. | `false` |
| `cabinType` | string | no | `economy` or `premium`. Premium only on routes that sell it. | `"economy"` |
| `currency` | string | no | `GBP`, `NOK`, `EUR`, `USD`, `SEK` or `DKK`. | `"GBP"` |
| `includeTransit` | boolean | no | Include fares with a transit/connection. Off returns direct only. | `false` |
| `adults` | integer | no | Number of adult passengers (1 to 9). | `1` |
| `withAiPriceInsight` | boolean | no | Paid AI add-on ($0.012 per route, off by default, disabled for free users). Adds one AI price analysis per route: cheapest days, price range, volatility and a book-now-vs-wait recommendation. | `false` |
| `maxFlights` | integer | no | Max priced day records to collect. Free plans are capped at 10. | `50` |

### Output reference

| Name | Type | Description |
|---|---|---|
| `origin` | string | Origin airport IATA code. |
| `originName` | string | Origin airport name. |
| `destination` | string | Destination airport IATA code. |
| `destinationName` | string | Destination airport name. |
| `departureDate` | string | Departure day (YYYY-MM-DD). |
| `departureDateTime` | string | Departure day as an ISO date-time. |
| `flightNumber` | null | Not exposed at the calendar tier. |
| `fareType` | string | null | Fare type (`LowFare` / `Premium LowFare`). Null in collapsed mode. |
| `cabin` | string | null | Cabin (`Economy` / `Premium`). Null in collapsed mode. |
| `price` | number | null | Cheapest fare for the day. Null when sold out. |
| `displayPrice` | string | null | Formatted display price from Norwegian. |
| `standardPrice` | number | null | Standard (non-discounted) price when present. |
| `currency` | string | Currency of the prices. |
| `isAgreementPrice` | boolean | Whether the fare is an agreement/corporate price. |
| `stops` | number | Number of transit stops (0 for direct). |
| `transit` | boolean | Whether the cheapest option requires a transit. |
| `isInterliningRoute` | boolean | Whether the route is an interlining route. |
| `soldOut` | boolean | No fare available for the day. |
| `fareOptions` | array | null | All fares for the day (collapsed mode only). |
| `direction` | string | `outbound` or `inbound`. |
| `isLowestFareOfDay` | boolean | Lowest fare across the requested range for this leg. |
| `recordType` | string | `fare` for a priced day row, `ai_price_insight` for a per-route AI summary row. |
| `priceMin` | number | null | Free enrichment: lowest fare for this route/leg over the range. |
| `priceMax` | number | null | Free enrichment: highest fare for this route/leg over the range. |
| `priceAvg` | number | null | Free enrichment: average fare for this route/leg over the range. |
| `cheapestDay` | string | null | Free enrichment: cheapest date to fly for this route/leg. |
| `pricedDays` | number | null | Free enrichment: number of days with a bookable fare. |
| `aiCheapestDays` | array | null | AI add-on: best day(s) to fly per the AI analysis. Null unless `withAiPriceInsight` is on. |
| `aiPriceRange` | string | null | AI add-on: plain-English summary of the price range and volatility. |
| `aiVolatility` | string | null | AI add-on: fare volatility rating (`low`, `medium`, `high`). |
| `aiRecommendation` | string | null | AI add-on: book-now-vs-wait recommendation. |
| `aiInsight` | string | null | AI add-on: short buyer-facing insight for the route. |
| `source` | string | Data source tier (`fare-calendar`). |
| `deepLink` | string | Booking link for the day. |
| `observedAt` | string | When the record was scraped (ISO). |
| `error` | string | null | Error message on a failed day, otherwise null. |

### Example output record

Round-trip run with `collapseFares` enabled, prices in NOK (real inbound record):

```json
{
  "origin": "LON",
  "originName": "London (All airports)",
  "destination": "OSL",
  "destinationName": "Oslo",
  "departureDate": "2026-09-25",
  "departureDateTime": "2026-09-25T00:00:00",
  "flightNumber": null,
  "currency": "NOK",
  "stops": 0,
  "transit": false,
  "isInterliningRoute": false,
  "soldOut": false,
  "direction": "inbound",
  "isLowestFareOfDay": true,
  "source": "fare-calendar",
  "deepLink": "https://www.norwegian.com/uk/booking/flight-tickets/select-flight/?adults=1&children=0&infants=0&currency=NOK&origin=LON&destination=OSL&outbound=2026-09-25&isRoundTrip=false",
  "observedAt": "2026-08-16T03:27:36.596Z",
  "error": null,
  "fareType": null,
  "cabin": null,
  "price": 748,
  "displayPrice": " 748",
  "fareOptions": [
    {
      "fareType": "LowFare",
      "cabin": "Economy",
      "price": 748,
      "displayPrice": " 748",
      "standardPrice": null,
      "isAgreementPrice": false
    }
  ]
}
```

### Run via API and CLI

Start a run with the Apify API:

```bash
curl -X POST "https://api.apify.com/v2/acts/scrapers_lat~norwegian-flights-scraper/runs?token=$APIFY_TOKEN" \
  -H "content-type: application/json" \
  -d '{"origin":"OSL","destination":"LON","departureDateFrom":"2026-09-15","departureDateTo":"2026-09-22","currency":"GBP"}'
```

With the Apify CLI:

```bash
apify call scrapers_lat/norwegian-flights-scraper \
  --input='{"origin":"OSL","destination":"LON","departureDateFrom":"2026-09-15","departureDateTo":"2026-09-22"}'
```

### Fetch results

```bash
curl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=$APIFY_TOKEN&format=json"
```

Swap `format=json` for `csv` or `xlsx` to export a spreadsheet.

### Billing and limits

- Pay per result: you are charged one `result` event ($0.008) for each priced day record pushed to the dataset. The free per-route price summary (`priceMin`, `priceMax`, `priceAvg`, `cheapestDay`, `pricedDays`) is included at no extra cost.
- AI price insight (optional): when you enable `withAiPriceInsight`, the actor adds one `ai_price_insight` event ($0.012 per route) for a buyer-facing AI analysis of the fare calendar. It is off by default, disabled for free Apify users, and billed only when a usable insight is produced (never on an AI error or missing key).
- No charge on failure: rows that carry only an `error` (for example a route Norwegian does not fly) are not billed.
- Free Apify plans are capped at 10 results per run. Paid plans run uncapped up to your `maxFlights`.
- A spend cap is enforced: once your configured `maxTotalChargeUsd` is reached the run stops emitting and charging further results.

### FAQ and troubleshooting

**Why is `flightNumber` always null?**
Norwegian's public low-fare calendar returns the cheapest fare per day, not each individual flight, so flight numbers and per-flight seat maps are not available. Every row is tagged `source: "fare-calendar"` for transparency.

**Can I get every flight of the day, not just the cheapest?**
Not from the public calendar. This actor returns the lowest bookable fare per day for the route, which is what the Norwegian low-fare calendar exposes.

**A day returned no price.**
That day is either sold out or has no Norwegian service. It is marked `soldOut: true` with `price: null`.

**Why did my run return an error row?**
If Norwegian does not operate the route (or the dates are unavailable), you get one row with an `error` message and no charge.

**Which currency and cabin do I get?**
Whatever you set in `currency` and `cabinType`. Premium prices only appear on routes where Norwegian sells a Premium cabin.

### More scrapers at scrapers.lat

- Ryanair Flights Scraper
- Frontier Flights Scraper
- Wizz Air Flights Scraper

Browse the full catalog at [scrapers.lat](https://scrapers.lat).

# Actor input Schema

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

Departure airport IATA code, e.g. OSL. Use LON for all London airports.

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

Arrival airport IATA code, e.g. LON. Use LON for all London airports.

## `departureDateFrom` (type: `string`):

Earliest outbound date (YYYY-MM-DD). Leave empty to search a near-future date automatically. Past dates are moved forward.

## `departureDateTo` (type: `string`):

Latest outbound date (YYYY-MM-DD). Leave empty to use the same day as Departure date from.

## `tripType` (type: `string`):

One-way or round trip. Round trip also scans the return leg.

## `includeReturn` (type: `boolean`):

Also scan the return leg (destination back to origin) over the return date range, tagged direction inbound.

## `returnDateFrom` (type: `string`):

Earliest inbound date (YYYY-MM-DD). Round trips only.

## `returnDateTo` (type: `string`):

Latest inbound date (YYYY-MM-DD). Round trips only.

## `collapseFares` (type: `boolean`):

By default each day is a separate row. Enable this to nest the day's fare in a fareOptions array instead (one row per flight/day).

## `cabinType` (type: `string`):

Cabin to price. Premium is only returned on routes where Norwegian sells it.

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

Currency for the fare prices.

## `includeTransit` (type: `boolean`):

Include fares that require a transit/connection. Off returns direct flights only.

## `adults` (type: `integer`):

Number of adult passengers.

## `withAiPriceInsight` (type: `boolean`):

Optional AI add-on. When on, produces one buyer-facing price analysis per route from the daily fare calendar: the cheapest day(s) to fly, the price range and volatility, and a book-now-vs-wait recommendation. Uses AI (billed $0.012 per route, only when a usable insight is produced). Off by default and disabled for free Apify users.

## `maxFlights` (type: `integer`):

Maximum number of priced day records to collect. Free Apify plans are capped at 10 per run.

## Actor input object example

```json
{
  "origin": "OSL",
  "destination": "LON",
  "tripType": "oneWay",
  "includeReturn": false,
  "collapseFares": false,
  "cabinType": "economy",
  "currency": "GBP",
  "includeTransit": false,
  "adults": 1,
  "withAiPriceInsight": false,
  "maxFlights": 10
}
```

# 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": "OSL",
    "destination": "LON",
    "maxFlights": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapers_lat/norwegian-flights-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": "OSL",
    "destination": "LON",
    "maxFlights": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("scrapers_lat/norwegian-flights-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": "OSL",
  "destination": "LON",
  "maxFlights": 10
}' |
apify call scrapers_lat/norwegian-flights-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,scrapers_lat/norwegian-flights-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/ctiCD3EyAYkzLXS5f/builds/QPf2QkqYuyFWGap0P/openapi.json
