TravelCheck
Deterministic airport-disruption and missed-connection risk assessments from current FAA operational events, Aviation Weather Center observations and forecasts, and caller-supplied itinerary timing.
TravelCheck returns a deterministic relative risk score from 0–100. A score of 72 does not mean a 72% chance of delay or a missed connection.
Paid resources
Airport Risk · $0.01
POST https://travelcheck-x402.fly.dev/v1/airport-risk
Assess operational and weather disruption risk around a requested time. Use IATA identifiers such as ORD or corresponding ICAO identifiers such as KORD.
Connection Risk · $0.05
POST https://travelcheck-x402.fly.dev/v1/connection-risk
Assess missed-connection risk from inbound/outbound itinerary times, a caller-supplied minimum connection time, and live airport conditions.
An unpaid request returns HTTP 402 Payment Required. An x402-aware buyer signs the exact USDC authorization and retries the request with the payment payload. Successful responses include the standard x402 settlement header.
Production network: eip155:8453. A unique idempotency-key is recommended for every new logical request. TravelCheck also advertises the optional x402 payment-identifier extension; clients that reuse the same payment ID for an identical retry can receive the settled response without a second payment while the current one-process replay window remains active.
Airport-risk request
{
"airport": "ORD",
"targetTime": "2026-08-12T20:00:00.000Z",
"direction": "both"
}
direction may be arrivals, departures, or both and defaults to both.
Airport-risk response shape
{
"airport": {
"icaoId": "KORD",
"iataId": "ORD",
"faaId": "ORD",
"name": "Chicago O'Hare International Airport"
},
"assessedAt": "…",
"targetTime": "…",
"direction": "both",
"riskScore": 50,
"riskBand": "high",
"recommendedAction": "add_buffer",
"components": { "operations": 34, "weather": 16 },
"signals": ["… structured signal objects …"],
"sourceTimes": {
"faaUpdatedAt": "…",
"metarObservedAt": "…",
"tafIssuedAt": "…"
},
"scoringVersion": "airport-v1"
}
Connection-risk request
{
"connectionAirport": "ORD",
"inbound": {
"flight": "UA123",
"scheduled": "2026-08-12T20:00:00.000Z",
"estimated": "2026-08-12T20:18:00.000Z"
},
"outbound": {
"flight": "UA456",
"scheduled": "2026-08-12T21:15:00.000Z"
},
"minimumConnectionMinutes": 45
}
Scheduled inbound and outbound times are required. Flight identifiers and estimated times are optional. minimumConnectionMinutes is required because valid minimums vary by airport, carrier, terminal, and domestic/international handling.
Connection-risk response shape
{
"connectionAirport": "ORD",
"inboundFlight": "UA123",
"outboundFlight": "UA456",
"assessedAt": "…",
"arrivalTimeUsed": "…",
"departureTimeUsed": "…",
"effectiveConnectionMinutes": 57,
"minimumConnectionMinutes": 45,
"remainingBufferMinutes": 12,
"riskScore": 73,
"riskBand": "high",
"recommendedAction": "add_buffer",
"assessmentQuality": "live_arrival_estimate",
"components": {
"connectionWindow": 65,
"airportAdjustment": 8,
"airportRiskScore": 50,
"airportExposure": 0.35
},
"signals": ["… structured signal objects …"],
"scoringVersion": "connection-v1"
}
Call TravelCheck with an x402 client
Any x402 v2 client supporting the exact EVM scheme on Base can call TravelCheck. This standalone Node example uses a dedicated EVM signer and opts into the advertised payment-identifier retry protection.
npm install @x402/core @x402/fetch @x402/evm @x402/extensions viem
export EVM_PRIVATE_KEY="0x..."
import { x402Client } from "@x402/core/client";
import { ExactEvmScheme } from "@x402/evm/exact/client";
import {
appendPaymentIdentifierToExtensions,
generatePaymentId,
} from "@x402/extensions/payment-identifier";
import { wrapFetchWithPayment } from "@x402/fetch";
import { privateKeyToAccount } from "viem/accounts";
const signer = privateKeyToAccount(process.env.EVM_PRIVATE_KEY);
const client = new x402Client();
client.register("eip155:8453", new ExactEvmScheme(signer));
const paymentId = generatePaymentId();
client.onBeforePaymentCreation(async ({ paymentRequired }) => {
if (paymentRequired.extensions?.["payment-identifier"]) {
appendPaymentIdentifierToExtensions(paymentRequired.extensions, paymentId);
}
});
const paidFetch = wrapFetchWithPayment(fetch, client);
const request = {
method: "POST",
headers: {
"content-type": "application/json",
"idempotency-key": crypto.randomUUID(),
},
body: JSON.stringify({
airport: "ORD",
targetTime: new Date(Date.now() + 2 * 60 * 60 * 1000).toISOString(),
direction: "both",
}),
};
const response = await paidFetch("https://travelcheck-x402.fly.dev/v1/airport-risk", request);
console.log(await response.json());
// If transport fails after authorization, retry the same logical request with
// the same paymentId (and the same idempotency-key) instead of creating a new ID.
Coverage and failure behavior
- Supports 646 scheduled-service airports in the United States and its territories.
- The supported target window is approximately 15 minutes in the past through 12 hours in the future.
- Required live sources are FAA NAS airport-status events plus Aviation Weather Center METAR observations and TAF forecasts. Airport identity comes from TravelCheck's generated scheduled-service directory rather than a live metadata request.
- TravelCheck fails closed with HTTP
503when required source data is stale, unavailable, malformed, or does not cover the requested time. - A failed assessment is not settled.
- The public pilot intentionally runs one process. Source caches, application idempotency, and payment-ID replay state are process-local; shared durable state is required before horizontal scaling.
Versioned scoring
Airport scoring is airport-v1; connection scoring is connection-v1. The weights are explicit, deterministic, and fixture-backed. Historical probability calibration is intentionally deferred until enough real outcomes exist to support it.