---
title: Briefing fields and the reader profile
category: read
summary: The fields on each presentation item, the briefing block with stories, themes and continuity, and the optional reader profile with its limits.
order: 15
updated: 2026-10-15
next: present-manifests-to-your-users
related: output-contract, read-the-response-envelope, build-and-save-a-beacon
reference: /openapi.json, /agent-guide.md
---

Read [The output contract](/agent-guides/output-contract) first. This guide lists the fields its rules refer to. A field that is absent is absent. Do not fill it in.

## When to use this

Use it to find where a quote, a chart value, a link or a reason lives in the response, and when you send a reader profile.

## Smallest working call

Send a `profile` with a pull on REST or on `synorb-manifests`, or save it on a Beacon.

```bash billed
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"], "days": 7, "target_count": 3, "profile": {"role": "head of risk", "goals": ["track capital rules"]}}'
```


## What you get back

### Fields on each item

Each entry in `presentation_items` can carry these fields.

- `headline`, `one_liner` and `full`: three lengths of the same text.
- `published_at` and `stream_name`: when the source published, and the Stream it came from.
- `claims`: up to 5 Claims. Each has `claim_text`, `claim_type` and `confidence`. A Claim without a confidence keeps `null`.
- `tag_names`, `tag_types` and `tag_ids`: aligned lists of up to 12 Tags.
- `action`: the first-party link as `url`, with a `label` and a `kind`. It is `null` when the item has no link.
- `supporting_quotes`: always present; an empty list when nothing can be quoted.
- `why_you_see_this`: one line. Synorb omits it when no Beacon, profile or Tag filter explains the item.
- `story_id`: joins the item to an entry in `briefing.stories`.
- `is_duplicate`, `duplicate_of_manifest_id`, `duplicate_reason`: only on a near-copy. Show the lead.
- `urgency`: `interrupt` or `digest`, with a score and a reason. It appears only when a profile was applied.

Each quote in `supporting_quotes` has `claim_id`, `claim_index`, `quote`, `evidence`, `source_url`, `method` and `verbatim`.

Join a quote to a Claim on `claim_id`, the same id as `presentation_items[].claims[].claim_id`. Do not use `claim_index` to find a displayed Claim: it counts the full list, not the 5 shown.

A `verbatim` value of `true` means the quote is a span of the Record text. It does not mean the quote proves the Claim. A machine-translated quote carries `translated: true` and a `translation_note`. Its wording differs from the linked page. Say so.

### The `briefing` block

A delivery also carries a top-level `briefing` object. It holds the work Synorb did across items.

- `stories`: items grouped by event. Each story has `story_id`, `manifest_ids`, `lead_manifest_id`, `tag_names` and `chart_ready`. A story with several items also has `citations` and `strongest_claim`.
- `stories[].chart_series`: up to 8 plottable series per story. Chart data lives here, not on the item.
- `themes`: up to 12 recurring topics, organizations or people, each with `kind`, `name`, `tag_id`, `count` and `manifest_ids`.
- `stats`: `items`, `stories` and `ratio`.
- `markdown`: a briefing built only from this response. It opens with a plain lead built by rule; the evidence, source index and coverage block follow. Write your own opening above it.
- `scaffold`: what you write the opening from. Synorb builds it from stored Claims with no model call. Fields: [Present Manifests](/agent-guides/present-manifests-to-your-users#present-a-pull-as-a-memo).
- `synthesis` (`lead`, `threads`, `decisions`, `sections`, `stories`, `method`, `path`) and `agent_instructions`: the plain lead as data, and notes for you, not your user. Top-level `presentation_rule` and `presentation_preflight` (5 yes/no checks) come on every delivery.
- `selection`: `matched`, `returned`, `coverage` (`sample`/`complete`), `ranking`, `scope`, `exclusions`, `coverage_note`.
- `profile`: present only when a profile was applied: `applied`, `source`, `excluded`, `excluded_count`, `unmatched_exclusions` (exclusions that matched no item, with a note) and `ranking`.
- `continuity`: what is new, seen, updated or contradicted since the last pull of the same Beacon. Bound accounts running a saved Beacon only; a demo key never gets it. Show contradictions. Lists: [Run and edit a Beacon](/agent-guides/run-and-edit-a-beacon).

Each chart series has `series_id`, `label`, `claim_text`, `unit`, `kind` (`comparison`, `range`, `timeseries` or `single`), `points`, `claim_refs`, `claim_ids`, `parse_confidence` and `claim_confidence`.

- `range` is one span (prices from $300 to $3,000) with points `low` and `high`, not a change. `before` and `after` mean a stated change, such as rose from 15% to 8%.
- `parse_confidence` is the parser's certainty about the points. Show the reader `claim_confidence`, the Claim's own label.
- Join a series to a displayed Claim on `claim_ids`, not on `claim_refs`.
- A point has `label` and `value`, optionally `x` and `value_high`. The unit `pp` means percentage points.
- Values are the numbers stated in the Claim text; plot them as given.

### Optional reader profile

Send a `profile` on `POST /manifests/query` or `synorb-manifests`, or save one on a Beacon with `synorb-save-beacon`; a Beacon call uses the saved profile when you send none.

The profile reorders items within the page and drops excluded items from the served list. It never changes what Synorb found or billed; without one, the order is unchanged.

An exclusion runs after the pull, on the page already found. It matches Tags, subtypes, dollar amounts and literal words in the headline and Claims, not meaning: `generic product marketing` removes only items using those words.

To avoid paying for unwanted items, narrow the pull itself with filters that run first: `stream_ids`, `tag_names`, `significance`, and the best-effort `exclude_tag_names`, `exclude_tag_ids`, `exclude_query_terms`, `exclude_source_channel_ids` and `exclude_home_domains`. Check a filter first with `mode: "count"`.

- `role`: text, up to 120 characters.
- `goals`: up to 10 entries.
- `watchlist`: up to 50 entries.
- `exclusions`: up to 20 entries. Each is free text such as `"crypto"`, or an object such as `{"tag": "Example Tag", "below_amount_usd": 5000000}`. The object keys are `tag`, `subtype` and `below_amount_usd`.
- Every entry is text of up to 200 characters with at least one matchable word.
- An exclusion object needs a `tag` or a `subtype`. `below_amount_usd` must be a number above 0 and compares dollar amounts only.
- At most 2 items per call get `urgency: "interrupt"`.

When the profile removes every matched item, `render.excluded_by_profile` holds the count: say items matched and were excluded, never that nothing happened. `briefing.profile.excluded` lists each excluded `manifest_id` with its reason.

## Failure modes

| Symptom | Cause | What to do |
| --- | --- | --- |
| No `continuity` block | A demo key, or no saved Beacon | Dedupe by `manifest_id` yourself. |
| HTTP 422 `invalid_profile` | The profile broke a limit above | Fix the field named in the message. |

## Make it good for your user

Ask once for a role, goals and a watchlist; send them as a profile.

## Next guide

[Present Manifests to your users](/agent-guides/present-manifests-to-your-users): the long guide, with the reference formatter, voice and report modes, grouping, duplicates and thin sources.
