curl --request POST \
--url https://dally.ai/v1/previs.create \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"request_key": "font-plan-hooks-1",
"kind": "hooks",
"title": "The plan that made me stop filming",
"format": "9:16",
"character": "Late twenties, black hair past the ears, round glasses, a navy fleece.",
"references": [
"https://media.withdally.com/content/3b1f0c7a-9d24-4e51-b6c8-2f7a90d15e43/frames/1fps/0002.jpg",
"https://media.withdally.com/content/3b1f0c7a-9d24-4e51-b6c8-2f7a90d15e43/frames/1fps/0014.jpg",
"https://media.withdally.com/content/3b1f0c7a-9d24-4e51-b6c8-2f7a90d15e43/frames/1fps/0031.jpg"
],
"frames": [
{
"say": "I spent longer choosing a font than filming.",
"see": "The creator closes a laptop at a kitchen table, looking quietly amused.",
"on_screen": "Still choosing the font",
"other_words": [
"Font first, filming second",
"Day three of the font"
],
"seconds": 4,
"place": "lower",
"box": "none",
"borrowed_from": []
},
{
"say": "I spent longer choosing a font than filming.",
"see": "The creator closes a laptop at a kitchen table, looking quietly amused.",
"on_screen": "The plan had a font",
"other_words": [
"I named the font before the reel",
"Serif, then silence"
],
"seconds": 4,
"place": "lower",
"box": "none",
"borrowed_from": []
},
{
"say": "I spent longer choosing a font than filming.",
"see": "The creator closes a laptop at a kitchen table, looking quietly amused.",
"on_screen": "Nothing filmed, one font picked",
"other_words": [
"The font is done",
"Ask me about the font"
],
"seconds": 4,
"place": "lower",
"box": "none",
"borrowed_from": []
},
{
"say": "I spent longer choosing a font than filming.",
"see": "The creator closes a laptop at a kitchen table, looking quietly amused.",
"on_screen": "Filming is next week",
"other_words": [
"The font ships today",
"Done choosing"
],
"seconds": 4,
"place": "lower",
"box": "none",
"borrowed_from": []
}
],
"parent_id": null
}
'import requests
url = "https://dally.ai/v1/previs.create"
payload = {
"request_key": "font-plan-hooks-1",
"kind": "hooks",
"title": "The plan that made me stop filming",
"format": "9:16",
"character": "Late twenties, black hair past the ears, round glasses, a navy fleece.",
"references": ["https://media.withdally.com/content/3b1f0c7a-9d24-4e51-b6c8-2f7a90d15e43/frames/1fps/0002.jpg", "https://media.withdally.com/content/3b1f0c7a-9d24-4e51-b6c8-2f7a90d15e43/frames/1fps/0014.jpg", "https://media.withdally.com/content/3b1f0c7a-9d24-4e51-b6c8-2f7a90d15e43/frames/1fps/0031.jpg"],
"frames": [
{
"say": "I spent longer choosing a font than filming.",
"see": "The creator closes a laptop at a kitchen table, looking quietly amused.",
"on_screen": "Still choosing the font",
"other_words": ["Font first, filming second", "Day three of the font"],
"seconds": 4,
"place": "lower",
"box": "none",
"borrowed_from": []
},
{
"say": "I spent longer choosing a font than filming.",
"see": "The creator closes a laptop at a kitchen table, looking quietly amused.",
"on_screen": "The plan had a font",
"other_words": ["I named the font before the reel", "Serif, then silence"],
"seconds": 4,
"place": "lower",
"box": "none",
"borrowed_from": []
},
{
"say": "I spent longer choosing a font than filming.",
"see": "The creator closes a laptop at a kitchen table, looking quietly amused.",
"on_screen": "Nothing filmed, one font picked",
"other_words": ["The font is done", "Ask me about the font"],
"seconds": 4,
"place": "lower",
"box": "none",
"borrowed_from": []
},
{
"say": "I spent longer choosing a font than filming.",
"see": "The creator closes a laptop at a kitchen table, looking quietly amused.",
"on_screen": "Filming is next week",
"other_words": ["The font ships today", "Done choosing"],
"seconds": 4,
"place": "lower",
"box": "none",
"borrowed_from": []
}
],
"parent_id": None
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
request_key: 'font-plan-hooks-1',
kind: 'hooks',
title: 'The plan that made me stop filming',
format: '9:16',
character: 'Late twenties, black hair past the ears, round glasses, a navy fleece.',
references: [
'https://media.withdally.com/content/3b1f0c7a-9d24-4e51-b6c8-2f7a90d15e43/frames/1fps/0002.jpg',
'https://media.withdally.com/content/3b1f0c7a-9d24-4e51-b6c8-2f7a90d15e43/frames/1fps/0014.jpg',
'https://media.withdally.com/content/3b1f0c7a-9d24-4e51-b6c8-2f7a90d15e43/frames/1fps/0031.jpg'
],
frames: [
{
say: 'I spent longer choosing a font than filming.',
see: 'The creator closes a laptop at a kitchen table, looking quietly amused.',
on_screen: 'Still choosing the font',
other_words: ['Font first, filming second', 'Day three of the font'],
seconds: 4,
place: 'lower',
box: 'none',
borrowed_from: []
},
{
say: 'I spent longer choosing a font than filming.',
see: 'The creator closes a laptop at a kitchen table, looking quietly amused.',
on_screen: 'The plan had a font',
other_words: ['I named the font before the reel', 'Serif, then silence'],
seconds: 4,
place: 'lower',
box: 'none',
borrowed_from: []
},
{
say: 'I spent longer choosing a font than filming.',
see: 'The creator closes a laptop at a kitchen table, looking quietly amused.',
on_screen: 'Nothing filmed, one font picked',
other_words: ['The font is done', 'Ask me about the font'],
seconds: 4,
place: 'lower',
box: 'none',
borrowed_from: []
},
{
say: 'I spent longer choosing a font than filming.',
see: 'The creator closes a laptop at a kitchen table, looking quietly amused.',
on_screen: 'Filming is next week',
other_words: ['The font ships today', 'Done choosing'],
seconds: 4,
place: 'lower',
box: 'none',
borrowed_from: []
}
],
parent_id: null
})
};
fetch('https://dally.ai/v1/previs.create', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://dally.ai/v1/previs.create",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'request_key' => 'font-plan-hooks-1',
'kind' => 'hooks',
'title' => 'The plan that made me stop filming',
'format' => '9:16',
'character' => 'Late twenties, black hair past the ears, round glasses, a navy fleece.',
'references' => [
'https://media.withdally.com/content/3b1f0c7a-9d24-4e51-b6c8-2f7a90d15e43/frames/1fps/0002.jpg',
'https://media.withdally.com/content/3b1f0c7a-9d24-4e51-b6c8-2f7a90d15e43/frames/1fps/0014.jpg',
'https://media.withdally.com/content/3b1f0c7a-9d24-4e51-b6c8-2f7a90d15e43/frames/1fps/0031.jpg'
],
'frames' => [
[
'say' => 'I spent longer choosing a font than filming.',
'see' => 'The creator closes a laptop at a kitchen table, looking quietly amused.',
'on_screen' => 'Still choosing the font',
'other_words' => [
'Font first, filming second',
'Day three of the font'
],
'seconds' => 4,
'place' => 'lower',
'box' => 'none',
'borrowed_from' => [
]
],
[
'say' => 'I spent longer choosing a font than filming.',
'see' => 'The creator closes a laptop at a kitchen table, looking quietly amused.',
'on_screen' => 'The plan had a font',
'other_words' => [
'I named the font before the reel',
'Serif, then silence'
],
'seconds' => 4,
'place' => 'lower',
'box' => 'none',
'borrowed_from' => [
]
],
[
'say' => 'I spent longer choosing a font than filming.',
'see' => 'The creator closes a laptop at a kitchen table, looking quietly amused.',
'on_screen' => 'Nothing filmed, one font picked',
'other_words' => [
'The font is done',
'Ask me about the font'
],
'seconds' => 4,
'place' => 'lower',
'box' => 'none',
'borrowed_from' => [
]
],
[
'say' => 'I spent longer choosing a font than filming.',
'see' => 'The creator closes a laptop at a kitchen table, looking quietly amused.',
'on_screen' => 'Filming is next week',
'other_words' => [
'The font ships today',
'Done choosing'
],
'seconds' => 4,
'place' => 'lower',
'box' => 'none',
'borrowed_from' => [
]
]
],
'parent_id' => null
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://dally.ai/v1/previs.create"
payload := strings.NewReader("{\n \"request_key\": \"font-plan-hooks-1\",\n \"kind\": \"hooks\",\n \"title\": \"The plan that made me stop filming\",\n \"format\": \"9:16\",\n \"character\": \"Late twenties, black hair past the ears, round glasses, a navy fleece.\",\n \"references\": [\n \"https://media.withdally.com/content/3b1f0c7a-9d24-4e51-b6c8-2f7a90d15e43/frames/1fps/0002.jpg\",\n \"https://media.withdally.com/content/3b1f0c7a-9d24-4e51-b6c8-2f7a90d15e43/frames/1fps/0014.jpg\",\n \"https://media.withdally.com/content/3b1f0c7a-9d24-4e51-b6c8-2f7a90d15e43/frames/1fps/0031.jpg\"\n ],\n \"frames\": [\n {\n \"say\": \"I spent longer choosing a font than filming.\",\n \"see\": \"The creator closes a laptop at a kitchen table, looking quietly amused.\",\n \"on_screen\": \"Still choosing the font\",\n \"other_words\": [\n \"Font first, filming second\",\n \"Day three of the font\"\n ],\n \"seconds\": 4,\n \"place\": \"lower\",\n \"box\": \"none\",\n \"borrowed_from\": []\n },\n {\n \"say\": \"I spent longer choosing a font than filming.\",\n \"see\": \"The creator closes a laptop at a kitchen table, looking quietly amused.\",\n \"on_screen\": \"The plan had a font\",\n \"other_words\": [\n \"I named the font before the reel\",\n \"Serif, then silence\"\n ],\n \"seconds\": 4,\n \"place\": \"lower\",\n \"box\": \"none\",\n \"borrowed_from\": []\n },\n {\n \"say\": \"I spent longer choosing a font than filming.\",\n \"see\": \"The creator closes a laptop at a kitchen table, looking quietly amused.\",\n \"on_screen\": \"Nothing filmed, one font picked\",\n \"other_words\": [\n \"The font is done\",\n \"Ask me about the font\"\n ],\n \"seconds\": 4,\n \"place\": \"lower\",\n \"box\": \"none\",\n \"borrowed_from\": []\n },\n {\n \"say\": \"I spent longer choosing a font than filming.\",\n \"see\": \"The creator closes a laptop at a kitchen table, looking quietly amused.\",\n \"on_screen\": \"Filming is next week\",\n \"other_words\": [\n \"The font ships today\",\n \"Done choosing\"\n ],\n \"seconds\": 4,\n \"place\": \"lower\",\n \"box\": \"none\",\n \"borrowed_from\": []\n }\n ],\n \"parent_id\": null\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://dally.ai/v1/previs.create")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"request_key\": \"font-plan-hooks-1\",\n \"kind\": \"hooks\",\n \"title\": \"The plan that made me stop filming\",\n \"format\": \"9:16\",\n \"character\": \"Late twenties, black hair past the ears, round glasses, a navy fleece.\",\n \"references\": [\n \"https://media.withdally.com/content/3b1f0c7a-9d24-4e51-b6c8-2f7a90d15e43/frames/1fps/0002.jpg\",\n \"https://media.withdally.com/content/3b1f0c7a-9d24-4e51-b6c8-2f7a90d15e43/frames/1fps/0014.jpg\",\n \"https://media.withdally.com/content/3b1f0c7a-9d24-4e51-b6c8-2f7a90d15e43/frames/1fps/0031.jpg\"\n ],\n \"frames\": [\n {\n \"say\": \"I spent longer choosing a font than filming.\",\n \"see\": \"The creator closes a laptop at a kitchen table, looking quietly amused.\",\n \"on_screen\": \"Still choosing the font\",\n \"other_words\": [\n \"Font first, filming second\",\n \"Day three of the font\"\n ],\n \"seconds\": 4,\n \"place\": \"lower\",\n \"box\": \"none\",\n \"borrowed_from\": []\n },\n {\n \"say\": \"I spent longer choosing a font than filming.\",\n \"see\": \"The creator closes a laptop at a kitchen table, looking quietly amused.\",\n \"on_screen\": \"The plan had a font\",\n \"other_words\": [\n \"I named the font before the reel\",\n \"Serif, then silence\"\n ],\n \"seconds\": 4,\n \"place\": \"lower\",\n \"box\": \"none\",\n \"borrowed_from\": []\n },\n {\n \"say\": \"I spent longer choosing a font than filming.\",\n \"see\": \"The creator closes a laptop at a kitchen table, looking quietly amused.\",\n \"on_screen\": \"Nothing filmed, one font picked\",\n \"other_words\": [\n \"The font is done\",\n \"Ask me about the font\"\n ],\n \"seconds\": 4,\n \"place\": \"lower\",\n \"box\": \"none\",\n \"borrowed_from\": []\n },\n {\n \"say\": \"I spent longer choosing a font than filming.\",\n \"see\": \"The creator closes a laptop at a kitchen table, looking quietly amused.\",\n \"on_screen\": \"Filming is next week\",\n \"other_words\": [\n \"The font ships today\",\n \"Done choosing\"\n ],\n \"seconds\": 4,\n \"place\": \"lower\",\n \"box\": \"none\",\n \"borrowed_from\": []\n }\n ],\n \"parent_id\": null\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://dally.ai/v1/previs.create")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"request_key\": \"font-plan-hooks-1\",\n \"kind\": \"hooks\",\n \"title\": \"The plan that made me stop filming\",\n \"format\": \"9:16\",\n \"character\": \"Late twenties, black hair past the ears, round glasses, a navy fleece.\",\n \"references\": [\n \"https://media.withdally.com/content/3b1f0c7a-9d24-4e51-b6c8-2f7a90d15e43/frames/1fps/0002.jpg\",\n \"https://media.withdally.com/content/3b1f0c7a-9d24-4e51-b6c8-2f7a90d15e43/frames/1fps/0014.jpg\",\n \"https://media.withdally.com/content/3b1f0c7a-9d24-4e51-b6c8-2f7a90d15e43/frames/1fps/0031.jpg\"\n ],\n \"frames\": [\n {\n \"say\": \"I spent longer choosing a font than filming.\",\n \"see\": \"The creator closes a laptop at a kitchen table, looking quietly amused.\",\n \"on_screen\": \"Still choosing the font\",\n \"other_words\": [\n \"Font first, filming second\",\n \"Day three of the font\"\n ],\n \"seconds\": 4,\n \"place\": \"lower\",\n \"box\": \"none\",\n \"borrowed_from\": []\n },\n {\n \"say\": \"I spent longer choosing a font than filming.\",\n \"see\": \"The creator closes a laptop at a kitchen table, looking quietly amused.\",\n \"on_screen\": \"The plan had a font\",\n \"other_words\": [\n \"I named the font before the reel\",\n \"Serif, then silence\"\n ],\n \"seconds\": 4,\n \"place\": \"lower\",\n \"box\": \"none\",\n \"borrowed_from\": []\n },\n {\n \"say\": \"I spent longer choosing a font than filming.\",\n \"see\": \"The creator closes a laptop at a kitchen table, looking quietly amused.\",\n \"on_screen\": \"Nothing filmed, one font picked\",\n \"other_words\": [\n \"The font is done\",\n \"Ask me about the font\"\n ],\n \"seconds\": 4,\n \"place\": \"lower\",\n \"box\": \"none\",\n \"borrowed_from\": []\n },\n {\n \"say\": \"I spent longer choosing a font than filming.\",\n \"see\": \"The creator closes a laptop at a kitchen table, looking quietly amused.\",\n \"on_screen\": \"Filming is next week\",\n \"other_words\": [\n \"The font ships today\",\n \"Done choosing\"\n ],\n \"seconds\": 4,\n \"place\": \"lower\",\n \"box\": \"none\",\n \"borrowed_from\": []\n }\n ],\n \"parent_id\": null\n}"
response = http.request(request)
puts response.read_body{
"previs": {
"previs_id": "bc3c7b36-7ac7-433d-82ef-58bc2d1fe1d1",
"kind": "hooks",
"title": "The plan that made me stop filming",
"format": "9:16",
"frames": [
{
"say": "I spent longer choosing a font than filming.",
"see": "The creator closes a laptop at a kitchen table, looking quietly amused.",
"on_screen": "Still choosing the font",
"other_words": [
"Font first, filming second",
"Day three of the font"
],
"seconds": 4,
"place": "lower",
"box": "none",
"borrowed_from": []
},
{
"say": "I spent longer choosing a font than filming.",
"see": "The creator closes a laptop at a kitchen table, looking quietly amused.",
"on_screen": "The plan had a font",
"other_words": [
"I named the font before the reel",
"Serif, then silence"
],
"seconds": 4,
"place": "lower",
"box": "none",
"borrowed_from": []
},
{
"say": "I spent longer choosing a font than filming.",
"see": "The creator closes a laptop at a kitchen table, looking quietly amused.",
"on_screen": "Nothing filmed, one font picked",
"other_words": [
"The font is done",
"Ask me about the font"
],
"seconds": 4,
"place": "lower",
"box": "none",
"borrowed_from": []
},
{
"say": "I spent longer choosing a font than filming.",
"see": "The creator closes a laptop at a kitchen table, looking quietly amused.",
"on_screen": "Filming is next week",
"other_words": [
"The font ships today",
"Done choosing"
],
"seconds": 4,
"place": "lower",
"box": "none",
"borrowed_from": []
}
],
"receipts": [],
"status": "queued",
"picked_index": null,
"revision": 1,
"revisions": [
{
"revision": 1,
"made_by": "chat",
"what": "Four hooks authored",
"forked_from": null,
"created_at": "2026-09-10T19:00:00.000Z",
"frames": [
{
"on_screen": "Still choosing the font",
"place": "lower",
"box": "none"
},
{
"on_screen": "The plan had a font",
"place": "lower",
"box": "none"
},
{
"on_screen": "Nothing filmed, one font picked",
"place": "lower",
"box": "none"
},
{
"on_screen": "Filming is next week",
"place": "lower",
"box": "none"
}
]
}
],
"result": null,
"error": null,
"created_at": "2026-09-10T19:00:00.000Z"
},
"show": {
"kind": "previs"
},
"request_id": "req_previs_example"
}{
"error": {
"code": "invalid_request",
"message": "<string>",
"details": {}
},
"request_id": "<string>"
}previs.create
Access: public. Send a JSON body; unknown keys are rejected with 400 invalid_request (inputs are strict). Responses may gain fields additively — never remove or repurpose; ignore unknown response fields.
curl --request POST \
--url https://dally.ai/v1/previs.create \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"request_key": "font-plan-hooks-1",
"kind": "hooks",
"title": "The plan that made me stop filming",
"format": "9:16",
"character": "Late twenties, black hair past the ears, round glasses, a navy fleece.",
"references": [
"https://media.withdally.com/content/3b1f0c7a-9d24-4e51-b6c8-2f7a90d15e43/frames/1fps/0002.jpg",
"https://media.withdally.com/content/3b1f0c7a-9d24-4e51-b6c8-2f7a90d15e43/frames/1fps/0014.jpg",
"https://media.withdally.com/content/3b1f0c7a-9d24-4e51-b6c8-2f7a90d15e43/frames/1fps/0031.jpg"
],
"frames": [
{
"say": "I spent longer choosing a font than filming.",
"see": "The creator closes a laptop at a kitchen table, looking quietly amused.",
"on_screen": "Still choosing the font",
"other_words": [
"Font first, filming second",
"Day three of the font"
],
"seconds": 4,
"place": "lower",
"box": "none",
"borrowed_from": []
},
{
"say": "I spent longer choosing a font than filming.",
"see": "The creator closes a laptop at a kitchen table, looking quietly amused.",
"on_screen": "The plan had a font",
"other_words": [
"I named the font before the reel",
"Serif, then silence"
],
"seconds": 4,
"place": "lower",
"box": "none",
"borrowed_from": []
},
{
"say": "I spent longer choosing a font than filming.",
"see": "The creator closes a laptop at a kitchen table, looking quietly amused.",
"on_screen": "Nothing filmed, one font picked",
"other_words": [
"The font is done",
"Ask me about the font"
],
"seconds": 4,
"place": "lower",
"box": "none",
"borrowed_from": []
},
{
"say": "I spent longer choosing a font than filming.",
"see": "The creator closes a laptop at a kitchen table, looking quietly amused.",
"on_screen": "Filming is next week",
"other_words": [
"The font ships today",
"Done choosing"
],
"seconds": 4,
"place": "lower",
"box": "none",
"borrowed_from": []
}
],
"parent_id": null
}
'import requests
url = "https://dally.ai/v1/previs.create"
payload = {
"request_key": "font-plan-hooks-1",
"kind": "hooks",
"title": "The plan that made me stop filming",
"format": "9:16",
"character": "Late twenties, black hair past the ears, round glasses, a navy fleece.",
"references": ["https://media.withdally.com/content/3b1f0c7a-9d24-4e51-b6c8-2f7a90d15e43/frames/1fps/0002.jpg", "https://media.withdally.com/content/3b1f0c7a-9d24-4e51-b6c8-2f7a90d15e43/frames/1fps/0014.jpg", "https://media.withdally.com/content/3b1f0c7a-9d24-4e51-b6c8-2f7a90d15e43/frames/1fps/0031.jpg"],
"frames": [
{
"say": "I spent longer choosing a font than filming.",
"see": "The creator closes a laptop at a kitchen table, looking quietly amused.",
"on_screen": "Still choosing the font",
"other_words": ["Font first, filming second", "Day three of the font"],
"seconds": 4,
"place": "lower",
"box": "none",
"borrowed_from": []
},
{
"say": "I spent longer choosing a font than filming.",
"see": "The creator closes a laptop at a kitchen table, looking quietly amused.",
"on_screen": "The plan had a font",
"other_words": ["I named the font before the reel", "Serif, then silence"],
"seconds": 4,
"place": "lower",
"box": "none",
"borrowed_from": []
},
{
"say": "I spent longer choosing a font than filming.",
"see": "The creator closes a laptop at a kitchen table, looking quietly amused.",
"on_screen": "Nothing filmed, one font picked",
"other_words": ["The font is done", "Ask me about the font"],
"seconds": 4,
"place": "lower",
"box": "none",
"borrowed_from": []
},
{
"say": "I spent longer choosing a font than filming.",
"see": "The creator closes a laptop at a kitchen table, looking quietly amused.",
"on_screen": "Filming is next week",
"other_words": ["The font ships today", "Done choosing"],
"seconds": 4,
"place": "lower",
"box": "none",
"borrowed_from": []
}
],
"parent_id": None
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
request_key: 'font-plan-hooks-1',
kind: 'hooks',
title: 'The plan that made me stop filming',
format: '9:16',
character: 'Late twenties, black hair past the ears, round glasses, a navy fleece.',
references: [
'https://media.withdally.com/content/3b1f0c7a-9d24-4e51-b6c8-2f7a90d15e43/frames/1fps/0002.jpg',
'https://media.withdally.com/content/3b1f0c7a-9d24-4e51-b6c8-2f7a90d15e43/frames/1fps/0014.jpg',
'https://media.withdally.com/content/3b1f0c7a-9d24-4e51-b6c8-2f7a90d15e43/frames/1fps/0031.jpg'
],
frames: [
{
say: 'I spent longer choosing a font than filming.',
see: 'The creator closes a laptop at a kitchen table, looking quietly amused.',
on_screen: 'Still choosing the font',
other_words: ['Font first, filming second', 'Day three of the font'],
seconds: 4,
place: 'lower',
box: 'none',
borrowed_from: []
},
{
say: 'I spent longer choosing a font than filming.',
see: 'The creator closes a laptop at a kitchen table, looking quietly amused.',
on_screen: 'The plan had a font',
other_words: ['I named the font before the reel', 'Serif, then silence'],
seconds: 4,
place: 'lower',
box: 'none',
borrowed_from: []
},
{
say: 'I spent longer choosing a font than filming.',
see: 'The creator closes a laptop at a kitchen table, looking quietly amused.',
on_screen: 'Nothing filmed, one font picked',
other_words: ['The font is done', 'Ask me about the font'],
seconds: 4,
place: 'lower',
box: 'none',
borrowed_from: []
},
{
say: 'I spent longer choosing a font than filming.',
see: 'The creator closes a laptop at a kitchen table, looking quietly amused.',
on_screen: 'Filming is next week',
other_words: ['The font ships today', 'Done choosing'],
seconds: 4,
place: 'lower',
box: 'none',
borrowed_from: []
}
],
parent_id: null
})
};
fetch('https://dally.ai/v1/previs.create', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://dally.ai/v1/previs.create",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'request_key' => 'font-plan-hooks-1',
'kind' => 'hooks',
'title' => 'The plan that made me stop filming',
'format' => '9:16',
'character' => 'Late twenties, black hair past the ears, round glasses, a navy fleece.',
'references' => [
'https://media.withdally.com/content/3b1f0c7a-9d24-4e51-b6c8-2f7a90d15e43/frames/1fps/0002.jpg',
'https://media.withdally.com/content/3b1f0c7a-9d24-4e51-b6c8-2f7a90d15e43/frames/1fps/0014.jpg',
'https://media.withdally.com/content/3b1f0c7a-9d24-4e51-b6c8-2f7a90d15e43/frames/1fps/0031.jpg'
],
'frames' => [
[
'say' => 'I spent longer choosing a font than filming.',
'see' => 'The creator closes a laptop at a kitchen table, looking quietly amused.',
'on_screen' => 'Still choosing the font',
'other_words' => [
'Font first, filming second',
'Day three of the font'
],
'seconds' => 4,
'place' => 'lower',
'box' => 'none',
'borrowed_from' => [
]
],
[
'say' => 'I spent longer choosing a font than filming.',
'see' => 'The creator closes a laptop at a kitchen table, looking quietly amused.',
'on_screen' => 'The plan had a font',
'other_words' => [
'I named the font before the reel',
'Serif, then silence'
],
'seconds' => 4,
'place' => 'lower',
'box' => 'none',
'borrowed_from' => [
]
],
[
'say' => 'I spent longer choosing a font than filming.',
'see' => 'The creator closes a laptop at a kitchen table, looking quietly amused.',
'on_screen' => 'Nothing filmed, one font picked',
'other_words' => [
'The font is done',
'Ask me about the font'
],
'seconds' => 4,
'place' => 'lower',
'box' => 'none',
'borrowed_from' => [
]
],
[
'say' => 'I spent longer choosing a font than filming.',
'see' => 'The creator closes a laptop at a kitchen table, looking quietly amused.',
'on_screen' => 'Filming is next week',
'other_words' => [
'The font ships today',
'Done choosing'
],
'seconds' => 4,
'place' => 'lower',
'box' => 'none',
'borrowed_from' => [
]
]
],
'parent_id' => null
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://dally.ai/v1/previs.create"
payload := strings.NewReader("{\n \"request_key\": \"font-plan-hooks-1\",\n \"kind\": \"hooks\",\n \"title\": \"The plan that made me stop filming\",\n \"format\": \"9:16\",\n \"character\": \"Late twenties, black hair past the ears, round glasses, a navy fleece.\",\n \"references\": [\n \"https://media.withdally.com/content/3b1f0c7a-9d24-4e51-b6c8-2f7a90d15e43/frames/1fps/0002.jpg\",\n \"https://media.withdally.com/content/3b1f0c7a-9d24-4e51-b6c8-2f7a90d15e43/frames/1fps/0014.jpg\",\n \"https://media.withdally.com/content/3b1f0c7a-9d24-4e51-b6c8-2f7a90d15e43/frames/1fps/0031.jpg\"\n ],\n \"frames\": [\n {\n \"say\": \"I spent longer choosing a font than filming.\",\n \"see\": \"The creator closes a laptop at a kitchen table, looking quietly amused.\",\n \"on_screen\": \"Still choosing the font\",\n \"other_words\": [\n \"Font first, filming second\",\n \"Day three of the font\"\n ],\n \"seconds\": 4,\n \"place\": \"lower\",\n \"box\": \"none\",\n \"borrowed_from\": []\n },\n {\n \"say\": \"I spent longer choosing a font than filming.\",\n \"see\": \"The creator closes a laptop at a kitchen table, looking quietly amused.\",\n \"on_screen\": \"The plan had a font\",\n \"other_words\": [\n \"I named the font before the reel\",\n \"Serif, then silence\"\n ],\n \"seconds\": 4,\n \"place\": \"lower\",\n \"box\": \"none\",\n \"borrowed_from\": []\n },\n {\n \"say\": \"I spent longer choosing a font than filming.\",\n \"see\": \"The creator closes a laptop at a kitchen table, looking quietly amused.\",\n \"on_screen\": \"Nothing filmed, one font picked\",\n \"other_words\": [\n \"The font is done\",\n \"Ask me about the font\"\n ],\n \"seconds\": 4,\n \"place\": \"lower\",\n \"box\": \"none\",\n \"borrowed_from\": []\n },\n {\n \"say\": \"I spent longer choosing a font than filming.\",\n \"see\": \"The creator closes a laptop at a kitchen table, looking quietly amused.\",\n \"on_screen\": \"Filming is next week\",\n \"other_words\": [\n \"The font ships today\",\n \"Done choosing\"\n ],\n \"seconds\": 4,\n \"place\": \"lower\",\n \"box\": \"none\",\n \"borrowed_from\": []\n }\n ],\n \"parent_id\": null\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://dally.ai/v1/previs.create")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"request_key\": \"font-plan-hooks-1\",\n \"kind\": \"hooks\",\n \"title\": \"The plan that made me stop filming\",\n \"format\": \"9:16\",\n \"character\": \"Late twenties, black hair past the ears, round glasses, a navy fleece.\",\n \"references\": [\n \"https://media.withdally.com/content/3b1f0c7a-9d24-4e51-b6c8-2f7a90d15e43/frames/1fps/0002.jpg\",\n \"https://media.withdally.com/content/3b1f0c7a-9d24-4e51-b6c8-2f7a90d15e43/frames/1fps/0014.jpg\",\n \"https://media.withdally.com/content/3b1f0c7a-9d24-4e51-b6c8-2f7a90d15e43/frames/1fps/0031.jpg\"\n ],\n \"frames\": [\n {\n \"say\": \"I spent longer choosing a font than filming.\",\n \"see\": \"The creator closes a laptop at a kitchen table, looking quietly amused.\",\n \"on_screen\": \"Still choosing the font\",\n \"other_words\": [\n \"Font first, filming second\",\n \"Day three of the font\"\n ],\n \"seconds\": 4,\n \"place\": \"lower\",\n \"box\": \"none\",\n \"borrowed_from\": []\n },\n {\n \"say\": \"I spent longer choosing a font than filming.\",\n \"see\": \"The creator closes a laptop at a kitchen table, looking quietly amused.\",\n \"on_screen\": \"The plan had a font\",\n \"other_words\": [\n \"I named the font before the reel\",\n \"Serif, then silence\"\n ],\n \"seconds\": 4,\n \"place\": \"lower\",\n \"box\": \"none\",\n \"borrowed_from\": []\n },\n {\n \"say\": \"I spent longer choosing a font than filming.\",\n \"see\": \"The creator closes a laptop at a kitchen table, looking quietly amused.\",\n \"on_screen\": \"Nothing filmed, one font picked\",\n \"other_words\": [\n \"The font is done\",\n \"Ask me about the font\"\n ],\n \"seconds\": 4,\n \"place\": \"lower\",\n \"box\": \"none\",\n \"borrowed_from\": []\n },\n {\n \"say\": \"I spent longer choosing a font than filming.\",\n \"see\": \"The creator closes a laptop at a kitchen table, looking quietly amused.\",\n \"on_screen\": \"Filming is next week\",\n \"other_words\": [\n \"The font ships today\",\n \"Done choosing\"\n ],\n \"seconds\": 4,\n \"place\": \"lower\",\n \"box\": \"none\",\n \"borrowed_from\": []\n }\n ],\n \"parent_id\": null\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://dally.ai/v1/previs.create")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"request_key\": \"font-plan-hooks-1\",\n \"kind\": \"hooks\",\n \"title\": \"The plan that made me stop filming\",\n \"format\": \"9:16\",\n \"character\": \"Late twenties, black hair past the ears, round glasses, a navy fleece.\",\n \"references\": [\n \"https://media.withdally.com/content/3b1f0c7a-9d24-4e51-b6c8-2f7a90d15e43/frames/1fps/0002.jpg\",\n \"https://media.withdally.com/content/3b1f0c7a-9d24-4e51-b6c8-2f7a90d15e43/frames/1fps/0014.jpg\",\n \"https://media.withdally.com/content/3b1f0c7a-9d24-4e51-b6c8-2f7a90d15e43/frames/1fps/0031.jpg\"\n ],\n \"frames\": [\n {\n \"say\": \"I spent longer choosing a font than filming.\",\n \"see\": \"The creator closes a laptop at a kitchen table, looking quietly amused.\",\n \"on_screen\": \"Still choosing the font\",\n \"other_words\": [\n \"Font first, filming second\",\n \"Day three of the font\"\n ],\n \"seconds\": 4,\n \"place\": \"lower\",\n \"box\": \"none\",\n \"borrowed_from\": []\n },\n {\n \"say\": \"I spent longer choosing a font than filming.\",\n \"see\": \"The creator closes a laptop at a kitchen table, looking quietly amused.\",\n \"on_screen\": \"The plan had a font\",\n \"other_words\": [\n \"I named the font before the reel\",\n \"Serif, then silence\"\n ],\n \"seconds\": 4,\n \"place\": \"lower\",\n \"box\": \"none\",\n \"borrowed_from\": []\n },\n {\n \"say\": \"I spent longer choosing a font than filming.\",\n \"see\": \"The creator closes a laptop at a kitchen table, looking quietly amused.\",\n \"on_screen\": \"Nothing filmed, one font picked\",\n \"other_words\": [\n \"The font is done\",\n \"Ask me about the font\"\n ],\n \"seconds\": 4,\n \"place\": \"lower\",\n \"box\": \"none\",\n \"borrowed_from\": []\n },\n {\n \"say\": \"I spent longer choosing a font than filming.\",\n \"see\": \"The creator closes a laptop at a kitchen table, looking quietly amused.\",\n \"on_screen\": \"Filming is next week\",\n \"other_words\": [\n \"The font ships today\",\n \"Done choosing\"\n ],\n \"seconds\": 4,\n \"place\": \"lower\",\n \"box\": \"none\",\n \"borrowed_from\": []\n }\n ],\n \"parent_id\": null\n}"
response = http.request(request)
puts response.read_body{
"previs": {
"previs_id": "bc3c7b36-7ac7-433d-82ef-58bc2d1fe1d1",
"kind": "hooks",
"title": "The plan that made me stop filming",
"format": "9:16",
"frames": [
{
"say": "I spent longer choosing a font than filming.",
"see": "The creator closes a laptop at a kitchen table, looking quietly amused.",
"on_screen": "Still choosing the font",
"other_words": [
"Font first, filming second",
"Day three of the font"
],
"seconds": 4,
"place": "lower",
"box": "none",
"borrowed_from": []
},
{
"say": "I spent longer choosing a font than filming.",
"see": "The creator closes a laptop at a kitchen table, looking quietly amused.",
"on_screen": "The plan had a font",
"other_words": [
"I named the font before the reel",
"Serif, then silence"
],
"seconds": 4,
"place": "lower",
"box": "none",
"borrowed_from": []
},
{
"say": "I spent longer choosing a font than filming.",
"see": "The creator closes a laptop at a kitchen table, looking quietly amused.",
"on_screen": "Nothing filmed, one font picked",
"other_words": [
"The font is done",
"Ask me about the font"
],
"seconds": 4,
"place": "lower",
"box": "none",
"borrowed_from": []
},
{
"say": "I spent longer choosing a font than filming.",
"see": "The creator closes a laptop at a kitchen table, looking quietly amused.",
"on_screen": "Filming is next week",
"other_words": [
"The font ships today",
"Done choosing"
],
"seconds": 4,
"place": "lower",
"box": "none",
"borrowed_from": []
}
],
"receipts": [],
"status": "queued",
"picked_index": null,
"revision": 1,
"revisions": [
{
"revision": 1,
"made_by": "chat",
"what": "Four hooks authored",
"forked_from": null,
"created_at": "2026-09-10T19:00:00.000Z",
"frames": [
{
"on_screen": "Still choosing the font",
"place": "lower",
"box": "none"
},
{
"on_screen": "The plan had a font",
"place": "lower",
"box": "none"
},
{
"on_screen": "Nothing filmed, one font picked",
"place": "lower",
"box": "none"
},
{
"on_screen": "Filming is next week",
"place": "lower",
"box": "none"
}
]
}
],
"result": null,
"error": null,
"created_at": "2026-09-10T19:00:00.000Z"
},
"show": {
"kind": "previs"
},
"request_id": "req_previs_example"
}{
"error": {
"code": "invalid_request",
"message": "<string>",
"details": {}
},
"request_id": "<string>"
}Authorizations
A WorkOS-dashboard-issued internal API key on Authorization: Bearer.
Body
A unique name for this previs. Keep it unchanged on retries.
1 - 128Four alternative openings, or four consecutive beats of the picked opening's story.
hooks, storyboard A short title for this new idea.
1 - 160Exactly four freshly authored frames in reading order. Hooks are alternatives; storyboard beats form one complete new story.
4 elementsShow child attributes
Show child attributes
Video frame shape: portrait short form or landscape long form. Storyboards inherit their parent.
9:16, 16:9 The creator's appearance from their reference images; required for hooks, inherited for storyboards.
1500Exactly three Dally media image URLs for the real creator and rooms, from open; inherited for a storyboard.
3The completed hook Previs id for a storyboard; null for hooks.
^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$Response
Success. request_id is present on every response.
The stored previs and its current state; dally_show kind previs takes this whole response.
Show child attributes
Show child attributes
How it is shown: dally_write renders this kind on this very answer with this whole response as its data, so the creator already sees it; do not render it again.
Show child attributes
Show child attributes
Server-minted id for this request. Present on every response, success and error — quote it when reporting a problem.
1