Find a reference
GET /v1/hooks searches a bounded recent corpus plus your own saved video analyses.
Filter by q, platform, niche, language, hookType, visualHookType and
evidence (observed, metadata or all). Page with limit and offset;
nextOffset is null at the end of the sample. The sample changes as new
content arrives, so treat it as a search, not a stable export.
GET /v1/hooks/stats reports counts over the same filtered sample.
Analyze a video independently
GET /v1/capabilities has the live price —
and failures are not charged. After a connection failure, retry with the same
idempotency key.
The response contains analysis.id, hook, scenes, transcript, ctas,
pacing, lowConfidenceFields, analyzedAt, and the original source URL.
Speech that starts in the first six seconds forms the spoken opening, even if a
segment runs past six seconds. Scene boundaries are approximate, not
frame-perfect. Call-to-action matching recognizes English phrases. Pacing
describes the scenes observed, not a count of every cut.
GET /v1/video/analyses/{analysisId} reads a saved analysis for free. Analyses
are private to you and your workspace; analyzing a URL never adds it to shared
research data.
Turn evidence into production
productionPrompt, and an adaptationRequest.
Suggestions are labeled separately from reference observations.
- Add your
projectIdtobrief.adaptationRequestand send it toPOST /v1/text/adaptwith a new idempotency key. - Review the returned script.
- Send it as
storytoPOST /v1/video/renderwithvideoType: "social",aspect: "vertical", and yourprojectId. Use another idempotency key. - Poll
GET /v1/jobs/{jobId}and collectartifacts.downloadonly whenstatusisdone.
Preview, save, and run discovery
POST /v1/discovery/preview accepts intent, keywords, excludeKeywords, and
platforms. It returns a deterministic quality check and a configPatch.
It does not run a model, collect content, create a resource, or spend credits.
Without explicit keywords it uses phrases from the intent; provide several
specific phrases for better coverage.
Send the patch to PUT /v1/discovery/configs/{brandId}. Use enabled: false for
manual research, then POST /v1/discovery/runs with contentBrandId and
kind: "discover". To schedule daily research set enabled: true and
discoveryIntervalMinutes: 1440.
GET /v1/discovery/configs/{brandId}/results reads the plan’s results, applying
its platforms and its exclusions (matched case-insensitively against titles,
descriptions and hashtags). Matching is by theme and phrase — it does not
guarantee that every result matches your intent, or that every platform is fully
covered. Source health and partial runs are reported as in
Niche discovery.
Creator breakouts
GET /v1/creators/{creatorId}/outliers?platform=youtube_shorts, where
creatorId is the creator’s username or id, returns
observed posts compared with the median views of up to 20 earlier observed
posts from that same creator and platform. Five baseline posts and a positive
median are required; otherwise outlierRatio is null. A ratio of three or more
is labeled a breakout.
The response includes the baseline sample size, publication window and when the
metrics were observed. Collected posts skew toward successful ones and lifetime
views are not adjusted for age, so treat this as a research signal, not a full
channel audit.
Watched accounts and their proven hits
GET /v1/competitors and GET /v1/competitors/{competitorId} return each
watched account with performance: the median views (or likes) of its posts
older than 72 hours, how many posts that median covers, and up to 12 hits
that beat it, each with its outlierRatio. A hit needs a ratio of two or more
over at least eight mature posts; with fewer, status is
insufficient-history rather than a guessed ratio. reason says why there are
no numbers (no data key for the platform, out of credits).
Accounts are measured when added and refreshed weekly. To measure one now:
measured: false, and is not charged again.
Your channel’s performance, and fixing a live video
GET /v1/performance/channels reads your connected YouTube channels’ measured
uploads, each against its own channel’s medians, with a diagnosis:
It also lists
recentEdits — live changes already made, with the numbers from
before them. Reading it is free.
To change a live video, propose the edit:
approval.summary says exactly what will change and approval.approval is a
signed reference. Send it to POST /v1/sigma/approvals to apply the change
through the channel’s YouTube connection. The change is recorded with what it
replaced and the video’s numbers from before it, so a later
GET /v1/performance/channels shows whether it worked. A free edit can run
under the workspace’s approval setting without the extra call; the answer then
carries approval.autoApproved. Pass projectId to keep the conversation in a
project.
MCP
Usevideo_analyze, video_analysis_get, hooks_search, hooks_stats,
discovery_preview, creator_outliers, and research_brief. Paid calls require
projectId and idempotencyKey. Continue with text_adapt, video_render,
and jobs_get for production.
Watched accounts are competitors_list, competitors_get and
competitors_measure; your own channels are performance_channels_get and
performance_video_edits_propose, applied with sigma_approve; the niche
corpus is discovery_corpus_get.