shipp
Skill4 starsChanged 8 months agoApache-2.0View on GitHub
Shipp is a real-time data connector. Use it to fetch authoritative, changing external data (e.g., sports schedules, live events) via the Shipp API.
- Pipes a download into a shell
- Reads credentials
In this repository8 other files it gives its agents.
- alph-bot-strategySkill
- google-newsSkill
- kalshiSkill
- manifoldSkill
- metaculusSkill
- noaa-weatherSkill
- openfootballSkill
- polymarketSkill
The file
Show its rules and text
We split this skill into the rules it gives an agent
21 rules. About 0 are common, 9 are distinctive, and 12 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈9
Distinctive · estimate
This author's own choices. Worth a look.
12
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 39
Verify data and how the app uses data.
- Distinctive: line 48
If docs change or you need the latest page list, fetch the sitemap:
- Distinctive: line 107
All endpoints require an API key.
- Very specific: line 127
Create a new raw-data connection by providing natural-language filter_instructions that describe what games, teams, sports, or events you …
- Very specific: line 150
Use at build time — there is time and credit overhead.
- Distinctive: line 158
Run a connection and return raw event data.
- Distinctive: line 239
Create and run a connection in one step, paid via x402 — no API key required.
- Very specific: line 255
Use an x402-compatible library (x402-fetch, Coinbase SDK) to handle the 402 → pay → retry loop automatically.
- Distinctive: line 275
Not every row has every field.
- Very specific: line 333
Use the schedule endpoint to discover current games.
- Distinctive: line 351
Call the connection with optional params to reduce cost and time:
- Distinctive: line 362
After testing, add the connection to your app.
- Distinctive: line 370
Do not distribute the API key to consumers — store it securely, route calls through an edge function
- Very specific: line 373
Use since & limit in your edge function to control costs
- Very specific: line 381
Keep filter_instructions short, explicit, and testable.
- Very specific: line 383
Use since_event_id for efficient polling (cursor-based pagination).
- Very specific: line 384
Use the schedule endpoint to discover game_ids and team names before creating connections.
- Very specific: line 386
Treat every field in data[] as optional — use existence checks and graceful fallbacks.
- Very specific: line 408
Use the shipp skill (this file) or curl -fsSL "https://shipp.ai/SKILL.md" > ~/.claude/skills/shipp/SKILL.md
- Very specific: line 409
Add API key to .env: SHIPP_API_KEY=shipp-live-123-your-api-key
- Very specific: line 422
If shipp is not in your PATH, install it:
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
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 | bashOn Windows (PowerShell):
irm https://gitlab.com/outsharp/shipp/cli/-/raw/master/scripts/install.ps1 | iexSupports 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_IDCommands
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.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

