Exploring Next API

A read-only HTTP API for Exploring Next episodes: metadata, audio, scripts, and transcripts. There is also an iframe player you can embed on any site. No account or API key is required.

no auth CORS enabled 120 req/min versioned (v1)

Quick start

GET the most recent episode
curl -H "Authorization: Bearer $EXPLORING_API_KEY" "https://ingest.sandrise.io/v1/episodes?limit=1"

Example response (captured at build time). Press Run it to fetch it live from your browser.

{
  "episodes": [
    {
      "id": "edf11f68-7008-4c74-928c-f9c98ead6522",
      "episodeNumber": 1002,
      "title": "Model Behavior: Week of September 21, 2026",
      "summary": "We read this week as the frontier splitting around agent execution: the winning move is less about one model leap and more about who controls the place where long-running work actually happens. The complication is that OpenAI, Anthropic, Google, DeepSeek, and the open-weight challengers are still making the parts better, cheaper, or sharper, so the stack is not replacing models so much as turning them into swappable pieces.",
      "publishedAt": "2026-09-23T00:05:41.905+00:00",
      "durationSeconds": 739,
      "hosts": {
        "a": "Masonry",
        "b": "Eyre"
      },
      "topics": {
        "domains": [
          "agents",
          "new-models"
        ],
        "concepts": [
          "agentic-loops",
          "tool-use-and-function-calling",
          "state-management-in-language-models",
          "durable-execution",
          "model-routing",
          "retry-loops-and-error-recovery",
          "context-window-management",
          "token-economics"
        ],
        "entities": [
          "openai",
          "anthropic",
          "google"
        ]
      },
      "links": {
        "self": "https://ingest.sandrise.io/v1/episodes/1002",
        "audio": "https://ingest.sandrise.io/v1/episodes/1002/audio",
        "script": "https://ingest.sandrise.io/v1/episodes/1002/script",
        "transcript": "https://ingest.sandrise.io/v1/episodes/1002/transcript",
        "page": "https://sandrise.io/exploring-next/1002",
        "embed": "https://sandrise.io/exploring-next/embed/1002",
        "oembed": "https://sandrise.io/exploring-next/oembed?url=https%3A%2F%2Fsandrise.io%2Fexploring-next%2F1002"
      }
    }
  ],
  "pagination": {
    "nextCursor": "eyJkIjoiMjAyNi0wNy0…",
    "limit": 1
  }
}

Conventions

Base URL
https://ingest.sandrise.io/v1. The discovery document lists every endpoint.
Auth
Most routes need a free API key — see Authentication. Everything is read-only (GET/HEAD only).
CORS
Access-Control-Allow-Origin: *, so it can be called directly from browser code.
Rate limits
120 requests/min per IP for metadata, 30/min for audio. A 429 response includes Retry-After.
Caching
Responses include an ETag. Send If-None-Match and unchanged resources return 304 Not Modified.
IDs
An episode's UUID and its episode number are interchangeable wherever an episode is referenced.

Authentication

Episode metadata, scripts, and transcripts require a free API key. Audio streaming, the discovery document, the OpenAPI spec, the embed widget, and oEmbed do not. Send the key as Authorization: Bearer <key> (or an X-API-Key header). The "Run it" buttons on this page go through a rate-limited demo proxy, so you can try everything without one.

To get a key, email Nick with a line about what you're building. Keys are free; the usage terms still apply.

Endpoints

GET /v1/episodes

List episodes. Published episodes, newest first. Keyset-paginated — follow pagination.nextCursor until it returns null. Requires an API key.

Query parameters for /v1/episodes
limit1–50 · default 20
cursoropaque, from pagination.nextCursor
domaintopic facet slug, e.g. agents
sinceISO 8601 date — only newer episodes
curl -H "Authorization: Bearer $EXPLORING_API_KEY" "https://ingest.sandrise.io/v1/episodes?limit=5"

GET /v1/episodes/{idOrNumber}

Get one episode. Accepts a UUID or an episode number — /v1/episodes/1002 works. The links object contains the URLs for the audio, script, transcript, episode page, and embed. Requires an API key.

curl -H "Authorization: Bearer $EXPLORING_API_KEY" "https://ingest.sandrise.io/v1/episodes/1002"

GET /v1/episodes/{idOrNumber}/audio

Get the audio. Returns the episode MP3. Supports HTTP Range requests, so players can seek. Add ?download=1 to get a Content-Disposition: attachment response with a descriptive filename. No API key needed.

Query parameters for /v1/episodes/{idOrNumber}/audio
downloadset to 1 to force a download
curl -L -o episode.mp3 "https://ingest.sandrise.io/v1/episodes/1002/audio?download=1"

GET /v1/episodes/{idOrNumber}/script

Get the script. Returns the dialogue as speaker-labeled segments with stage directions removed, plus chapters with per-chapter summaries and takeaways. Requires an API key.

curl -H "Authorization: Bearer $EXPLORING_API_KEY" "https://ingest.sandrise.io/v1/episodes/1002/script"

Trimmed here for length. Run it to see every segment.

