# Squaremouth Travel Insurance Quote Comparison Scraper (`crawlerbros/squaremouth-travel-insurance-scraper`) Actor

Get a live, side-by-side comparison of travel insurance plans from Squaremouth for any trip - destination, dates, traveler ages, and trip cost. Returns provider, plan name, price, medical/evacuation/cancellation/interruption coverage, ratings, and purchase links.

- **URL**: https://apify.com/crawlerbros/squaremouth-travel-insurance-scraper.md
- **Developed by:** [Crawler Bros](https://apify.com/crawlerbros) (community)
- **Categories:** Travel, Automation, E-commerce
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 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?

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

## Squaremouth Travel Insurance Scraper

Get a live, side-by-side comparison of **travel insurance plans from Squaremouth** for any real trip. Submit a destination, travel dates, traveler ages, and trip cost, and get back every matching plan with its provider, price, coverage amounts, and customer rating — the same comparison Squaremouth itself shows shoppers, in structured data.

### What this actor does

- **Live quotes, not a static list** — every run submits a real trip-detail request and scrapes the resulting comparison page
- **Full coverage breakdown per plan** — medical, medical evacuation, pre-existing conditions, trip cancellation, trip interruption, Cancel For Any Reason
- **Filter by coverage amount or provider**, sort by price or rating
- **Ratings and review counts** from Squaremouth's own verified customer reviews
- **Empty fields are omitted** from every record — you won't see `null` or blank strings

### Output per plan

- `planId` — Squaremouth's internal plan/quote ID
- `provider` — insurance company, e.g. "Tin Leg", "Allianz Travel"
- `planName` — plan tier, e.g. "Gold", "Luxury"
- `providerLogoUrl` — insurer's logo image URL
- `price`, `priceCurrency`, `priceLabel` — total plan price and what it covers (e.g. "Total Price for 1 Traveler")
- `medicalCoverage`, `medicalCoverageType` — emergency medical coverage amount (USD) and whether it's Primary or Secondary
- `medicalEvacuationCoverage`
- `preExistingConditionCoverage` — pre-existing condition coverage terms
- `cancellationCoverage`, `interruptionCoverage`
- `cancelForAnyReason` — Cancel For Any Reason availability/terms
- `rating`, `ratingLabel`, `reviewCount`, `reviewsUrl`
- `badge` — e.g. "Most Popular Provider", when Squaremouth highlights the plan
- `policyDetailUrl` — link to the full policy details on Squaremouth
- `buyNowUrl` — link to purchase the plan
- `quoteUrl` — link to the full comparison page for this trip (shareable)
- `recordType: "insurancePlan"`, `scrapedAt`

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `destinationCountry` | select | `Mexico` | **Required.** Main destination — dropdown of all 251 countries/regions Squaremouth supports |
| `departureDate` | string | `2026-08-15` | **Required.** Trip start date, `YYYY-MM-DD`, must be in the future |
| `returnDate` | string | `2026-08-22` | **Required.** Trip end date, `YYYY-MM-DD`, after departure |
| `travelerAges` | array of int | `[35]` | **Required.** Age of each traveler (1-10 travelers) |
| `tripCost` | int | `2000` | **Required.** Total pre-paid trip cost in USD |
| `residenceState` | select | – | US state or Canadian province of residence — dropdown of all 50 states + DC + 13 provinces (defaults to Florida/Ontario when left blank for US/Canada residents; ignored otherwise) |
| `residenceCountry` | select | `United States` | Traveler's country of residence — dropdown of all 251 countries/regions |
| `citizenshipCountry` | select | `United States` | Traveler's country of citizenship — dropdown of all 251 countries/regions |
| `includeCancellationCoverage` | boolean | `true` | Size quotes for trip cancellation/interruption coverage |
| `paidInFull` | boolean | `true` | Whether the trip is already paid in full |
| `sortBy` | string | `recommended` | `recommended` / `priceAsc` / `priceDesc` / `ratingDesc` |
| `minMedicalCoverage` | int | – | Only return plans with at least this much medical coverage (USD) |
| `minCancellationCoverage` | int | – | Only return plans with at least this much cancellation coverage (USD) |
| `providerFilter` | string | – | Only return plans whose provider name contains this text |
| `maxItems` | int | `50` | Max plans to return (1-200) |

#### Example: family trip to Mexico, cheapest first

```json
{
  "destinationCountry": "Mexico",
  "departureDate": "2026-08-15",
  "returnDate": "2026-08-22",
  "travelerAges": [35, 33, 8],
  "tripCost": 4500,
  "sortBy": "priceAsc"
}
```

#### Example: high medical coverage for an older traveler, non-US resident

```json
{
  "destinationCountry": "Italy",
  "departureDate": "2026-09-10",
  "returnDate": "2026-09-24",
  "travelerAges": [67],
  "tripCost": 6000,
  "residenceCountry": "Canada",
  "citizenshipCountry": "Canada",
  "minMedicalCoverage": 250000,
  "sortBy": "ratingDesc"
}
```

#### Example: compare only Tin Leg plans

```json
{
  "destinationCountry": "France",
  "departureDate": "2026-10-01",
  "returnDate": "2026-10-10",
  "travelerAges": [42],
  "tripCost": 3000,
  "providerFilter": "Tin Leg"
}
```

### Use cases

- **Travel agencies & advisors** — pull live quotes for clients without manual form entry
- **Insurance comparison content** — power a travel blog or destination guide with real, current pricing
- **Personal trip planning tools** — embed live travel insurance options in a booking flow
- **Market research** — track how travel insurance pricing shifts by destination, trip cost, and traveler age
- **Affiliate/referral tooling** — surface plan options with direct purchase links

### FAQ

**Is this affiliated with Squaremouth?**
No. This is an independent, third-party actor that submits a real quote request to Squaremouth's public quote tool and reads the resulting comparison page — no account or login required.

**Why do prices vary by trip cost and traveler age?**
Travel insurance pricing is risk-based: it depends on trip cost (for cancellation/interruption coverage), traveler ages, destination, and trip length, exactly as it would if you filled out the quote form yourself.

**Are these real, purchasable prices?**
Yes — the same live quotes and `buyNowUrl` links shown to a shopper on squaremouth.com for the trip details you provide.

**Why are some fields like `cancelForAnyReason` missing on some plans?**
Not every plan offers every coverage type. Fields are only included when the plan actually publishes that value; missing fields mean the plan doesn't offer or display that coverage.

**Can I get quotes for non-US residents?**
Yes — set `residenceCountry` and `citizenshipCountry` to any country Squaremouth supports (200+ countries/regions); `residenceState` is only used for US and Canadian residents (state/province) and ignored otherwise.

**Does `quoteUrl` expire?**
It's the same permalink Squaremouth generates for your trip's specific quote request, valid to revisit for the current pricing.

### Limitations

This actor covers Squaremouth's **single-trip** quote form (`/plans/single-trip-home-page`), which is the flow the vast majority of users need. Squaremouth also publishes a separately-built **Annual/Multi-Trip** quote form (`/plans/annual`) with a different field set (trips per year, maximum trip length, instead of one departure/return date pair) — this is a distinct product, not just a filter on the single-trip form, so it isn't covered by this actor. Its themed landing pages (cruise, adventure/sports, medical-only, flight, group, family) reuse the same single-trip quote engine this actor already drives, just with different marketing copy and pre-selected defaults, so no separate support is needed for those.

# Actor input Schema

## `destinationCountry` (type: `string`):

Main destination country for the trip, e.g. "Mexico", "France", "Italy". Matched against Squaremouth's live destination list (200+ countries/regions) (full list of Squaremouth's 251 supported countries/regions).

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

