---
title: The Stream schema and every filter
category: find
summary: What every field on a Stream means, which fields you can filter on, and exactly how each filter behaves across MCP and REST.
order: 5
updated: 2026-10-07
next: choose-a-stream
related: search-streams-in-depth, source-channel-metadata-and-filters, manifests-filter-cookbook
reference: /docs/api, /openapi.json
---

The reference docs list a Stream's fields. This guide tells you what to do with them. Once you know what each field means, you can read a Stream and decide, without guessing, whether it fits your user's question.

## When to use this

Use it after a search gives you candidates and before you commit to one. Use it also to build an exact catalog filter, for example "public companies in the engineering domain with an audio source channel". Use it also to explain a Stream to your user.

## Smallest working call

Read one Stream completely. This is free:

```mcp
synorb-details
{"stream_ids": ["STREAM_ID"], "verbosity": "verbose"}
```

```bash
curl -sS "https://api.synorb.com/streams/STREAM_ID" \
  -H "Authorization: Bearer $SYNORB_KEY"
```

## What you get back

The fields below come from `synorb-details`. `GET /streams/{id}` returns flat `manifests_last24h`, `manifests_last7d`, `manifests_last30d` and `claims_last*` counts and raw source channel rows, without the guidance blocks. `surface_ids` appears on `GET /streams` list rows. Read the fields in this order.

### Identity and subject

| Field | Meaning | How to use it |
| --- | --- | --- |
| `id` | A 17-digit identifier | Pass it as a string in `stream_ids`. |
| `name` | A stable lowercase slug | Useful for logs. Do not show it to people. |
| `title`, `description` | Human-readable name and what the Stream covers | Quote the title to your user. Use the description to judge fit. |
| `source_type` | The primitive: `organization`, `person`, `data` or `place` | Tells you the type of subject. A `place` Stream is a metro or locale bundle. Its source channels are mixed on purpose. |
| `stream_class` | The Stream's class | Informational. |
| `security` | `ticker`, `isin` and `figi` for company Streams | Join to your user's holdings. Never infer a ticker yourself. |

### Where it sits in the taxonomy

| Field | Meaning | How to use it |
| --- | --- | --- |
| `home_domain` | Exactly one of the 12 canonical domains | The strongest single filter for "what field is this?" |
| `cross_domains` | Three other domains (never the home domain) | Adds breadth. Use `cross_domain_logic` `and` to intersect, `or` to widen. |
| `surface_ids` | The curated verticals the Stream belongs to (for example `public_companies`) | Filter whole verticals with the `surface` parameter. |

The 12 home domains are `arts-culture-entertainment`, `economics-business-work`, `engineering-technology`, `everyday-life-practical-knowledge`, `health-medicine`, `language-literature`, `life-environment`, `people-biography-history`, `physical-sciences-mathematics`, `places-geography`, `society-law-government` and `universe-earth`. The valid `surface` ids are the `enum` on the `surface` parameter in [openapi.json](/openapi.json).

### How active it is

| Field | Meaning | How to use it |
| --- | --- | --- |
| `volume.manifests_last24h`, `_last7d`, `_last30d` | Recent Manifest counts | Set expectations. A Stream averaging two items a week will often return nothing for one day. |
| `volume.claims_last24h`, `_last7d`, `_last30d` | Recent atomic-claim counts | A rough measure of depth, not item count. |
| `last_manifest_at`, `days_since_last_manifest` | When it last produced | Detect a stalled Stream. |
| `freshness_state` | `fresh`, `quiet`, `stale`, `never_published` or `unknown` | Check this before promising "latest". |

### Where the content comes from

