Polling 113 feeds · updated 57s ago

Every bus, train, and ferry.
One API call.

We poll 113 GTFS-Realtime feeds from 105+ transit agencies every 30 seconds. Your agent gets normalized vehicle positions, service alerts, and arrival predictions. No API keys. Free tier or pay per query in USDC.

Serving data from AC Transit · Adelaide Metro · Arlington, VA · BC Transit · Barrie Transit · Bay Area Rapid Transit · Bibus · Boise, ID · +97 more

113

Active feeds

polled every 30s

372

Vehicles now

last 5 min window

6,358

Active alerts

last 24 hours

105

Agencies

GTFS-Realtime

GTFS-Realtime is a standard. Integrating it is not.

Live response

GET /api/feeds →
GET https://transit.motioninfo.com/api/feeds
Loading...

This is a live response from the API. Free, no auth required. 10 req/min.

Endpoints

105 agencies · GTFS-RT
Free GET /api/feeds

Full catalog of transit feeds with agency, enabled state, and last-poll status.

GET /api/vehicles?lat=42.35&lon=-71.08&radius_km=2

Real-time positions of buses, trains, and ferries near a coordinate.

GET /api/alerts?feed=mbta

Service alerts and disruptions for any feed.

GET /api/predictions?feed=mbta&stop=70154

Arrival and departure predictions per stop.

Free GET /api/stream/vehicles?lat=42.35&lon=-71.08

Server-Sent Events stream of vehicle positions. Rate limited.

Pricing

USDC on Base
DataPrice / querySource
Vehicles, alerts, predictions$0.001 USDCPublic GTFS-Realtime

Network: Base mainnet (eip155:8453) · x402 protocol · no API keys, no signup.

Free tier: 10 requests/min on every endpoint. No payment required.

Integration

x402 · Python
# pip install x402[httpx,evm] eth-account
from x402.http.clients import x402HttpxClient
from x402 import x402Client
from x402.mechanisms.evm import EthAccountSigner
from x402.mechanisms.evm.exact.register import register_exact_evm_client
from eth_account import Account

account = Account.from_key("YOUR_PRIVATE_KEY")
client = x402Client()
register_exact_evm_client(client, EthAccountSigner(account))

async with x402HttpxClient(client) as http:
    # Vehicles near Boston: $0.001
    r = await http.get("https://transit.motioninfo.com/api/vehicles?lat=42.35&lon=-71.08")
    # Service alerts for MBTA
    r = await http.get("https://transit.motioninfo.com/api/alerts?feed=mbta")

Or just curl it:

# Free tier, no auth needed
curl https://transit.motioninfo.com/api/feeds | jq '.feeds[:3]'