# SiteVerdict — Travel Advisory Monitor (UK FCDO, US, Canada) (`siteverdict/siteverdict-travel-advisory-monitor`) Actor

Official travel advice from the UK FCDO, US State Department and Canada in one table: normalised 1-4 levels, regional warnings, summaries and source links. Monitor mode diffs each run and alerts Slack or a webhook when a country's advice changes.

- **URL**: https://apify.com/siteverdict/siteverdict-travel-advisory-monitor.md
- **Developed by:** [Aman Thakran](https://apify.com/siteverdict) (community)
- **Categories:** Travel
- **Security:** Limited permissions
- **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.

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

## SiteVerdict — Travel Advisory Monitor (UK FCDO, US, Canada)

**Know the moment a government changes its travel advice for a country your travellers are heading to.** One table with the UK FCDO, US State Department and Government of Canada advice side by side, a normalised 1–4 level, regional warnings, summaries and the official link, plus monitoring that tells you exactly what changed since the last run and pings Slack or your webhook.

> **Not legal, insurance or security advice.** This is an automated summary of official government travel advice with the date each source was fetched. Always read the official page linked before travelling.

### Who it is for

- **Travel management companies, tour operators and OTAs**: duty-of-care checks on every destination you sell, and an alert when one moves to "avoid all travel".
- **Corporate travel, HR and security teams**: a daily watch-list for the countries your staff visit.
- **Travel insurers and assistance companies**: FCDO advice against travel often affects cover; see it the day it changes.
- **Content teams and AI agents**: a cited, structured source instead of copying web pages (see `MCP-TOOL.md`).

### What you get

| Field | Example (live run, 11 Oct 2026) |
|---|---|
| `siteverdictLevel` / `siteverdictLabel` | `4` / `Do not travel / avoid all travel` (the highest of the three governments) |
| `ukLabel` | `FCDO advises against all travel to parts of the country and against all but essential travel to other parts` (Ukraine) |
| `usLabel` | `Level 4: Do Not Travel` |
| `caLabel` | `Avoid all travel` |
| `sourcesAgree`, `levelSpread` | `false`, `1` (Thailand: UK 2, US 1, Canada 2) |
| `ukLatestChange` | FCDO warning headlines + the latest update note, e.g. `Latest update: Updated information on European Entry-Exit System (EES)` |
| `usSummary` | the State Department summary as plain text |
| `changedSinceLastRun`, `changes[]` | `true`, `["U.S. Department of State lowered Thailand from level 2 to 1: Level 1: Exercise Normal Precautions."]` |
| `ukUrl`, `usUrl`, `caUrl` | official pages |
| `sources[]` | publisher, licence, URL and fetch time for every source used |

**Change rows** (`type: "change"`): `level-raised`, `level-lowered`, `regional-change`, `updated` (republished, same level), `new-destination`, with before/after level, the publisher's note and the official link.

**Exports in the run's key-value store:** `REPORT.html` (shareable report), `advisories.csv`, `SUMMARY` (agent-ready JSON: counts by level, disagreements, changes, attribution).

#### How the 1–4 level is built

| Level | US State Department | Canada | UK FCDO (no numbered levels, so we map its alert status) |
|---|---|---|---|
| 1 | Exercise normal precautions | Exercise normal security precautions | No advice against travel |
| 2 | Exercise increased caution | Exercise a high degree of caution | Advises against (all or all-but-essential) travel to **parts** of the country |
| 3 | Reconsider travel | Avoid non-essential travel | Advises against all but essential travel to the **whole** country |
| 4 | Do not travel | Avoid all travel | Advises against all travel to the **whole** country |

`highestRegionalLevel` shows the worst level that applies to part of a country (e.g. FCDO "against all travel to parts" = 4).

### Use cases

1. **Daily duty-of-care monitor.** Schedule daily with `outputMode: "changes-only"`, your destination list and a Slack webhook. The first run saves a baseline; afterwards you only see (and pay for) what changed.
2. **Destination risk table for sales or content.** Run with no destinations to get all ~230 destinations from three governments in one CSV.
3. **Disagreement finder.** Sort by `levelSpread`: where governments disagree by two or more levels, read all three pages.

### Input examples

```json
{ "countries": ["France", "Thailand", "Mexico", "Israel", "Ukraine", "India"] }
```

Monitoring with alerts:

```json
{
  "countries": ["Thailand", "Egypt", "Kenya", "Mexico"],
  "outputMode": "changes-only",
  "alertOn": "level-change",
  "minAlertLevel": 2,
  "slackWebhookUrl": "https://hooks.slack.com/services/…"
}
```

Try it free first: `{ "executionMode": "sample" }` uses recorded official data and a simulated previous run, so you can see change rows and test your webhook without paying.

### Pricing (pay per event)

| Event | Price | When |
|---|---|---|
| `country-advisory` | $0.002 | one destination row delivered |
| `advisory-change` | $0.01 | one detected change (per government × destination) |
| `monitoring-run` | $0.01 | a successful changes-only run after the baseline |
| `ai-brief` | $0.03 | AI briefing generated with your own key (only if it succeeds) |

Examples: all ~230 destinations ≈ **$0.46**; a 20-country daily monitor ≈ **$0.30/month** plus $0.01 per change; sample mode is free. Failed sources and errors are never charged; the run's maximum charge is respected. If the maximum charge stops a run before every change is delivered, the undelivered changes are not lost: they stay pending and the next run reports them.

### Optional AI brief

Set `aiProvider` to `anthropic` or `openai` and paste **your own** API key (stored as a secret). The Actor sends only this run's results and asks for a short, cited briefing (what changed, what needs attention). The output is labelled AI-generated; the official pages remain the source of truth.

### FAQ

**How fresh is the data?** Every live run fetches the official feeds. GOV.UK pages are re-fetched whenever the official index shows a newer update; unchanged pages are reused from your state store.

**Why does the UK show level 2 for a country the US rates 1?** The FCDO advises against travel to some regions (for example border areas). Our level 2 means "regional warnings"; read `ukLabel` and the official page.

**What about Australia (Smartraveller)?** Not included: its site did not respond to our automated requests from a cloud server during testing, and we do not work around access controls. If an open feed becomes reachable we will add it.

**Can it answer visa questions?** No. Use our Visa & Entry Requirements Actor for that.

### Limits

- Covers destinations published by the three governments (UK 226, US ≈213 after merging duplicates, Canada 230). Regions such as Azores or Canary Islands keep a `CA-` code.
- The US feed sometimes splits a territory (West Bank and Gaza); we keep the highest level for the country code and note the other advisory.
- Change detection starts after the first (baseline) run per state store.
- Summaries are shortened; always read the full official advice.

### Sources & compliance

| Source | Access | Licence / terms (checked 11 Oct 2026) |
|---|---|---|
| UK FCDO foreign travel advice | GOV.UK Content API (`/api/content/foreign-travel-advice`) | Open Government Licence v3.0 — https://www.nationalarchives.gov.uk/doc/open-government-licence/version/3/ ; "Contains public sector information licensed under the Open Government Licence v3.0." |
| US State Department travel advisories | Consular Affairs data API `cadataapi.state.gov/api/TravelAdvisories`, official RSS feed as fallback | U.S. Government work, public domain (17 U.S.C. §105) — https://www.usa.gov/government-copyright |
| Government of Canada travel advice | Open data JSON `data.international.gc.ca/travel-voyage/index-updated.json` | Open Government Licence – Canada 2.0 — https://open.canada.ca/en/open-government-licence-canada ; "Contains information licensed under the Open Government Licence – Canada." |

- Official, documented feeds only; no scraping of HTML pages, no bot-protection bypass. Honest User-Agent `SiteVerdict/travel-advisory-monitor (hello@webrevenuescan.com)`, polite spacing for GOV.UK, retries with backoff.
- No personal data is collected. Webhook URLs and AI keys are secret inputs, never logged or written to the dataset. Webhooks must be HTTPS and cannot point to private or internal addresses (SSRF guard, re-checked on redirects).
- UK GDPR / PECR: the Actor processes no personal data; if you add staff names to your own workflows, you are the controller.
- Not affiliated with or endorsed by any government.

# Changelog

This Actor's version history is a separate document: https://apify.com/siteverdict/siteverdict-travel-advisory-monitor/changelog.md

# Actor input Schema

## `executionMode` (type: `string`):

<b>live</b>: fetch the official feeds now. <b>sample</b>: try the Actor on recorded official data from 11 Oct 2026 with a simulated previous run (shows change rows and test alerts; no source calls, nothing charged).

## `countries` (type: `array`):

Country names or ISO codes ("France", "TH", "United Arab Emirates"). Leave empty to cover every destination the governments publish (about 230). Max 300.

## `sources` (type: `array`):

Any of <code>uk-fcdo</code> (GOV.UK FCDO foreign travel advice), <code>us-state</code> (US State Department travel advisories), <code>ca-travel</code> (Government of Canada travel advice). Default: all three.

## `outputMode` (type: `string`):

<b>all</b>: one row per destination every run (plus change rows). <b>changes-only</b>: monitoring mode, only change rows and the destinations that changed (the first run outputs the full baseline).

## `includeSummaries` (type: `boolean`):

Add the official summary text (US) and FCDO warning headlines plus the latest update note (UK).

## `alertOn` (type: `string`):

<b>level-change</b>: alert when a level goes up or down (or regional warnings change). <b>any-update</b>: also alert when a government republishes its advice without a level change.

## `minAlertLevel` (type: `integer`):

Level changes are alerted when the level before or after is at least this (1 = every level change, 3 = only reconsider/avoid travel and above).

## `webhookUrl` (type: `string`):

Optional. Receives a JSON POST with the alertable changes. HTTPS only; private and internal addresses are blocked.

## `slackWebhookUrl` (type: `string`):

Optional. https://hooks.slack.com/services/... receives a short message per run with changes.

## `aiProvider` (type: `string`):

Off by default. Writes a short travel-risk briefing from this run's rows using YOUR Anthropic or OpenAI key. Only the run's results are sent to the provider.

## `aiApiKey` (type: `string`):

Your own Anthropic or OpenAI API key. Stored encrypted by Apify, never logged or output.

## `aiModel` (type: `string`):

Defaults: claude-sonnet-5-5 (Anthropic) or gpt-4o-mini (OpenAI).

## `stateStoreName` (type: `string`):

Named key-value store that remembers the last run (needed for change detection). Use different names for separate watch-lists.

## `requestDelayMs` (type: `integer`):

Gap between GOV.UK page requests. Unchanged pages are reused from the state store, so scheduled runs fetch only what changed.

## Actor input object example

```json
{
  "executionMode": "live",
  "countries": [
    "France",
    "Thailand",
    "Mexico",
    "Israel",
    "Ukraine",
    "India"
  ],
  "sources": [
    "uk-fcdo",
    "us-state",
    "ca-travel"
  ],
  "outputMode": "all",
  "includeSummaries": true,
  "alertOn": "level-change",
  "minAlertLevel": 1,
  "aiProvider": "none",
  "stateStoreName": "siteverdict-travel-advisory-state",
  "requestDelayMs": 700
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `summary` (type: `string`):

No description

## `files` (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 = {
    "executionMode": "live",
    "countries": [
        "France",
        "Thailand",
        "Mexico",
        "Israel",
        "Ukraine",
        "India"
    ],
    "sources": [
        "uk-fcdo",
        "us-state",
        "ca-travel"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("siteverdict/siteverdict-travel-advisory-monitor").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 = {
    "executionMode": "live",
    "countries": [
        "France",
        "Thailand",
        "Mexico",
        "Israel",
        "Ukraine",
        "India",
    ],
    "sources": [
        "uk-fcdo",
        "us-state",
        "ca-travel",
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("siteverdict/siteverdict-travel-advisory-monitor").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 '{
  "executionMode": "live",
  "countries": [
    "France",
    "Thailand",
    "Mexico",
    "Israel",
    "Ukraine",
    "India"
  ],
  "sources": [
    "uk-fcdo",
    "us-state",
    "ca-travel"
  ]
}' |
apify call siteverdict/siteverdict-travel-advisory-monitor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,siteverdict/siteverdict-travel-advisory-monitor"
        }
    }
}
```

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/wNtaSZ3qXPwg7uD0X/builds/yePXHtz0Tj0W6zKBI/openapi.json
