api.video - upload, encode, host, and stream video on demand and live, with immediate playback.
Bring your own key. This API needs your own api.video key - get one from the provider, add it once below, and the proxy injects it on every call. Your OmniStream plan covers the unified SDK, key storage, and proxy - the provider's own rate limits still apply to your key.
This is a community listing. If you own this API, you can request ownership.
npm install omnistream-sdkimport { OmniClient } from "omnistream-sdk";
const omni = new OmniClient({ token: process.env.OMNI_KEY! });
// One key reaches every API on the marketplace.
const data = await omni.call("apivideo/GET_analytics-live-streams-liveStreamId");One install, one key - the same client calls every API on the marketplace.
The unique identifier for the video you want the status for.
List live stream player sessions
List player session events
List video player sessions
Authenticate
Refresh token
List all live streams
/**
* apivideo - generated by OmniStream from api.video's OpenAPI spec.
* One typed method per endpoint. A single Omni key reaches the API.
*/
const DEFAULT_BASE = "https://grid.skinvaults.online/v1/proxy/apivideo";
export class apivideoError extends Error {
status: number;
code?: string;
constructor(status: number, code: string | undefined, message?: string) {
super(message || `apivideo error ${status}`);
this.name = "apivideoError";
this.status = status;
this.code = code;
}
}
export interface apivideoOptions {
baseUrl?: string;
fetch?: typeof fetch;
timeoutMs?: number;
}
export class apivideo {
/** @param token Your OmniStream key (one key for every API). */
constructor(private token: string, private opts: apivideoOptions = {}) {
if (!token) throw new Error("apivideo: token is required");
}
rateLimit: { remainingMinute?: number; remainingDay?: number } | null = null;
private async _request(method: string, path: string, { params, body }: { params?: Record<string, unknown>; body?: unknown } = {}): Promise<any> {
const f = this.opts.fetch ?? globalThis.fetch;
const url = new URL((this.opts.baseUrl ?? DEFAULT_BASE).replace(/\/+$/, "") + path);
if (params) for (const [k, v] of Object.entries(params)) if (v != null) url.searchParams.set(k, String(v));
const headers: Record<string, string> = { "x-omni-key": this.token };
if (body !== undefined) headers["content-type"] = "application/json";
const res = await f(url, { method, headers, body: body !== undefined ? JSON.stringify(body) : undefined });
this.rateLimit = {
remainingMinute: Number(res.headers.get("x-ratelimit-remaining-minute")) || undefined,
remainingDay: Number(res.headers.get("x-ratelimit-remaining-day")) || undefined,
};
const data = await res.json().catch(() => ({}));
if (!res.ok) throw new apivideoError(res.status, data?.error?.code, data?.error?.message);
return data.data ?? data;
}
/** List live stream player sessions */
gETAnalyticsLiveStreamsLiveStreamId(params: { "liveStreamId": string; "period"?: string; "currentPage"?: number; "pageSize"?: number }): Promise<any> {
return this._request("GET", "/analytics/live-streams/{liveStreamId}", { params });
}
/** List player session events */
gETAnalyticsSessionsSessionIdEvents(params: { "sessionId": string; "currentPage"?: number; "pageSize"?: number }): Promise<any> {
return this._request("GET", "/analytics/sessions/{sessionId}/events", { params });
}
/** List video player sessions */
gETAnalyticsVideosVideoId(params: { "videoId": string; "period"?: string; "metadata"?: unknown[]; "currentPage"?: number; "pageSize"?: number }): Promise<any> {
return this._request("GET", "/analytics/videos/{videoId}", { params });
}
/** Authenticate */
pOSTAuthApiKey(body: unknown): Promise<any> {
return this._request("POST", "/auth/api-key", { body });
}
/** Refresh token */
pOSTAuthRefresh(body: unknown): Promise<any> {
return this._request("POST", "/auth/refresh", { body });
}
/** List all live streams */
gETLiveStreams(params: { "streamKey"?: string; "name"?: string; "sortBy"?: string; "sortOrder"?: string; "currentPage"?: number; "pageSize"?: number }): Promise<any> {
return this._request("GET", "/live-streams", { params });
}
/** Create live stream */
pOSTLiveStreams(body: unknown): Promise<any> {
return this._request("POST", "/live-streams", { body });
}
/** Show live stream */
gETLiveStreamsLiveStreamId(params: { "liveStreamId": string }): Promise<any> {
return this._request("GET", "/live-streams/{liveStreamId}", { params });
}
/** Update a live stream */
pATCHLiveStreamsLiveStreamId(body: unknown, params: { "liveStreamId": string }): Promise<any> {
return this._request("PATCH", "/live-streams/{liveStreamId}", { body, params });
}
/** Delete a live stream */
dELETELiveStreamsLiveStreamId(params: { "liveStreamId": string }): Promise<any> {
return this._request("DELETE", "/live-streams/{liveStreamId}", { params });
}
/** Upload a thumbnail */
pOSTLiveStreamsLiveStreamIdThumbnail(params: { "liveStreamId": string }): Promise<any> {
return this._request("POST", "/live-streams/{liveStreamId}/thumbnail", { params });
}
/** Delete a thumbnail */
dELETELiveStreamsLiveStreamIdThumbnail(params: { "liveStreamId": string }): Promise<any> {
return this._request("DELETE", "/live-streams/{liveStreamId}/thumbnail", { params });
}
/** List all players */
gETPlayers(params: { "sortBy"?: string; "sortOrder"?: string; "currentPage"?: number; "pageSize"?: number }): Promise<any> {
return this._request("GET", "/players", { params });
}
/** Create a player */
pOSTPlayers(body: unknown): Promise<any> {
return this._request("POST", "/players", { body });
}
/** Show a player */
gETPlayersPlayerId(params: { "playerId": string }): Promise<any> {
return this._request("GET", "/players/{playerId}", { params });
}
/** Update a player */
pATCHPlayersPlayerId(body: unknown, params: { "playerId": string }): Promise<any> {
return this._request("PATCH", "/players/{playerId}", { body, params });
}
/** Delete a player */
dELETEPlayersPlayerId(params: { "playerId": string }): Promise<any> {
return this._request("DELETE", "/players/{playerId}", { params });
}
/** Upload a logo */
pOSTPlayersPlayerIdLogo(params: { "playerId": string }): Promise<any> {
return this._request("POST", "/players/{playerId}/logo", { params });
}
/** Delete logo */
dELETEPlayersPlayerIdLogo(params: { "playerId": string }): Promise<any> {
return this._request("DELETE", "/players/{playerId}/logo", { params });
}
/** Upload with an upload token */
pOSTUpload(params: { "token": string; "Content-Range"?: string }): Promise<any> {
return this._request("POST", "/upload", { params });
}
/** List all active upload tokens. */
gETUploadTokens(params: { "sortBy"?: string; "sortOrder"?: string; "currentPage"?: number; "pageSize"?: number }): Promise<any> {
return this._request("GET", "/upload-tokens", { params });
}
/** Generate an upload token */
pOSTUploadTokens(body: unknown): Promise<any> {
return this._request("POST", "/upload-tokens", { body });
}
/** Show upload token */
gETUploadTokensUploadToken(params: { "uploadToken": string }): Promise<any> {
return this._request("GET", "/upload-tokens/{uploadToken}", { params });
}
/** Delete an upload token */
dELETEUploadTokensUploadToken(params: { "uploadToken": string }): Promise<any> {
return this._request("DELETE", "/upload-tokens/{uploadToken}", { params });
}
/** List all videos */
lISTVideos(params: { "title"?: string; "tags"?: unknown[]; "metadata"?: unknown[]; "description"?: string; "liveStreamId"?: string; "sortBy"?: string; "sortOrder"?: string; "currentPage"?: number; "pageSize"?: number }): Promise<any> {
return this._request("GET", "/videos", { params });
}
/** Create a video */
pOSTVideo(body: unknown): Promise<any> {
return this._request("POST", "/videos", { body });
}
/** Show a video */
gETVideo(params: { "videoId": string }): Promise<any> {
return this._request("GET", "/videos/{videoId}", { params });
}
/** Update a video */
pATCHVideo(body: unknown, params: { "videoId": string }): Promise<any> {
return this._request("PATCH", "/videos/{videoId}", { body, params });
}
/** Delete a video */
dELETEVideo(params: { "videoId": string }): Promise<any> {
return this._request("DELETE", "/videos/{videoId}", { params });
}
/** List video captions */
gETVideosVideoIdCaptions(params: { "videoId": string; "currentPage"?: number; "pageSize"?: number }): Promise<any> {
return this._request("GET", "/videos/{videoId}/captions", { params });
}
/** Show a caption */
gETVideosVideoIdCaptionsLanguage(params: { "videoId": string; "language": string }): Promise<any> {
return this._request("GET", "/videos/{videoId}/captions/{language}", { params });
}
/** Upload a caption */
pOSTVideosVideoIdCaptionsLanguage(params: { "videoId": string; "language": string }): Promise<any> {
return this._request("POST", "/videos/{videoId}/captions/{language}", { params });
}
/** Update caption */
pATCHVideosVideoIdCaptionsLanguage(body: unknown, params: { "videoId": string; "language": string }): Promise<any> {
return this._request("PATCH", "/videos/{videoId}/captions/{language}", { body, params });
}
/** Delete a caption */
dELETEVideosVideoIdCaptionsLanguage(params: { "videoId": string; "language": string }): Promise<any> {
return this._request("DELETE", "/videos/{videoId}/captions/{language}", { params });
}
/** List video chapters */
gETVideosVideoIdChapters(params: { "videoId": string; "currentPage"?: number; "pageSize"?: number }): Promise<any> {
return this._request("GET", "/videos/{videoId}/chapters", { params });
}
/** Show a chapter */
gETVideosVideoIdChaptersLanguage(params: { "videoId": string; "language": string }): Promise<any> {
return this._request("GET", "/videos/{videoId}/chapters/{language}", { params });
}
/** Upload a chapter */
pOSTVideosVideoIdChaptersLanguage(params: { "videoId": string; "language": string }): Promise<any> {
return this._request("POST", "/videos/{videoId}/chapters/{language}", { params });
}
/** Delete a chapter */
dELETEVideosVideoIdChaptersLanguage(params: { "videoId": string; "language": string }): Promise<any> {
return this._request("DELETE", "/videos/{videoId}/chapters/{language}", { params });
}
/** Upload a video */
pOSTVideosVideoIdSource(params: { "videoId": string; "Content-Range"?: string }): Promise<any> {
return this._request("POST", "/videos/{videoId}/source", { params });
}
/** Show video status */
gETVideoStatus(params: { "videoId": string }): Promise<any> {
return this._request("GET", "/videos/{videoId}/status", { params });
}
/** Upload a thumbnail */
pOSTVideosVideoIdThumbnail(params: { "videoId": string }): Promise<any> {
return this._request("POST", "/videos/{videoId}/thumbnail", { params });
}
/** Pick a thumbnail */
pATCHVideosVideoIdThumbnail(body: unknown, params: { "videoId": string }): Promise<any> {
return this._request("PATCH", "/videos/{videoId}/thumbnail", { body, params });
}
/** List all webhooks */
lISTWebhooks(params: { "events"?: string; "currentPage"?: number; "pageSize"?: number }): Promise<any> {
return this._request("GET", "/webhooks", { params });
}
/** Create Webhook */
pOSTWebhooks(body: unknown): Promise<any> {
return this._request("POST", "/webhooks", { body });
}
/** Show Webhook details */
gETWebhook(params: { "webhookId": string }): Promise<any> {
return this._request("GET", "/webhooks/{webhookId}", { params });
}
/** Delete a Webhook */
dELETEWebhook(params: { "webhookId": string }): Promise<any> {
return this._request("DELETE", "/webhooks/{webhookId}", { params });
}
}
export default apivideo;
No reviews yet. Be the first to rate this API.
Yes. api.video uses bearer authentication, so you bring your own key from the provider. You store it once on OmniStream and the proxy injects it into every call, so your code only ever sends your Omni key.
api.video - upload, encode, host, and stream video on demand and live, with immediate playback. It exposes 46 endpoints over GET, POST, PATCH, DELETE, including GET /analytics/live-streams/{liveStreamId}, GET /analytics/sessions/{sessionId}/events, GET /analytics/videos/{videoId}.
Install the OmniStream SDK for your language and call api.video through it. The client is generated from this API's OpenAPI spec, so parameters and responses are fully typed, and the same client also calls every other API in the marketplace.
You can start on the free plan. OmniStream charges for the unified SDK, key storage and proxy rather than for api.video itself, and api.video's own rate limits still apply to your provider key.
Giphy: Search, translate, trending, and random GIFs and stickers from the GIPHY library.
Create live stream
Show live stream
Update a live stream
Delete a live stream
Upload a thumbnail
Delete a thumbnail
List all players
Create a player
Show a player
Update a player
Delete a player
Upload a logo
Delete logo
Upload with an upload token
List all active upload tokens.
Generate an upload token
Show upload token
Delete an upload token
List all videos
Create a video
Show a video
Update a video
Delete a video
List video captions
Show a caption
Upload a caption
Update caption
Delete a caption
List video chapters
Show a chapter
Upload a chapter
Delete a chapter
Upload a video
Show video status
Upload a thumbnail
Pick a thumbnail
List all webhooks
Create Webhook
Show Webhook details
Delete a Webhook