Skip to main content
GET
/
v1
/
topics
/
breakout
List Breakout Topics
curl --request GET \
  --url https://api.upriver.ai/v1/topics/breakout \
  --header 'X-API-Key: <api-key>'
import requests

url = "https://api.upriver.ai/v1/topics/breakout"

headers = {"X-API-Key": "<api-key>"}

response = requests.get(url, headers=headers)

print(response.text)
const options = {method: 'GET', headers: {'X-API-Key': '<api-key>'}};

fetch('https://api.upriver.ai/v1/topics/breakout', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));
<?php

$curl = curl_init();

curl_setopt_array($curl, [
CURLOPT_URL => "https://api.upriver.ai/v1/topics/breakout",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-API-Key: <api-key>"
],
]);

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}
package main

import (
"fmt"
"net/http"
"io"
)

func main() {

url := "https://api.upriver.ai/v1/topics/breakout"

req, _ := http.NewRequest("GET", url, nil)

req.Header.Add("X-API-Key", "<api-key>")

res, _ := http.DefaultClient.Do(req)

defer res.Body.Close()
body, _ := io.ReadAll(res.Body)

fmt.Println(string(body))

}
HttpResponse<String> response = Unirest.get("https://api.upriver.ai/v1/topics/breakout")
.header("X-API-Key", "<api-key>")
.asString();
require 'uri'
require 'net/http'

url = URI("https://api.upriver.ai/v1/topics/breakout")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)
request["X-API-Key"] = '<api-key>'

response = http.request(request)
puts response.read_body
{
  "total_count": 123,
  "surface_mode": "topic",
  "topics": [
    {
      "topic_id": "<string>",
      "topic_name": "<string>",
      "canonical_name": "<string>",
      "vertical": "<string>",
      "status": "<string>",
      "peak_score": 123,
      "discovered_at": "2023-11-07T05:31:56Z",
      "updated_at": "2023-11-07T05:31:56Z",
      "category": "<string>",
      "score": 123,
      "relevance_score": 123,
      "engagement": {
        "percentile_score": 123
      },
      "confidence_score": 123,
      "last_signal_at": "2023-11-07T05:31:56Z",
      "source_summary": {},
      "citations": [
        {
          "source_category": "<string>",
          "source_url": "<string>",
          "title": "<string>",
          "display": "",
          "snippet": "<string>",
          "source_authority": 123,
          "engagement_score": 123,
          "published_at": "2023-11-07T05:31:56Z"
        }
      ],
      "entities": [
        {
          "canonical_name": "<string>",
          "entity_type": "<string>",
          "confidence": 123,
          "entity_id": "<string>",
          "entity_subtype": "<string>"
        }
      ],
      "trend": {
        "momentum": 1
      },
      "citation_rate": [
        {
          "day": "<string>",
          "count": 123
        }
      ],
      "narrative": {
        "narrative_id": "<string>",
        "display_name": "<string>",
        "member_count": 123,
        "arc_summary": [
          "<string>"
        ]
      },
      "event_start_at": "2023-11-07T05:31:56Z",
      "event_end_at": "2023-11-07T05:31:56Z"
    }
  ],
  "stories": [
    {
      "seed_topic": {
        "topic_id": "<string>",
        "topic_name": "<string>",
        "canonical_name": "<string>",
        "vertical": "<string>",
        "status": "<string>",
        "peak_score": 123,
        "discovered_at": "2023-11-07T05:31:56Z",
        "updated_at": "2023-11-07T05:31:56Z",
        "category": "<string>",
        "score": 123,
        "relevance_score": 123,
        "engagement": {
          "percentile_score": 123
        },
        "confidence_score": 123,
        "last_signal_at": "2023-11-07T05:31:56Z",
        "source_summary": {},
        "citations": [
          {
            "source_category": "<string>",
            "source_url": "<string>",
            "title": "<string>",
            "display": "",
            "snippet": "<string>",
            "source_authority": 123,
            "engagement_score": 123,
            "published_at": "2023-11-07T05:31:56Z"
          }
        ],
        "entities": [
          {
            "canonical_name": "<string>",
            "entity_type": "<string>",
            "confidence": 123,
            "entity_id": "<string>",
            "entity_subtype": "<string>"
          }
        ],
        "trend": {
          "momentum": 1
        },
        "citation_rate": [
          {
            "day": "<string>",
            "count": 123
          }
        ],
        "narrative": {
          "narrative_id": "<string>",
          "display_name": "<string>",
          "member_count": 123,
          "arc_summary": [
            "<string>"
          ]
        },
        "event_start_at": "2023-11-07T05:31:56Z",
        "event_end_at": "2023-11-07T05:31:56Z"
      },
      "surface": {
        "story_id": "<string>",
        "member_topic_ids": [
          "<string>"
        ],
        "display_name": "<string>",
        "story_score": 123,
        "member_count": 123,
        "lead_topic_id": "<string>",
        "description": "<string>",
        "latest_signal_at": "2023-11-07T05:31:56Z",
        "coherence_score": 123,
        "projection_refreshed_at": "2023-11-07T05:31:56Z"
      },
      "member_topics": [
        {
          "topic_id": "<string>",
          "topic_name": "<string>",
          "canonical_name": "<string>",
          "vertical": "<string>",
          "status": "<string>",
          "peak_score": 123,
          "discovered_at": "2023-11-07T05:31:56Z",
          "updated_at": "2023-11-07T05:31:56Z",
          "category": "<string>",
          "score": 123,
          "relevance_score": 123,
          "engagement": {
            "percentile_score": 123
          },
          "confidence_score": 123,
          "last_signal_at": "2023-11-07T05:31:56Z",
          "source_summary": {},
          "citations": [
            {
              "source_category": "<string>",
              "source_url": "<string>",
              "title": "<string>",
              "display": "",
              "snippet": "<string>",
              "source_authority": 123,
              "engagement_score": 123,
              "published_at": "2023-11-07T05:31:56Z"
            }
          ],
          "entities": [
            {
              "canonical_name": "<string>",
              "entity_type": "<string>",
              "confidence": 123,
              "entity_id": "<string>",
              "entity_subtype": "<string>"
            }
          ],
          "trend": {
            "momentum": 1
          },
          "citation_rate": [
            {
              "day": "<string>",
              "count": 123
            }
          ],
          "narrative": {
            "narrative_id": "<string>",
            "display_name": "<string>",
            "member_count": 123,
            "arc_summary": [
              "<string>"
            ]
          },
          "event_start_at": "2023-11-07T05:31:56Z",
          "event_end_at": "2023-11-07T05:31:56Z"
        }
      ],
      "search_match": {
        "matched_topic_count": 123,
        "matched_topic_ids": [
          "<string>"
        ],
        "match_sources": [
          "<string>"
        ]
      }
    }
  ],
  "source_topic_count": 123,
  "returned_story_count": 123,
  "next_cursor": "<string>"
}
{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>"
}
]
}

