kinescope

Kinescope nodes for n8n: Speak video meeting rooms and admin links, participants, calls, recordings and transcripts, videos with download, upload by URL, editing and moving, subtitles by speech recognition, projects and folders, webhooks, any API call, an

Documentation

n8n-nodes-kinescope

n8n community nodes for Kinescope, the video hosting platform, and Speak,
its video meeting tool. An action node with 46 operations across 12 resources — Speak rooms and
signed admin links to them, participants, calls with their recordings and transcripts, restream
destinations, catalog videos with download, upload by URL, editing and moving, subtitles by speech
recognition, projects and folders, users, webhooks and signing keys, plus a Custom Request for every
other route — and a trigger that subscribes itself to Kinescope's webhooks.

Written from scratch against the official documentation
(docs.kinescope.com/api, read on 22.10.2026). No code from
any other package.

Status: 0.3.0. Every operation ran against a live Kinescope workspace, the trigger included;
the two transcript operations ran but never met a transcript. See What was checked. Where Kinescope behaves differently from its
documentation, this README says so.

Installation

In n8n: Settings → Community Nodes → Install, package name n8n-nodes-kinescope.

For a self-hosted instance without the UI installer:

cd ~/.n8n/nodes
npm install n8n-nodes-kinescope

and restart n8n.

Credentials

Kinescope API takes one API token, from Settings → API tokens in Kinescope. A token belongs to
one workspace, and Kinescope finds the workspace from the token alone, so there is nothing else to
fill in. A token pasted with Bearer in front of it works too.

The host is fixed at https://api.kinescope.io. The credential cannot be picked in an HTTP Request
node: its Allowed HTTP Request Domains setting is pinned to none, so the token cannot be sent to
another server by pointing a generic node at it. Use Custom Request for a route the other
operations lack.

Admin Link Signing Key serves Room → Get Admin Link only and needs nothing by default; see
Admin links.

Kinescope node

Resource Operations
Room Create, Get, Get Many, Update, Delete, Get Admin Link
Participant Add, Get, Get Many, Update, Remove
Call Get, Get Many, Get Recordings, Get Transcript, Download Transcript
Restream Destination Get Many, Update
Video Get, Get Many, Download, Update, Move, Upload From URL, Delete
Subtitle Generate, Get, Get Many, Download, Upload, Update, Delete
Project Create, Get, Get Many
Folder Create, Get Many
User Get Many
Webhook Create, Get Many, Update, Delete
Signing Key Register, Get Many, Delete
Custom Request Request

Room. A Speak room is a link people join by; it can host any number of meetings. Create needs an
owner, a user of the workspace — pick one from the list, which comes from GET /v1/users. That route
is not in Kinescope's reference, but it is the only one that names users, and the owner field cannot
be filled without it. The list route returns rooms with an empty link; the node fills it in from
the room code.

Waiting Room and Wait for Host can only be set when a room is created: Kinescope accepts them in an
update and changes nothing. Automatic Recording and Automatic Transcription can be changed later.

Admin links

Room → Get Admin Link signs a Speak link that lets whoever opens it into the room as admin, without
a Kinescope account: they can start recording, admit people from the waiting room, manage access.
It is the token of Kinescope's
Speak login link — RS256,
aud: speak, the room code, role: admin — signed in n8n with a private key Kinescope never sees.

There is nothing to set up. With Admin Link Signing Key on Generated by n8n, the default, n8n
makes an RSA key on the first request with the credential and keeps it in the credential, encrypted
and blanked out in the editor. The first admin link registers its public half with Kinescope, valid
for 100 years, under an ID taken from the key itself (n8n- and 16 hex digits). On n8n 2.38.5 the
key stayed the same from one execution to the next and after the credential was saved again from the
editor.

  • A copy of a credential — duplicated, or imported on another n8n — carries the same key. Two
    credentials have two keys, both registered; neither touches the other's.
  • A credential that loses its key, e.g. one created anew, gets a new one with its next request. Links
    signed before keep working: the old public key stays in Kinescope until you delete it.
  • After a leak, replace the credential first, then remove the old key with Signing Key → Delete.
    A credential still holding the key registers it again with its next admin link.

With My Own Key the node signs with a key you paste — from
openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:2048 — under an ID you choose. The first
link registers it for 100 years; Signing Key → Register sets another expiry if you run it first. A
PEM pasted into the one-line field loses its line breaks; the node puts them back.

Anyone holding an admin link is admin of that room until Valid For runs out — send it to the host,
not to a channel. Kinescope uses the same keys for stream chat tokens, telling them apart by aud.