{
  "id": "edf11f68-7008-4c74-928c-f9c98ead6522",
  "episodeNumber": 1002,
  "title": "Model Behavior: Week of September 21, 2026",
  "hosts": {
    "a": "Masonry",
    "b": "Eyre"
  },
  "chapters": [
    {
      "title": "The agent layer eats the launch cycle",
      "summary": "Masonry and Eyre frame the week around OpenAI's Agents API and the broader move from model selling to managed execution.",
      "takeaways": [
        "OpenAI's Agents API is a shift toward cloud agent infrastructure, not just another model surface.",
        "The competitive unit is becoming the harness that manages context, tools, long-running work, and model choice.",
        "Raw capability still matters, but it is increasingly judged by how well it plugs into execution."
      ]
    },
    "… more chapters"
  ],
  "segments": [
    {
      "speaker": "Masonry",
      "text": "The move that tells on the whole week is OpenAI's Agents API, because it makes the quiet part loud: the frontier race is not just whose model scores higher. It is who owns the execution layer where the model becomes a worker. Eyre, I know your eyebrow is already doing the benchmark-skeptic thing, but this is the board shifting."
    },
    {
      "speaker": "Eyre",
      "text": "Yeah, and I mostly buy that, which is annoying for my brand. OpenAI is not merely saying, use GPT-6 Astra, or Sol, or Luna in your app. The pitch is, let us run the cloud agent with the Codex harness, context handling, tool use, and long-running state managed for you. That turns the model into one replaceable component inside a larger machine."
    },
    "… 39 more segments"
  ]
}

GET /v1/episodes/{idOrNumber}/transcript

Get the transcript. Returns the transcript as text/plain, one line per spoken turn. Requires an API key.

curl -H "Authorization: Bearer $EXPLORING_API_KEY" "https://ingest.sandrise.io/v1/episodes/1002/transcript"

Pagination

The list endpoint uses cursor pagination, so results stay consistent as new episodes publish. To page through the full archive:

  1. Request /v1/episodes?limit=50.
  2. Read pagination.nextCursor from the response, then request /v1/episodes?limit=50&cursor=<that>.
  3. Repeat until nextCursor is null.

Cursors are opaque — pass them back unchanged rather than parsing them.

Errors

All errors use the same JSON envelope. Match on error.code:

{
  "error": {
    "code": "not_found",
    "message": "Episode not found.",
    "status": 404
  }
}
Error codes
not_foundno such episode, or its audio is not yet published (404)
invalid_episode_ref, invalid_cursor, invalid_limitmalformed input; the response says which (400)
script_unavailable, script_unparseablethe episode has no usable script (uncommon; older episodes)
rate_limitedtoo many requests; retry after Retry-After seconds (429)

Embed the player

A self-contained iframe player for embedding on other sites. It plays the audio, seeks, changes speed, and offers a download. It sets no cookies, uses no storage, and loads no third-party scripts. Each player includes a "Listen on Exploring Next" link back to the episode page.

Live demo
<iframe src="https://sandrise.io/exploring-next/embed/latest"
  width="100%" height="180"
  style="max-width:640px;border:0;border-radius:12px;overflow:hidden"
  title="Exploring Next audio player"
  loading="lazy" allow="autoplay"></iframe>
Embed options
/embed/latestthe most recent episode; updates as new episodes publish
/embed/{number}a specific episode, by number or UUID (e.g. /embed/1002)
?theme=darkdark palette; the default is the light theme above
?accent=RRGGBBaccent color as 6-digit hex, without the #
sizeheight is fixed at 180; width is fluid down to 250px
keyboardSpace/K play–pause, / seek ±5s

The player posts playback events to the parent page via postMessage, as { source: "exploring-next-embed", event, id, episodeNumber }, where event is one of ready, play, pause, or ended.

oEmbed

Platforms that support oEmbed (for example WordPress and Ghost) embed the player automatically when an episode URL is pasted. Episode pages declare the endpoint in their <head>. You can also call it directly:

curl "https://sandrise.io/exploring-next/oembed?url=https://sandrise.io/exploring-next/1002"

Machine-readable formats

Other representations of the same data:

OpenAPI 3.1
https://ingest.sandrise.io/v1/openapi.json — the full spec, for import into a client generator or API tool.
llms.txt
https://sandrise.io/llms.txt — a plain-text index of the machine-readable surfaces on this site.
MCP server
https://mcp.sandrise.io — list, search, and fetch episodes (including transcripts and structured scripts) over the Model Context Protocol. Streamable HTTP at /mcp.
RSS
https://sandrise.io/exploring-next/rss.xml — podcast feed (iTunes/Spotify-compatible) with audio enclosures.

Usage & attribution

This API is free and open — no keys, no signup. In return, a few terms apply to keep it that way:

  • Attribute it. When you show or quote an episode, credit Exploring Next and link back to the episode page (sandrise.io/exploring-next/…). The embed player and oEmbed responses already include the link.
  • Don't re-host the archive. Building on top of the API is welcome; scraping the full catalog to republish it as your own feed, app, or dataset is not.
  • Respect the rate limits. 120 requests/min for metadata, 30/min for audio, per IP. They're generous for real use; sustained bulk extraction will be throttled.
  • It can change. Content is generated and occasionally corrected or removed. Cache reasonably, but treat the API — not your copy — as the source of truth.

Questions, higher limits, or a partnership? Get in touch. The same terms are advertised on every API response as a Link: …; rel="license" header.

Versioning

v1 is additive-only: new fields may be added over time, but existing fields are not removed or renamed, and existing URLs do not change. If a v2 is ever introduced, v1 will continue to work.