The request
string
required
Your account slug, for example
your-brand.string
required
Your own video id, URL-encoded, for example
catalog%3Avideo%3A1234. Up to 200 printable characters, no leading or trailing space. The catalog import stores this id.string
default:"json"
json: the whole block as JSON. See the Quickstart for the shape.head:text/htmlfor the page head. The JSON-LD script, the discovery link tags and, when on, the WebMCP tags.body:text/htmlfor the page body. Chapter summaries and the transcript. Empty when the rights allow neither.
404.string
Only for an unlisted account:
Bearer <account API key>. See Listed and unlisted accounts.Render it server side
Fetch the block in your server, edge function or build step, and write it into the HTML you send. Do not load it with a script in the browser. Many crawlers and AI fetchers read the HTML as sent and never run scripts, so metadata added in the browser stays invisible to them.One VideoObject per page
A page should describe its video once. If your page already renders aVideoObject, merge the block into it. Do not add a second one.
- You render no VideoObject. Put
head_html(or theformat=headresponse) in your page head as it is. - You already render a VideoObject. Use
format=json. Take the fields you lack fromjson_ld["@graph"][0], most of allhasPart(the chapters asClipitems), and add them to your own object. Keep your own@id,url,embedUrl,contentUrland player fields. Then render each ofdiscovery.linksas a<link>tag in your head.
Point chapter links at your own page
EachClip in hasPart has a url at the chapter’s start second. For a listed account it points to the AgentTV watch page. Search engines show key moments best when each Clip url is your own page, opened at that second. When you merge, rewrite each url to your page with your player’s start parameter, and keep startOffset as it is:
WebMCP tags when you merge
When WebMCP site tools are on for your account and your site is verified,head_html ends with two more tags. They are not in the JSON fields. If you merge the JSON, copy them from the format=head response into your head:
Chapters and the transcript
- Chapters come as
Clipitems in the JSON-LD, with a name, a description, and start and end offsets in seconds. - The transcript comes as
transcript.cues, each withstart_secondsandtext. It is never inside the JSON-LD. body_htmlis ready HTML with the chapter summaries and the transcript, with plain timestamps and no links. Put it in your page body, or build your own section fromtranscript.cues.
Parts
A long video often has its own structure: each match of an event, each talk of a conference, each segment of a show. AgentTV finds it from the chapters and serves it asparts. Each part is a run of the video’s chapters in a row, with its own title, description and thumbnail. Use it to lay out a long video by its structure, for example a rail of matches.
partsis[]when the video has none.- Times are in milliseconds from the start of the video.
- A
thumbnail_urlisnullwhen your rights do not allow showing the picture. - On a read with your account key, each
thumbnail_urlis a signed frame URL that is valid for about an hour. Fetch the block again for fresh URLs. Do not store them as permanent links.
Clip in hasPart, with its chapters as nested Clip items. A video with no parts keeps its chapters as flat Clip items.
Language
The block states the video’s spoken language and subtitle languages aslanguage_primary, language_source, language_confidence, subtitle_tracks and caption_languages. The JSON-LD carries them as inLanguage, subtitleLanguage and caption, and body_html sets a lang attribute on the video’s words. See Languages.
The transcript is present only when your rights allow quotes and the grant is not gated or limited to a territory. Chapter summaries show only when your rights allow summaries. See Rights and access.
Caching and traffic
A listed account’s200 comes with these headers:
- Your CDN may keep a block for 5 minutes and serve it stale for 5 more while it refreshes. A rights change reaches your pages within 10 minutes.
- Send the
ETagback asIf-None-Match. An unchanged block returns304with no body. Each format has its ownETag. - There is no purge call. To refresh at once, listen for the
video.updatedwebhook and fetch again. - Every
404isCache-Control: private, no-store. A newly published video shows on the next request. - An unlisted account’s key read is always
private, no-store. Cache it in your own server, keyed by video id, and refresh on the webhook. - A key read also has an
ETagand answers a matchingIf-None-Matchwith304. ItsETagchanges every hour, with the signed frame URLs, so a304means your cached URLs are still valid. To tell a real content change from the hourly re-signing, compare thex-agentcdn-content-versionheader. It changes only when the content changes.
When there is no block
The route returns404 with {"error": "owned_web_artifact_unavailable"}, never an empty 200, when:
- the id is unknown, or belongs to another account,
- the video is not published, or not public on a listed account,
- the video’s rights block citation,
- the
formatvalue is not one of the three above.