shipp
Shipp API
Shipp.ai is the real-time data connector for AI builders.
Implement as many tests as possible as soon as possible. Verify data and how the app uses data. Be flexible in schema — event rows are schema-flexible JSON and fields vary by sport, feed, and event.
Base URL: https://api.shipp.ai/api/v1
Sitemap & Documentation Index
If docs change or you need the latest page list, fetch the sitemap:
curl -sL "https://markdown.new/docs.shipp.ai/sitemap.xml"
To read any doc page as clean markdown:
curl -sL "https://markdown.new/docs.shipp.ai/<path>"
Full Sitemap
Getting Started
Shipp enables a faster way to create connections to real-time data. It's cost-effective, fast to run, and easy to start.
- Sign up on Shipp
- Paste your API key into your favorite AI builder. See Platform Guides
- Shipp works with your AI builder to provide the live data your app needs
Following the instructions (Setup, Test, Shipp) is the best way to create your first Connection.
Available Data
- Sports: NBA, NFL, NCAA Football, MLB, Soccer (Multiple Leagues)
- News, Financials, Travel, Shopping, Social, Prediction Markets, Weather — coming soon
Authentication
All endpoints require an API key. The API supports several methods:
| Method | Example |
|---|---|
Query parameter api_key |
?api_key=YOUR_API_KEY |
Query parameter apikey |
?apikey=YOUR_API_KEY |
Authorization header (Bearer) |
Authorization: Bearer YOUR_API_KEY |
Authorization header (Basic) |
Authorization: Basic base64(:YOUR_API_KEY) |
X-API-Key header |
X-API-Key: YOUR_API_KEY |
User-API-Key header |
User-API-Key: YOUR_API_KEY |
API-Key header |
API-Key: YOUR_API_KEY |
Pick whichever method works best for your client.
Endpoints
POST /api/v1/connections/create
Create a new raw-data connection by providing natural-language filter_instructions that describe what games, teams, sports, or events you want to track.
Request body:
{
"filter_instructions": "string (required)"
}
Response (200):
{
"connection_id": "01KFXTX1WDQ68A1GS77T1XJ5YB",
"enabled": true,
"name": "string",
"description": "string"
}
Errors: 400 (invalid JSON, empty body, missing filter_instructions), 500
Use at build time — there is time and credit overhead. Store and reuse the returned connection_id.
POST /api/v1/connections/{connection_id}
Run a connection and return raw event data.
Path params: connection_id (required, ULID)
Body params (all optional):
since(string, ISO 8601): reference time to pull from. Default: 48 hours agolimit(int): max events to return. Default: 100since_event_id(ULID): last event id received — only returns newer events. Causes events to be ordered asc bywall_clock_start
Response (200):
{
"connection_id": "01KFXTX1WDQ68A1GS77T1XJ5YB",
"data": [
{ "any": "shape varies by feed + event data availability" }
]
}
Errors: 400 (missing/invalid connection_id, over limit / not authorized), 500
GET /api/v1/connections
List all connections in the current org scope. Free to call.
Response (200):
{
"connections": [
{
"connection_id": "01KFXTX1WDQ68A1GS77T1XJ5YB",
"enabled": true,
"name": "string (optional)",
"description": "string (optional)"
}
]
}
GET /api/v1/sports/{sport}/schedule
Get upcoming and recent games (past 24 hours through next 7 days).
Path params: sport (required) — e.g. nba, nfl, mlb, ncaafb, soccer (case-insensitive)
Response (200):
{
"schedule": [
{
"sport": "Soccer",
"game_status": "live",
"game_id": "01KGREKH8PXFV8AHA4Q9H2Z68F",
"scheduled": "2026-02-06T15:00:00Z",
"home": "Al-Ittifaq FC",
"home_team_players": null,
"away": "Damac FC",
"away_team_players": null
}
]
}
POST /api/v1/connections/inline (x402)
Create and run a connection in one step, paid via x402 — no API key required. Requires a crypto wallet funded with USDC on Base.
Body params:
filter_instructions(string, required)since(string, ISO 8601, optional)limit(int, optional)since_event_id(ULID, optional)
Flow:
- Agent sends request — gets
402 Payment Requiredwith pricing details - Agent signs payment with funded wallet
- Agent retries with
PAYMENT-SIGNATUREheader - Server returns data (same shape as Run Connection)
Use an x402-compatible library (x402-fetch, Coinbase SDK) to handle the 402 → pay → retry loop automatically.
Data Shape
Each element of data[] is a schema-flexible JSON object. Fields vary by sport, feed, and event.
Identifiers: game_id, home_id, away_id, attribution_id, posession_id
Text / enums: sport, home_name, away_name, game_clock, game_period_sub, desc, type, category, score_method, score_missed_outcome
Numeric: home_points, away_points, game_period, game_num, down, yards_first_down, location_yard_line, injury_time_minutes
Time: wall_clock_start, wall_clock_end
Booleans: fake_punt, fake_field_goal, screen_pass, play_action, run_pass_options
Not every row has every field. Treat every field as optional. Agents and clients should be defensive and handle missing keys.
Error Format
Errors are returned as JSON:
{
"error": "string",
"status": 400
}
| Status | Meaning |
|---|---|
| 400 | Invalid request — check JSON and required fields |
| 401 | Missing or invalid API key |
| 402 | Billing changes required — manage at https://platform.shipp.ai/billing |
| 403 | API key lacks access to this resource |
| 404 | Connection not found or doesn't belong to your org |
| 429 | Rate-limited — retry with backoff |
| 5xx | Server error — retry later or contact support@shipp.ai |
How to Shipp — Integration Pattern
Mental Model
Shipp "Connections" = reusable live-data queries. You create a connection with filter_instructions in plain English, then run it to retrieve raw event data in a schema-flexible data[] array.
Step-by-Step
-
Write a "Real-Time Contract" for one screen — define: user promise, triggering events, data shape needed, freshness window, failure mode.
-
Translate the contract into
filter_instructions— keep them short, explicit, testable, scoped. Include the domain (e.g., "NBA"), scope to an entity/time, and name what you want surfaced. -
Create a Connection once, store the
connection_id— don't create per-run. Saves time, cost, and stability. -
Run the Connection to fetch updates — use pull-based polling:
- On page load: run with a reasonable
since - On interval (5–30s): re-run with
since_event_idset to the most recent event - Merge/dedupe events into UI state
- On page load: run with a reasonable
-
Handle schema-flexible
data[]defensively — treat every field as optional, prefer safe access, log unknown shapes. -
Deduplicate, order, and reconcile — keep a rolling set of seen event IDs, order by timestamp or ID (lexicographically stable), send the largest event ID as
since_event_id.
Sports-Specific Helper
Use the schedule endpoint to discover current games. Use game context to craft filter_instructions and create connections.
Setup Instructions
- Create a connection: POST to
/api/v1/connections/createwithfilter_instructionsdescribing desired data (e.g., "Track all NBA games today and include scoring and play-by-play context") - Store the
connection_idfrom the response - List connections: GET
/api/v1/connectionsto look up saved connections (free to call)
Testing Your Connection
Call the connection with optional params to reduce cost and time:
curl https://api.shipp.ai/api/v1/connections/CONNECTION_ID?api_key=YOUR_KEY -d '{
"since": "2026-01-27T16:48:41-05:00",
"limit": 100
}'
Once tested, use since_event_id for efficient polling — save the largest event ID and pass it on subsequent calls.
After testing, add the connection to your app. Route requests through your backend (never expose API key to clients).
Shipping Your Product
- Do not distribute the API key to consumers — store it securely, route calls through an edge function
- The API is designed for direct runtime use — no caching or database setup required
- Include a footer credit to Shipp when using the APIs (see docs for HTML snippet)
- Use
since&limitin your edge function to control costs
Usage Tips
- Keep
filter_instructionsshort, explicit, and testable. Mention the sport/league and scope. - Store and reuse
connection_id— don't create a new connection per run. - Use
since_event_idfor efficient polling (cursor-based pagination). - Use the schedule endpoint to discover
game_ids and team names before creating connections. - Surface error messages directly to users when limits are hit.
- Treat every field in
data[]as optional — use existence checks and graceful fallbacks. - Log unknown data shapes in development to refine
filter_instructions. - Polling interval: 5–30 seconds depending on domain and cost sensitivity.
- Deduplicate events by keeping a rolling set of seen event IDs.
Platform Guides
For platforms without a guide: tell the platform to read the docs at https://docs.shipp.ai.
For Claude Code specifically:
- Use the shipp skill (this file) or
curl -fsSL "https://shipp.ai/SKILL.md" > ~/.claude/skills/shipp/SKILL.md - Add API key to
.env:SHIPP_API_KEY=shipp-live-123-your-api-key - Test the integration
Shipp CLI
The official command-line interface for Shipp. Use it to create accounts, manage connections, and fetch live event data directly from the terminal.
Source: https://gitlab.com/outsharp/shipp/cli
Install the CLI
If shipp is not in your PATH, install it:
curl -fsSL https://shipp.ai/install.sh | bash
On Windows (PowerShell):
irm https://gitlab.com/outsharp/shipp/cli/-/raw/master/scripts/install.ps1 | iex
Supports macOS (Apple Silicon & Intel), Linux (x86_64 & ARM64), and Windows (x86_64 & ARM64).
Quick Start
# 1. Create an account
shipp account create --email you@example.com
# 2. Log in (paste API key when prompted — stored at ~/.config/shipp/config.zon)
shipp account login
# 3. Create a connection
shipp connections create --filter_instructions "NBA games, scoring plays only"
# 4. Run the connection
shipp connections run --id CONNECTION_ID
Commands
shipp account
| Command | Description |
|---|---|
shipp account create --email <email> |
Create a new Shipp account |
shipp account login |
Log in with your API key |
shipp account logout |
Clear stored credentials |
shipp connections
| Command | Description |
|---|---|
shipp connections create --filter_instructions <text> |
Create a connection with natural language filtering |
shipp connections list |
List all your connections |
shipp connections run --id <connection_id> |
Run a connection and fetch matching events |
connections run options
| Option | Description |
|---|---|
--id <string> |
(required) The connection ID to run |
--limit <int> |
Max events to return (default: 100) |
--since <string> |
ISO 8601 timestamp — only return events after this time (default: 48h ago) |
--since-event-id <string> |
ULID of the last event received — only return newer events |
Global options
| Option | Description |
|---|---|
-v, --version |
Print the CLI version |
--raw |
Output raw JSON instead of formatted tables |
--help |
Show help for any command |
Examples
# List connections
shipp connections list
# Get last 10 events
shipp connections run --id CONNECTION_ID --limit 10
# Get events from the last hour
shipp connections run --id CONNECTION_ID --since "2026-03-08T12:00:00Z"
# Raw JSON output piped to jq
shipp connections run --id CONNECTION_ID --raw | jq '.data[].desc'
# Incremental polling
LAST_ID=$(shipp connections run --id CONNECTION_ID --raw | jq -r '.data[-1].id')
shipp connections run --id CONNECTION_ID --since-event-id "$LAST_ID"
Versioning
This API is versioned under /api/v1/. New versions will be introduced under a new prefix when breaking changes are required.