| Field | Meaning | How to use it |
| --- | --- | --- |
| `source_channels[]` | Each source channel with `id`, `name`, `display`, `org_name`, `category`, `content_types`, `source_url`, `source_class`, `evidence_type`, `source_type`, `media_format`, `crawl_frequency`, `avg_items_30d`, `total_items`, `is_active`, `description` | Describe the sources honestly, and filter to one with `source_channel_ids`. |
| `source_channel_count`, `source_channel_metadata` | Totals, active and inactive counts, formats and ready-made exact source channel filters | A fast overview. |
| `filter_metadata` | `available_media_formats`, the source channel IDs, and Tag filtering guidance | Build a precise follow-up call. |
| `filter_definition` | How content is routed into this Stream | Read it to understand scope. **Do not copy it into your own queries.** |

### Guidance Synorb attaches

`retrieval_profile`, `query_hints`, `next_call` and `alternate_calls` are suggestions for the next call. They are worth following as a starting point, then adjusting for your user's actual question.

## Filtering streams, surface by surface

Different entry points expose different filters. This is the complete picture.

| Filter | `GET /streams` | `POST /streams/search` | `synorb-stream-search` | `synorb-catalog` |
| --- | --- | --- | --- | --- |
| Free text | No | `query` | `query` | `query` / `search` |
| `home_domain` | Yes (one) | `home_domain` / `home_domains` | Yes | Yes |
| `cross_domains` and logic | No | Yes | Yes | Yes |
| `media_format` | Yes | Yes | Yes | Yes |
| `ticker`, `isin` | Yes (comma-separated) | Yes | Yes | No |
| `company_kind` | Yes (`company_type` is an alias) | Yes | Yes | No |
| `organization_subtype` | Yes (`entity_type` is an alias) | Yes | Yes | No |
| `surface` | Yes (`surface_id` is an alias) | Yes (not yet in `openapi.json`) | Yes | Yes |
| `tag_type`, `subtype` | No | No | No | Yes |
| Source channel projection | `include_source_channels=true` (up to 25 per Stream) | `include_details` | `include_details` | n/a |
| Paging | `page`, `page_size` | `page`, `page_size` | `page`, `page_size` | `page`, `page_size` |

Four details need care:

- `media_format` on `GET /streams` returns Streams that have **at least one active source channel** of that format. A Stream can be mostly text and still match `audio`.
- Synorb derives `company_kind` from organization Tags. `is_public=false` is **not** a private-company classifier.
- `GET /streams` rejects any parameter it does not know. It does not ignore the parameter. A typo is an error, not an unfiltered catalog.
- `active_only` defaults to `true`.

Organization subtypes you can pass include `public_company`, `private_company`, `startup`, `hedge_fund`, `asset_manager`, `private_equity`, `venture_capital`, `investment_bank`, `bank`, `insurer`, `exchange`, `rating_agency`, `central_bank`, `government_agency`, `regulator`, `legislature`, `court`, `university`, `research_institute`, `media_outlet` and `think_tank`.

## Failure modes

| Symptom | Cause | What to do |
| --- | --- | --- |
| `400` on a catalog call | An unknown parameter, or `search=` on `GET /streams` | Use only the listed parameters. Use `POST /streams/search` for free text. |
| `422` naming valid values | A bad `media_format`, `home_domain` or `surface` | Use a value from the list in the error. |
| A Stream looks right but returns little | Low volume, or `stale` | Read `volume` and `freshness_state` first. |
| `source_channels` is empty on a list call | You did not ask for it | Add `include_source_channels=true`, or call `synorb-details`. |
| Copying `filter_definition` into a query | It is a routing rule, not a query | Scope with `stream_ids` and the documented filters. |

## Make it good for your user

Turn the schema into a sentence your user can check.

For example: "This is the NVIDIA Stream in engineering and technology. It reads NVIDIA's own newsroom and SEC filings. It published 12 items this week." That sentence uses `title`, `home_domain`, the `display` names of the source channels and `volume`. It shows your user what you are about to rely on. This builds more trust than an ID.

## Next guide

[Choose a Stream](/agent-resources/choose-a-stream): a decision workflow from shortlist to a verified commitment.