Trip start date, format YYYY-MM-DD. Must be in the future.

## `returnDate` (type: `string`):

Trip end date, format YYYY-MM-DD. Must be after the departure date.

## `travelerAges` (type: `array`):

Age of each traveler on the trip (1-10 travelers). One quote is generated for the whole group.

## `tripCost` (type: `integer`):

Total pre-paid, non-refundable trip cost for all travelers combined, in USD. Used to size Cancellation/Interruption coverage.

## `residenceState` (type: `string`):

US state or Canadian province of residence, e.g. "Florida" or "Ontario". Required by Squaremouth for US/Canada residents (defaults to Florida for US / Ontario for Canada if left blank); ignored for all other residence countries.

## `residenceCountry` (type: `string`):

Traveler's country of residence (full list of Squaremouth's 251 supported countries/regions).

## `citizenshipCountry` (type: `string`):

Traveler's country of citizenship (full list of Squaremouth's 251 supported countries/regions).

## `includeCancellationCoverage` (type: `boolean`):

Whether to size quotes for trip cancellation/interruption coverage of the full trip cost.

## `paidInFull` (type: `boolean`):

Whether the trip is already paid in full (affects a small number of plans with "pay in full" requirements).

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

Order of the returned plans.

## `minMedicalCoverage` (type: `integer`):