Authorizations

X-API-Key
string
header
required

Query Parameters

vertical
string | null

Filter by vertical: 'sports', 'tech', or 'politics'

category
string | null

Filter by category within the sports vertical (topic mode only), e.g. 'nba' or 'nfl'

status
enum<string>
default:active

Filter by topic status. Options: 'active' (default), 'detected', 'emerging', 'trending', 'declining', or 'all'.

Available options:
active,
all,
detected,
emerging,
trending,
declining
temporal_status
enum<string> | null

Filter to topics about an event with this timing relative to now: 'upcoming' (not yet started), 'ongoing' (in progress), or 'past'. Only topics tied to a scheduled event have a timing, so this narrows results to them. Filter a topic by its request-time event temporal status.

Only topics linked to a scheduled event carry a temporal status, so filtering by any of these values implicitly restricts results to event-linked topics.

Available options:
upcoming,
ongoing,
past
min_importance
number | null
limit
integer
default:20

Maximum number of results. Requesting more than 20 results requires a credits-based plan.

Required range: 1 <= x <= 100
cursor
string | null
include
enum<string>[]

Optional expansions to include in the response. Allowed values: citations, entities. Example: include=citations&include=entities

Available options:
citations,
entities
citation_sources
enum<string>[] | null

Restrict returned citations to these source categories (news, reddit, twitter). Omit for all sources. Only applies when surface_mode=topic.

Citation source categories usable as a citation filter.

A subset of the source_category values that appear on returned citations — the categories worth filtering on. Other categories (web, tiktok, trends) can still appear on citations but are not offered as filter values.

Available options:
news,
reddit,
twitter
sort_by
string
default:recommended

Ranking mode: 'recommended' (default, balanced), 'rising' (gaining fastest), 'top' (highest absolute volume), or 'newest' (most recently appeared). Legacy aliases (relevance, importance, hot, blended, momentum, emerging, recent, new) are accepted.

discovered_within_hours
integer | null

Keep only topics first seen within this many hours (the 'brand new' filter). Combine with any sort. Omit for no limit.

Required range: 1 <= x <= 8760
surface_mode
enum<string>
default:topic

List raw topics or deduped derived story surfaces

Available options:
topic,
story

Response

Successful Response

Response for listing breakout topics.

total_count
integer
required

Total matching rows for the current list mode. When surface_mode=story, this counts exact-deduped projected story surfaces before list-level overlap suppression and pagination.

surface_mode
enum<string>
default:topic

Whether the list contains raw topics or derived story surfaces

Available options:
topic,
story
topics
BreakoutTopicResponse · object[]

List of topics when surface_mode=topic

stories
TopicStoryViewResponse · object[]

Derived story surfaces when surface_mode=story

story_source
enum<string> | null

Actual story list source when surface_mode=story. 'projection' means cached group membership with live ranking, 'live' means request-time seed expansion.

Available options:
auto,
live,
projection
source_topic_count
integer | null

Raw source-topic seed count behind story mode before exact projection dedupe. This helps distinguish story-surface volume from the broader seed pool used to build them.

returned_story_count
integer | null

Number of returned story surfaces when surface_mode=story

next_cursor
string | null

Cursor for next page, if more results