# Global Entry Appointment Alerts - NEXUS, SENTRI, No Login (`that_red_bird/global-entry-appointment-alerts`) Actor

Tired of refreshing the CBP site for an interview slot? Checks every Global Entry, NEXUS, SENTRI and FAST centre and returns only NEW open slots, near you or before your trip. No login. Schedule it, get a webhook.

- **URL**: https://apify.com/that_red_bird/global-entry-appointment-alerts.md
- **Developed by:** [mohamed alaya](https://apify.com/that_red_bird) (community)
- **Categories:** Travel, Automation
- **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

## Global Entry Appointment Alerts - NEXUS, SENTRI, No Login

Checks every CBP enrolment centre for open Global Entry, NEXUS, SENTRI and FAST interview slots and returns only the slots that are NEW since your last run. Built for travellers racing a trip date, and for travel agents and corporate travel desks who book interviews for others.

It reads the same public scheduler data the CBP booking site shows. No login, no account, and it never books anything: you book the slot yourself on the official site.

### Input examples

**1. Preview (the default, also what `{}` does)** - the soonest slots at 10 centres, nothing remembered:

```json
{}
```

**2. Alerts for a trip: centres within 150 miles of New York, slots before 31 Dec**

```json
{ "programs": ["Global Entry"], "zip": "10001", "maxMiles": 150, "beforeDate": "2026-12-31", "stateStoreName": "my-ge-alerts", "webhookUrl": "https://hooks.slack.com/services/..." }
```

**3. One centre, NEXUS**

```json
{ "programs": ["NEXUS"], "locationIds": ["5020"], "stateStoreName": "nexus-blaine" }
```

### Input guide

- **Preview vs alert mode.** Leave `stateStoreName` empty for a preview. Set a name (use the same one on every scheduled run) for alert mode: the Actor remembers slots it reported and returns only new ones. Slot-found is charged only in alert mode.
- **Schedule it.** Slots appear and vanish within minutes. Run every 5-15 minutes with a Schedule.
- **Distance.** Give a US ZIP / Canadian postal code (or latitude + longitude as text) and `maxMiles`. Centres outside the US and Canada have no coordinates here and are skipped when the filter is active.
- **Webhook.** New slots are POSTed as JSON with `text` and `content` fields, so Slack, Discord, Mattermost, Telegram bridges, Zapier and Make accept it directly.

### Output

| Field | Meaning |
|---|---|
| type | `slot` (alert mode), `overview` (preview), `run-summary`, `error` |
| locationId, locationName, city, state, country | The enrolment centre |
| programs | Programs the centre was listed under in your search |
| slotStart, slotEnd, minutes | Interview time, local time of the centre (`timezone`) |
| distanceMiles | From your ZIP/coordinates, when given |
| newSlotsAtCentre / openSlotsFound | How many new (alert) or open (preview) slots the centre had |
| bookingUrl | Where to book (official CBP Trusted Traveler site) |

Sample row:

```json
{"type":"slot","locationId":6480,"locationName":"Bowling Green","city":"NEW YORK","state":"NY","country":"US","programs":["Global Entry"],"timezone":"America/New_York","distanceMiles":3.9,"slotStart":"2026-10-07T09:30","slotEnd":"2026-10-07T09:40","minutes":10,"newSlotsAtCentre":60}
```

### Use it with

Schedule + webhook into Slack or Telegram; or feed `slot` rows to Zapier / Make to text your team; combine with a calendar tool for corporate travel desks.

### FAQ

**Does it book for me?** No. It only reads public availability.
**Why did I get no rows?** In alert mode that means nothing new appeared since the last run; the run-summary row says so.
**Is it affiliated with CBP?** No. It is an independent tool using public data.

### Limits (honest)

- Slots are read from CBP's live scheduler; they can be taken before you open the site.
- Each run reports at most `maxSlotsPerLocation` of the soonest new slots per centre (60 soonest are examined) and `maxAlertsPerRun` overall.
- Distance is straight-line miles from the ZIP centre to the centre's ZIP centre, not driving distance.
- FAST is read as the US/Canada and US/Mexico FAST programs.

### Price

Pay per event: **$0.01 per new slot found** (alert mode) and **$0.0003 per centre checked**. Example: a 10-minute schedule on 10 centres costs 10 x $0.0003 = $0.003 per run, plus $0.01 for each new slot reported. Preview runs cost only the centre checks.

# Actor input Schema

## `programs` (type: `array`):

Trusted traveler programs to check. Global Entry, NEXUS, SENTRI and FAST (US/Canada and US/Mexico). Interview slots are the same CBP scheduler data the booking site shows; no login is used.

## `beforeDate` (type: `string`):

Keep only interview slots on or before this date, for example 2026-12-31. Leave empty for no date limit.

## `zip` (type: `string`):

US ZIP (10001) or Canadian postal code (M5V). Used with 'Within miles' to keep only enrolment centres near you. Leave empty to check all centres.

## `latitude` (type: `string`):

Alternative to ZIP: your latitude as text, for example 40.7128. Needs longitude too. Overrides ZIP when both are set.

## `longitude` (type: `string`):

Your longitude as text, for example -74.0060. Used together with latitude.

## `maxMiles` (type: `integer`):

Straight-line distance from your ZIP or coordinates. Only applies when a ZIP or coordinates are given. Centres outside the US and Canada have no distance and are skipped when this filter is active.

## `locationIds` (type: `array`):

Optional list of CBP location IDs, for example 5140 (JFK) or 5446 (SFO). Leave empty to check every centre that currently has slots.

## `maxLocations` (type: `integer`):

How many enrolment centres with open slots to look at per run (nearest first when a ZIP is given). Each one checked costs a small 'location checked' fee.

## `maxSlotsPerLocation` (type: `integer`):

Report at most this many of the soonest slots per centre per run.

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

Turns on ALERT mode. Pick a name such as my-ge-alerts; the Actor remembers slots it already reported and returns only NEW ones on every later run, and charges 'slot found' only for those. Leave empty for a PREVIEW of the current soonest slots (nothing remembered, no slot-found charges). Use the same name on every scheduled run.

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

In alert mode, new slots are POSTed here as JSON with 'text' and 'content' fields, so Slack, Discord, Mattermost and Telegram bridges (and Zapier/Make) accept it. Leave empty for none.

## `maxAlertsPerRun` (type: `integer`):

Safety cap on how many new slots one run reports (and charges for).

## Actor input object example

```json
{
  "programs": [
    "Global Entry"
  ],
  "beforeDate": "",
  "zip": "",
  "latitude": "",
  "longitude": "",
  "maxMiles": 100,
  "locationIds": [],
  "maxLocations": 10,
  "maxSlotsPerLocation": 2,
  "stateStoreName": "",
  "webhookUrl": "",
  "maxAlertsPerRun": 50
}
```

# Actor output Schema

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

No description

## `downloadCsv` (type: `string`):

No description

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

No description

## `count` (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 = {
    "programs": [
        "Global Entry"
    ],
    "beforeDate": "",
    "zip": "",
    "latitude": "",
    "longitude": "",
    "maxMiles": 100,
    "locationIds": [],
    "maxLocations": 10,
    "maxSlotsPerLocation": 2,
    "stateStoreName": "",
    "webhookUrl": "",
    "maxAlertsPerRun": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("that_red_bird/global-entry-appointment-alerts").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 = {
    "programs": ["Global Entry"],
    "beforeDate": "",
    "zip": "",
    "latitude": "",
    "longitude": "",
    "maxMiles": 100,
    "locationIds": [],
    "maxLocations": 10,
    "maxSlotsPerLocation": 2,
    "stateStoreName": "",
    "webhookUrl": "",
    "maxAlertsPerRun": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("that_red_bird/global-entry-appointment-alerts").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 '{
  "programs": [
    "Global Entry"
  ],
  "beforeDate": "",
  "zip": "",
  "latitude": "",
  "longitude": "",
  "maxMiles": 100,
  "locationIds": [],
  "maxLocations": 10,
  "maxSlotsPerLocation": 2,
  "stateStoreName": "",
  "webhookUrl": "",
  "maxAlertsPerRun": 50
}' |
apify call that_red_bird/global-entry-appointment-alerts --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,that_red_bird/global-entry-appointment-alerts"
        }
    }
}
```

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/smX5AmyPUVGeo3FV0/builds/qDtaqbyAFXdSAF08P/openapi.json
