OSAPI.os.tv
Concepts

BANS: the truth model

BANS is the Broadcast Address Numbering System. The registry returns one canonical origin per broadcaster, carrying six facets that are deliberately kept separate.

identity   ≠   governance   ≠   allocation   ≠   publication   ≠   presentations   ≠   reachability

Two invariants hold throughout: reviewed ≠ governed, and allocated ≠ published ≠ reachable.

Origin (identity)

The canonical broadcaster. origin.id (wwbn:origin:<uuid>) is the stable, per-origin key you route and bookmark on. registry_id (WWBN-0000000) is the network address — shared by an origin's siblings — so it is not a per-origin key.

"origin": {
  "id": "wwbn:origin:1160f6e7-…",
  "name": "Example Network",
  "registry_id": "WWBN-0001006",
  "network": { "id": "…", "name": "YouTube" }
}

Governance

An origin is governed only when an active governance edge establishes it. A reviewed crosswalk on its own means the origin is reviewed (its presentations resolve) but not yet governed.

Stategovernance.stateMeaning
Governedgovernedactive_edges ≥ 1 — the only BANS-eligibility signal.
ReviewedungovernedA reviewed crosswalk exists (presentations resolve) but no active governance edge — awaiting adoption.
UnreviewedungovernedNo reviewed crosswalk and no governance — no resolved presentations.
A verification record alone never makes an origin governed. Only an active governance edge does.

BANS allocation

A governed origin may hold a permanent channel-tier address: network.station.channel (e.g. 2.0.1). Numbers are station-scoped and never recycled.

"bans": {
  "allocated": true,
  "address": "2.0.1",
  "network": 2, "station": 0, "channel": 1,
  "publication_status": "published"
}
The channel-tier address is not the network-tier registry_id — they are different addressing systems. The registry never substitutes one for the other.

A governed origin without an allocation is eligible, not broken: bans.allocated = false.

Publication

An allocation is either published or held. A held allocation keeps its same address — it is reserved for the origin, never freed.

"bans": { "allocated": true, "address": "2.0.2",
          "publication_status": "held",
          "held": { "at": "…", "reason": "…" } }

Presentations (reachability)

The transports actually resolved to the origin — one entry per carriage. Multiple carriages of the same transport aggregate beneath the one origin.

OVPIPTVOTAFAST

"presentations": [
  { "carriage_id": "ostv:carriage:…", "transport": "iptv",
    "provider": "…", "source": "…", "availability": "available" }
]
Reachability is reported, never inferred. availability is transport telemetry; where the source has none it is null. A carriage merely existing does not imply the origin is reachable, and it is never promoted to publication_status.

What never happens here

  • Unresolved carriages never create a synthetic origin.
  • Identity is never inferred from matching names.
  • Network-tier addressing is never surfaced as the channel-tier BANS address.
  • Nothing is written — the registry is a projection.

See the worked examples: published · held · governed (eligible) · reviewed · unreviewed.