---
title: Source-channel metadata and filters
category: find
summary: Read where a Stream's content comes from, filter by who published it versus what it is about, and avoid asking for a Stream per channel.
order: 7
updated: 2026-10-07
next: resolve-tags-and-entities
related: beacon-scope-parent-stream-and-source-channel, stream-schema-and-filters, manifests-filter-cookbook
reference: /docs/mcp, /openapi.json
---

Every Manifest says where it came from. Reading that metadata lets you filter precisely and tell your user exactly whose words they are reading.

## When to use this

Use this guide when "everything about X" is too broad. Examples: only X's own announcements, only filings, only the podcast source channel, only central-bank speeches, or "who published this?" as part of the answer.

## Smallest working call

Inspect a Stream's source channels (free):

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

Then narrow a pull by the source that **published** it. This counts first-party company posts in the last week and bills nothing:

```mcp
synorb-manifests
{"stream_ids": ["STREAM_ID"], "source_class": ["company_first_party"], "days": 7, "mode": "count"}
```

The same count over REST:

```bash
curl -sS -X POST https://api.synorb.com/manifests/query \
  -H "Authorization: Bearer $SYNORB_KEY" \
  -H "Content-Type: application/json" \
  -d '{"stream_ids": ["STREAM_ID"], "source_class": ["company_first_party"], "days": 7, "mode": "count"}'
```

## What you get back

`synorb-details` lists each source channel with the metadata you need to describe it honestly:

```json response
{
  "source_channels": [
    {
      "id": "...",
      "name": "...",
      "display": "...",
      "org_name": "...",
      "source_class": "company_first_party",
      "evidence_type": "announcement",
      "source_type": "organization",
      "media_format": "text",
      "crawl_frequency": "...",
      "avg_items_30d": 12,
      "is_active": true,
      "source_url": "https://..."
    }
  ]
}
```

Each Stream's details also include `source_channel_metadata`. It has the counts of `total`, `active` and `inactive` source channels. It lists the `media_formats` and `source_types` present. It also has ready-made `exact_source_channel_filters` (a `media_format` with its `source_channel_ids`) you can pass directly to `synorb-manifests`. `filter_metadata.source_channel_ids` lists every source channel ID in the Stream.

Each returned Manifest carries a `source` object with `source_name`, `source_channel_display`, `source_url`, `source_class`, `evidence_type`, `media_format`, `content_quality` and `source_reachability`. These are the fields behind a line like "from the company's own newsroom" in your answer.

### Published BY versus ABOUT

These are two different filters. Do not mix them up.

| You want | Use | Example |
| --- | --- | --- |
| Content **published by** a class of source | `source_class` (and `evidence_type`) | `{"source_class": ["central_bank"]}` |
| Content **about** an entity or topic, from anyone | `tag_names` or `tag_ids` | `{"tag_names": ["Federal Reserve"]}` |
| One exact form or source channel | `sec_form_type` or `source_channel_names` | `{"sec_form_type": ["8-K"]}` |

They combine. `{"tag_names": ["Federal Reserve"], "source_class": ["central_bank"]}` is the Fed's own output. Drop `source_class` to include everyone's coverage of the Fed.

Valid `source_class` values are `central_bank`, `official_regulator`, `legislature`, `government_other`, `company_first_party`, `corporate_blog`, `sec_filing`, `earnings_transcript`, `newswire`, `academic_preprint`, `peer_reviewed_journal`, `clinical_registry`, `podcast`, `secondary_news` and `commentary`. The alias `government` expands to the four government classes. The class `company_first_party` also matches `corporate_blog`.

For SEC filings use the exact form (`sec_form_type: ["8-K"]`) and never substitute a nearby one. Every source channel filter must be an exact ID or name. A name that does not resolve fails closed with zero Manifests and no usage.

### One Stream per subject, not per source channel

When you want a narrower slice, add a filter. Do not ask for a separate Stream for each blog, podcast or filing type. Do not build one. Synorb uses one Stream per subject, with source channels inside it. A source channel gets its own Stream only when it is a customer-facing product, such as a podcast show or a data series. The Beacon guide on parent Streams and source channels shows the full pattern.

## Failure modes

| Symptom | Cause | What to do |
| --- | --- | --- |
| A count of zero after adding `source_class` | The Stream has no source channel of that class | Read `source_class` per source channel in `synorb-details`, and pick a class it has. |
| Filter results look broader than expected | You used `tag_names` (about) when you meant `source_class` (by) | Switch the filter, or combine both. |
| A source channel shows `is_active: false` | Synorb no longer crawls it | Do not promise fresh content from it. |
| `evidence_type`, `source_channel_display` or `content_quality` is missing from `source` | You asked for `response_profile: "slim"`, which keeps only `source_name`, `source_url`, `media_format` and `source_class` | Use the default profile when you need the other fields. |
| `source_url` leads to a dead page | Link rot, a paywall or a takedown | The Signal and Brief remain citable. Link to it, but do not depend on it. |

## Make it good for your user

Attribute every statement to a named source and link it. "OpenAI's own announcement" and "a third-party analysis" deserve different weight, and `source_class` tells you which one you hold. If it helps your user judge credibility, group by source class in your answer.

## Next guide

[Resolve Tags and entities](/agent-resources/resolve-tags-and-entities): turn the people, companies and topics your user names into canonical Tags.
