Agent-native travel risk

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.

$0.01 airport risk $0.05 connection risk x402 v2 Base mainnet USDC 646 U.S. scheduled-service airports
Risk score is not probability.

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

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.