Only return plans with at least this much emergency medical coverage.

## `minCancellationCoverage` (type: `integer`):

Only return plans with at least this much trip cancellation coverage.

## `providerFilter` (type: `string`):

Only return plans whose provider name contains this text, e.g. "Tin Leg" or "Allianz". Case-insensitive.

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

Maximum number of insurance plans to return.

## Actor input object example

```json
{
  "destinationCountry": "Mexico",
  "departureDate": "2026-08-15",
  "returnDate": "2026-08-22",
  "travelerAges": [
    35
  ],
  "tripCost": 2000,
  "residenceState": "Florida",
  "residenceCountry": "United States",
  "citizenshipCountry": "United States",
  "includeCancellationCoverage": true,
  "paidInFull": true,
  "sortBy": "recommended",
  "maxItems": 50
}
```

# Actor output Schema

## `plans` (type: `string`):

Dataset containing all scraped travel insurance plan quotes.

# 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 = {
    "destinationCountry": "Mexico",
    "departureDate": "2026-08-15",
    "returnDate": "2026-08-22",
    "travelerAges": [
        35
    ],
    "tripCost": 2000,
    "residenceState": "Florida",
    "residenceCountry": "United States",
    "citizenshipCountry": "United States",
    "includeCancellationCoverage": true,
    "paidInFull": true,
    "sortBy": "recommended",
    "maxItems": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawlerbros/squaremouth-travel-insurance-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 = {
    "destinationCountry": "Mexico",
    "departureDate": "2026-08-15",
    "returnDate": "2026-08-22",
    "travelerAges": [35],
    "tripCost": 2000,
    "residenceState": "Florida",
    "residenceCountry": "United States",
    "citizenshipCountry": "United States",
    "includeCancellationCoverage": True,
    "paidInFull": True,
    "sortBy": "recommended",
    "maxItems": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("crawlerbros/squaremouth-travel-insurance-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 '{
  "destinationCountry": "Mexico",
  "departureDate": "2026-08-15",
  "returnDate": "2026-08-22",
  "travelerAges": [
    35
  ],
  "tripCost": 2000,
  "residenceState": "Florida",
  "residenceCountry": "United States",
  "citizenshipCountry": "United States",
  "includeCancellationCoverage": true,
  "paidInFull": true,
  "sortBy": "recommended",
  "maxItems": 50
}' |
apify call crawlerbros/squaremouth-travel-insurance-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,crawlerbros/squaremouth-travel-insurance-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/PJa0vfMA23kqsfEUt/builds/BqbMwIpBKz8OCMUOz/openapi.json
