STREAM SUMMARIES · x402 API

Every Twitch crypto & memecoin stream we capture becomes one structured JSON: who was bullish, what chat thought, which coins came up, when, and at what price. Sold per call to AI agents for about $0.01 USDC over x402 on Base. No key, no account, no subscription.

How it works

Three HTTP calls, no sign-up. The first one is refused with a price; your x402 client pays it and retries.

  1. Ask

    GET a paid path. You get HTTP 402 with the price, the asset and a pay-to address in the PAYMENT-REQUIRED header.

  2. Pay

    Your client signs a USDC transfer on Base (eip155:8453) — about $0.01 — and retries with the payment header.

  3. Read

    HTTP 200 and the summary as JSON: schema stream_summary_v1, sentiment from −1 to +1, every coin, topic and guest.

Live examples

Real responses. The free routes are fetched from this server as you read; the paid routes show the 402 you get first, then an abbreviated real response from the matching free /v1/sample/… route (3 coins, 3 topics, data.sample: true). If a fetch fails, the block keeps a static copy captured 2026-10-09.

FREE

The catalogue

GET /v1/streams
REQUEST
curl https://extra.watch/v1/streams
STATIC COPYevery channel with a summary, its last stream, and how many summaries exist
  • decu23summarieslast stream 2h 46m · ended Oct 9, 17:34
  • vladesiu14summarieslast stream 3h 00m · ended Oct 9, 16:57
  • hectortrade16summarieslast stream 3h 01m · ended Oct 9, 14:48
  • megga27summarieslast stream 1h 43m · ended Oct 9, 11:47
  • threadguy17summarieslast stream 1h 22m · ended Oct 9, 10:04
  • alxcooks9summarieslast stream 16m · ended Oct 9, 08:42
  • boxbox312227summarieslast stream 2h 37m · ended Oct 9, 05:46
  • sh4vwty4summarieslast stream 3h 01m · ended Oct 9, 01:40
  • advyth10summarieslast stream 7h 12m · ended Oct 8, 09:11
  • cented13summarieslast stream 3h 30m · ended Oct 7, 22:03
  • dvces15summarieslast stream 5h 08m · ended Oct 7, 20:22
  • jackduvaltrades2summarieslast stream 3h 48m · ended Sep 19, 03:08
  • quaave100x1summarylast stream 1h 14m · ended Sep 18, 19:44
Raw JSON
{
  "data": {
    "schema": "stream_catalogue_v1",
    "source": "twitch",
    "channels": [
      {
        "channel": "advyth",
        "n_summaries": 10,
        "last_session": "2026-10-08T01-58-47",
        "last_ended_at": "2026-10-08T09:11:16-04:00",
        "last_duration_s": 25944
      },
      {
        "channel": "alxcooks",
        "n_summaries": 9,
        "last_session": "2026-10-09T08-25-43",
        "last_ended_at": "2026-10-09T08:42:11-04:00",
        "last_duration_s": 982
      },
      {
        "channel": "boxbox3122",
        "n_summaries": 27,
        "last_session": "2026-10-09T03-09-34",
        "last_ended_at": "2026-10-09T05:46:29-04:00",
        "last_duration_s": 9411
      },
      {
        "channel": "cented",
        "n_summaries": 13,
        "last_session": "2026-10-07T18-33-11",
        "last_ended_at": "2026-10-07T22:03:40-04:00",
        "last_duration_s": 12625
      },
      {
        "channel": "decu",
        "n_summaries": 23,
        "last_session": "2026-10-09T14-48-43",
        "last_ended_at": "2026-10-09T17:34:43-04:00",
        "last_duration_s": 9955
      },
      {
        "channel": "dvces",
        "n_summaries": 15,
        "last_session": "2026-10-07T15-13-53",
        "last_ended_at": "2026-10-07T20:22:28-04:00",
        "last_duration_s": 18510
      },
      {
        "channel": "hectortrade",
        "n_summaries": 16,
        "last_session": "2026-10-09T11-47-49",
        "last_ended_at": "2026-10-09T14:48:41-04:00",
        "last_duration_s": 10847
      },
      {
        "channel": "jackduvaltrades",
        "n_summaries": 2,
        "last_session": "2026-09-18T23-20-10",
        "last_ended_at": "2026-09-19T03:08:26-04:00",
        "last_duration_s": 13690
      },
      {
        "channel": "megga",
        "n_summaries": 27,
        "last_session": "2026-10-09T10-04-47",
        "last_ended_at": "2026-10-09T11:47:46-04:00",
        "last_duration_s": 6175
      },
      {
        "channel": "quaave100x",
        "n_summaries": 1,
        "last_session": "2026-09-18T18-31-02",
        "last_ended_at": "2026-09-18T19:44:49-04:00",
        "last_duration_s": 4422
      },
      {
        "channel": "sh4vwty",
        "n_summaries": 4,
        "last_session": "2026-10-08T22-39-28",
        "last_ended_at": "2026-10-09T01:40:30-04:00",
        "last_duration_s": 10857
      },
      {
        "channel": "threadguy",
        "n_summaries": 17,
        "last_session": "2026-10-09T08-42-13",
        "last_ended_at": "2026-10-09T10:04:44-04:00",
        "last_duration_s": 4947
      },
      {
        "channel": "vladesiu",
        "n_summaries": 14,
        "last_session": "2026-10-09T13-57-22",
        "last_ended_at": "2026-10-09T16:57:46-04:00",
        "last_duration_s": 10819
      }
    ],
    "n_channels": 13,
    "n_summaries": 178,
    "produced_at": "2026-10-09T17:47:11-0400"
  },
  "as_of": "2026-10-09T22:56:32.799Z",
  "data_age_seconds": 4162,
  "source": "catalogue",
  "disclaimer": "Derived, observation-grade data about public broadcasts. Not financial advice. No transcripts, no chat usernames.",
  "schema": "stream_api_v1"
}
PAID · $0.01

