Packages
The sellable unit is a package: a seller-defined, versioned description of inventory. Switchboard never forces packages into a fixed vocabulary; it makes whatever the seller defines legible and safe to transact.
Package types
daypart (a selling title plus days and a time window, see Selling titles), program (a show or tentpole), genre (a content collection), rotator (rotation rules across windows), ron (run of network), and custom. Each carries a type-appropriate definition and the same versioning; the full shape is the package object, and the wire values live at the package type enum. A program that airs on irregular dates (a game schedule, an awards night, a premiere) may define itself by explicit occurrences (date, start, end, optional label) instead of a weekly pattern; slots then exist only on those dates, and everything else about slots, weekly pricing, and ordering is unchanged.
Slots
A slot is a package on a date: the orderable instance. Slot IDs are constructed, never looked up: {package_id}:{date}, so acme-prime:2026-10-07 is Prime on October 7. A slot inherits the rate entries of its ISO week; there is no per-date pricing. The grain rule in one sentence: cards price by week, trades book by slot. Order a slot and the air date is pinned (daylocked by construction); order a package and week instead and the seller distributes your units across its slots, reported per date in the line's allocation.
The catalog integrity rule
On every catalog or rate-card update: for each network and week, no two packages in state Available may overlap in days-intersect-time, unless every package in the overlapping set declares the same shared pool. Overlapping definitions are legitimate (alternate packaging, quarter-over-quarter replacement); overlapping active coverage outside a shared pool is the error, and it rejects the update with a conflict report before it can ever produce an order error.
pool: acme-prime-breaks: legal, they share one capacity.Shared pools
Sellers often sell the same breaks through more than one package: a broad Prime rotator and a weekend sports carve-out of the same inventory, each entitled to only so much of it. A pool makes that legal and keeps it honest. The pool declares shared capacity on a network; each member package opts in with an inventory_pool block naming the pool_id and its own max_per_week cap. The full shape lives at the pool object.
{
"pool_id": "acme-prime-breaks",
"network": "ACME",
"unit": "spots",
"capacity": {
"grain": "week",
"per_week": 80
},
"effective": {
"start": "2026-09-28",
"end": "2026-12-27"
}
}
Member packages draw down one shared capacity. A package never sells past its own max_per_week, and the pool never sells past its capacity. Caps may add up to more than the pool (60 + 30 over a pool of 80 is the point: whichever package sells first gets the room). Avails on a pooled package report available as the smaller of the package's remaining cap and the pool's remaining capacity. An order that would breach either rejects with INVENTORY_UNAVAILABLE and names the pool in details.pool_id; there is no new error to handle. Packages that overlap without declaring the same pool still reject at ingest with DAYPART_CONFLICT.
The reference is validated, not trusted: inventory_pool.pool_id must resolve at ingest to a pool you have published on the same network, with a matching unit and an effective window covering the overlapping weeks. A nonexistent, expired, cross-network, or unit-incompatible pool reference rejects the update with a conflict report, the same way undeclared overlap does. A shared label with no real pool behind it never turns the integrity rule off.
Mirrors
Any package whose definition carries a day-and-time window (a daypart, or a custom package like a sponsorship) may declare a paired mirror airing: a second window at a fixed offset from the primary, sold alongside it. A common rate-card shape is Prime 8P-12A with a 12A-4A mirror. The package definition carries an optional mirror attribute with offset_minutes; buyers opt in per line item with include_mirror. Mirrors do not change the integrity rule: the mirror window belongs to its package and is checked like any other coverage.
Markets
A package may carry a market block naming the geography it sells: scheme (an open enum: nielsen_dma, msa, cable_zone, country, custom), code, name, and country. A package with no market is national. A local station lists as its own network with its packages carrying the station's market; a station group lists every station under one provider; a cable interconnect is a bookable network whose zone-level packages carry scheme: cable_zone. Buyers filter catalog and avails with ?market=nielsen_dma:501. Market of sale and country of license are separate facts, so cross-border inventory declares both honestly.