← Back to product·Simulmedia VAMOS Docs·Concepts / Products
Concepts

Products

The sellable unit is a product: a seller-defined, versioned description of inventory. VAMOS never forces products into a fixed vocabulary; it makes whatever the seller defines legible and safe to transact.

Product 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), sponsorship (all or part of a program bought by one advertiser), and custom. Each carries a type-appropriate definition and the same versioning; the full shape is the product object, and the wire values live at the product 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; the product airs only on those dates, and everything else about periods, weekly pricing, and ordering is unchanged.

Periods and grains

A product is a description of inventory. What is transacted is a line item: so many units of one product for one period. A period is a grain plus a start, and the grain decides the start's format: day with 2026-10-07, week with 2026-W41, month with 2026-10. Nothing else names a purchase, and there is no separate object between the product and the line.

The seller decides which grains a product instantiates at. A product's grains lists them; omitting it means the week, which is what everything was sold by before the field existed. A line naming a grain the product does not offer is refused 422 GRAIN_NOT_OFFERED, naming the product, the grain asked for, and the grains on offer. A buyer cannot mint a grain by asking for it.

The noun ladder is product, then line item, then unit. Order a day period and the air date is pinned, daylocked by construction; order a week or a month and the seller distributes your units across the period's dates, reported per date in the line's allocation.

Cards price by week; trades book by period. A rate card keys on (product, week) whatever grain a line books at, and a line locks exactly one rate holding across its whole period. That is the one cost of the month grain: a product may only offer month where its card prices each month uniformly, because a month whose weeks carry two prices for one cell has no single rate a month line could lock. Publishing one anyway is refused 409 GRAIN_CONFLICT, naming the product and the month.

Distribution

A product may declare the layer its inventory sits in: network (the national commercial load carried at once across owned-and-operated and affiliated stations), syndication (time inside a program licensed for national distribution that airs on individual local stations), or spot (time sold by an individual station or system). Omitted means unstated, which stays valid. Buyers filter catalog reads with ?distribution=syndication; the wire values live at the distribution enum.

Geography is not part of this enum, because geography is already on market. spot with no market is a national spot offering; spot with a market is local. That composition is why there are three values and not five, and it is why there is no local_spot: cross-producing distribution with geography would give two fields the same job and let them drift.

Syndication needs no special case, because the integrity rule is scoped to one seller's catalog. Under barter syndication the syndicator holds some of a program's avails and the station holds the rest: two sellers, two products, one program. That is different inventory sharing a program, not one avail claimed twice. VAMOS carries what each seller states about its own inventory; it never invents a fact spanning sellers.

Competitive separation

Two fields, deliberately on different objects, and keeping them apart is the point: advertiser_class prices; the advertiser's category separates. advertiser_class (general, dr, tune_in, competitive, theatrical, political) answers what rate and clearance policy applies, and it lives on the line's locked rate. category answers what the advertiser sells, which is what separation runs on, and it lives on the advertiser record: an order names the advertiser by reference and the category comes with it, so one advertiser cannot end up separated two ways because two orders spelled its category differently. It is an open string: no category taxonomy is standard across sellers, and pretending otherwise would be worse than not trying.

A product states the seller's own rule in separation_policy: min_separation_seconds and a scope of break, pod, or program. Length-dependent rights (published policy commonly grants product protection to :30s and withholds it from independent :15s) ride the seller's stated rule, not a rule the platform imposes. VAMOS records and surfaces both facts so the seller can see them at the approval gate; it does not place spots within a break, so enforcement stays the seller's, exactly as it is today.

The buyer's ask is a different field from the seller's rule, and it is on a different object. separation_policy is the product's: the seller stating where it enforces, scoped break, pod, or program. buyer_requests is the order's: the buyer stating what it wants, and its scope takes one value, campaign. A DR buyer asking for an hour between its own spots is asking across its whole campaign, not inside one break, so the two enums are deliberately not the same enum. Sending a seller-side scope on buyer_requests returns 422 INVALID_INPUT rather than quietly recording an ask the buyer did not make. Per line, do_not_air names dates the buyer asks to skip.

All three are recorded and surfaced, never enforced. A do_not_air date can still receive an allocation, and a stated min_separation_seconds does not change how units are distributed across a week. What they buy you is that the seller sees the ask as a field at the approval gate, and can honor it or decline it explicitly, instead of finding it in a notes field after the fact.

Sponsorships and billboards

A sponsorship is the purchase of all or part of a program by one advertiser. It is a product type rather than a buy type, because it says what is being bought, not what the seller stands behind: a sponsorship composes with non_preemptible or fixed_position like any other product.

A billboard is a sponsorship product carrying a billboard block: seconds (typically 3, 5, or 10) and position (open, close, or both). A billboard is not a spot with a short spot_length, and the difference is contractual: published seller policy ties billboard eligibility to the commercial weight a buyer has purchased and excludes :15s from earning them. It is a benefit attached to a schedule, not a small unit of time.

Roadblocks, piggybacks, and bookending get no type of their own. A roadblock is an all-or-nothing multi-product booking; piggyback and bookending are trafficking arrangements of two creatives inside one purchased unit. An infomercial is a spot_length of 1800 with the dr advertiser class.

Who can see a product

Two fields, one answer each. A product's visibility says whether it needs a relationship at all: open, which is what omitting it means, lists it for every buyer; by_agreement lists it only for a buyer the seller has granted it to. The grant itself lives on the agreement, in catalog_scope: "*" for your whole catalog, or exactly the products you name.

The record is made by granting. There is no separate step that mints a relationship before you can scope one: the first grant to a buyer you have never transacted with creates the record, which is how a carve-out gets made before the first order arrives. Alongside the grant you may carry your own external_ref for that buyer, opaque to the platform and unique across your relationships, so your CRM key travels on the record VAMOS keys by agreement_id.

It narrows, never widens. The grant composes with everything else the agreement permits as an intersection, so granting a product the agreement excludes grants nothing. And an open product lists for every buyer whatever any grant says, because open is you declaring the product needs no relationship to be seen.

What an ungranted buyer sees is nothing at all. The product is absent from its catalog and avails reads, and a direct read is 404, the same answer a product that does not exist gets. Not 403: a distinguishable refusal would confirm that inventory it cannot see exists, which is the thing the gate is for. Avails and rate lines need no gate of their own, because they are reached through the product and the product is what is scoped.

Visibility and disclosure are separate axes and always were. Visibility decides whether a buyer may see a product; disclosure decides what they see of it once it lists.

The catalog integrity rule

One rule, and it is about the month grain: a product offering month has to price each of its months uniformly, or the update rejects with a conflict report naming the product and the month. Nothing else about a catalog is refused wholesale.

Overlapping products are ordinary. Two products covering the same network, the same days, and the same hours publish cleanly, and no declaration is needed to make that legal. Sellers sell the same breaks through more than one cut of them all the time: a broad Prime rotator and a weekend sports carve-out of the same inventory, an all-day run of network beside the dayparts inside it, fifty audience segments over one national rotation. VAMOS carries what you state about your own inventory; it does not model capacity, and it never claims to know that two of your products would oversell each other.

Two different sellers overlapping on the same network and week is not an oversell either, and never was: under barter syndication the syndicator holds some of a program's avails and the station holds the rest. Two sellers, two products, one program.

Mirrors

Any product whose definition carries a day-and-time window (a daypart, or 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 product 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 product and is checked like any other coverage.

Markets

A product 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 product with no market is national. A local station lists as its own network with its products carrying the station's market; a station group lists every station under one provider; a cable interconnect is a bookable network whose zone-level products 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.