Latest stream for a channel

GET /v1/streams/{channel}/latest
REQUEST
curl -i https://extra.watch/v1/streams/threadguy/latest
FIRST ANSWER · UNPAID
HTTP/1.1 402 Payment Required
PAYMENT-REQUIRED: eyJ4NDAyVmVyc2lvbiI6MiwiYWNjZXB0cyI6W3sic2NoZW1lIjoiZXhhY3Qi…

# that header is base64 JSON — decoded:
{
  "x402Version": 2,
  "accepts": [
    {
      "scheme": "exact",
      "network": "eip155:8453",
      "amount": "10000",
      "asset": "0x8335…2913",
      "payTo": "0x5382…36D4"
    }
  ]
}
STATIC SAMPLEafter payment you get this — live from /v1/sample/latest, abbreviated
{
  "data": {
    "schema": "stream_summary_v1",
    "channel": "threadguy",
    "source": "twitch",
    "session": "2026-10-09T08-42-13",
    "started_at": "2026-10-09T08:42:17-04:00",
    "ended_at": "2026-10-09T10:04:44-04:00",
    "duration_s": 4947,
    "streamer": {
      "sentiment": {
        "score": 0.006,
        "label": "neutral",
        "n_lines": 905,
        "n_scored": 220
      }
    },
    "chat": {
      "sentiment": {
        "score": 0.112,
        "label": "bullish"
      },
      "n_messages": 1111,
      "n_users": 166,
      "messages_per_min": 13.47
    },
    "guests": {
      "method": "heuristic-v1",
      "guests": [
        {
          "name": "stock",
          "confidence": 0.54,
          "evidence": "introduced by streamer 2x; @mentioned in chat 0x"
        }
      ]
    },
    "coins": [
      {
        "symbol": "FTX",
        "chain": "bsc",
        "address": "0x87cc…7777",
        "mentions": {
          "chat": 4,
          "streamer": 7
        },
        "first_mention_at": "2026-10-09T08:46:26-04:00",
        "first_mention_by": "chat",
        "sentiment": 0,
        "price_at_summary": 4.88e-06
      },
      {
        "symbol": "DRV",
        "chain": "hyperliquid",
        "address": "0x0896…ef62",
        "mentions": {
          "chat": 4,
          "streamer": 2
        },
        "first_mention_at": "2026-10-09T09:31:59-04:00",
        "first_mention_by": "chat",
        "sentiment": 0.1,
        "price_at_summary": 0.5041
      },
      {
        "symbol": "ZEC",
        "chain": "near",
        "address": "zec.omft.near",
        "mentions": {
          "chat": 4,
          "streamer": 0
        },
        "first_mention_at": "2026-10-09T08:51:57-04:00",
        "first_mention_by": "chat",
        "sentiment": 0.1,
        "price_at_summary": 1210.89
      }
    ],
    "topics": [
      {
        "topic": "market-direction",
        "mentions": {
          "chat": 26,
          "streamer": 48
        },
        "sentiment": -0.035,
        "label": "neutral"
      },
      {
        "topic": "stream-meta",
        "mentions": {
          "chat": 21,
          "streamer": 27
        },
        "sentiment": 0.004,
        "label": "neutral"
      },
      {
        "topic": "size-and-pnl",
        "mentions": {
          "chat": 9,
          "streamer": 9
        },
        "sentiment": -0.206,
        "label": "bearish"
      }
    ],
    "produced_at": "2026-10-09T10:16:21-04:00",
    "sample": true,
    "note": "abbreviated sample — the paid route returns every coin, topic and guest"
  },
  "as_of": "2026-10-09T22:54:28.148Z",
  "data_age_seconds": 31212,
  "source": "sample",
  "disclaimer": "Derived, observation-grade data about public broadcasts. Not financial advice. No transcripts, no chat usernames.",
  "schema": "stream_api_v1"
}
PAID · $0.03

