diff --git a/content/de/api-reference/odds-best.mdx b/content/de/api-reference/odds-best.mdx
index 9f39f3d..23475a1 100644
--- a/content/de/api-reference/odds-best.mdx
+++ b/content/de/api-reference/odds-best.mdx
@@ -38,6 +38,10 @@ Best Odds ist in allen Tarifen verfügbar, einschließlich Free. Die verglichene
Veraltete Quoten (älter als 5 Minuten für Pre-Game, 1 Minute für Live) werden automatisch von Best-Odds-Vergleichen ausgeschlossen, um irreführende Ergebnisse zu vermeiden.
+
+**`is_main_line` vs. `market=main`.** `is_main_line` wird pro `(event, market_type, selection)`-Kohorte ausgewertet: Es markiert die Hauptlinie *innerhalb der eigenen Linienstaffel jedes Markts*. Perioden- und Prop-Märkte liefern daher zu Recht Zeilen mit `is_main_line=true` (z. B. die Konsens-Halbzeit-Gesamtlinie); `?is_main_line=true` ist somit **kein** Filter, der nur die Hauptlinien des gesamten Spiels liefert. Um die Ergebnisse auf die **Hauptlinien des gesamten Spiels** zu beschränken (Moneyline, Spiel-Handicap, Spiel-Gesamtlinie), verwende stattdessen den Kategorie-Alias [`?market=main`](/de/api-reference/odds/#market-category-aliases), optional kombiniert mit `?is_main_line=true`, um zusätzlich die Alt-Linien innerhalb dieser Märkte auszuschließen.
+
+
## Beispielanfragen
diff --git a/content/de/api-reference/stream.mdx b/content/de/api-reference/stream.mdx
index 8a0bd35..9d9925d 100644
--- a/content/de/api-reference/stream.mdx
+++ b/content/de/api-reference/stream.mdx
@@ -29,7 +29,7 @@ https://api.sharpapi.io/api/v1/stream?api_key=sk_live_your_key
| Parameter | Typ | Standard | Beschreibung |
|-----------|------|---------|-------------|
-| `channel` | string | `opportunities` | Was gestreamt werden soll: `odds`, `opportunities`, `gamestate` (nur Enterprise) oder `all` |
+| `channel` | string | `opportunities` | Was gestreamt werden soll: `odds`, `opportunities`, `gamestate` (nur Enterprise) oder `all`. Akzeptiert auch den Plural-Alias `channels`. Eine kommagetrennte Liste mit mehr als einem Kanal wird auf `all` reduziert — siehe Hinweis unten. |
| `sport` | string | alle | Filter nach Sportart(en), kommagetrennt (z. B. `basketball`, `football`, `ice_hockey`) |
| `sportsbook` | string | tariferlaubt | Filter nach Sportsbook(s), kommagetrennt |
| `league` | string | alle | Filter nach Liga(en), kommagetrennt |
@@ -49,6 +49,10 @@ https://api.sharpapi.io/api/v1/stream?api_key=sk_live_your_key
| `gamestate` | `gamestate:snapshot`, `gamestate:update`, `gamestate:removed`, `heartbeat` | Live-Spielstände, Perioden, Uhren und situative Daten pro Event. **Nur Enterprise-Tarif.** Siehe [Live Game State](/api-reference/gamestate/) für den vollständigen Feldkatalog. |
| `all` | Alle Event-Typen | Vollständiges Echtzeitbild |
+
+**Ein Abonnement pro SSE-Stream.** Aus Gründen der Parität mit der WebSocket-API akzeptiert der Endpoint sowohl `channel` als auch den Plural `channels`, und beide tolerieren einen kommagetrennten Wert. Eine SSE-Verbindung trägt jedoch ein **einziges** Abonnement: Wenn du mehr als einen gültigen Kanal übergibst (z. B. `?channels=odds,opportunities`), wird die Anfrage **auf `channel=all` reduziert**, statt einen Fehler zurückzugeben. Ein einzelner Wert (`?channel=odds`) streamt nur diesen Kanal. Um gezielt eine bestimmte *Teilmenge* von Kanälen zu abonnieren, verwende die [WebSocket-API](/streaming/websocket/), die echtes Multi-Channel-Filtern via `channels=` über eine einzige Verbindung unterstützt.
+
+
### Komfort-Routen
| Route | Entspricht |
diff --git a/content/de/concepts/live-vs-prematch.mdx b/content/de/concepts/live-vs-prematch.mdx
index 5dbfe68..e58502f 100644
--- a/content/de/concepts/live-vs-prematch.mdx
+++ b/content/de/concepts/live-vs-prematch.mdx
@@ -120,7 +120,7 @@ Wenn ein DK- oder FD-Markt ausgesetzt ist, verschwindet er einfach aus der API
| Pinnacle | Ja | Ausgezeichnet — tief, schnell, setzt selten aus | Sharp |
| Bookmaker | Ja | Ausgezeichnet — breites Marktangebot, global | Sharp |
| Circa Sports | Ja | Gut — Sharp-US-Buchmacher, fokussiertes Angebot | Sharp |
-| Bet365 | Ja | Gut — großes internationales Angebot | Pro |
+| Bet365 | Ja | Gut — großes internationales Angebot | Hobby |
| BetMGM | Ja | Mittelmäßig — regelmäßige Aussetzungen | Hobby |
| Caesars | Ja | Mittelmäßig — regelmäßige Aussetzungen | Hobby |
| DraftKings | Ja | Begrenzt — häufige Aussetzungen, dünnes Angebot | Free |
diff --git a/content/en/api-reference/odds-best.mdx b/content/en/api-reference/odds-best.mdx
index e86f54b..60e405b 100644
--- a/content/en/api-reference/odds-best.mdx
+++ b/content/en/api-reference/odds-best.mdx
@@ -29,7 +29,7 @@ Best Odds is available on all tiers, including Free. The sportsbooks compared de
| `market` | string | all | Filter by market type(s), comma-separated (e.g., `moneyline`, `spread`, `total`). Supports category aliases — see [Odds: Market Category Aliases](/en/api-reference/odds/#market-category-aliases). |
| `event` | string | — | Filter by event ID(s), comma-separated |
| `live` | boolean | — | `true` = live only, `false` = prematch only, omit = both |
-| `is_main_line` | boolean | — | `true` = main-line entries only (consensus line for each `(event, market, selection)` cohort plus no-line markets like moneyline); `false` = alt-line entries only; omit = both. See the `is_main_line` response field below for the cohort semantics. |
+| `is_main_line` | boolean | — | `true` = main-line entries only (consensus line for each `(event, market, selection)` cohort plus no-line markets like moneyline); `false` = alt-line entries only; omit = both. This is scoped **per market**, so period/prop markets keep their own main line — for full-game lines only, use `?market=main` (see note below). See the `is_main_line` response field below for the cohort semantics. |
| `min_odds` | number | — | Minimum American odds filter |
| `max_odds` | number | — | Maximum American odds filter |
| `limit` | integer | 50 | Max results per page (max 200) |
@@ -39,6 +39,10 @@ Best Odds is available on all tiers, including Free. The sportsbooks compared de
Stale odds (older than 5 minutes for pre-game, 1 minute for live) are automatically excluded from best-odds comparisons to prevent misleading results.
+
+**`is_main_line` vs `market=main`.** `is_main_line` is evaluated per `(event, market_type, selection)` cohort — it marks the main line *within each market's own ladder*. Period and player-prop markets therefore legitimately return `is_main_line=true` rows (e.g. the consensus first-half total), so `?is_main_line=true` is **not** a "main game lines only" filter. To restrict results to **full-game core lines** (moneyline, full-game spread, full-game total), use the [`?market=main`](/en/api-reference/odds/#market-category-aliases) category alias instead — optionally combined with `?is_main_line=true` to also drop alt lines within those markets.
+
+
## Example Requests
diff --git a/content/en/api-reference/stream.mdx b/content/en/api-reference/stream.mdx
index 224d96e..912a2c3 100644
--- a/content/en/api-reference/stream.mdx
+++ b/content/en/api-reference/stream.mdx
@@ -29,7 +29,7 @@ https://api.sharpapi.io/api/v1/stream?api_key=sk_live_your_key
| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
-| `channel` | string | `opportunities` | What to stream: `odds`, `opportunities`, `gamestate` (Enterprise only), or `all` |
+| `channel` | string | `opportunities` | What to stream: `odds`, `opportunities`, `gamestate` (Enterprise only), or `all`. Also accepts the plural alias `channels`. A comma-separated list of more than one channel collapses to `all` — see the note below. |
| `sport` | string | all | Filter by sport(s), comma-separated (e.g. `basketball`, `football`, `ice_hockey`) |
| `sportsbook` | string | tier-allowed | Filter by sportsbook(s), comma-separated |
| `league` | string | all | Filter by league(s), comma-separated |
@@ -49,6 +49,10 @@ https://api.sharpapi.io/api/v1/stream?api_key=sk_live_your_key
| `gamestate` | `gamestate:snapshot`, `gamestate:update`, `gamestate:removed`, `heartbeat` | Live scores, periods, clocks, and situational data per event. **Enterprise tier only.** See [Live Game State](/api-reference/gamestate/) for the full field catalog. |
| `all` | All event types | Full real-time picture |
+
+**One subscription per SSE stream.** For parity with the WebSocket API, the endpoint accepts both `channel` and the plural `channels`, and either one tolerates a comma-separated value. But an SSE connection carries a **single** subscription: if you pass more than one valid channel (e.g. `?channels=odds,opportunities`), the request **collapses to `channel=all`** instead of returning an error. A single value (`?channel=odds`) streams just that channel. To subscribe to a specific *subset* of channels selectively, use the [WebSocket API](/streaming/websocket/), which supports true multi-channel `channels=` filtering on one connection.
+
+
### Convenience Routes
| Route | Equivalent To |
diff --git a/content/en/concepts/event-matching.mdx b/content/en/concepts/event-matching.mdx
index fb8eb55..405ae90 100644
--- a/content/en/concepts/event-matching.mdx
+++ b/content/en/concepts/event-matching.mdx
@@ -89,6 +89,32 @@ Without the bucket, both fixtures would collide on one ID and odds would be mixe
**What this means for cross-book matching.** Inside one fixture, every book that reports a start time within the same 6-hour window converges on the same `_b{N}`. Across a bucket boundary — for example, one book stamps a soccer kick-off at 17:55 UTC (`_b2`) and another at 18:10 UTC (`_b3`) — books can fragment across two canonical IDs. This is a known limitation. If you observe this, file a ticket with the event details.
+### Doubleheader suffix (`_g{N}`)
+
+When one book reports both games of a same-day doubleheader in a single update, the two fixtures are disambiguated with a trailing `_g{N}` suffix placed *after* the bucket — e.g. `mlb_athletics_mariners_2026-05-02_b0` and `mlb_athletics_mariners_2026-05-02_b0_g1`. Books that see only one of the two games emit the bare bucketed ID. The residual cross-book mismatch for doubleheaders is therefore: same `_b{N}` base, one side carrying a `_g{N}` suffix and the other not.
+
+### Grouping one matchup across IDs
+
+To collapse the rows that belong to a single physical fixture but landed on different canonical IDs, pick the level that matches your tolerance for merging:
+
+1. **Same-fixture collapse (recommended).** Strip a trailing `_g{N}` suffix and compare the remainder, keeping the `_b{N}` bucket intact:
+
+ ```
+ key = event_id with a trailing _g{N} removed # ..._b0_g1 → ..._b0
+ group events whose stripped key is identical
+ ```
+
+ This reunites the doubleheader-suffix mismatch above without merging distinct games. It mirrors the server-side same-event predicate.
+
+2. **Loose matchup grouping (display).** To gather *every* price for a matchup on a date regardless of bucket — e.g. to render one card per game in a UI and absorb the cross-bucket-boundary fragmentation described above — strip **both** the `_g{N}` and `_b{N}` suffixes and group by `{league}_{teamA}_{teamB}_{date}`, tolerating ±1 day for starts that cross UTC midnight:
+
+ ```
+ key = "{league}_{teamA}_{teamB}_{date}" # teams are already alpha-sorted; _b{N}/_g{N} dropped
+ group keys that share league + teams and whose dates are within 1 day of each other
+ ```
+
+ **Tradeoff:** because this discards the bucket, a genuine same-day doubleheader collapses into one group. Use level 1 when the two games must stay apart.
+
## Live vs Pre-Match Share The Same Event ID
A given fixture has **one canonical event ID** that covers both pre-match and live (in-play) odds. The `is_live` field on each odds row tells you which state the price was collected in:
diff --git a/content/en/concepts/live-vs-prematch.mdx b/content/en/concepts/live-vs-prematch.mdx
index c7bcb7a..66b7c9c 100644
--- a/content/en/concepts/live-vs-prematch.mdx
+++ b/content/en/concepts/live-vs-prematch.mdx
@@ -120,7 +120,7 @@ When a DK or FD market is suspended, it simply disappears from the API — there
| Pinnacle | Yes | Excellent — deep, fast, rarely suspends | Sharp |
| Bookmaker | Yes | Excellent — wide market menu, global | Sharp |
| Circa Sports | Yes | Good — sharp US book, focused menu | Sharp |
-| Bet365 | Yes | Good — large international menu | Pro |
+| Bet365 | Yes | Good — large international menu | Hobby |
| BetMGM | Yes | Moderate — regular suspensions | Hobby |
| Caesars | Yes | Moderate — regular suspensions | Hobby |
| DraftKings | Yes | Limited — frequent suspensions, thin menu | Free |
diff --git a/content/es/api-reference/odds-best.mdx b/content/es/api-reference/odds-best.mdx
index e3baa47..da4f127 100644
--- a/content/es/api-reference/odds-best.mdx
+++ b/content/es/api-reference/odds-best.mdx
@@ -38,6 +38,10 @@ Best Odds está disponible en todos los planes, incluido el Free. Las casas de a
Las cuotas obsoletas (con más de 5 minutos para prepartido, 1 minuto para en vivo) se excluyen automáticamente de las comparaciones de mejores cuotas para evitar resultados engañosos.
+
+**`is_main_line` frente a `market=main`.** `is_main_line` se evalúa por cohorte `(event, market_type, selection)`: marca la línea principal *dentro del propio escalado de cada mercado*. Por eso los mercados de periodo y de props devuelven legítimamente filas con `is_main_line=true` (p. ej. el total consensuado de la primera mitad), de modo que `?is_main_line=true` **no** es un filtro de "solo líneas principales del partido completo". Para limitar los resultados a las **líneas principales del partido completo** (moneyline, hándicap de partido completo, total de partido completo), usa el alias de categoría [`?market=main`](/es/api-reference/odds/#market-category-aliases), opcionalmente combinado con `?is_main_line=true` para descartar además las líneas alternativas dentro de esos mercados.
+
+
## Ejemplos de Solicitudes
diff --git a/content/es/api-reference/stream.mdx b/content/es/api-reference/stream.mdx
index 7f21b79..31def26 100644
--- a/content/es/api-reference/stream.mdx
+++ b/content/es/api-reference/stream.mdx
@@ -29,7 +29,7 @@ https://api.sharpapi.io/api/v1/stream?api_key=sk_live_your_key
| Parámetro | Tipo | Predeterminado | Descripción |
|-----------|------|----------------|-------------|
-| `channel` | string | `opportunities` | Qué transmitir: `odds`, `opportunities`, `gamestate` (solo Enterprise) o `all` |
+| `channel` | string | `opportunities` | Qué transmitir: `odds`, `opportunities`, `gamestate` (solo Enterprise) o `all`. También acepta el alias plural `channels`. Una lista separada por comas con más de un canal colapsa a `all` — consulta la nota a continuación. |
| `sport` | string | todos | Filtrar por deporte(s), separados por comas (p. ej. `basketball`, `football`, `ice_hockey`) |
| `sportsbook` | string | permitidos por el plan | Filtrar por sportsbook(s), separados por comas |
| `league` | string | todas | Filtrar por liga(s), separadas por comas |
@@ -49,6 +49,10 @@ https://api.sharpapi.io/api/v1/stream?api_key=sk_live_your_key
| `gamestate` | `gamestate:snapshot`, `gamestate:update`, `gamestate:removed`, `heartbeat` | Marcadores en vivo, periodos, relojes y datos situacionales por evento. **Solo plan Enterprise.** Consulta [Estado del juego en vivo](/api-reference/gamestate/) para el catálogo completo de campos. |
| `all` | Todos los tipos de eventos | Imagen completa en tiempo real |
+
+**Una suscripción por stream SSE.** Por paridad con la API WebSocket, el endpoint acepta tanto `channel` como el plural `channels`, y ambos toleran un valor separado por comas. Pero una conexión SSE mantiene una **única** suscripción: si pasas más de un canal válido (p. ej. `?channels=odds,opportunities`), la solicitud **colapsa a `channel=all`** en lugar de devolver un error. Un único valor (`?channel=odds`) transmite solo ese canal. Para suscribirte de forma selectiva a un *subconjunto* concreto de canales, usa la [API WebSocket](/streaming/websocket/), que admite el filtrado multicanal real con `channels=` en una sola conexión.
+
+
### Rutas de conveniencia
| Ruta | Equivalente a |
diff --git a/content/es/concepts/live-vs-prematch.mdx b/content/es/concepts/live-vs-prematch.mdx
index 6bdbfe1..48601e2 100644
--- a/content/es/concepts/live-vs-prematch.mdx
+++ b/content/es/concepts/live-vs-prematch.mdx
@@ -120,7 +120,7 @@ Cuando un mercado de DK o FD está suspendido, simplemente desaparece de la API:
| Pinnacle | Sí | Excelente: profundo, rápido, rara vez suspende | Sharp |
| Bookmaker | Sí | Excelente: amplio menú de mercados, global | Sharp |
| Circa Sports | Sí | Bueno: casa profesional estadounidense, menú enfocado | Sharp |
-| Bet365 | Sí | Bueno: amplio menú internacional | Pro |
+| Bet365 | Sí | Bueno: amplio menú internacional | Hobby |
| BetMGM | Sí | Moderado: suspensiones regulares | Hobby |
| Caesars | Sí | Moderado: suspensiones regulares | Hobby |
| DraftKings | Sí | Limitado: suspensiones frecuentes, menú reducido | Free |
diff --git a/content/pt-BR/api-reference/odds-best.mdx b/content/pt-BR/api-reference/odds-best.mdx
index c7ef974..61bd467 100644
--- a/content/pt-BR/api-reference/odds-best.mdx
+++ b/content/pt-BR/api-reference/odds-best.mdx
@@ -38,6 +38,10 @@ Best Odds está disponível em todos os planos, incluindo o Free. As casas de ap
Odds desatualizadas (mais de 5 minutos para pré-jogo, 1 minuto para ao vivo) são excluídas automaticamente das comparações de melhores odds para evitar resultados enganosos.
+
+**`is_main_line` vs. `market=main`.** `is_main_line` é avaliado por coorte `(event, market_type, selection)`: marca a linha principal *dentro do próprio leque de cada mercado*. Por isso mercados de período e de props retornam legitimamente linhas com `is_main_line=true` (ex.: o total de consenso do primeiro tempo), de forma que `?is_main_line=true` **não** é um filtro de "apenas linhas principais do jogo completo". Para restringir os resultados às **linhas principais do jogo completo** (moneyline, handicap de jogo completo, total de jogo completo), use o alias de categoria [`?market=main`](/pt-BR/api-reference/odds/#market-category-aliases), opcionalmente combinado com `?is_main_line=true` para também descartar as linhas alternativas dentro desses mercados.
+
+
## Exemplos de Requisição
diff --git a/content/pt-BR/api-reference/stream.mdx b/content/pt-BR/api-reference/stream.mdx
index d34c0de..7e984a2 100644
--- a/content/pt-BR/api-reference/stream.mdx
+++ b/content/pt-BR/api-reference/stream.mdx
@@ -29,7 +29,7 @@ https://api.sharpapi.io/api/v1/stream?api_key=sk_live_your_key
| Parâmetro | Tipo | Padrão | Descrição |
|-----------|------|---------|-------------|
-| `channel` | string | `opportunities` | O que transmitir: `odds`, `opportunities`, `gamestate` (apenas Enterprise) ou `all` |
+| `channel` | string | `opportunities` | O que transmitir: `odds`, `opportunities`, `gamestate` (apenas Enterprise) ou `all`. Também aceita o alias plural `channels`. Uma lista separada por vírgulas com mais de um canal colapsa para `all` — veja a nota abaixo. |
| `sport` | string | todos | Filtrar por esporte(s), separados por vírgula (ex.: `basketball`, `football`, `ice_hockey`) |
| `sportsbook` | string | permitidos pelo plano | Filtrar por sportsbook(s), separados por vírgula |
| `league` | string | todas | Filtrar por liga(s), separadas por vírgula |
@@ -49,6 +49,10 @@ https://api.sharpapi.io/api/v1/stream?api_key=sk_live_your_key
| `gamestate` | `gamestate:snapshot`, `gamestate:update`, `gamestate:removed`, `heartbeat` | Placares ao vivo, períodos, cronômetros e dados situacionais por evento. **Apenas plano Enterprise.** Veja [Live Game State](/api-reference/gamestate/) para o catálogo completo de campos. |
| `all` | Todos os tipos de evento | Visão completa em tempo real |
+
+**Uma assinatura por stream SSE.** Para manter paridade com a API WebSocket, o endpoint aceita tanto `channel` quanto o plural `channels`, e ambos toleram um valor separado por vírgulas. Mas uma conexão SSE mantém uma **única** assinatura: se você passar mais de um canal válido (ex.: `?channels=odds,opportunities`), a requisição **colapsa para `channel=all`** em vez de retornar um erro. Um único valor (`?channel=odds`) transmite apenas aquele canal. Para assinar de forma seletiva um *subconjunto* específico de canais, use a [API WebSocket](/streaming/websocket/), que oferece filtragem multicanal real com `channels=` em uma única conexão.
+
+
### Rotas de Conveniência
| Rota | Equivalente A |
diff --git a/content/pt-BR/concepts/live-vs-prematch.mdx b/content/pt-BR/concepts/live-vs-prematch.mdx
index 40cd2de..bce4ac8 100644
--- a/content/pt-BR/concepts/live-vs-prematch.mdx
+++ b/content/pt-BR/concepts/live-vs-prematch.mdx
@@ -120,7 +120,7 @@ Quando um mercado da DK ou FD é suspenso, ele simplesmente desaparece da API
| Pinnacle | Sim | Excelente — profunda, rápida, raramente suspende | Sharp |
| Bookmaker | Sim | Excelente — cardápio amplo de mercados, global | Sharp |
| Circa Sports | Sim | Boa — casa sharp dos EUA, cardápio focado | Sharp |
-| Bet365 | Sim | Boa — grande cardápio internacional | Pro |
+| Bet365 | Sim | Boa — grande cardápio internacional | Hobby |
| BetMGM | Sim | Moderada — suspensões regulares | Hobby |
| Caesars | Sim | Moderada — suspensões regulares | Hobby |
| DraftKings | Sim | Limitada — suspensões frequentes, cardápio enxuto | Free |