# Shipp

> 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.

- Skill: `outsharp/shipp` (Agent Skill, multi-file: 2 files)
- Install (CLI): `npx skillmds add outsharp/shipp`
- Raw SKILL.md: https://api.skillmd.com/api/skills/outsharp/shipp/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Integrations & APIs
- Author: outsharp (https://skillmd.com/u/outsharp)
- Updated: 2026-09-09
- Page: https://skillmd.com/skills/outsharp/shipp

---


# Shipp API

[Shipp.ai](https://shipp.ai) is the real-time data connector for AI builders.

[Create an API Key](https://platform.shipp.ai)

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

| Page | markdown.new URL |
|---|---|
| Getting Started | https://markdown.new/docs.shipp.ai/ |
| Setup Instructions | https://markdown.new/docs.shipp.ai/instructions/setup/ |
| Test Your Connection | https://markdown.new/docs.shipp.ai/instructions/test/ |
| Shipp Your Product | https://markdown.new/docs.shipp.ai/instructions/shipp/ |
| How to Shipp | https://markdown.new/docs.shipp.ai/how-to/ |
| API Reference | https://markdown.new/docs.shipp.ai/api-reference/ |
| Create Connection | https://markdown.new/docs.shipp.ai/api-reference/connections-create/ |
| List Connections | https://markdown.new/docs.shipp.ai/api-reference/connections-list/ |
| Run Connection | https://markdown.new/docs.shipp.ai/api-reference/connections-run/ |
| Sport Schedule | https://markdown.new/docs.shipp.ai/api-reference/sport-schedule/ |
| Data Shape | https://markdown.new/docs.shipp.ai/api-reference/connections-run-data-shape/ |
| Error Format | https://markdown.new/docs.shipp.ai/api-reference/error-format/ |
| Usage Tips | https://markdown.new/docs.shipp.ai/api-reference/usage-tips/ |
| Versioning | https://markdown.new/docs.shipp.ai/api-reference/versioning/ |
| x402 Payments | https://markdown.new/docs.shipp.ai/api-reference/x402/ |
| Platform Guides | https://markdown.new/docs.shipp.ai/platform-guides/ |
| Lovable Guide | https://markdown.new/docs.shipp.ai/platform-guides/lovable/ |
| Base44 Guide | https://markdown.new/docs.shipp.ai/platform-guides/base44/ |
| Claude Code Guide | https://markdown.new/docs.shipp.ai/platform-guides/claude-code/ |
| Blink Guide | https://markdown.new/docs.shipp.ai/platform-guides/blink/ |
| Replit Guide | https://markdown.new/docs.shipp.ai/platform-guides/replit/ |

---

## 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.

1. Sign up on [Shipp](https://platform.shipp.ai)
2. Paste your API key into your favorite AI builder. See [Platform Guides](https://markdown.new/docs.shipp.ai/platform-guides/)
3. Shipp works with your AI builder to provide the live data your app needs

Following the instructions ([Setup](https://markdown.new/docs.shipp.ai/instructions/setup/), [Test](https://markdown.new/docs.shipp.ai/instructions/test/), [Shipp](https://markdown.new/docs.shipp.ai/instructions/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:**

```json
{
  "filter_instructions": "string (required)"
}
```

**Response (200):**

```json
{
  "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`.

> [Full docs](https://markdown.new/docs.shipp.ai/api-reference/connections-create/)

---

### `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 ago
- `limit` (int): max events to return. Default: 100
- `since_event_id` (ULID): last event id received — only returns newer events. Causes events to be ordered asc by `wall_clock_start`

**Response (200):**

```json
{
  "connection_id": "01KFXTX1WDQ68A1GS77T1XJ5YB",
  "data": [
    { "any": "shape varies by feed + event data availability" }
  ]
}
```

**Errors:** 400 (missing/invalid `connection_id`, over limit / not authorized), 500

> [Full docs](https://markdown.new/docs.shipp.ai/api-reference/connections-run/)

---

### `GET /api/v1/connections`

List all connections in the current org scope. Free to call.

**Response (200):**

```json
{
  "connections": [
    {
      "connection_id": "01KFXTX1WDQ68A1GS77T1XJ5YB",
      "enabled": true,
      "name": "string (optional)",
      "description": "string (optional)"
    }
  ]
}
```

> [Full docs](https://markdown.new/docs.shipp.ai/api-reference/connections-list/)

---

### `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):**

```json
{
  "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
    }
  ]
}
```

> [Full docs](https://markdown.new/docs.shipp.ai/api-reference/sport-schedule/)

---

### `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:**

1. Agent sends request — gets `402 Payment Required` with pricing details
2. Agent signs payment with funded wallet
3. Agent retries with `PAYMENT-SIGNATURE` header
4. 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.

> [Full docs](https://markdown.new/docs.shipp.ai/api-reference/x402/)

---

## 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.

> [Full docs](https://markdown.new/docs.shipp.ai/api-reference/connections-run-data-shape/)

---

## Error Format

Errors are returned as JSON:

```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 |

> [Full docs](https://markdown.new/docs.shipp.ai/api-reference/error-format/)

---

## How to Shipp — Integration Pattern

> [Full guide](https://markdown.new/docs.shipp.ai/how-to/)

### 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

1. **Write a "Real-Time Contract"** for one screen — define: user promise, triggering events, data shape needed, freshness window, failure mode.

2. **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.

3. **Create a Connection once, store the `connection_id`** — don't create per-run. Saves time, cost, and stability.

4. **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_id` set to the most recent event
   - Merge/dedupe events into UI state

5. **Handle schema-flexible `data[]` defensively** — treat every field as optional, prefer safe access, log unknown shapes.

6. **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](https://markdown.new/docs.shipp.ai/api-reference/sport-schedule/) to discover current games. Use game context to craft `filter_instructions` and create connections.

---

## Setup Instructions

> [Full docs](https://markdown.new/docs.shipp.ai/instructions/setup/)

1. **Create a connection:** POST to `/api/v1/connections/create` with `filter_instructions` describing desired data (e.g., "Track all NBA games today and include scoring and play-by-play context")
2. **Store the `connection_id`** from the response
3. **List connections:** GET `/api/v1/connections` to look up saved connections (free to call)

---

## Testing Your Connection

> [Full docs](https://markdown.new/docs.shipp.ai/instructions/test/)

Call the connection with optional params to reduce cost and time:

```bash
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

> [Full docs](https://markdown.new/docs.shipp.ai/instructions/shipp/)

- 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` & `limit` in your edge function to control costs

---

## Usage Tips

> [Full docs](https://markdown.new/docs.shipp.ai/api-reference/usage-tips/)

- Keep `filter_instructions` short, 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_id` for efficient polling (cursor-based pagination).
- Use the schedule endpoint to discover `game_id`s 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

> [Full index](https://markdown.new/docs.shipp.ai/platform-guides/)

| Platform | Guide |
|---|---|
| Lovable | https://markdown.new/docs.shipp.ai/platform-guides/lovable/ |
| Base44 | https://markdown.new/docs.shipp.ai/platform-guides/base44/ |
| Claude Code | https://markdown.new/docs.shipp.ai/platform-guides/claude-code/ |
| Blink | https://markdown.new/docs.shipp.ai/platform-guides/blink/ |
| Replit | https://markdown.new/docs.shipp.ai/platform-guides/replit/ |

For platforms without a guide: tell the platform to read the docs at `https://docs.shipp.ai`.

For Claude Code specifically:
1. Use the shipp skill (this file) or `curl -fsSL "https://shipp.ai/SKILL.md" > ~/.claude/skills/shipp/SKILL.md`
2. Add API key to `.env`: `SHIPP_API_KEY=shipp-live-123-your-api-key`
3. 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:

```sh
curl -fsSL https://shipp.ai/install.sh | bash
```

On Windows (PowerShell):

```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

```sh
# 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

```sh
# 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.

> [Full docs](https://markdown.new/docs.shipp.ai/api-reference/versioning/)

