# Business & First Class Deal Validator (`critd/premium-cabin-validator`) Actor

Find the catches in a premium-cabin itinerary before you choose. Review mixed cabins, price details and connection timing using flight options you already have.

- **URL**: https://apify.com/critd/premium-cabin-validator.md
- **Developed by:** [Critical Distinction](https://apify.com/critd) (community)
- **Categories:** Travel
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.40 / 1,000 itinerary evaluateds

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/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

## Business & First Class Deal Validator

**Find the catches before you choose your flight.**

A premium fare can still come with an economy leg, an awkward connection or
unclear pricing. Review the itineraries you already have and see which details
need attention before you decide.

This tool checks supplied flight options. It does not search or book flights.

[Try the demo](#demo) · [Review your options](#start-here) · [Pricing](#pricing) · [Help](#help)

### What you get

**A focused itinerary review and a CSV comparison list.** See which checks pass,
which flag a problem and which need more information. Missing details stay
visible, so a partly described itinerary does not become a confident answer.

### Demo

Leave **Demo** selected to explore three fictional itineraries. Run and open
**REPORT.html** from Output. The examples show mixed cabins and missing details;
they are not current deals you can book.

The demo has no custom itinerary-review charge. Apify's automatic
**$0.00005 per start** still applies; check the displayed maximum cost.

### Start here

1. Select **Evaluate** and prepare a copy of your itinerary data using the
   segment CSV template below.
2. Paste it into **Start with the segment CSV template**. Use one row per flight
   segment and leave the other input routes empty.
3. Run and open **REPORT.html**. Download **REVIEW.csv** for your working list.

Already have a compatible Dataset or JSON export? The [supported import option](#existing-dataset-or-json-export-compatibility)
can save that step. Use data you are permitted to analyze; keep passenger names,
booking references and payment details out of it.

#### Segment CSV template

```csv
customerId,quoteId,tripType,adults,price,currency,priceBasis,taxes,observedAt,expiresAt,fareConditions,direction,flight,origin,destination,departure,arrival,durationMinutes,cabins,lieFlat,selfTransfer,sourceId,pointOfSale
example,Q1,one_way,1,2000,USD,whole_party,unknown,,,,outbound,XX1,JFK,LHR,,,420,business,,,supplied-export,US
```

This row is fictional. Repeat itinerary-wide fields consistently across its
segments. Use `round_trip` with both directions for a return trip. Keep unknown
values blank; add observation times only when you know when the prices were
collected. Upload time is not price freshness.

### Pricing

**Base price: $0.50 per 1,000 complete-itinerary evaluations** ($0.00050 each).
Platform usage is included, plus Apify's automatic **$0.00005 per start**.
No Dataset-row surcharge.

| Apify plan | Price per complete-itinerary evaluation |
| --- | ---: |
| Free | $0.00050 |
| Bronze | $0.00045 |
| Silver | $0.000425 |
| Gold / Platinum / Diamond | $0.00040 |

Segments and additional checks do not multiply an itinerary's charge. Finding
a problem is still a useful evaluation. Rejected imports, duplicates and
information-only unknown results are not eligible. Results are saved before
the custom charge; your spending limit is respected. Check
[current pricing](https://apify.com/critd/premium-cabin-validator/pricing) before
running. Unknown charge outcomes are not automatically retried.

### Know what the review means

A passed check reflects the information supplied, not current availability.
The Actor does not fill in missing cabin, taxes, lie-flat seating, fare terms,
connection protection or observation times. It does not certify minimum
connections, visa requirements or passenger protection.

That makes it useful for comparing known details and spotting questions to ask
before choosing a fare. It does not replace confirmation with the airline.

### Help

Ask about preparing an itinerary or understanding a result in the
[Issues tab](https://apify.com/critd/premium-cabin-validator/issues). Include the
run ID for a run problem. Use fictional examples in public support, not booking
records or access links. A stopped run may already have results or charges;
inspect that run before starting another.

### Advanced reference

#### Input parameters

Choose one completed Dataset, supported JSON export, `offersCsv` or advanced
normalized `offers`. Limits are 100 itineraries and 16 segments each;
Dataset/export/CSV input is 4 MiB and complete JSON input is 8 MiB.

The default policy accepts Business/First, permits at most 15% known
nonrequested-cabin time, no unknown-cabin time for approval, and two stops per
direction. Advanced `policy` can add lie-flat, connection, elapsed-time and
price-target requirements. Currency and price basis must match; no currency
conversion is performed.

CSV cabins use `business`, `first`, `economy`, `premium_economy` or `unknown`;
per-adult values are separated by `|`. Absolute timestamps need timezone
offsets. Missing return legs do not form a complete round trip. Unknown, future
or over-15-minute-old observation times cannot establish a fresh candidate.
A useful rejection may coexist with other unknown evidence.

#### Existing Dataset or JSON export compatibility

A completed Dataset or unchanged exported JSON array can use the pinned
**poidata-google-flights-0.1.70** format. Select that format and supply either
**Existing compatible Dataset ID** (with run-token READ access) or **Dataset
JSON export**, not both. Leave segment CSV and normalized `offers` empty.
Use `sourceObservedAt` only for a known source observation time.

This adapter supports **one adult, no children or infants**. Larger parties
use normalized CSV with an explicit price basis. A supplied version marker
must match; changed required fields are rejected. Local times with unknown UTC
offsets do not establish connection timing or freshness. Arbitrary JSON or
other scraper versions are not implied to work. Format compatibility is not
permission to collect or reuse another source. No upstream acquisition service
is included or required.

#### Output format and repeated reviews

`REPORT.html` is the readable review and `REVIEW.csv` the working list. `OUTPUT`
links canonical JSON and reports; the Dataset is a convenience view. Partial
coverage is visible. A failed Dataset append does not remove the saved report.

Monitor uses named history storage and `state.scopeId`, with optional
`baselineSnapshotId`. `CHANGES.json`/CSV separates source, decision, clock and
input changes. History is accepted for 90 days; missing or ambiguous history is
disclosed. Select `historyStoreId` for hosted Monitor; any `state.storeId` must
match. This grants the stated read/write access, not a recurring schedule.

#### Permissions

Limited Actor permissions are the default. Select only the input/history
resources needed and use appropriate storage access/retention settings.
Evidence excludes raw upstream error bodies and unselected fields. The charge
event remains `itinerary-evaluated`. See the bundled changelog for implementation
history.

# Changelog

This Actor's version history is a separate document: https://apify.com/critd/premium-cabin-validator/changelog.md

# Actor input Schema

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

Use Demo for fictional examples, or select the customer workflow for your supplied input.

## `datasetId` (type: `string`):

Optional compatible export route: use a completed Dataset you are permitted to analyze. This Actor does not collect fares or grant collection rights.

## `sourceProfile` (type: `string`):

Poidata Google Flights 0.1.70 format; one adult, no children or infants.

## `datasetJson` (type: `string`):

Paste the exported JSON array unchanged; choose this or Dataset ID, not both. Up to 100 records / 4 MiB.

## `sourceObservedAt` (type: `string`):

ISO timestamp with timezone, for example 2026-09-25T12:00:00Z. Leave blank if unknown; never substitute the time you uploaded the file.

## `sourcePointOfSale` (type: `string`):

Optional two-letter country code for the supplied source point of sale. Leave empty if unknown.

## `offersCsv` (type: `string`):

Paste the documented segment CSV using data you already have and are permitted to analyze. Rows with the same customer ID form one complete itinerary.

## `offers` (type: `array`):

Complete normalized supplied itineraries; at most 100.

## `policy` (type: `object`):

Requirements used to evaluate the supplied itineraries. Missing evidence remains unknown.

## `state` (type: `object`):

Monitor scope and optional exact baseline. Select the history store in historyStoreId for hosted runs.

## `dataset` (type: `object`):

Advanced completed Dataset/export input and explicit source-profile metadata.

## `historyStoreId` (type: `string`):

For monitor runs, select the history key-value store here and set state.scopeId. If state.storeId is also supplied, it must match.

## Actor input object example

```json
{
  "mode": "demo",
  "sourceProfile": "poidata-google-flights-0.1.70"
}
```

# Actor output Schema

## `report` (type: `string`):

No description

## `review` (type: `string`):

No description

## `output` (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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("critd/premium-cabin-validator").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 = {}

# Run the Actor and wait for it to finish
run = client.actor("critd/premium-cabin-validator").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 '{}' |
apify call critd/premium-cabin-validator --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,critd/premium-cabin-validator"
        }
    }
}
```

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/EcfiOfBxquc6Low2M/builds/HIJ9VS4vLwfX2lJgZ/openapi.json
