other · Listed · eip155:8453 · Found · 117 endpoints · Gateway-eligible
api.cueframe.ai
cueframe
X402 endpoints at api.cueframe.ai.
Indexed from this operator's public /.well-known/x402.json. Found is not operator-owned and is not attested. Claim or opt out.
Agent Read · Cleared Index
ROUTE
Route when you need other at published x402 prices.
confidence
78%
source
signal
Index before you pay. Same payload for agents:
GET /api/cleared/agent-read?slug=cat-api-cueframe-ai
When to call
- Need other via x402 and want Cleared-indexed payTo with a live scorecard.
- Budget between $10000 and $100000 per call on published endpoints.
- X402 endpoints at api.cueframe.ai.
Risks
- Found — not operator-owned; claim status unknown.
- No Cleared settlement receipt on file yet.
- No Gateway traffic yet — market share unproven.
Price posture
Published 117 endpoints from $10000 to $100000.
Category · Gateway
other · no Gateway routes yet — early / unproven on Cleared market share.
Endpoint hints
POST /v1/review/{id}/decisionRecord approve / revise / abandon from the hosted page. Server-side this IS POST /v1/checkpoints/{id}/resume — one implementation; the driving agent learns of t
GET /v1/whoamiEchoes the `orgId`, `permissions`, and key metadata derived from the Authorization header (or x402 payment). Useful for SDKs to confirm which org a key is bound
GET /v1/meReturns the org this key is bound to (server-resolved from auth, never the body), the current plan, a per-feature `entitlements` map, and `costCeilings` (e.g. t
GET /v1/projectsRequired permission: projects:read
POST /v1/projectsCreate a video project — the container for a composition (the editable timeline), its media, brand kit, and renders. Every other authoring call (import or gener
GET /v1/projects/{id}Required permission: projects:read
GET /v1/projects/{id}Required permission: projects:write
GET /v1/projects/{id}Required permission: projects:write
Evidence (Cleared)
- → Intake verified · Gateway-eligible
- → Trust 70/100 · pass · tier listed
- → Protocol x402 · eip155:8453
- → Manifest reachable · schema valid
- → Found listing — indexed from public x402.json, not operator-attested.
Endpoints
Record a hosted review decision (the same resume rail)
Not used$MeteredPOST https://api.cueframe.ai/v1/review/{id}/decisionRecord approve / revise / abandon from the hosted page. Server-side this IS POST /v1/checkpoints/{id}/resume — one implementation; the driving agent learns of the decision via the checkpoint webhooks / wait_job. 409 when the packet is no longer awaiting (superseded, expired, or already decided).
Return the caller identity + permissions
$10000GET https://api.cueframe.ai/v1/whoamiEchoes the `orgId`, `permissions`, and key metadata derived from the Authorization header (or x402 payment). Useful for SDKs to confirm which org a key is bound to and what permissions it carries.
Return the caller's account: identity, plan, entitlements, cost ceilings
$10000GET https://api.cueframe.ai/v1/meReturns the org this key is bound to (server-resolved from auth, never the body), the current plan, a per-feature `entitlements` map, and `costCeilings` (e.g. the generate_media per-call USD ceiling). Read it BEFORE a metered call (create_render / compose / generate_media / create_brand_kit) to budget without burning a round-trip on a 402. READ `balance`, NOT `included`: most capabilities are credit-funded — rendering, generation, previews, the judge and the Director carry no separate per-plan allowance and instead spend the shared wallet named in `fundedBy`, so each `balance` is that one wallet restated in the feature's own `unit`. Generation is also bounded by the disclosed generationLimit for accounts that have not purchased credits; `included:false` means the plan genuinely lacks the feature. Plan/entitlement values come from the billing backend best-effort; unknown values are `null` and `billingConfigured:false` flags an environment where billing isn't configured.
List projects
$10000GET https://api.cueframe.ai/v1/projectsRequired permission: projects:read
Create a project
$10000POST https://api.cueframe.ai/v1/projectsCreate a video project — the container for a composition (the editable timeline), its media, brand kit, and renders. Every other authoring call (import or generate media, apply composition ops, compose, render, export) takes this project's id. Set the output format here (aspectRatio, fps, resolution).
Get a project by id
$10000GET https://api.cueframe.ai/v1/projects/{id}Required permission: projects:read
Update a project
$10000GET https://api.cueframe.ai/v1/projects/{id}Required permission: projects:write
Delete a project
$10000GET https://api.cueframe.ai/v1/projects/{id}Required permission: projects:write
Get a project's composition
$10000GET https://api.cueframe.ai/v1/projects/{id}/compositionRequired permission: projects:read
Replace a project's composition
$10000GET https://api.cueframe.ai/v1/projects/{id}/compositionRequired permission: projects:write
List a project's compositions
$10000GET https://api.cueframe.ai/v1/projects/{id}/compositionsRequired permission: projects:read
Create a new composition (video) in a project
$10000POST https://api.cueframe.ai/v1/projects/{id}/compositionsRequired permission: projects:write
Apply one operation to a project's composition
$10000POST https://api.cueframe.ai/v1/projects/{id}/composition/opsRequired permission: projects:write
Apply a batch of operations to a project's composition (or dry-run validate)
$10000POST https://api.cueframe.ai/v1/projects/{id}/composition/applyAtomically applies an array of CompositionOps. All ops succeed or none do (transactional). Pass `if_match` for optimistic-concurrency control (409 stale_etag on mismatch). Pass `dry_run: true` to validate the batch — runs the same apply + projection accept/reject guards WITHOUT persisting, returning `{ valid, errors }` with `locator.op_index` on the first failing op. Both modes may carry `warnings[]` — non-fatal authoring advisories (e.g. a card whose html reads a CSS custom property no token defines). Warnings never block.
Build and persist a composition from a clip suggestion
$10000POST https://api.cueframe.ai/v1/projects/{id}/composition/from-suggestionRequired permission: projects:write
Derive a reframed sibling composition for a new aspect (multi-format)
$10000POST https://api.cueframe.ai/v1/projects/{id}/compositions/deriveRequired permission: projects:write
Validate a composition body without saving it (dry-run)
$10000POST https://api.cueframe.ai/v1/composition/validateDry-run the FULL save-time authoring guard set against a Composition body WITHOUT persisting it and without a project. Runs the same pure, DB-free guards saveComposition enforces — wire shape, primitive membership (unknown_primitive / custom_missing_sourcecode), required-param shape (invalid_primitive_params), clip↔track family (clip_source_track_mismatch), reframe coverage (reframe_coverage_gap), and font admission (font_not_reproducible: a caption/param face that is neither bundled nor sealed in a brand font asset) — and returns ONE shape, `200 { valid, errors[] }`, for BOTH wire-shape and deep-invariant failures (no 400-vs-200 split). `valid:false` lists every authoring error (sanitized envelopes) to fix before save/render. The ONLY checks NOT run here are the two DB-bound ones — trim-bounds (media duration) and image/asset-on-video-track (media kind) — which can only be caught at save/render.
Delete a composition
$10000GET https://api.cueframe.ai/v1/projects/{id}/compositions/{compositionId}Delete a composition and its version history. REFUSES the project's ACTIVE composition (409 composition_active) — make another one active first, or delete the project.
Semantic search over the org's own footage
$10000GET https://api.cueframe.ai/v1/media/searchFind MOMENTS in your library by describing what they look like. The query uses the same visual-semantic index as the footage, so it matches on visual content — "wide shot of a speaker at a whiteboard", "hands on a keyboard", "city skyline at dusk" — including shots nobody talks about (which is where transcript search fails). Results are time-ranged: feed `mediaId` + `startSec`/`endSec` straight into apply_composition as a clip. `q` is required; `limit` defaults to 10 and caps at 25. `indexing` is COVERAGE, not emptiness: it is true whenever some of the org's footage is not in the visual index yet (media that predates it, or still processing), and it can be true ALONGSIDE results — then read them as "the best moments among what we have looked at so far". Empty `results` with `indexing: true` is a state, not a failure; re-run the item through processing to index it. The first search after an idle period can take up to ~90s; subsequent searches are typically faster.
Mint a short-lived token for the signed upload lane
$10000POST https://api.cueframe.ai/v1/uploads/tokenRequired permission: media:write
List media items
$10000GET https://api.cueframe.ai/v1/mediaPaginated library list. Filter with ?kind= (video|audio|image|gif|asset|source|stock), ?source= (upload|generated|import-url|stock), ?tag= (exact tag) so a real library isn't an undifferentiated soup.
Initiate a direct upload (presigned PUT URL)
$10000POST https://api.cueframe.ai/v1/mediaRequired permission: media:write
Finalize a direct upload (trigger processing after the bytes are PUT)
$10000POST https://api.cueframe.ai/v1/media/{id}/finalizeRequired permission: media:write
Generate media with AI (video, image, or Manim animation)
$MeteredPOST https://api.cueframe.ai/v1/media/generateGenerate a new media item from a text prompt: text-to-video, text-to-image, image-to-video, or a programmatic Manim animation (generator 'auto' picks the best one for the prompt). Async — returns a media id that flips to ready when generation finishes; poll GET /media/:id or register a media.completed webhook. Priced on what the model actually costs; refused with 402 if your balance cannot cover the quote (see GET /me).
Import media from a URL (server-side fetch)
$10000POST https://api.cueframe.ai/v1/media/importImport media into the project from a public https URL — the server fetches and mirrors the bytes (SSRF-filtered), then processes it (transcode + transcribe). Async: returns a media id that flips to ready when the mirror and processing finish; poll GET /media/:id or use a media.completed webhook.
Get a media item by id
$10000GET https://api.cueframe.ai/v1/media/{id}Required permission: media:read
Delete a media item
$10000GET https://api.cueframe.ai/v1/media/{id}Required permission: media:write
Get a media transcript (paginated)
$10000GET https://api.cueframe.ai/v1/media/{id}/transcriptRequired permission: media:read
Get authoring context for a media item (faces + transcript + beat/word grids)
$10000GET https://api.cueframe.ai/v1/media/{id}/contextThe read-only context an agent needs to author a composition over this source: the detected face/subject roster (face-0 = primary speaker, with normalized bbox + active-speaker share), the transcript, the temporal grids — `beatGrid` (a MUSIC bed's rhythm: bpm, beatTimesMs in milliseconds, confidence, method) and `wordGrid` (VO word-onset timings in milliseconds, from the transcript) — and a presigned `thumbnail` (~the footage at a glance). For stills at CHOSEN timestamps, call preview_frame with a one-clip composition over this media. Call this before authoring crop intents (reframe) and overlay/caption timing. Faces are lazily detected — `faces.status` is `not_detected` until a compose/detect pass has run over the source, never a faked empty roster. `beatGrid` is null until beat analysis has run: generated music beds are analyzed automatically at delivery; an uploaded/imported bed may not carry a grid yet (on-demand analysis is not client-triggerable today). `audioRole` is the DECLARED role of an audio asset (vo | music | sfx | ambience) — author the clip source's `audioRole` from it; `envelope` carries the coarse `envelopeClass` (transient | sweep | ambient) plus any probed attack/centroid/volume stats. Both are null for footage/images or an undeclared audio asset.
List clip suggestions for a media item
$10000GET https://api.cueframe.ai/v1/media/{id}/suggestionsRequired permission: media:read
Trigger clip-suggestion analysis
$MeteredPOST https://api.cueframe.ai/v1/media/{id}/suggestionsAnalyze a video for its best short-form moments — returns ranked clip suggestions with trims, hooks, titles, captions, hashtags, and platform fit for turning long footage into shorts. Async: returns 202; poll GET /media/:id/suggestions for the ranked results.
Reset clip suggestions for a media item
$10000GET https://api.cueframe.ai/v1/media/{id}/suggestionsRequired permission: media:write
Trigger standalone subject/face detection
$100000POST https://api.cueframe.ai/v1/media/{id}/detect-subjectsRequired permission: media:write
Buy a behind-subject matte for one source window
$10000POST https://api.cueframe.ai/v1/media/{id}/matteBakes the alpha matte that lets a graphic sit BEHIND the subject for a specific source window. The window is the clip's SOURCE trim (`startSec`/`endSec` in seconds into the underlying file), not timeline time, and it is required — a matte's cost scales with its duration. Async: poll `GET /media/{id}/facts` for the matte fact's status. If a matte for this exact window already exists (bought earlier, or baked by a compose that put a graphic behind the subject) this returns 200 with the existing state and charges NOTHING. `summary.presenceFraction` on the delivered fact is the viability signal: below 0.6 there is no reliable silhouette, and that matte is delivered free.
List derived facts for a media item, with quotes for what is missing
$10000GET https://api.cueframe.ai/v1/media/{id}/factsThe enhancement menu. `facts` is everything expensive we have already computed about this source — subject tracks, mattes — with its status, a small summary a caller can act on without fetching the artifact, and `charge` (what it was billed; absent when it cost nothing, e.g. a matte produced as a side effect of a compose you already paid for, or one delivered below the behind-subject presence floor). `offers` is what is NOT present yet, with a real server quote. A matte is offered ONLY when you pass `startSec`+`endSec` — the clip's SOURCE window — because a matte's price is a function of its duration and a whole-source quote for a three-second clip is not a price. Pass the window from the editor and you get a per-clip matte quote plus the status of that window's matte; omit it from the library and you get everything except the matte.
Buy a derived fact (subject track or behind-subject matte)
$100000POST https://api.cueframe.ai/v1/media/{id}/factsPurchases one enhancement for this source. `matte` REQUIRES `intent:{startSec,endSec}` — the clip's SOURCE window — because a matte's cost scales with its duration. For `subjectTrack` the same `intent` is OPTIONAL: give the clip's source window to buy the track the render will look up for THAT clip (and pay only for its duration); omit it for the whole source. If the fact already exists (pending or ready) this returns it with `alreadyExisted:true` and charges nothing. Charging happens on DELIVERY, never here: a job that never lands is never billed.
Analyse a media item's transcript
$MeteredPOST https://api.cueframe.ai/v1/media/{id}/transcript/analyzeAsk ONE editorial question of a transcript and get the answer as text: `summary` (what is actually said, plus the takeaways), `chapters` (where the subject changes), or `highlights` (the moments that stand alone as a short). PRECISION: timestamps are ABSOLUTE seconds from the start of the media and every one is verified against the transcript before you see it (a fabricated timestamp fails the call rather than shipping) — but they are LINE-START markers roughly 15s apart, so a boundary can sit up to 15s BEFORE the moment you asked for. Treat every span as APPROXIMATE: use it to LOCATE the moment, then refine the in/out against the word timings from GET /v1/media/{id}/context before you cut. Feeding a raw span straight into a clip trim will start it mid-sentence. Pass `window` to analyse one slice; omit it for the whole thing. This is a METERED LLM call, not a read: it bills on measured token spend, and a recording too long to analyse in one pass is rejected with 422 `transcript_too_long` (over ~100k characters, roughly two hours of speech) rather than silently summarising only its first half — narrow it with `window`. 422 `media_no_transcript` means the item has no speech on file (or none inside your window); GET /v1/media/{id}/context shows transcript state, and GET /v1/media/{id}/transcript returns the raw words.
Analyze a timeline transcript for edit decisions
$MeteredPOST https://api.cueframe.ai/v1/timeline-analysisReturns filler, silence-gap, and emphasis word indices for an editor timeline. Analysis settings are selected server-side and cannot be overridden.
One-call agent context: composition + media + transcript + brand
$10000GET https://api.cueframe.ai/v1/projects/{id}/contextEverything an authoring agent needs to open a project, in ONE read: the active composition (with its format and markers hoisted), the org's media pool with a `hasTranscript` flag per item, the first transcribed item's word-timed transcript, and the brand kit bound to the project. Replaces the get_composition + get_media_context + get_profile opening sequence. A freshly created project reads back with `composition: null` — that is the empty state, not an error; 404 means the project doesn't exist for your org. Transcript BODIES are never inlined per media item — read another item's with GET /v1/media/{id}/transcript, and its faces/beat/word grids with GET /v1/media/{id}/context.
Search stock media (Pexels / Pixabay / Freesound / Klipy)
$10000POST https://api.cueframe.ai/v1/resources/searchSearch licensed stock media by keyword. Pass `query` for one search, or `queries[]` (≤10) to run a batch in ONE call — the batch returns `results[]`, one entry per query in order, each with its own `candidates` (and an `error` string if that single query failed; one bad query never discards the rest). `kind` selects the corpus (video/photo default to Pexels; Pixabay is explicitly selectable; sfx → Freesound CC0-only; gif → Klipy); defaults to video. Returns ranked candidates each carrying an opaque `candidateId` — pass it to import_resource to bring the asset into a project. Free + rate-limited; results are cached for 7 days, after which a candidateId must be refreshed by searching again. For sfx, bound the result by clip length with `durationSec` — impacts/ticks ≈ 0–2s, risers/whooshes ≈ 2–8s, ambients unbounded. For video, use minWidth/minHeight to exclude smaller renditions.
Import a stock candidate or a curated SFX-pack sound
$10000POST https://api.cueframe.ai/v1/resources/importTwo lanes. STOCK { projectId, candidateId }: import a candidate returned by search_resources into a project as an org-owned media item (preserving provider/externalId/license provenance; bytes deduped across orgs). Async: returns { id, status:'importing' }; status flips to complete when the import finishes (poll GET /media/:id). A candidate whose 7-day search cache has expired returns 422 — re-search. PACK { kind:"sfx-pack", id:<soundId> }: mint/return the org media item for a curated CC0 SFX-pack sound (soundId from list_catalog's sfx[]) — returns { id, status:'ready' } immediately to place as a normal sfx clip. Idempotent per (org, soundId); an unknown soundId is a 422. Pack imports are FREE: no plan feature required, and an x402 payment is released unsettled (no charge). PRICE of a stock import for a keyed (API-key / session) caller: 0 credits — the resource_import entitlement is a plan grant, not a meter (get_account reports `entitlements.resource_import.listUsdPerUnit: 0`); the imported bytes count toward the `storage` gauge. Only an unkeyed x402 caller pays the $0.01 import tier.
Search web font families by name/style
$10000POST https://api.cueframe.ai/v1/fonts/searchSearch the Google Fonts web-font catalog by keyword. Returns matching font families (family name + category + available variants + a css2 stylesheet URL). DISCOVERY ONLY, and this is NOT the set the renderer can draw: a cloud render draws only the faces GET /v1/fonts lists, or a face sealed in a brand kit font asset. Naming any other family in captions/params fails validate_composition with font_not_reproducible. Read GET /v1/fonts to choose a family AND an admitted weight and style before authoring. Read-only and free; results are cached server-side. An empty `results` array means no match (or the upstream catalog was unavailable).
List the font faces the renderer can actually draw
$10000GET https://api.cueframe.ai/v1/fontsThe renderer's admitted font set: per family the exact name authoring accepts, the weight ranges a shipped file declares, the styles bytes exist for, the caption default weights, and whether the bytes are bundled or an aliased metric-compatible stand-in. Choose from here and validate_composition will not refuse the face. Unlike POST /fonts/search (which searches the GOOGLE catalog) this is what the render page can rasterize. `manifestVersion` identifies the exact table and moves only when the admitted set does. Covers the BUNDLED set only — a brand kit's sealed faces are per-org and per-render.
List renders for a project
$10000GET https://api.cueframe.ai/v1/projects/{id}/rendersRequired permission: renders:read
Create a render job
$MeteredPOST https://api.cueframe.ai/v1/projects/{id}/rendersRender the project's composition to a finished MP4. Async: returns a render id; poll GET /projects/:id/renders/:renderId or stream progress over SSE, then download the signed output URL once status is complete.
Render a scoped motion preview of the composition
$50000POST https://api.cueframe.ai/v1/projects/{id}/preview-clipA cheap, watchable MP4 of ONLY [fromSec, toSec) of the composition at preview quality (capped resolution, lighter encode). The way to judge motion — a cut, a transition, a component's animation — with real fidelity BEFORE paying for a full render. Async: returns a render job; wait_job(kind='render') or webhook render.completed for the URL. Meters the capture feature, never an exports credit.
Get a render job
$10000GET https://api.cueframe.ai/v1/projects/{id}/renders/{renderId}Required permission: renders:read
Cancel a render
$10000POST https://api.cueframe.ai/v1/projects/{id}/renders/{renderId}/cancelRequired permission: renders:write
Re-render against an existing renderJob's snapshot
$10000POST https://api.cueframe.ai/v1/projects/{id}/renders/{renderId}/retryRequired permission: renders:write
Refresh a render's output URL
$10000POST https://api.cueframe.ai/v1/projects/{id}/renders/{renderId}/refresh-urlRequired permission: renders:write
Stream render status (SSE)
$10000GET https://api.cueframe.ai/v1/projects/{id}/renders/{renderId}/streamServer-Sent Events stream emitting `progress`, `complete`, and `error` frames until the render reaches a terminal state. Required scope: renders:read
Create a Final Cut Pro export
$10000POST https://api.cueframe.ai/v1/projects/{id}/exports/fcpxmlExport the project as a Final Cut Pro XML (FCPXML) timeline — eject the agent-authored edit into a professional NLE for human finishing, preserving clips, trims, and timeline structure. Async: poll GET /projects/:id/exports/:exportId for the download URL.
Create a Premiere Pro export
$10000POST https://api.cueframe.ai/v1/projects/{id}/exports/premiereExport the project to Adobe Premiere Pro — eject the agent-authored edit into a professional NLE for human finishing, preserving clips, trims, and timeline structure. Async: poll GET /projects/:id/exports/:exportId for the download URL.
Get an export job
$10000GET https://api.cueframe.ai/v1/projects/{id}/exports/{exportId}Required permission: renders:read
Cancel an in-flight export
$10000POST https://api.cueframe.ai/v1/projects/{id}/exports/{exportId}/cancelRequired permission: renders:write
List brand kits (read-only)
$10000GET https://api.cueframe.ai/v1/brand-kitsRequired permission: projects:read
Create (or upsert) a brand kit
$10000POST https://api.cueframe.ai/v1/brand-kitsCreate or upsert a brand kit. Gated on the `brand_kits` boolean entitlement, which the FREE plan grants — brand-first authoring is deliberately never paywalled — so this is available to every account and costs no credits. A plan without it returns 402 billing_required (`details.featureId: "brand_kits"`). Discover the gate WITHOUT a failed round-trip via GET /v1/me — its `entitlements.brand_kits.included` tells you up front.
Extract brand tokens from a website URL
$10000POST https://api.cueframe.ai/v1/brand-kits/extractQueue brand-token extraction from a website URL — ASYNC: returns a 202 job receipt; poll GET /v1/jobs/{jobId} (or MCP wait_job kind=brand_kit_extract) for the tokens (colors, fonts, title, description) on the succeeded result. The service inspects the site under a 20-second limit and does NOT persist a kit (pass the result to POST /brand-kits). A blocked (private-network), non-2xx, non-HTML, or slow URL degrades to EMPTY token arrays on a SUCCEEDED terminal rather than erroring; succeeded extractions are reused for 5 minutes per URL.
Get a brand kit by id
$10000GET https://api.cueframe.ai/v1/brand-kits/{id}Required permission: projects:read
Presign a brand kit's inspiration exemplar frames
$10000POST https://api.cueframe.ai/v1/brand-kits/{id}/exemplarsReturns short-lived URLs for the kit's exemplar frames (the pixels the maker and judge condition on). Filter to one motif's evidence frames with `motifId`. Vision-budget-bounded consumers should keep `limit` small (default 6).
Reserve presigned PUT slots for inspiration exemplar frames
$10000POST https://api.cueframe.ai/v1/brand-kits/exemplar-uploadsReturns presigned PUT URLs under this org's `brand-inspiration/…` prefix — the only namespace the brand-kit upsert accepts `exemplarKeys` from. PUT each curated reference frame (≤720px jpeg recommended — the frames become vision input downstream), then upsert the kit with the returned keys. This is the ingest door for agent-driven kit extraction (the `extracting-brand-kits` skill on GET /skills).
List briefs (optionally scoped to a project)
$10000GET https://api.cueframe.ai/v1/briefsDEFAULT lists human-authored briefs only. Machine-minted clip briefs (suggest_briefs output) are opt-in: ?kind=clip lists just them, ?kind=all lists everything. Any other kind value is a 400, never silently empty.
Create a brief (the persisted intent the Director composes from)
$10000POST https://api.cueframe.ai/v1/briefsPersist the video's intent — goal/audience/format/tone/CTA, beats with optional moment pinning ({mediaId, startSec, endSec}), captions (style + emphasis phrases), seeded graphics (carried VERBATIM as locked clips), exclusions (hard negatives the Director must never author), and gate config (holdAt / autoApprove). Then compose it with POST /projects/:id/compose {briefId} — every field is honored or the compose is refused loudly naming the field. The response carries the brief-time quote (compose + estimated render) to relay BEFORE any metered call.
Get a brief by id
$10000GET https://api.cueframe.ai/v1/briefs/{id}Required permission: projects:read
Edit a brief
$10000GET https://api.cueframe.ai/v1/briefs/{id}Partial update. While an ACTIVE compose job references this brief the edit is refused (409 conflict) — finish, resume, or abandon the job first; the Director never has its input edited out from under it.
Delete a brief
$10000GET https://api.cueframe.ai/v1/briefs/{id}Required permission: projects:write
List checkpoints (scope to a compose job or project)
$10000GET https://api.cueframe.ai/v1/checkpointsThe version stack of approval packets, newest first. Scope with ?composeJobId= to see one run's gate history (v1→vN with per-version status + decisions) or ?projectId= for everything reviewable in a project.
Get a checkpoint packet
$10000GET https://api.cueframe.ai/v1/checkpoints/{id}The full approval packet: the stage artifact under review, presigned storyboard/eval stills, critic verdicts (incl. lock_violation entries), the money triple {thisStep, jobSpendSoFar, estimatedJourneyTotal}, and the recorded decision once resolved. Answer an `awaiting` packet with POST /v1/checkpoints/{id}/resume.
Answer a held checkpoint (approve / revise / abandon)
$10000POST https://api.cueframe.ai/v1/checkpoints/{id}/resumeThe A1 review grammar: one `decision` for the gate, optionally carrying anchored `comments` ({beatId} or {timecodeMs} anchors; per-anchor verdict approve|revise|lock — lock freezes the element contractually) and/or `edits` (your revised stage artifact). `revise` loops IN-JOB: the director revises and re-presents this same gate with a new packet (version+1); the brief quote states the included revision cycles — beyond them, revise is refused 402 with the path forward. `abandon` ends the run. Approve-with-comments is legal: the notes record without gating.
Score a composition (the standalone sighted judge)
$100000POST https://api.cueframe.ai/v1/projects/{id}/score-compositionQueue the server-side judge: it samples eval beats, renders them, and grades editorial/spatial/brand/caption (0–10 + weighted composite + worst-first critique). Your REGISTERED CRITICS run too (register_critic) — rules + rubric verdicts ride the result as clientScores, exactly like the Director's gates evaluate them (evaluator-webhook critics run in the Director lane only). Returns a jobId — wait_job(kind='verify') for the result, which ALSO carries a checkpointId: the verdicts mint a durable kind:'score' Checkpoint (the same evidence noun the Director's gates produce). Stateless — nothing to open, warm or close; the compose_verify meter fires on the job's success terminal.
Queue still-frame evidence for a composition
$20000POST https://api.cueframe.ai/v1/projects/{id}/preview-frame-jobsResolve and freeze the exact authored target, then queue durable still capture. Returns immediately; poll the generic job with wait_job(kind='preview_frame'). One successful request is one compose_capture operation regardless of timestamp count.
Render one component preview
$20000POST https://api.cueframe.ai/v1/projects/{id}/component-previewQueue a preview of ONE org-installed component. It returns the SAME content-addressed VP9-alpha motion clip the production render composites. Returns a jobId — wait_job(kind='preview') for the artifact. Compile/runtime failures land on the job terminal with the sanitized author-fixable message.
List component catalog (defaults + installed)
$10000GET https://api.cueframe.ai/v1/componentsDiscover the built-in primitive catalog (87 primitives + 7 scenes) plus your installed components. Narrow with facet filters (category, kind, tier, useCase, mood) or free-text (q / intent); when ANY filter is set, results are ordered recommended-tier-first. With NO `limit` the WHOLE (filtered) catalog returns in one page — pass `limit` only to page. Each entry carries a `placement` hint telling you exactly how to author it on the timeline.
Author (create) a component
$10000POST https://api.cueframe.ai/v1/componentsRequired permission: projects:write
Get a component entry
$10000GET https://api.cueframe.ai/v1/components/{id}Required permission: projects:read
Update an authored component
$10000GET https://api.cueframe.ai/v1/components/{id}Required permission: projects:write
Patch an authored component
$10000GET https://api.cueframe.ai/v1/components/{id}RFC 7396 merge patch: send only the fields you are changing. Every field you omit keeps the value it already had. Identical in effect to PUT, which merges the same way.
Get a component's source
$10000GET https://api.cueframe.ai/v1/components/{id}/sourceRequired permission: projects:read
List sessions
$10000GET https://api.cueframe.ai/v1/sessionsRequired permission: sessions:read
Create a session
$10000POST https://api.cueframe.ai/v1/sessionsRequired permission: sessions:write
Get a session
$10000GET https://api.cueframe.ai/v1/sessions/{id}Required permission: sessions:read
Delete a session
$10000GET https://api.cueframe.ai/v1/sessions/{id}Required permission: sessions:write
Poll mux job status
$10000GET https://api.cueframe.ai/v1/sessions/{id}/mux-jobRequired permission: sessions:read
Trigger mux-audio-onto-video workflow
$100000POST https://api.cueframe.ai/v1/sessions/{id}/mux-jobRequired permission: sessions:write
List webhook endpoints
$10000GET https://api.cueframe.ai/v1/webhooksRequired permission: webhooks:read
Register a webhook endpoint
$20000POST https://api.cueframe.ai/v1/webhooksRegister a webhook so long-running jobs (render/compose/media) notify you instead of blocking on wait_job. Body: `url` (https, must pass SSRF checks) + `events` (see the WebhookEvent enum). DELIVERY: each event is a POST with body `{ event, timestamp, projectId?, data }` and Standard-Webhooks headers `webhook-id`, `webhook-timestamp`, `webhook-signature: v1,<base64>` (+ `x-cueframe-event`). The `secret` (`whsec_<base64>`) is returned ONCE here — verify the raw body with `new Webhook(secret).verify(rawBody, headers)`. ACTIVATION (synchronous, no separate step): on create, CueFrame POSTs a signed `webhook.verify` challenge; your endpoint must reply 2xx echoing `data.token` (raw body === token, or JSON `{token}`/`{challenge}`). On success the response is `status:"active"`; otherwise `status:"pending"` with `verification.reason` and the webhook receives NO events until it verifies (recover with POST /webhooks/:id/verify — no delete/recreate). Full contract + per-event `data` shapes: GET /webhooks/events.
Get the webhook delivery contract
$10000GET https://api.cueframe.ai/v1/webhooks/eventsThe machine-readable webhook contract: the delivery envelope, Standard-Webhooks signing (secret format, signed content, how to verify), the synchronous echo-the-token ownership handshake, and every subscribable event with its exact `data` fields. Read this before building a receiver — it answers 'what's the payload shape / how do I verify the signature / how does activation work' without guessing.
Get a webhook endpoint
$10000GET https://api.cueframe.ai/v1/webhooks/{id}Required permission: webhooks:read
Update a webhook endpoint
$10000GET https://api.cueframe.ai/v1/webhooks/{id}Required permission: webhooks:write
Delete a webhook endpoint
$10000GET https://api.cueframe.ai/v1/webhooks/{id}Required permission: webhooks:write
Fire a webhook.test delivery
$20000POST https://api.cueframe.ai/v1/webhooks/{id}/testRequired permission: webhooks:write
Re-run webhook ownership verification
$20000POST https://api.cueframe.ai/v1/webhooks/{id}/verifyRe-send the signed `webhook.verify` ownership challenge to a PENDING webhook's url and, if the endpoint now echoes `data.token` in a 2xx, flip it active — IN PLACE (id + secret preserved; no delete/recreate). Use it to recover after fixing a receiver that failed the challenge at create time. An already-verified webhook returns `status:"active"` unchanged (idempotent). Returns the same `{ status, verification? }` shape as create.
List registered critics (Profile family)
$10000GET https://api.cueframe.ai/v1/criticsEvery enabled critic: id, label, tier, phase, floor, and reference media. Rubric text, rules, and evaluator URLs are write-only — registration config comes back, payloads don't.
Register a compose critic
$10000POST https://api.cueframe.ai/v1/criticsRequired permission: projects:write
Delete a registered critic
$10000GET https://api.cueframe.ai/v1/critics/{criticId}Required permission: projects:write
Read the org's Profile — its legible taste
$10000GET https://api.cueframe.ai/v1/profileOne read for everything the platform knows about this org's taste: brand kits, registered critics (the machine-checkable standard both the Director's gates and score_composition enforce), the critics' reference media with presigned thumbnails, and the recent checkpoint-decision log (what was approved/revised/abandoned, where). Read this before composing for an org you haven't worked with — it is the house style.
List switch (multicam) candidates + recommendation for a synced-angle group
$10000GET https://api.cueframe.ai/v1/projects/{id}/selector/candidatesRequired permission: media:read
Re-resolve a switch advisory under a hand-supplied policy (A/B taste; not persisted)
$10000POST https://api.cueframe.ai/v1/projects/{id}/selector/previewRequired permission: media:read
Start an async Director compose workflow
$MeteredPOST https://api.cueframe.ai/v1/projects/{id}/composeAsync sibling of `composeFromSuggestion`. The Director execution authors a canonical wire-shape Composition and saves it as the project's active composition. Watch progress via the SSE stream at `/v1/projects/:id/compose/:composeJobId/stream`.
Stream compose progress (SSE)
$10000GET https://api.cueframe.ai/v1/projects/{id}/compose/jobs/{composeJobId}/streamServer-Sent Events stream emitting typed `compose_event` frames (per `2026-05-23-compose-api-contract.md` § SSE event types — job_started, candidate_phase_started, candidate_phase_evaluated, candidate_completed, critique_retry_started, winner_selected, job_completed, job_failed). The stream closes once the compose job reaches a terminal status. Required scope: projects:read
Promote a compose candidate to the active composition
$10000POST https://api.cueframe.ai/v1/projects/{id}/compose/jobs/{composeJobId}/selectSelects one candidate from a finished compose ensemble and writes it to the project's composition. `selectStrategy` decides how the editor draft interacts with the write (per compose-api-contract.md).
Cancel an in-flight compose job
$10000POST https://api.cueframe.ai/v1/projects/{id}/compose/jobs/{composeJobId}/cancelCancel a running compose so an agent (or a cost guard) can abort a mis-priced or runaway ensemble without waiting out its budget or TTL. Cancellation is confirmed before the job becomes terminal; the compose.cancelled event is then emitted and any linked charge is released. Already-terminal jobs are rejected (422 compose_not_cancellable).
List recent compose jobs for a project
$10000GET https://api.cueframe.ai/v1/projects/{id}/compose/jobsRequired permission: projects:read
Fetch a compose job's full ensemble state
$10000GET https://api.cueframe.ai/v1/projects/{id}/compose/jobs/{composeJobId}Required permission: projects:read
Ask the multi-agent Director for editing advice (never writes)
$MeteredPOST https://api.cueframe.ai/v1/projects/{id}/consultAsk the Director for editing advice on the project's current composition — it NEVER saves; you stay the decider. Async: poll the returned job for the advisory envelope. Modes: 'advise' = the planner agent (fast, ~30s-2min) returns a PLAN (framing/cuts/captions/graphics intents) as guidance you re-author from — no grounded scores; 'amend' = the full author→judge→refine loop (minutes) returns a GRADED assessment + an adoptable fix candidate (adopt via POST /compose/jobs/:jobId/select with its candidateIndex). ('explore' — a ranked slate of directions — is coming soon.)
Open an isolated scratch composition
$10000POST https://api.cueframe.ai/v1/projects/{id}/compose-sessionMint isolated scratch state for project authoring. This returns immediately and starts no sandbox or render provider; use /preview-frame-jobs and /score-composition for durable preview and verification work. The scratch closes automatically after its idle TTL or explicitly via DELETE. Optionally seed it from a supplied composition (seedComposition); a bodyless open derives from the project's active composition.
Read the session's scratch composition
$10000GET https://api.cueframe.ai/v1/projects/{id}/compose-session/{sessionId}/compositionPure read: returns the composition currently held in the session's SCRATCH (what the author LLM has been editing over this session), NOT the project's active composition. The Director ensemble reads this back per candidate and returns it as the authored composition — the winner is saved downstream, so a candidate never commits its scratch to active. 404 when the session is unknown/foreign or has never written a scratch.
Close a compose session
$10000GET https://api.cueframe.ai/v1/projects/{id}/compose-session/{sessionId}Required permission: projects:write
Commit the session scratch onto the project's active composition
$10000POST https://api.cueframe.ai/v1/projects/{id}/compose-session/{sessionId}/commitRequired permission: projects:write
Get an async job's status and result
$10000GET https://api.cueframe.ai/v1/jobs/{jobId}Read one async job — the uniform status/result resource behind every long-running operation. Poll until `status` is terminal (`succeeded` | `failed` | `cancelled`), then read `result` (kind-specific payload) or `error` (stable code + message). `job_timeout` means the executor died mid-run and the stall sweep reaped the job — re-enqueue the operation to retry.
Cancel an async job
$10000POST https://api.cueframe.ai/v1/jobs/{jobId}/cancelCancel a running async job so an agent can abort a mis-priced/runaway operation without waiting out its TTL. Cancellation is durable and never meters. Already-terminal jobs are rejected (422 job_not_cancellable).
Mint a workspace (project + imported source) in one call
$20000POST https://api.cueframe.ai/v1/workspaceThe one-call editing handle: create a project and import the source video URL into it. Returns { projectId, mediaId } — the handle a (paying or keyed) agent threads through the compose/render loop. The import is async; poll GET /v1/media/:mediaId for readiness.
Create a scoped API key (session credential only)
$10000POST https://api.cueframe.ai/v1/api-keysList metered usage events (the A2 usage ledger)
$10000GET https://api.cueframe.ai/v1/usageEvery metered billing event, newest-first, with attribution: featureId, amount, the project/job that produced it, and the event's LIST price in USD (the invoice may zero it inside a plan allowance). Filter by projectId, jobId, and/or a [from, to) epoch-ms period. Events appear moments after the job's success terminal (the meter is scheduler-dispatched).
List the plan catalog: tiers, intervals, product ids, prices
$10000GET https://api.cueframe.ai/v1/billing/plansReturns every purchasable {tier, interval} and its billing catalog product id — discovery to read BEFORE POST /v1/billing/checkout so an agent requests a real plan/interval instead of guessing. `priceUsd` is best-effort (null if unavailable); `billingConfigured:false` flags an env without billing.
Start a hosted Stripe checkout for a plan/interval
$10000POST https://api.cueframe.ai/v1/billing/checkoutBody `{ plan, interval }` → returns a hosted Stripe checkout `url` to open in a browser to complete payment. Upgrades the CURRENT org (server-resolved from your key/identity, NEVER the body). Always a hosted URL — an existing saved card is NEVER charged without the human confirming on Stripe. `interval:"year"` selects the annual plan. Discover valid combos with GET /v1/billing/plans. Requires `billing:write`.
Attach production scores to one of your director traces
$10000POST https://api.cueframe.ai/v1/traces/{traceId}/scoresRecord 1–10 named scores (0..1) on a trace the CueFrame gateway produced for YOUR director run — the trace id is the `trace_id` the client stamped on that run's requests. Only the trace's own user may score it; any other trace id answers 404. Scores are accepted asynchronously and acknowledged with 202. Free.
Checks
reachable
valid
2026-10-09T06:30:53.611Z
No settlement evidence found in chain signals.
Gateway routing
Score ≥70/100 — Cleared attestation pass. Route via Gateway before pay.
Claim this listing to upgrade to Cleared attestation.
Claim listing