ViewStream
Integrations · for developers and agencies

Connect ViewStream to your site, apps and systems.

Everything in ViewStream is available outside Studio. Embed the player with one tag. Build your own website or app on the Sites Delivery API. Read catch-up, AI summaries, presenters and subtitles over the REST API. React to events with signed webhooks. Publish shows as podcasts. Connect AI assistants over MCP. The examples below are copy-and-paste starting points; replace the placeholders acme, <channel-id> and $VS_KEY with your own values.

1 · Embed the player

A player on any page, in one line.

Studio builds these snippets for you: open a channel, video or clip and choose Embed & share. Branding, skin, language, ads and allowed domains come from the player configuration you edit in Studio, so a change there reaches every page within about a minute.

iframe

The simplest embed. Works in any CMS. Options: autoplay=1 (muted), start=<seconds>, lang=he|en|ru|ar, config=<name>.

<iframe src="https://player.viewstream.co.il/e/acme/live/main"
        allow="autoplay; fullscreen; picture-in-picture" allowfullscreen
        style="aspect-ratio:16/9;width:100%;border:0"></iframe>

<!-- a video or a clip -->
<iframe src="https://player.viewstream.co.il/e/acme/vod/<asset-id>" …></iframe>
<iframe src="https://player.viewstream.co.il/e/acme/clip/<clip-id>" …></iframe>

Player tag

The player inside your page, with access to its events. Several players on one page load the player code once.

<script async src="https://player.viewstream.co.il/embed.js"
        data-src="https://cdn.example.net/live/acme/main/master.m3u8"
        data-tenant="acme"
        data-config="news"
        data-lang="he"></script>

<script>
document.addEventListener('vs:ready', function (e) {
  var player = e.detail.player;   // a Video.js player
  player.on('play',  function () { /* … */ });
  player.on('ended', function () { /* … */ });
});
</script>