History — the last N streams

GET /v1/streams/{channel}/history?limit=20
REQUEST
curl -i "https://extra.watch/v1/streams/threadguy/history?limit=20"
FIRST ANSWER · UNPAID
HTTP/1.1 402 Payment Required
PAYMENT-REQUIRED: eyJ4NDAyVmVyc2lvbiI6MiwiYWNjZXB0cyI6W3sic2NoZW1lIjoiZXhhY3Qi…

# decoded — amount is in USDC base units (6 decimals): 30000 = $0.03
{
  "x402Version": 2,
  "accepts": [
    {
      "scheme": "exact",
      "network": "eip155:8453",
      "amount": "30000",
      "asset": "0x8335…2913",
      "payTo": "0x5382…36D4"
    }
  ]
}
STATIC SAMPLEnewest first, up to 30 — live from /v1/sample/history, cut to 2 summaries × 2 coins
{
  "data": {
    "schema": "stream_history_v1",
    "channel": "threadguy",
    "n": 2,
    "total_summaries": 17,
    "produced_at": "2026-10-09T17:47:11-0400",
    "sample": true,
    "note": "abbreviated sample — the paid route returns up to 30 full summaries",
    "summaries": [
      {
        "schema": "stream_summary_v1",
        "channel": "threadguy",
        "source": "twitch",
        "session": "2026-10-09T08-42-13",
        "started_at": "2026-10-09T08:42:17-04:00",
        "ended_at": "2026-10-09T10:04:44-04:00",
        "duration_s": 4947,
        "streamer": {
          "sentiment": {
            "score": 0.006,
            "label": "neutral",
            "n_lines": 905,
            "n_scored": 220
          }
        },
        "chat": {
          "sentiment": {
            "score": 0.112,
            "label": "bullish"
          },
          "n_messages": 1111,
          "n_users": 166,
          "messages_per_min": 13.47
        },
        "guests": {
          "method": "heuristic-v1",
          "guests": [
            {
              "name": "stock",
              "confidence": 0.54,
              "evidence": "introduced by streamer 2x; @mentioned in chat 0x"
            }
          ]
        },
        "coins": [
          {
            "symbol": "FTX",
            "chain": "bsc",
            "address": "0x87cc…7777",
            "mentions": {
              "chat": 4,
              "streamer": 7
            },
            "first_mention_at": "2026-10-09T08:46:26-04:00",
            "first_mention_by": "chat",
            "sentiment": 0,
            "price_at_summary": 4.88e-06
          },
          {
            "symbol": "DRV",
            "chain": "hyperliquid",
            "address": "0x0896…ef62",
            "mentions": {
              "chat": 4,
              "streamer": 2
            },
            "first_mention_at": "2026-10-09T09:31:59-04:00",
            "first_mention_by": "chat",
            "sentiment": 0.1,
            "price_at_summary": 0.5041
          }
        ],
        "topics": [
          {
            "topic": "market-direction",
            "mentions": {
              "chat": 26,
              "streamer": 48
            },
            "sentiment": -0.035,
            "label": "neutral"
          },
          {
            "topic": "stream-meta",
            "mentions": {
              "chat": 21,
              "streamer": 27
            },
            "sentiment": 0.004,
            "label": "neutral"
          }
        ],
        "produced_at": "2026-10-09T10:16:21-04:00",
        "sample": true,
        "note": "abbreviated sample — the paid route returns every coin, topic and guest"
      },
      {
        "schema": "stream_summary_v1",
        "channel": "threadguy",
        "source": "twitch",
        "session": "2026-10-08T08-46-31",
        "started_at": "2026-10-08T08:46:36-04:00",
        "ended_at": "2026-10-08T11:04:24-04:00",
        "duration_s": 8268,
        "streamer": {
          "sentiment": {
            "score": -0.051,
            "label": "neutral",
            "n_lines": 1214,
            "n_scored": 259
          }
        },
        "chat": {
          "sentiment": {
            "score": 0.094,
            "label": "bullish"
          },
          "n_messages": 2311,
          "n_users": 242,
          "messages_per_min": 16.77
        },
        "guests": {
          "method": "heuristic-v1",
          "guests": []
        },
        "coins": [
          {
            "symbol": "ZEC",
            "chain": "near",
            "address": "zec.omft.near",
            "mentions": {
              "chat": 8,
              "streamer": 0
            },
            "first_mention_at": "2026-10-08T09:20:10-04:00",
            "first_mention_by": "chat",
            "sentiment": 0.263,
            "price_at_summary": 1190.48
          },
          {
            "symbol": "ALGO",
            "chain": "algorand",
            "address": "0",
            "mentions": {
              "chat": 8,
              "streamer": 0
            },
            "first_mention_at": "2026-10-08T09:35:50-04:00",
            "first_mention_by": "chat",
            "sentiment": 0.037,
            "price_near_first_mention": 0.1217
          }
        ],
        "topics": [
          {
            "topic": "market-direction",
            "mentions": {
              "chat": 66,
              "streamer": 64
            },
            "sentiment": 0.045,
            "label": "neutral"
          },
          {
            "topic": "stream-meta",
            "mentions": {
              "chat": 41,
              "streamer": 38
            },
            "sentiment": 0.014,
            "label": "neutral"
          }
        ],
        "produced_at": "2026-10-08T19:49:05-04:00",
        "sample": true,
        "note": "abbreviated sample — the paid route returns every coin, topic and guest"
      }
    ]
  },
  "as_of": "2026-10-09T22:54:28.148Z",
  "data_age_seconds": 4162,
  "source": "sample",
  "disclaimer": "Derived, observation-grade data about public broadcasts. Not financial advice. No transcripts, no chat usernames.",
  "schema": "stream_api_v1"
}
PAID · $0.01