Participant is a workspace user given a role in a room ahead of a meeting: Admin or Manager, both
need a user ID, and a user can be added once. The owner is in the room already. Update changes the
name only; Kinescope ignores a new role.

Call is one meeting held in a room. Kinescope returns little about it: its ID, the transcript ID,
created_at and updated_at. In every call observed updated_at was the moment the call ended.

  • Get Recordings finds the videos recorded during a call. Kinescope links them nowhere — a video
    has no room or call ID — so the node matches the title Kinescope gives a Speak recording,
    Record <room name> <YYYY-MM-DD HH:MM:SS>, against the room name and the call's time span. A room
    renamed after the meeting is not found this way.
  • Download Transcript works once Get Transcript reports status done, and outputs one item per
    phrase (speaker, text, start and end in seconds), talk time per speaker, the whole text, or a .txt
    file.

Restream Destination. Up to 15 per room, added only when the room is created. Kinescope returns
stream keys in plain text; the node leaves them out of every output unless Include Stream Key is on.

Video → Download fetches a file of a catalog video into binary data, or returns just its signed
link (Mode: Link Only).

  • Best MP4 (the default) is the encoded MP4 with the highest resolution.
  • Original is the file as uploaded. Speak recordings have none once processed — only encoded MP4s
    and an audio track.
  • Audio Only is the audio track as M4A, e.g. for a speech-to-text service.

For a Speak recording Kinescope lists file_size of the video stream alone, while the MP4 carries the
audio too and downloads larger. The node passes the figure on as listedFileSize
rather than pretending it is the file's size.

Video → Update changes the title, description and embedding privacy; Move puts a video into
another project or folder, its ID and links unchanged. Upload From URL has Kinescope fetch a file
from a direct link or a YouTube address and returns at once with status uploading. Upload headers
carry Latin-1 only, so the node percent-encodes the title, description and file name, and Kinescope
decodes them: a title with Cyrillic, guillemets, & and % arrived intact. Uploading a file from
n8n itself is not here yet.

Subtitle → Generate has Kinescope recognise the speech of a video, one track per language code.
Kinescope answers at once with the tracks pending; with Wait for Recognition on, the node polls
every ten seconds until they are done. A 16-second clip of Russian speech was done within the
first poll and came back word for word, without punctuation and without speaker names. Download
gives the cues as items with start and end in seconds, the text, or a VTT or SRT file. Upload
attaches a VTT or SRT file from binary data. Kinescope rejects an audio-only file as a video, so the
check used a video with sound. What recognition costs is not in Kinescope's API reference; see your
plan.

Project and Folder list and create the places videos live in; Move and Upload From URL pick
them from dropdowns. Kinescope returns a project's privacy domains as record IDs, not as the domain
names sent.

Webhook. Kinescope returns the Basic Auth password of a webhook in plain text, though its
reference shows it redacted; Get Many leaves it out unless Include Password is on. Kinescope's update
replaces the whole webhook and refuses an empty endpoint or event list, so Update reads the current
values and changes only the fields you set.

Custom Request sends any method to any path under api.kinescope.io with the same token, rate
limit and error messages. A query parameter named status[] is sent as a list, the way Kinescope's
filters want; Follow Pages reads every page of a list route.

Rate limit

Kinescope publishes 10 requests a second and 300 a minute per token, and its own reference says the
figures do not hold in practice. The nodes stay under 10 a second per token, shared by every workflow
in the n8n process, and wait 5 seconds after a 429 — Kinescope sends no Retry-After. A POST that
timed out is not repeated: Kinescope has no idempotency key, and a second POST would make a second
room or webhook.

Kinescope Trigger

Starts a workflow on the events chosen, one item per delivery: event, receivedAt and the fields
Kinescope sent. Kinescope's events carry no time of their own, so receivedAt — when n8n got the
delivery — is the closest there is.

On Automatic the trigger creates a webhook to its own address when the workflow is activated and
deletes it when the workflow is deactivated; a webhook to the same address left from an earlier
activation is updated rather than duplicated. Kinescope signs nothing, so the trigger registers a
Basic Auth login and password derived from the token and refuses any delivery without them with
401. Kinescope does send them: a real delivery carried Authorization: Basic with exactly the
credentials of the webhook. On Manual it leaves Kinescope alone and checks nothing.

Options narrow what starts the workflow: Video Statuses for Media: Status Updated (Done is the
moment a file can be downloaded), Room IDs for Speak events.

The Speak events cannot be subscribed to yet. Kinescope documents six of them — call started and
finished, participant joined and left, recording started and finished — but on 22.10.2026 its webhook
route refused them: it accepts media.update.status and the six live.* events only. They stay in the
list for when Kinescope enables them; until then picking one fails activation with an error that says
so. Ask Kinescope support if you need them.