Share links (https://player.viewstream.co.il/w/acme/live/main) open a hosted watch page with social preview tags. Protected content: the player fetches signed URLs by itself, or your backend signs them with POST /v1/playback/tokens.

2 · Headless sites

Your own front end, our content.

The Sites Delivery API serves everything a ViewStream site shows: pages, shows, episodes with AI summaries and presenters, the guide, catch-up, search and sitemaps. It is public and cached, needs no key, and answers JSON with CORS, so you can call it from the browser, Next.js or a mobile app.

Read a show and its episodes

Base: https://api.viewstream.co.il/s/v1/<site>/. The site slug is in Studio → Sites.

# the site: theme, menus, player settings
curl -s https://api.viewstream.co.il/s/v1/acme/config

# what a path is (page, show, video, programme …)
curl -s "https://api.viewstream.co.il/s/v1/acme/route?path=/show/evening-news"

# one show, with episodes, summaries and presenters
curl -s https://api.viewstream.co.il/s/v1/acme/entities/show/evening-news

# today's guide with catch-up and start-over links
curl -s "https://api.viewstream.co.il/s/v1/acme/epg?channel=main&day=2026-10-06"

# Hebrew-aware search over shows, videos and catch-up
curl -s -G https://api.viewstream.co.il/s/v1/acme/search --data-urlencode "q=תקציב"

Or drop in ready-made components

Web components render rails, the live hero, the guide, catch-up and the player in your site's theme. Hebrew and right-to-left first; add lang="en" for English.

<script type="module"
  src="https://player.viewstream.co.il/sdk/[email protected]"></script>

<vs-hero          site="acme" channel="main"></vs-hero>
<vs-rail          site="acme" path="/" section="1"></vs-rail>
<vs-catchup-days  site="acme" channel="main" days="3"></vs-catchup-days>
<vs-epg           site="acme" channel="main"></vs-epg>
<vs-player        site="acme" channel="main"></vs-player>

Live demo: player.viewstream.co.il/sdk/demo.html

3 · REST API

Catch-up, summaries and subtitles for every programme.

Create an API key in Studio → Integrations → API keys, give it only the scopes it needs, and send it as a bearer token. The same API runs Studio itself: uploads, clips, channels, the guide, statistics and raw data export.

export VS_KEY=vs_xxxxxxxx_…               # never in browser code: call the API from your backend
API=https://api.viewstream.co.il/v1
H=(-H "Authorization: Bearer $VS_KEY")

Catch-up: list and search

Scope channels:read. Play play_start–play_end: the programme's real start and end, found by AI, not the guide times.

# your channels and their ids
curl -s "$API/channels" "${H[@]}"

# programmes of one day
curl -s "$API/channels/<channel-id>/catchup?from=2026-10-05T00:00:00Z&to=2026-10-06T00:00:00Z" "${H[@]}"

# search titles, guide text and AI summaries
curl -s -G "$API/channels/<channel-id>/catchup/search" \
     --data-urlencode "q=ריבית" "${H[@]}"

AI summary and presenters

Scope assets:read. A Hebrew summary, verified presenters and topics for a programme.

curl -s "$API/programmes/<programme-id>/summary" "${H[@]}"
{
  "status": "ready",
  "summary": "…",
  "presenters": ["…"],
  "presenters_source": "series",
  "topics": ["…", "…"],
  "words": 104,
  "updated_at": "2026-10-06T18:12:40Z"
}

Subtitles

Scope assets:read. Every subtitle language of a programme, video or clip, each with a ready-to-use WebVTT file, or the timed cues as JSON.

# languages, status and the WebVTT URL of each track
curl -s "$API/subtitles/subjects/<programme-id>" "${H[@]}" \
  | jq '.languages[] | {lang, status, vtt: .track.vtt_url}'

# the cues of one track as JSON
curl -s "$API/subtitles/tracks/<track-id>/cues" "${H[@]}"

The same in JavaScript

From your server (Node 18 or later, no libraries).

const API = 'https://api.viewstream.co.il/v1';
const vs = (path) => fetch(API + path, {
  headers: { Authorization: `Bearer ${process.env.VS_KEY}` },
}).then((r) => r.ok ? r.json() : Promise.reject(r.status));

const { items } = await vs(`/channels/${channelId}/catchup`);
for (const p of items.filter((p) => p.status === 'recorded')) {
  const s = await vs(`/programmes/${p.id}/summary`);
  console.log(p.title, s.presenters.join(', '), s.summary);
}

Errors are application/problem+json. Rate limits answer 429 with Retry-After. The full reference, with every field, is in the API documentation.

4 · Webhooks

Know the moment something happens.

Get a signed HTTPS POST when a video is ready, a clip is final, a programme starts, a feed changes or an alert fires. Deliveries are retried and can be redelivered from Studio → Integrations → Webhooks.

Subscribe

Scope webhooks:manage. The answer shows the signing secret once; store it.

curl -s -X POST "$API/webhooks" "${H[@]}" \
  -H "Content-Type: application/json" \
  -d '{"url": "https://cms.example.com/vs-hook",
       "events": ["asset.ready", "clip.ready", "channel.programme_started"]}'
// what you receive
POST /vs-hook
X-VS-Event: asset.ready
X-VS-Timestamp: 1791295200
X-VS-Signature: sha256=…

{"id": "…", "type": "asset.ready", "at": "2026-10-06T08:00:00Z", "data": {…}}

Verify the signature (Node)

HMAC-SHA256 of <timestamp>.<raw body>. Verify before you parse the body, and reject old timestamps.

import crypto from 'node:crypto';

export function verify(secret, rawBody, ts, sig) {
  if (Math.abs(Date.now() / 1000 - Number(ts)) > 300) return false;
  const want = 'sha256=' + crypto.createHmac('sha256', secret)
    .update(`${ts}.`).update(rawBody).digest('hex');
  return want.length === sig.length &&
    crypto.timingSafeEqual(Buffer.from(want), Buffer.from(sig));
}
5 · Podcasts

Every show can also be a podcast.

Mark a show as a podcast in Studio → Sites, and ViewStream prepares an audio version of each episode and publishes a standard RSS feed with its cover, description and episodes. Submit the feed once to Apple Podcasts, Spotify or YouTube Music, and new episodes appear there by themselves. The video episodes stay on your site.

https://<your-site-domain>/podcast/<show-slug>/feed.xml
https://api.viewstream.co.il/s/v1/acme/podcast/<show-slug>/feed.xml
6 · AI assistants

