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.
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.
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.
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>
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.
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.
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=תקציב"
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
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")
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[@]}"
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"
}
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[@]}"
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.
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.
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": {…}}
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));
}
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
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 mcp add --transport http viewstream \ https://api.viewstream.co.il/mcp \ --header "Authorization: Bearer <key>"
{
"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.
@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.
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} />; }
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,
});
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.
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.
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.
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.
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.
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"].
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.
Every operation, field and scope, with a Hebrew switch. OpenAPI documents for download.
Skins, configurations, live demos and the full list of embed options.
Rails, hero, guide, catch-up and player components for headless sites.
Planning an integration? We will help with the design and review your first calls.
Customers and their agencies get API keys, scoped access and direct help from the team that builds the platform.