Guide · async
Search your transcriptions
Find transcriptions by words in their name or link, site, language, kind, tag and date, keep the shared ones, and play each with its share code.
GET /v1/transcriptions takes the same filters as the dashboard's search: give any of them and every one must match. The server filters before it pages, so total is the number of matches and nextCursor pages through matches only.
Filter the list
Parameter Keeps qEvery word in the name, the source's name or its link, in any case: q=team meetingsiteLinks from that site, by its id: youtube,vimeo,loom,soundcloud,twitch…languageThat spoken language, set or detected: en,es…kindfile(an upload),link(a URL) orlive(a microphone or a stream)tagThat tag, by its id or its name ( tags.list)originWhere it was made: dashboard,api,extension…broadcastThe live transcriptions feeding that broadcast, by its id createdAfter,createdBeforeAn RFC 3339 time, or a YYYY-MM-DDdate for the whole day (UTC)lifecycleactive(the default),archivedorallGET /v1/transcriptions?q=interview&site=youtube&language=en&createdAfter=2026-01-01is every English YouTube interview made this year. A value that does not parse (akindofvideo, a date ofyesterday) is400 invalid_options. In the SDKs,list()reads every page of matches andlistPage()reads one.Keep the shared ones
shared=truekeeps the transcriptions with a live share link, and each one carriesshareCode, the code of its newest link.shared=falsekeeps those with none. A transcription gets a share link when it is created withshareLink: true, from the dashboard's Share button, or fromPOST /v1/transcriptions/{id}/share-links. A revoked link no longer counts.Play them
A share code plays in the open-source
@vocalstack/playerwith no key, so the page that lists your videos needs no credential. Call the API on your server, where the API key stays, and send the page only the codes:import { VocalStackPlayer } from '@vocalstack/player' import '@vocalstack/player/style.css' export function Videos({ codes }: { codes: string[] }) { return codes.map((code) => <VocalStackPlayer key={code} id={code} />) }Anyone with a share code can open that transcript at
/v1/shares/{code}: share only what you mean to publish.
TypeScript SDK
import { VocalStack } from '@vocalstack/js-sdk';
const vs = new VocalStack({ baseUrl: 'https://api.vocalstack.com', apiKey: process.env.VOCALSTACK_API_KEY });
const page = await vs.transcriptions.listPage({ q: 'interview', site: 'youtube', language: 'en', createdAfter: '2026-01-01', limit: 20 });
console.log(`${page.total} match`);
const videos = await vs.transcriptions.list({ shared: true, q: 'interview', site: 'youtube' });
const codes = videos.map((v) => v.shareCode!);
console.log(codes);
Python SDK
import asyncio
import os
from vocalstack import VocalStack
async def main() -> None:
async with VocalStack("https://api.vocalstack.com", api_key=os.environ["VOCALSTACK_API_KEY"]) as vs:
page = await vs.transcriptions.list_page(q="interview", site="youtube", language="en", created_after="2026-01-01", limit=20)
print(f"{page.total} match")
videos = await vs.transcriptions.list(shared=True, q="interview", site="youtube")
codes = [v.share_code for v in videos]
print(codes)
asyncio.run(main())
PHP SDK
<?php
require 'vendor/autoload.php';
use VocalStack\VocalStack;
$vs = new VocalStack(apiKey: getenv('VOCALSTACK_API_KEY'), baseUrl: 'https://api.vocalstack.com');
$page = $vs->transcriptions->listPage(q: 'interview', site: 'youtube', language: 'en', createdAfter: '2026-01-01', limit: 20);
echo $page['total'], " match\n";
$videos = $vs->transcriptions->list(shared: true, q: 'interview', site: 'youtube');
$codes = array_column($videos, 'shareCode');
echo implode("\n", $codes), "\n";
HTTP + WebSocket
#!/usr/bin/env bash
set -euo pipefail
API=https://api.vocalstack.com
AUTH="Authorization: Bearer $VOCALSTACK_API_KEY"
curl -sSfG "$API/v1/transcriptions" -H "$AUTH" \
--data-urlencode "q=interview" -d site=youtube -d language=en -d createdAfter=2026-01-01 -d limit=20 | jq .total
curl -sSfG "$API/v1/transcriptions" -H "$AUTH" -d shared=true --data-urlencode "q=interview" -d site=youtube > shared.json
jq -r '.transcriptions[].shareCode' shared.json