One specific stream

GET /v1/streams/{channel}/{session}

Session ids come from the catalogue or a history response.

REQUEST
curl -i https://extra.watch/v1/streams/threadguy/2026-10-08T08-46-31
FIRST ANSWER · UNPAID
HTTP/1.1 402 Payment Required
PAYMENT-REQUIRED: eyJ4NDAyVmVyc2lvbiI6MiwiYWNjZXB0cyI6W3sic2NoZW1lIjoiZXhhY3Qi…

# decoded
{
  "x402Version": 2,
  "accepts": [
    {
      "scheme": "exact",
      "network": "eip155:8453",
      "amount": "10000",
      "asset": "0x8335…2913",
      "payTo": "0x5382…36D4"
    }
  ]
}
STATIC SAMPLElive from /v1/sample/session, abbreviated
{
  "data": {
    "schema": "stream_summary_v1",
    "channel": "threadguy",
    "source": "twitch",
    "session": "2026-10-08T08-46-31",
    "started_at": "2026-10-08T08:46:36-04:00",
    "ended_at": "2026-10-08T11:04:24-04:00",
    "duration_s": 8268,
    "streamer": {
      "sentiment": {
        "score": -0.051,
        "label": "neutral",
        "n_lines": 1214,
        "n_scored": 259
      }
    },
    "chat": {
      "sentiment": {
        "score": 0.094,
        "label": "bullish"
      },
      "n_messages": 2311,
      "n_users": 242,
      "messages_per_min": 16.77
    },
    "guests": {
      "method": "heuristic-v1",
      "guests": []
    },
    "coins": [
      {
        "symbol": "ZEC",
        "chain": "near",
        "address": "zec.omft.near",
        "mentions": {
          "chat": 8,
          "streamer": 0
        },
        "first_mention_at": "2026-10-08T09:20:10-04:00",
        "first_mention_by": "chat",
        "sentiment": 0.263,
        "price_at_summary": 1190.48
      },
      {
        "symbol": "ALGO",
        "chain": "algorand",
        "address": "0",
        "mentions": {
          "chat": 8,
          "streamer": 0
        },
        "first_mention_at": "2026-10-08T09:35:50-04:00",
        "first_mention_by": "chat",
        "sentiment": 0.037,
        "price_near_first_mention": 0.1217
      },
      {
        "symbol": "PLTR",
        "chain": "robinhood",
        "address": "0x894E…4F2A",
        "mentions": {
          "chat": 5,
          "streamer": 0
        },
        "first_mention_at": "2026-10-08T09:00:32-04:00",
        "first_mention_by": "chat",
        "sentiment": -0.04,
        "price_at_summary": 198.48
      }
    ],
    "topics": [
      {
        "topic": "market-direction",
        "mentions": {
          "chat": 66,
          "streamer": 64
        },
        "sentiment": 0.045,
        "label": "neutral"
      },
      {
        "topic": "stream-meta",
        "mentions": {
          "chat": 41,
          "streamer": 38
        },
        "sentiment": 0.014,
        "label": "neutral"
      },
      {
        "topic": "ai-narrative",
        "mentions": {
          "chat": 27,
          "streamer": 39
        },
        "sentiment": -0.036,
        "label": "neutral"
      }
    ],
    "produced_at": "2026-10-08T19:49:05-04:00",
    "sample": true,
    "note": "abbreviated sample — the paid route returns every coin, topic and guest"
  },
  "as_of": "2026-10-09T22:54:28.148Z",
  "data_age_seconds": 83248,
  "source": "sample",
  "disclaimer": "Derived, observation-grade data about public broadcasts. Not financial advice. No transcripts, no chat usernames.",
  "schema": "stream_api_v1"
}

