Skip to content

Video.draft

Writes a Video’s timeline from your records, your Brand and a Template, with a draft mark on every frame.

Action class
None
Approval
Runs on its own
Emits
Video.drafted
Price
Free
POST https://api.sb/{your-domain}/videos/draft

Its Inputs, Outputs, Effects and guards quote the hub’s Video.draft; this page adds what each Venue honors, its limits and a worked call.

Inputs

NameTypeDefaultMeaning
brandBrandRequiredThe Brand the Video speaks for.
offerOfferyour first OfferThe offer the Video presents. Unset: the startup’s first offer, the one its pricing page leads with.

Outputs

FieldTypeWhat null means
videoVideoNever null: the Video in status Draft, with a draft mark on every frame.
video.statusstringNever null: draft until Video.finalize clears the mark.

Effects

Action class

None: no approval rule names it, so it runs within its seat’s Permissions and Limits

Modes
  • try: Writes the timeline and returns it with a frame list; nothing is rendered or stored.
  • send: Returns a pending Action at once; Video.drafted fires when the timeline and its preview render.
  • do: Waits for the preview render, about a minute for 30 seconds, and returns the Video.
Idempotency

Only with a key: the same Idempotency-Key and input return the first Action, and the same key with other input returns 409. A repeat with the same key returns the first draft; a new key drafts again from the records as they are now.

Saved or shared

The Video, its timeline and the record each on-screen claim reads, so a changed price or count marks the draft stale.

Emits

Video.drafted with { video, brand, offer, claims }

Performed by

Content lead

Price

Free on your own account: the platform charges nothing for the call.

On each Venue

It acts on your own records and reaches no Venue, so every account answers the same way.

What try does

Runs every check the call meets and returns the record as it would be; nothing is stored, sent or posted.

Refuses when

CheckErrorFixThen call
An invented testimonial, a synthetic person speaking as a customer, or a face or voice with no yessynthetic-mediaUse a real customer’s words with their yes, or show the product instead.Content.draft
A Post with a claim that resolves to no live recordclaims-resolveCut the claim, or name the record that backs it.Content.draft
The synthetic-media payload
JSON
{
  "type": "https://startupbuilder.dev/errors/synthetic-media",
  "title": "Synthetic media",
  "status": 422,
  "detail": "An invented testimonial, a synthetic person speaking as a Customer, or a face or voice with no yes.",
  "fix": "Use a real Customer’s words with their yes, or show the product instead.",
  "next": {
    "verb": "Content.draft",
    "input": {}
  },
  "instance": "https://api.sb/leaseline.app/actions/action_1"
}

When it waits

In send mode it returns a pending Action, reason: 'running' until the preview renders, and Video.drafted delivers the result.

TypeScript
await $.Watch.create({
  selector: 'Video.drafted',
  url: 'https://leaseline.app/hooks/sb'
})

Example

A refusal: its offer asks for a customer testimonial with no recorded yes, so the draft refuses before a frame is written.

You, to your agent
Draft a 30-second video for the Portfolio plan: renewal notices go out
60 days early, for every owner, for `offer_test_testimonial`.
Response, in try mode
{
  "type": "https://startupbuilder.dev/errors/synthetic-media",
  "title": "Synthetic media",
  "status": 422,
  "detail": "An invented testimonial, a synthetic person speaking as a Customer, or a face or voice with no yes.",
  "fix": "Use a real Customer’s words with their yes, or show the product instead.",
  "next": {
    "verb": "Content.draft",
    "input": {}
  },
  "instance": "https://api.sb/leaseline.app/actions/action_1"
}

To retry, send the same Idempotency-Key: the retry returns the first answer for $0. A new key reads again.

Test values

A sk_test_ key answers these the same way every time, at $0 (every test value).

Test valueAlways returnsWhat it is for
brand_test{"video":{"status":"draft","seconds":30}}Always the same 30-second draft, so the review step after it runs on a known timeline.
offer_test_testimonialRefuses with synthetic-mediaIts offer asks for a customer testimonial with no recorded yes, so the draft refuses before a frame is written.

Used by