Meeting recordings to a disk

A Speak recording becomes an ordinary catalog video in a project Kinescope names Speak Records and
creates with the first recording. It goes through Media: Status Updated as pre-processing,
processing, done; for a short meeting done came within a minute of its end.

  1. Kinescope Trigger, event Media: Status Updated, Video Statuses: Done.
  2. Kinescope → Video → Get with {{ $json.id }}; an IF on the title starting with Record keeps
    Speak recordings only. duration is in seconds.
  3. Kinescope → Video → Download, Best MP4, into binary data, then the Google Drive, Dropbox or S3
    node. For Yandex Disk, Mode: Link Only and Yandex's upload by URL let the file skip n8n entirely.

Long meetings make large files. n8n holds binary data in memory unless N8N_DEFAULT_BINARY_DATA_MODE
is filesystem (or S3); set it before moving hour-long recordings. The node streams the download
into n8n's binary storage either way.

From the other side — a call ID in hand — Call → Get Recordings finds its videos.

To keep the recording tidy, Video → Update gives it a title after the meeting and Video → Move
takes it out of Speak Records into the project or folder it belongs in.

For the text of the meeting, Subtitle → Generate with Wait for Recognition on and then
Subtitle → Download as Text. It is speech recognition of the recording — one stream of text with
no speaker names — and works where Speak's own transcript does not appear, see below.

A recording a few seconds long and without sound ended in status error with no files; a longer one
with sound went through.

Automatic recording starts only when the room owner joins, signed in to Kinescope. A participant
who joins as admin through a JWT link
(Speak login link) can start
recording by hand, but automatic recording does not start for them, and the API has no way to start
or stop a recording.

Who was in a meeting, and for how long

What Kinescope's API gives today:

  • During a call, Room → Get lists in participants everyone connected: the name they joined
    with, the role (guest for anyone who came by link) and when they joined. Each new connection is
    an entry, so one person can appear more than once. The list empties when the call ends and
    holds no leave times. Getting one such guest by its ID through Participant → Get answers 500.
  • After a call, Call → Get gives its start and, as updated_at, its end; Video → Get gives the
    recording's duration; Download Transcript with Talk Time per Speaker gives who spoke and for how
    long.
  • Who joined and left, with times, is what the speak.participant.* webhooks are for — which
    Kinescope does not yet accept, see above.

Not here, or not known

  • Speak transcripts were not seen. Automatic Transcription was on in the test room, yet no call
    got a transcript: transcript_id stayed empty. Like automatic recording it may wait for the owner.
    Get Transcript and Download Transcript are written to the reference and its example
    ([MM:SS.T-MM:SS.T] Speaker: Text) and are untested against a real transcript. Subtitle → Generate
    on the recording gives the text without speakers.
  • Restream destinations cannot be started, stopped, added to an existing room or removed one by one
    through the API; the room interface does that.
  • Live events, playlists, players and analytics are reachable through Custom Request only. Uploading
    a file from n8n is not: the uploader host takes only Upload From URL here, and Custom Request is
    fixed to api.kinescope.io.

What was checked

On a live Kinescope workspace, 22.10.2026, by running the compiled nodes inside a stand-in for n8n's
runtime:

  • every operation of Room, Participant, Restream Destination, User, Webhook, Signing Key and Custom
    Request, the writes on test rooms, webhooks and keys created for the purpose and deleted afterwards;
  • an admin link of the same shape as Get Admin Link signs let a person into a room as admin, with the
    record button; the node's own links were checked against the public key;
  • Call → Get, Get Many and Get Recordings on real meetings, each matched to its recording or to
    none;
  • Video → Get, Get Many and Download in all modes, a whole recording downloaded and found to hold a
    video and an audio track; Video → Delete on the test recordings;
  • the trigger's registration, re-registration and removal against the API, and a real Kinescope
    delivery with its Basic Auth header;
  • Subtitle, Project, Folder and Video → Update, Move and Upload From URL in a test project, its
    videos and folders deleted afterwards: recognition of a Russian speech clip, every download format,
    an SRT uploaded and read back;
  • the generated signing key in n8n 2.38.5 itself: made on the first request, the same key in later
    executions and after the credential was saved again from the editor, blanked out in the editor;
  • the error texts for a malformed ID, a missing call, a refused event, a sort field Kinescope does not
    take, and a file a video does not have.

Not seen working: the two transcript operations, for the reason above.

License

MIT. Kinescope and its logo are trademarks of their owner; see the trademark note in the
license.

Discussion