# Polyox Nba

> Query the PolyOx API for NBA data, Polymarket predictions, and AI matchup analysis. The analysis endpoint uses the x402 payment protocol (USDC on Base Sepolia).

- Skill: `dvcrn/polyox-nba` (Agent Skill)
- Install (CLI): `npx skillmds@latest add dvcrn/polyox-nba`
- Raw SKILL.md: https://api.skillmd.com/api/skills/dvcrn/polyox-nba/raw
- Safety review: pending (external: skill-scanner PASS, skillspector CAUTION)
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Integrations & APIs
- Author: dvcrn (https://skillmd.com/u/dvcrn)
- Updated: 2026-09-08
- Page: https://skillmd.com/skills/dvcrn/polyox-nba

---


# PolyOx NBA API

Base URL: `https://api-hoobs.polyox.io`

All responses are JSON. Paginated endpoints return `{ data, page, pageSize, total }`.

---

## Step 0 — Check your wallet

Before calling any paid endpoint you need an EVM wallet with USDC on
**Base Sepolia**.

**Already have a wallet?** Make sure the `EVM_PRIVATE_KEY` environment
variable is set and skip to [Quick start](#quick-start).

**Don't have a wallet?** Set one up with
[Coinbase Agentic Wallet](https://docs.cdp.coinbase.com/agentic-wallet/welcome)
— a CLI wallet built for AI agents. No private key management required.

### Set up Coinbase Agentic Wallet

Prerequisites: **Node.js 24+** and an email address.

```bash
# Install the agentic-wallet skills (one-time)
npx skills add coinbase/agentic-wallet-skills
```

#### Authenticate

```bash
# 1. Start login — sends a 6-digit code to your email
npx awal@latest auth login agent@example.com

# 2. Verify with the code you received
npx awal@latest auth verify <flowId> <otp>

# 3. Confirm authentication
npx awal@latest status
```

#### Check address & balance

```bash
npx awal@latest address
npx awal@latest balance
```

#### Fund your wallet

Get testnet USDC from the Base Sepolia faucet, or ask another agent /
user to send USDC to your wallet address.

> **Full Agentic Wallet docs:**
> <https://docs.cdp.coinbase.com/agentic-wallet/quickstart>

---

## Quick start

```bash
# Today's games
curl "https://api-hoobs.polyox.io/nba/games?date=2026-02-08"

# Matchup context (injuries, recent form, Polymarket odds)
curl "https://api-hoobs.polyox.io/nba/games/context?date=2026-02-08&home=MIN&away=LAC"

# Latest injury report
curl "https://api-hoobs.polyox.io/nba/injury-reports/latest"
```

---

## Free endpoints

### NBA

| Method | Path | Description |
|--------|------|-------------|
| GET | `/nba/teams` | List all teams |
| GET | `/nba/teams/{id}` | Get one team |
| GET | `/nba/games` | List games (filter: `date`, `from`, `to`, `status`, `season`, `teamId`) |
| GET | `/nba/games/{id}` | Get one game |
| GET | `/nba/games/{id}/markets` | Polymarket markets for a game |
| GET | `/nba/games/context` | Full matchup context — requires `date`, `home`, `away` |
| GET | `/nba/players` | List players (filter: `search`, `isActive`, `teamId`) |
| GET | `/nba/players/{id}` | Get one player |
| GET | `/nba/team-stats` | Team game stats (filter: `gameId`, `teamId`) |
| GET | `/nba/player-stats` | Player game stats (filter: `gameId`, `playerId`, `teamId`) |
| GET | `/nba/injury-reports` | List injury reports |
| GET | `/nba/injury-reports/latest` | Latest entries (filter: `team`, `status`, `date`) |

### Polymarket

| Method | Path | Description |
|--------|------|-------------|
| GET | `/polymarket/events` | List events (filter: `date`, `search`) |
| GET | `/polymarket/markets` | List markets (filter: `eventId`, `search`) |
| GET | `/polymarket/price` | Live CLOB prices (`tokenId` or `marketIds`) |
| GET | `/polymarket/orderbook` | Live CLOB orderbook (`tokenId` or `marketIds`) |

All list endpoints support `page` and `pageSize` query params.

---

## Paid endpoint — x402 protocol

### `POST /nba/analysis`

AI-powered matchup analysis. Payment via **x402** — the HTTP-native payment standard.

- **Network:** Base Sepolia (chain ID `84532`)
- **Token:** USDC at `0x036CbD53842c5426634e7929541eC2318f3dCF7e`
- **Protocol docs:** https://docs.x402.org

#### Request body

```json
{
  "date": "2026-02-08",
  "home": "MIN",
  "away": "LAC"
}
```

All three fields required. `date` is `YYYY-MM-DD`, `home`/`away` are team abbreviations.

---

### How x402 works (step by step)

#### Step 1 — Send the request

Make a normal HTTP request. The server will respond with **HTTP 402**.

```bash
curl -s -D - -X POST \
  -H "Content-Type: application/json" \
  -d '{"date":"2026-02-08","home":"MIN","away":"LAC"}' \
  "https://api-hoobs.polyox.io/nba/analysis"
```

#### Step 2 — Parse the 402 response

The 402 response includes a `PAYMENT-REQUIRED` header. Decode it from base64 to get the payment requirements:

```bash
# Extract and decode the payment requirements
PAYMENT_REQUIRED=$(curl -s -D - -X POST \
  -H "Content-Type: application/json" \
  -d '{"date":"2026-02-08","home":"MIN","away":"LAC"}' \
  "https://api-hoobs.polyox.io/nba/analysis" \
  | grep -i "payment-required" | cut -d' ' -f2 | tr -d '\r')

echo "$PAYMENT_REQUIRED" | base64 -d | jq .
```

The decoded JSON contains:

```json
{
  "maxAmountRequired": "...",
  "resource": "...",
  "payTo": "0x...",
  "asset": "0x036CbD53842c5426634e7929541eC2318f3dCF7e",
  "network": "eip155:84532",
  "expiresAt": "...",
  "nonce": "...",
  "paymentId": "...",
  "accepts": [{ "scheme": "exact", "network": "eip155:84532" }]
}
```

#### Step 3 — Sign and construct the payment

Using the payment requirements, create an **EIP-712 typed-data signature**
that authorises the USDC transfer. This is an off-chain signature — no gas spent.

The signature must be sent as a base64-encoded JSON payload in the
`PAYMENT-SIGNATURE` header when retrying the request.

**Important:** The EIP-712 signing step requires a crypto library. Pure `curl`
cannot sign. Use one of the approaches below.

#### Step 4 — Retry with payment

```bash
curl -X POST \
  -H "Content-Type: application/json" \
  -H "PAYMENT-SIGNATURE: <base64_encoded_signed_payload>" \
  -d '{"date":"2026-02-08","home":"MIN","away":"LAC"}' \
  "https://api-hoobs.polyox.io/nba/analysis"
```

The server verifies the signature, settles the payment on-chain, and returns
the analysis. A `PAYMENT-RESPONSE` header is included with settlement proof.

---

### Agent integration options

Choose the approach that matches your setup:

#### Option A — Coinbase Agentic Wallet (recommended)

The simplest path. If you set up your wallet via `awal` in Step 0, you can
pay for x402 endpoints in a single command — no code, no private key handling.

```bash
# Pay and call the analysis endpoint
npx awal@latest x402 pay \
  "https://api-hoobs.polyox.io/nba/analysis" \
  -X POST \
  -d '{"date":"2026-02-08","home":"MIN","away":"LAC"}'
```

The `awal x402 pay` command handles the full 402 → sign → retry flow
automatically. Options:

| Flag | Description |
|------|-------------|
| `-X, --method <method>` | HTTP method (default: GET) |
| `-d, --data <json>` | JSON request body |
| `-q, --query <params>` | Query parameters |
| `--max-amount <amount>` | Max USDC to spend (in micro-units) |
| `--json` | Output raw JSON |

> **Agentic Wallet skills reference:**
> <https://docs.cdp.coinbase.com/agentic-wallet/skills/overview>

#### Option B — Node.js / TypeScript

If you already have an EVM private key and prefer programmatic control:

```bash
npm install @x402/fetch @x402/core @x402/evm viem
```

```typescript
import { wrapFetchWithPayment } from "@x402/fetch";
import { x402Client } from "@x402/core/client";
import { registerExactEvmScheme } from "@x402/evm/exact/client";
import { privateKeyToAccount } from "viem/accounts";

const signer = privateKeyToAccount(process.env.EVM_PRIVATE_KEY as `0x${string}`);
const client = new x402Client();
registerExactEvmScheme(client, { signer });

const fetchWithPayment = wrapFetchWithPayment(fetch, client);

const res = await fetchWithPayment(
  "https://api-hoobs.polyox.io/nba/analysis",
  {
    method: "POST",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify({ date: "2026-02-08", home: "MIN", away: "LAC" }),
  },
);

console.log(await res.json());
```

> **Note for AI agents:** Option A is the fastest way to get started — no
> private key required. Option B gives full programmatic control if you
> already manage your own wallet.

---

## Reference

**Team abbreviations:** ATL, BOS, BKN, CHA, CHI, CLE, DAL, DEN, DET, GSW, HOU, IND, LAC, LAL, MEM, MIA, MIL, MIN, NOP, NYK, OKC, ORL, PHI, PHX, POR, SAC, SAS, TOR, UTA, WAS

**Date format:** `YYYY-MM-DD`

**Pagination:** `page` (1-indexed), `pageSize` (default 50)
