# Agent-Ready Video (ARV): full specification text > Draft 1.0, proposed. Published 2026-09-23, updated 2026-09-24. Canonical URL: https://agentreadyvideo.org/spec/1.0. Maintained by AgentCDN. Spec text: contributed to the W3C Agent-Ready Video Community Group under the W3C CLA at launch. > Source: https://github.com/sandersaar/agentreadyvideo at commit 958eda6192f7408b5f3e01f90042c979f6505a36. > Suggested citation: Agent-Ready Video (ARV) Specification, Draft 1.0 (proposed). AgentCDN, 2026. https://agentreadyvideo.org/spec/1.0 # Agent-Ready Video (ARV) Specification Draft 1.0, proposed. Published 2026-09-23, updated 2026-09-24. This draft may change before 1.0 is final. ## Conventions The key words MUST, MUST NOT, SHOULD, SHOULD NOT and MAY are to be read as described in [RFC 2119](https://www.rfc-editor.org/rfc/rfc2119). - All times are integer milliseconds unless a field says otherwise. - Every ARV object carries `"arv": "1.0"`. - URLs in examples use `example.com`. Examples are not normative, except where a rule says so. - Every example in this spec is a file in [`examples/1.0/`](https://agentreadyvideo.org/schema/1.0/) and validates against its schema in CI. ## Key terms Short definitions. Section 3 holds the normative rules. - **Moment**: A time range on one video, named `arv:{asset_id}#t={start_ms},{end_ms}`. An agent may ask for any range. The origin may snap it to a clean edge and returns the range it applied. The snapped range is the identity. - **Evidence**: Typed spans inside a moment (transcript, on-screen text, shot caption or visual) that show why the moment answers a question. Every span lies fully inside the range. - **Rights summary**: The public rights for one moment: whether an agent may show it, embed the source or quote it, for how long, and whether it needs a linked account or payment. - **Playback descriptor**: What a player needs to start a moment: a start time, optional cue points and sources. Only a playback call returns it. It never appears in search or other discovery. - **Usage receipt**: A signed record that an agent served a moment, under which rights policy, with the citation it showed. - **Manifest**: The JSON file at `/.well-known/arv`. It names the conformance level, license, keys, tool profiles and catalogs. Validators and agents start here. - **Catalog**: A JSON list of assets and their published moments, usually at `/arv.json`. The manifest points to it. - **Conformance level**: How much of ARV an origin implements. L1 is crawl-readable, L2 is agent-callable, L3 adds rights and a ledger. - **Origin**: The site that publishes the video and answers for its rights. ## 1. Purpose and definition **Agent-Ready Video (ARV) is a profile that binds existing web and agent standards into one way to make video usable by AI.** A publisher that follows ARV is found by crawlers, called by agents and played by any player, with the same moment, rights and credit at each step. ARV reuses schema.org, video sitemaps, Media Fragments, RSL, AIPREF, MCP, WebMCP, NLWeb and A2A as they are. It adds only what video needs and no other standard defines: 1. Range-addressed moments. 2. Per-moment rights. 3. Typed evidence. 4. Signed, player-neutral playback. 5. Signed usage receipts. ### 1.1 One manifest, one validator, one badge No single standard covers video end to end. Without ARV, a publisher reads nine specs and still has no way to say "these 40 seconds may be shown, quoted up to 15 seconds, with credit, and here is proof they were used". ARV packages the answer as three things: - **One manifest.** `/.well-known/arv` names the conformance level, the license, the keys, the tool profiles and the catalogs. Every other surface is reachable from it. - **One validator.** `arv validate https://example.com` runs every check in [section 5](https://agentreadyvideo.org/spec/1.0#conformance) and prints pass or fail per standard. - **One badge.** "ARV L1", "ARV L2" or "ARV L3", earned only by a green validator run, with a dated report URL. ### 1.2 What ARV adds to each standard - Standard | What it covers | What ARV adds | When it applies - schema.org `VideoObject`, `Clip`, `SeekToAction` | Video and chapter metadata for search engines | Clip `@id` equals the moment URI; a Clip appears only when the rights allow segment display | Crawl time - W3C Media Fragments (`#t=start,end`) | Addressing a time range in a media URL | The snapped range is the identity, with millisecond precision in the URI | Crawl, inference, playback - Video sitemaps, MRSS | Listing videos for crawlers and feeds | Per-moment entries and a link to the manifest | Crawl time - llms.txt | A plain guide for language models | Fixed section order that points at the manifest and tools | Crawl time - IndexNow | Push notice of changed URLs | Push when a moment or its rights change, not only when a page changes | Crawl time - RSL 1.0 | Machine-readable license and payment terms | Per-moment video terms (clip, segment display, source embed, quote limits) | Crawl time, inference time - IETF AIPREF (`Content-Usage`) | Train, AI-use and search preferences | Header derived from the same rights record as RSL, so they never disagree | Crawl time - MCP and MCP Apps | Agent tool calls and in-chat UI | Origin tool profile with fixed names and shapes; forbidden-field rule | Inference time - WebMCP (`document.modelContext`) | Tools a page exposes to an in-browser agent | Page profile: three tools plus an optional ask tool | Inference time - NLWeb | `/ask` returning schema.org items | Items are Clips with moment URIs | Inference time - A2A agent card | Agent-to-agent discovery | Card skills map to the MCP origin profile | Inference time - JSON Schema, JWS, JWKS | Shape validation, signatures, key sets | Versioned `$id` URLs; signed playback tokens and receipts | All - HLS, DASH, MP4, iframe players | Delivery and players | Player-neutral descriptor with a start for each source | Playback ### 1.3 Name The full name is **Agent-Ready Video**. The short form is **ARV**. Use the full name first on every page, because the short form alone is ambiguous in search. The URI scheme is `arv:` and the version field is `"arv"`. ## 2. Scope ARV defines formats and behavior at the edge of a video origin: what it publishes for crawlers, what its tools accept and return, what a player receives, and what a receipt proves. The format is open. How well a publisher fills it is up to the publisher. ### 2.1 In scope - The objects in [section 3](https://agentreadyvideo.org/spec/1.0#objects) and their JSON Schemas. - How those objects appear in each bound standard ([section 4](https://agentreadyvideo.org/spec/1.0#bindings)). - The conformance checks and the badge ([section 5](https://agentreadyvideo.org/spec/1.0#conformance)). - Optional entitlement and payment fields, so an origin can say that a moment needs a linked account or a payment before playback. - An evaluation method for moment quality: range overlap with a reviewed answer, evidence inside the range, honest grades, and playable at the stated start. ### 2.2 Out of scope - How a producer finds moments, grades evidence or ranks results. - Models, prompts and processing pipelines. - Billing systems, entitlement systems and commercial terms between parties. ARV only carries the signals (section 3.3) and the references (section 3.5). ### 2.3 The moment is an address, not a pre-cut list The agent on the user's side decides what the moment is. ARV lets it name any range on any asset and get the same rights, playback and receipt for it. - A moment is `{asset_id, start_ms, end_ms}` with a recomputable id ([section 3.2](https://agentreadyvideo.org/spec/1.0#moment)). - Published moments (chapters, shots, evidence-backed ranges) are suggestions the origin offers. An agent MAY ignore them. - `get_rights`, `play_moment` and `record_usage` MUST accept any range on a published asset. - The origin MAY snap or cap the range, for example to a sentence edge or to a rights limit. It MUST return the range it actually applied, and that range is the moment's identity. Chapters, shots and spans are all moments. The spec does not care how a range was found. ## 3. Core objects Each object has a JSON Schema (draft 2020-12) at `https://agentreadyvideo.org/schema/1.0/.schema.json`. The source files are in [`schemas/1.0/`](https://agentreadyvideo.org/schema/1.0/). Every object carries `"arv": "1.0"`. Objects MAY carry fields this spec does not define. Consumers MUST ignore fields they do not understand. ### 3.1 Asset One video as published by an origin. Schema: [`asset.schema.json`](https://agentreadyvideo.org/schema/1.0/asset.schema.json). - `id` MUST be unique within the publishing origin. - `duration_ms` MUST be present. Every moment on the asset lies inside it. - `content_hash` SHOULD be present, as `sha256:` plus lowercase hex. - `c2pa` MAY point to Content Credentials for the asset. - Vendor data MUST live under `extensions`, keyed by a reverse-domain name such as `com.example`. Core fields MUST NOT carry vendor-specific values. Example: [`examples/1.0/asset.json`](https://agentreadyvideo.org/examples/1.0/asset.json) Example (https://agentreadyvideo.org/examples/1.0/asset.json): ```json { "arv": "1.0", "id": "vid_8f2c", "title": "Tuning a carburettor", "duration_ms": 1284000, "language": "en", "content_hash": "sha256:9b1e...", "creator": { "id": "cr_12", "name": "Example Garage", "url": "https://example.com" }, "page_url": "https://example.com/videos/carb", "c2pa": { "credentials_url": "https://example.com/c2pa/vid_8f2c" }, "extensions": { "com.mux": { "playback_id": "abc" } } } ``` ### 3.2 Moment A time range on an asset. Its identity is the canonical range after snapping. Two producers that snap to the same range name the same moment. Schema: [`moment.schema.json`](https://agentreadyvideo.org/schema/1.0/moment.schema.json). - `start_ms` and `end_ms` MUST satisfy `0 <= start_ms < end_ms <= duration_ms`. - `moment_uri` MUST equal `arv:{asset_id}#t={start_ms},{end_ms}`. - `id` MUST equal `mom_` followed by the first 26 characters of the lowercase RFC 4648 base32 encoding (no padding) of SHA-256 over the UTF-8 string `{origin}|{asset_id}|{start_ms}|{end_ms}`. `origin` is the ASCII serialization of the publishing origin, for example `https://example.com`. Anyone can recompute it. - `moment_url` SHOULD be an https deep link that opens the video at `start_ms`, using Media Fragments in seconds (`#t=12.4,31`) or the player's own start parameter. - `snap` names the rule the origin used: `shot`, `sentence`, `word`, `silence` or `rights_cap`. Omit it when the producer does not know. - `evidence` is a list of typed spans: `transcript`, `on_screen_text`, `shot_caption` or `visual`. Each span MUST lie fully inside the moment range. - `evidence_grade`: **A** human-verified; **B** machine-produced and passed the ARV evaluation method; **C** machine-produced with at least one direct span inside the range; **D** metadata or inference only. - `confidence` carries a `score` from 0 to 1 and a `band` (`low`, `medium` or `high`). - `aliases` MAY list earlier ids for the same moment, so old references keep resolving. `end_ms` stays on the moment. It governs rights, quote limits and receipts. Players do not enforce it (section 3.4). Example: [`examples/1.0/moment.json`](https://agentreadyvideo.org/examples/1.0/moment.json). Its `id` is computed with origin `https://example.com`. Example (https://agentreadyvideo.org/examples/1.0/moment.json): ```json { "arv": "1.0", "id": "mom_rg2e4kdenkmkzilboihacumshn", "moment_uri": "arv:vid_8f2c#t=12400,31000", "moment_url": "https://example.com/videos/carb#t=12.4,31", "asset_id": "vid_8f2c", "start_ms": 12400, "end_ms": 31000, "snap": "sentence", "title": "Setting the idle mixture screw", "evidence": [ { "type": "transcript", "start_ms": 12900, "end_ms": 18200, "text": "Turn the mixture screw a quarter turn out", "confidence": 0.93 }, { "type": "shot_caption", "start_ms": 14000, "end_ms": 22000, "text": "Close-up of a screwdriver on the idle screw", "confidence": 0.81 } ], "evidence_grade": "C", "confidence": { "score": 0.84, "band": "high" }, "aliases": [ "amt_2b7c..." ] } ``` ### 3.3 RightsSummary The public rights for one moment. Terms use RSL 1.0 words where RSL has one, and the `arv:` extension namespace where it does not. Schema: [`rights-summary.schema.json`](https://agentreadyvideo.org/schema/1.0/rights-summary.schema.json). - `rsl` tokens MUST be RSL 1.0 words. - `aipref` MUST be derived from the same rights record as `rsl`. The two MUST NOT disagree. - `video` holds the video terms: `segment_display`, `source_embed_display`, `full_video_display`, `clip` and `quote_max_ms`. An absent `source_embed_display` means false. - `policy_version` MUST change whenever any term changes. - `expires_at` says how long a consumer may rely on this summary. - Finer terms (agent scope, territory, tiers) are an L3 concern and live behind tools, not in this public summary. Example: [`examples/1.0/rights-summary.json`](https://agentreadyvideo.org/examples/1.0/rights-summary.json) Example (https://agentreadyvideo.org/examples/1.0/rights-summary.json): ```json { "arv": "1.0", "moment_uri": "arv:vid_8f2c#t=12400,31000", "rsl": { "permits": [ "search", "ai-input", "ai-index" ], "prohibits": [ "ai-train" ], "payment": "attribution" }, "aipref": "train-ai=n, ai-use=y, search=y", "video": { "segment_display": true, "source_embed_display": true, "full_video_display": false, "clip": false, "quote_max_ms": 15000 }, "attribution_required": true, "policy_version": 7, "expires_at": "2026-09-24T00:00:00Z", "license_url": "https://example.com/license.xml", "entitlement": { "required": false, "kind": "none" }, "payment": { "required": false, "model": "free" } } ``` #### 3.3.1 Entitlement and payment A RightsSummary MAY carry `entitlement` and `payment`, so discovery can say "this needs a linked account" or "this costs money" before playback is requested. The PlaybackDescriptor (3.4) carries the same two objects with the same shapes. Both are defined in 1.0. Implementing them is optional. `entitlement`: - `required` (boolean, required). - `kind` (required): `none`, `account_link`, `subscription` or `purchase`. - `link_url` (optional): https URL where the user links an account or buys. - `provider` (optional): a string naming the entitlement provider. `payment`: - `required` (boolean, required). - `model` (required): `free`, `per_use`, `per_view` or `subscription`. - `amount` (optional): `currency` as an ISO 4217 code and `minor_units` as an integer, for example cents. - `methods` (optional): strings naming accepted payment methods, for example `http-402`, `ap2` or `wallet`. - `challenge_url` (optional): https URL of the payment or entitlement challenge. Rules: - All URLs in these objects MUST use https. - A conforming L3 origin that sets `required: true` in either object MUST answer a playback token request that lacks the entitlement or payment with HTTP 402 or 403. The response MUST carry the `challenge_url` (for an entitlement without one, the `link_url`). - An absent object means the origin makes no claim. It does not mean free. A restricted moment that needs account linking: [`examples/1.0/rights-summary-account-link.json`](https://agentreadyvideo.org/examples/1.0/rights-summary-account-link.json) Example (https://agentreadyvideo.org/examples/1.0/rights-summary-account-link.json): ```json { "arv": "1.0", "moment_uri": "arv:vid_8f2c#t=12400,31000", "rsl": { "permits": [ "search", "ai-input", "ai-index" ], "prohibits": [ "ai-train" ], "payment": "attribution" }, "aipref": "train-ai=n, ai-use=y, search=y", "video": { "segment_display": true, "source_embed_display": false, "full_video_display": false, "clip": false, "quote_max_ms": 15000 }, "attribution_required": true, "policy_version": 7, "expires_at": "2026-09-24T00:00:00Z", "license_url": "https://example.com/license.xml", "entitlement": { "required": true, "kind": "account_link", "link_url": "https://example.com/account/link?moment=vid_8f2c", "provider": "example-garage-members" }, "payment": { "required": false, "model": "free" } } ``` ### 3.4 PlaybackDescriptor What a player needs to start a moment. It is player neutral and is returned only by a playback call, never by discovery. Schema: [`playback-descriptor.schema.json`](https://agentreadyvideo.org/schema/1.0/playback-descriptor.schema.json). - `start_ms` MUST be present. The player starts there. - `cue_points` MAY list more start times in milliseconds, for example the steps of a multi-step answer. - `end_ms` MAY be present and is advisory only. Players MUST NOT stop at it by default. Playback continues past the moment so the viewer stays with the video. The moment's end still governs rights, quote limits and receipts. - Each entry in `sources` names a `kind` (`hls`, `dash`, `mp4` or `embed`), a `provider`, and how to start it: a `token_ref` plus `start_ms`, or an `embed_url` plus the player's own `start_param`. Sources carry a start, never an end. - `token_ref` is exchanged at the origin for a short-lived URL. A signed media URL MUST NOT appear in any cached or crawlable response. - `token.expires_at` MUST be no more than 15 minutes after issue. - `entitlement` and `payment` MAY be present, with the shapes and rules in 3.3.1. Example: [`examples/1.0/playback-descriptor.json`](https://agentreadyvideo.org/examples/1.0/playback-descriptor.json) Example (https://agentreadyvideo.org/examples/1.0/playback-descriptor.json): ```json { "arv": "1.0", "moment_uri": "arv:vid_8f2c#t=12400,31000", "start_ms": 12400, "end_ms": 31000, "cue_points": [ 22000 ], "sources": [ { "kind": "hls", "provider": "mux", "token_ref": "ptk_91", "start_ms": 12400 }, { "kind": "embed", "provider": "youtube", "embed_url": "https://www.youtube.com/embed/abc", "start_param": "start=12" } ], "poster": "https://example.com/poster/vid_8f2c.jpg", "captions": [ { "lang": "en", "url": "https://example.com/cc/vid_8f2c.vtt" } ], "token": { "ref": "ptk_91", "jws_kid": "k-2026-09", "expires_at": "2026-09-23T12:10:00Z", "scope": "segment" }, "entitlement": { "required": false, "kind": "none" }, "payment": { "required": false, "model": "free" } } ``` ### 3.5 UsageReceipt A signed record that an agent served a moment. Schema: [`usage-receipt.schema.json`](https://agentreadyvideo.org/schema/1.0/usage-receipt.schema.json). - `moment_uri` and `moment_id` MUST resolve to a moment at the origin. - `action` names what was done, using the terms in the RightsSummary, for example `segment_display`. - `policy_version` MUST be the rights policy in force when the moment was served. - `jws` MUST be a compact JWS over the receipt, verifiable with a key from the origin's `jwks_url`. - `payment_ref` and `entitlement_ref` MAY point at what paid for or unlocked the use. Both are defined in 1.0 and optional to implement. Example: [`examples/1.0/usage-receipt.json`](https://agentreadyvideo.org/examples/1.0/usage-receipt.json) Example (https://agentreadyvideo.org/examples/1.0/usage-receipt.json): ```json { "arv": "1.0", "receipt_id": "rcp_5x", "moment_uri": "arv:vid_8f2c#t=12400,31000", "moment_id": "mom_rg2e4kdenkmkzilboihacumshn", "action": "segment_display", "served_to": { "agent": "chatgpt", "surface": "chat" }, "policy_version": 7, "served_at": "2026-09-23T12:00:04Z", "citation": "Example Garage, Tuning a carburettor, 0:12", "jws": "eyJhbGciOiJFUzI1NiIsImtpZCI6ImstMjAyNi0wOSJ9...", "entitlement_ref": "ent_free_public" } ``` ### 3.6 Manifest Served at `/.well-known/arv` as JSON. It is the entry point for every validator and agent. Schema: [`manifest.schema.json`](https://agentreadyvideo.org/schema/1.0/manifest.schema.json). - `conformance_level` is the level the publisher claims: `L1`, `L2` or `L3`. A claim counts only with a current validator report. - `catalogs` lists one or more catalog URLs. - `tool_profiles` lists the declared inference surfaces: `mcp_origin`, `webmcp_page`, `nlweb` and `a2a`. Omit what you do not offer. - `jwks_url` is REQUIRED at L3. - `schema` SHOULD point to the manifest schema for the version in use. - `entitlement_url` MAY name where users link accounts or manage entitlements for the origin. `payment_terms_url` MAY name the origin's payment terms. Both MUST use https. Example: [`examples/1.0/manifest.json`](https://agentreadyvideo.org/examples/1.0/manifest.json) Example (https://agentreadyvideo.org/examples/1.0/manifest.json): ```json { "arv": "1.0", "conformance_level": "L2", "publisher": { "name": "Example Garage", "contact": "agents@example.com" }, "license_url": "https://example.com/license.xml", "jwks_url": "https://example.com/.well-known/jwks.json", "catalogs": [ "https://example.com/arv.json" ], "tool_profiles": { "mcp_origin": { "url": "https://example.com/mcp", "version": "1.0" }, "webmcp_page": { "adapter": "https://example.com/webmcp/v1/adapter.js", "version": "1.0" }, "nlweb": { "ask": "https://example.com/ask" }, "a2a": { "card": "https://example.com/.well-known/agent-card.json" } }, "validator_report": "https://agentreadyvideo.org/validator/r/example.com/2026-09-23", "schema": "https://agentreadyvideo.org/schema/1.0/manifest.schema.json", "entitlement_url": "https://example.com/account/link", "payment_terms_url": "https://example.com/terms/payment" } ``` ### 3.7 Catalog A list of assets and their published moments, usually at `/arv.json`. Schema: [`catalog.schema.json`](https://agentreadyvideo.org/schema/1.0/catalog.schema.json). - `origin` is the publishing origin. It is the `origin` in every moment id preimage. - Every asset MUST validate as an Asset. Every moment MUST validate as a Moment and reference an asset in the same catalog or in another catalog the manifest lists. Example: [`examples/1.0/catalog.json`](https://agentreadyvideo.org/examples/1.0/catalog.json) ## 4. Bindings How ARV objects appear inside the standards it binds. Section 1.2 lists them all. ### 4.1 Crawl time - **schema.org.** JSON-LD `VideoObject` with `hasPart` `Clip` items. Clip `@id` MUST equal `moment_uri`. Clip `url` MUST equal `moment_url`. A Clip MUST NOT be emitted for a moment whose rights do not allow `segment_display`. `SeekToAction` SHOULD be emitted only when the rights allow public playback of the full video. - **Sitemaps and MRSS.** Video sitemap and MRSS entries per asset, with `` to the manifest. - **llms.txt.** Sections in this order: what this is, manifest, tools, license, example questions. - **IndexNow.** Publishers SHOULD push when a moment or its rights change, not only when a page changes. - **RSL.** A `License:` line in robots.txt, and `Link: ; rel="license"; type="application/rsl+xml"` on pages and on the catalog. Tokens MUST be RSL 1.0 words. - **AIPREF.** A `Content-Usage` header from the same rights record as RSL. The AIPREF vocabulary is still an IETF draft. ARV cites it as informative, and the validator pins the tokens it accepts. ### 4.2 Inference time - **MCP origin profile.** Tool names: `search_moments`, `get_moment`, `get_rights`, `play_moment`, `record_usage`, plus `search` and `fetch` for clients that only speak those two. A server MAY declare other names as aliases. MCP Apps UI is optional and declared with `_meta.ui.resourceUri` and `ui.csp`. - **WebMCP page profile.** Three tools on `document.modelContext`: `search_this_catalog`, `get_moment_context` and `play_moment`, with `ask_this_video` optional. Results use a short-lived `moment_ref`. The page rechecks rights before it returns context or starts playback. - **NLWeb.** `/ask` returns an `ItemList`. Items are `Clip` objects with `isPartOf` the `VideoObject`, and each carries `moment_uri`. - **A2A.** Agent card at `/.well-known/agent-card.json`, with skills mapped one to one to the MCP origin profile. `get_rights`, `play_moment` and `record_usage` accept any range on a published asset, not only published moments (section 2.3). #### Forbidden-field rule (normative) Discovery responses (search, list, ask, JSON-LD, feeds, sitemaps, llms.txt) MUST NOT carry `playback_url`, `stream_url`, `playback_token`, or any manifest or media URL that plays without an origin check. Discovery finds moments. Only a playback call starts them. The validator fails L1 or L2 on any hit. ### 4.3 Playback The descriptor is enough for a small adapter per player, under 100 lines, that maps `start_ms` and any `cue_points` to the player's own API. Examples: a plain `