How to pay

USDC on Base (eip155:8453), x402 protocol v2. Any x402-aware client works — @x402/fetch is just the shortest example. The wallet needs a little USDC on Base. Bitcoin not accepted; it is here for the vibes.

  1. Pick a channel

    GET /v1/streams is free and lists every channel and session id.

  2. Call a paid path

    The first reply is 402. Your client reads PAYMENT-REQUIRED, signs the USDC transfer, retries.

  3. Keep the JSON

    200 with the envelope: data, as_of, data_age_seconds, source, schema.

CURL
# free catalogue — which channels, how many summaries
curl https://extra.watch/v1/streams

# paid path — 402 until an x402 client pays
curl -i https://extra.watch/v1/streams/threadguy/latest
JAVASCRIPT · @x402/fetch
import { wrapFetchWithPayment } from "@x402/fetch";
import { privateKeyToAccount } from "viem/accounts";
const account   = privateKeyToAccount(process.env.PRIVATE_KEY);
const fetchPaid = wrapFetchWithPayment(fetch, account);
const res = await fetchPaid("https://extra.watch/v1/streams/threadguy/latest");
console.log(await res.json());   // 402 → pay → 200, done for you

Endpoints & prices

EndpointPriceWhat you get
GET /v1/streamsFREEcatalogue: channels, last stream, how many summaries
GET /v1/streams/{channel}/latest$0.01the most recent finished stream's summary
GET /v1/streams/{channel}/history?limit=20$0.03the last N summaries, newest first (N ≤ 30)
GET /v1/streams/{channel}/{session}$0.01one specific stream by session id
GET /v1/sample/latest, /v1/sample/history, /v1/sample/sessionFREEabbreviated real responses for demos — 3 coins, 3 topics, sample: true
GET /v1/meta, /openapi.json, /healthFREEcontract, discovery, liveness

Prices are in USDC and are quoted in each 402; this table is filled from /v1/meta when reachable.

What's in a summary

Derived data only. There are no transcripts and no chat usernames in any response.