---
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-09
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-resources/output-contract) first. This guide lists the fields that its rules refer to. Every field here comes from the code that builds the response. A field that is absent is absent. Do not fill it in.

## When to use this

Use it when you write a briefing and need to know where a quote, a chart value, a link or a reason lives in the response. Use it again when you send a reader profile.

## Smallest working call

Send a profile with a normal pull on REST. The MCP tool `synorb-manifests` has no `profile` argument. On MCP, save the profile on a Beacon with `synorb-save-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"]}}'
```

Everything else in this guide is in the response.

## 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, up to 12 Tags. Index `i` of each list describes one Tag.
- `action`: the first-party link as `url`, with a `label` and a `kind` (`read`, `listen` or `watch`). It is `null` when the item has no link.
- `supporting_quotes`: always present, and 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`.
- `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_index`, `quote`, `evidence`, `source_url`, `method` and `verbatim`. `claim_index` points into the item's Claims. 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 quote from a machine translation carries `translated: true` and a `translation_note`. Its wording differs from the linked page. Say so when you show it.

### 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. This is where chart data lives, not on the item.
- `themes`: up to 12 recurring topics, organizations or people, each with `kind`, `name`, `tag_id`, `count` and `manifest_ids`. `themes_total` appears when more exist.
- `stats`: `items`, `stories` and `ratio`.
- `profile`: a receipt, present only when a profile was applied. It has `applied`, `source`, `excluded`, `excluded_count` and `ranking`.
- `continuity`: what is new, seen, updated or contradicted since this reader's last pull of the same Beacon. Only bound accounts that run a saved Beacon get it. A cold or demo key never gets it.

Each chart series has `series_id`, `label`, `unit`, `kind` (`comparison`, `timeseries` or `single`), `points` and `claim_refs`. A point has a `label` and a `value`, and may have `x` and `value_high`. A value can be negative. The unit `pp` means percentage points. The values are the numbers stated in the Claim text. Plot them as given.

`continuity` has the lists `new`, `seen`, `updated`, `contradictions` and `duplicates`. It also has `possibly_new` and `new_certain`. When `new_certain` is `false`, Synorb could not prove an item is new, and it lists the item under `possibly_new`. Each contradiction names the new and prior Manifest, the prior and new values, both Claim texts and a confidence. Show a contradiction to the reader. Do not resolve it yourself.

### Optional reader profile

Send a `profile` on `POST /manifests/query`, or save one on a Beacon with `synorb-save-beacon`. A Beacon stores it at `manifest_config.profile`. A call from a Beacon uses the saved profile when you send none.

```json
{"profile": {"role": "head of risk at a regional bank", "goals": ["track capital rules"], "watchlist": ["Example Bank"], "exclusions": ["crypto", {"tag": "Example Tag", "below_amount_usd": 5000000}]}}
```

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

- `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, or an object with `tag`, `subtype` and `below_amount_usd`.
- Every entry is text of up to 200 characters. An entry needs at least one matchable word.
- An exclusion object needs a `tag` or a `subtype`. `below_amount_usd` must be a number above 0.
- A threshold compares dollar amounts only. An item with no parseable dollar amount is not excluded by a threshold.
- At most 2 items per call get `urgency: "interrupt"`.

A bad profile returns HTTP 422 with `error: "invalid_profile"` and a message.

When the profile removes every matched item, `render.excluded_by_profile` holds the count. Tell the reader that items matched and were excluded. Do not report that nothing happened. `briefing.profile.excluded` lists each excluded `manifest_id` with its reason. To see them, repeat the request without the profile.

## Failure modes

| Symptom | Cause | What to do |
| --- | --- | --- |
| `supporting_quotes` is empty | No quote could be shown word for word | Write without a quote. Do not invent one. |
| An item has no `why_you_see_this` | No Beacon, profile or Tag filter explains it | Say why it matters in general terms, or leave it out. |
| No `continuity` block | The key is a cold or demo key, or the call did not come from a saved Beacon | Dedupe by `manifest_id` yourself. |
| A chart series is missing | The Claims hold no plottable measured values | Skip the chart. |
| HTTP 422 `invalid_profile` | The profile broke a limit above | Fix the field named in the message. |

## Make it good for your user

Ask the reader for a role, a few goals and a watchlist once. Send them as a profile on every call. Then each briefing opens with what matters to that person.

## Next guide

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