Ask your platform in plain language.

ViewStream has an MCP server, so Claude, Cursor and other AI assistants can use the platform with your API key and its scopes: “what is on air on all channels right now?”, “find yesterday's interview about the budget and make a 60-second clip”. The assistant can also read the documentation, in English and Hebrew.

Claude Code

claude mcp add --transport http viewstream \
  https://api.viewstream.co.il/mcp \
  --header "Authorization: Bearer <key>"

Cursor and other clients

{
  "mcpServers": {
    "viewstream": {
      "url": "https://api.viewstream.co.il/mcp",
      "headers": { "Authorization": "Bearer <key>" }
    }
  }
}

Give an assistant its own key with read-only scopes unless it should change things. Every call it makes is in the audit log.

For AI agents: all 17 tools and their scopes, setup for Claude Code, Cursor and Claude Desktop, and machine-readable docs (llms.txt) are on the Developers page.

7 · Next.js and Vercel

A video site on Vercel in an afternoon.

@viewstream/next brings the player, typed API helpers with Next.js cache tags, a signed webhook route and direct browser uploads to any App Router site. The starter site, in Hebrew and English, has latest videos, catch-up search that opens the programme at the second something was said, AI summaries and presenters, AI articles and an upload page. Set three environment variables in Vercel and deploy.

A video page

The API key stays on the server. Pages are cached and refreshed by tag.

// app/v/[id]/page.tsx
import { createViewStream } from '@viewstream/next/server';
import { ViewStreamPlayer } from '@viewstream/next/client';

const vs = createViewStream(); // VIEWSTREAM_API_KEY, VIEWSTREAM_TENANT

export default async function Page({ params }) {
  const { id } = await params;
  const video = await vs.assets.get(id);
  return <ViewStreamPlayer tenant="acme" kind="vod" id={video.id} />;
}

Publish in Studio, the site updates

Point a webhook at this route with asset.published, clip.final and artifact.published. Signatures are checked, and the affected pages are revalidated at once.

// app/api/viewstream/webhook/route.ts
import { viewstreamWebhook } from '@viewstream/next/webhook';

export const POST = viewstreamWebhook({
  secret: process.env.VIEWSTREAM_WEBHOOK_SECRET,
});

Watch: two short tutorials (Hebrew)

1 · A video site in five minutes
2 · Deploy to Vercel, update on publish

Uploads go from the browser straight to ViewStream storage in parts with an upload-only token, so Vercel's request size limit does not apply and the key never reaches the browser.

8 · WordPress

Your WordPress site, connected in one click.

The ViewStream plugin turns new videos, final clips, AI articles and catch-up programmes into WordPress posts, adds a ViewStream video block, and uploads videos from the browser straight to ViewStream storage. Hebrew and English, no API key to copy.

1. Install

In WordPress: Plugins → Add New → Upload Plugin, choose viewstream-wordpress.zip, Install Now, then Activate. Needs WordPress 6.4 or newer and PHP 8.1 or newer.

2. Connect to ViewStream

Settings → ViewStream → Connect to ViewStream. Studio opens: sign in, pick your organisation, see exactly what the site may do and approve. You return connected; the site gets its own key (WordPress: <your site>, revocable in Studio → Integrations → API keys) and the webhook is registered for you.

3. Choose what becomes a post

Published videos, final clips, published AI articles, finished programmes. Posts are saved as drafts by default, or pending review, or published at once, with your post type, category, author and player.

4. Upload and embed

Media → ViewStream or the block: files go from the browser straight to ViewStream storage in 64 MB parts, never through your WordPress server, with progress and resume. Choose per upload whether ViewStream creates Hebrew subtitles, or set a site default. In the editor, use the ViewStream video block or [viewstream id="…" kind="vod"].

Watch: four short tutorials (Hebrew)

1 · Install the plugin
2 · Connect your account
3 · Publish automatically
4 · Upload with or without subtitles

Disconnecting in the plugin revokes its key. Uninstalling removes all plugin settings; your posts stay. Agencies that prefer a manual key can paste one under Advanced.

Building on ViewStream?

Customers and their agencies get API keys, scoped access and direct help from the team that builds the platform.