{
  "service": "kino402",
  "x402_versions": [
    1,
    2
  ],
  "network": {
    "v1": "base",
    "v2": "eip155:8453",
    "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
    "symbol": "USDC"
  },
  "rails": [
    {
      "name": "Base",
      "v1": "base",
      "v2": "eip155:8453",
      "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
      "symbol": "USDC"
    },
    {
      "name": "Solana",
      "v1": "solana",
      "v2": "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp",
      "asset": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
      "symbol": "USDC"
    }
  ],
  "pricing": "priced per call from the rate in each model's formula, on a $0.001 grid. The unpaid 402 quotes the exact number for the body you sent, and that is the number that settles.",
  "failures": "payment settles when the job is accepted. A job that fails twice reports status=failed with the reason; contact support@kino402.com with the job id.",
  "tts_buyer": {
    "guide": "https://kino402.com/tts",
    "skill": "https://kino402.com/skill.md"
  },
  "models": [
    {
      "id": "seedance-2.0",
      "kind": "video",
      "title": "Seedance 2.0",
      "mark": "SD 2.0",
      "vendor": "ByteDance",
      "path": "/v1/generate",
      "good_at": "The flagship. Physical camera moves, coherent motion, the one to reach for when the shot has to hold up.",
      "resolutions": [
        "480p",
        "720p"
      ],
      "default_resolution": "720p",
      "aspect_ratios": [
        "auto",
        "21:9",
        "16:9",
        "4:3",
        "1:1",
        "3:4",
        "9:16"
      ],
      "duration_s": {
        "min": 4,
        "max": 15,
        "default": 5
      },
      "audio": false,
      "image_to_video": false,
      "input": "JSON: {model, prompt, duration_s?, resolution?, aspect_ratio?, audio?, image_urls?}",
      "formula": "$0.0168 per 1k video tokens ((h×w×24×s)/1024)",
      "example": {
        "params": {
          "duration_s": 5,
          "resolution": "720p"
        },
        "price": "$1.815",
        "price_atomic_usdc": "1815000"
      }
    },
    {
      "id": "seedance-2.0-mini",
      "kind": "video",
      "title": "Seedance 2.0 mini",
      "mark": "SD 2.0m",
      "vendor": "ByteDance",
      "path": "/v1/generate",
      "good_at": "Draft passes and volume. Priced per second flat, so a ten-second look costs exactly twice a five-second one.",
      "resolutions": [
        "480p",
        "720p"
      ],
      "default_resolution": "720p",
      "aspect_ratios": [
        "auto",
        "21:9",
        "16:9",
        "4:3",
        "1:1",
        "3:4",
        "9:16"
      ],
      "duration_s": {
        "min": 4,
        "max": 15,
        "default": 5
      },
      "audio": false,
      "image_to_video": false,
      "input": "JSON: {model, prompt, duration_s?, resolution?, aspect_ratio?, audio?, image_urls?}",
      "formula": "$0.08652 per second at 480p, $0.18564 at 720p",
      "example": {
        "params": {
          "duration_s": 5,
          "resolution": "720p"
        },
        "price": "$0.929",
        "price_atomic_usdc": "929000"
      }
    },
    {
      "id": "seedance-2.5",
      "kind": "video",
      "title": "Seedance 2.5",
      "mark": "SD 2.5",
      "vendor": "ByteDance",
      "path": "/v1/generate",
      "good_at": "The expensive one, and it looks it. Prompt adherence on complicated staging, up to a native 30-second single shot.",
      "resolutions": [
        "480p",
        "720p"
      ],
      "default_resolution": "720p",
      "aspect_ratios": [
        "auto",
        "21:9",
        "16:9",
        "4:3",
        "1:1",
        "3:4",
        "9:16"
      ],
      "duration_s": {
        "min": 4,
        "max": 30,
        "default": 5
      },
      "audio": false,
      "image_to_video": false,
      "input": "JSON: {model, prompt, duration_s?, resolution?, aspect_ratio?, audio?, image_urls?}",
      "formula": "$0.02568 per 1k video tokens",
      "example": {
        "params": {
          "duration_s": 5,
          "resolution": "720p"
        },
        "price": "$2.774",
        "price_atomic_usdc": "2774000"
      }
    },
    {
      "id": "seedance-1.5-pro",
      "kind": "video",
      "title": "Seedance 1.5 pro",
      "mark": "SD 1.5",
      "vendor": "ByteDance",
      "path": "/v1/generate",
      "good_at": "The previous generation, and the cheapest way to get a competent shot. It can carry its own audio, and at 480p it is the cheapest clip with sound here.",
      "resolutions": [
        "480p",
        "720p"
      ],
      "default_resolution": "720p",
      "aspect_ratios": [
        "auto",
        "21:9",
        "16:9",
        "4:3",
        "1:1",
        "3:4",
        "9:16"
      ],
      "duration_s": {
        "min": 4,
        "max": 12,
        "default": 5
      },
      "audio": true,
      "image_to_video": true,
      "input": "JSON: {model, prompt, duration_s?, resolution?, aspect_ratio?, audio?, image_urls?}",
      "formula": "$0.00288 per 1k tokens with audio, $0.00144 without",
      "example": {
        "params": {
          "duration_s": 5,
          "resolution": "720p"
        },
        "price": "$0.156",
        "price_atomic_usdc": "156000"
      }
    },
    {
      "id": "kling-2.5-turbo-pro",
      "kind": "video",
      "title": "Kling 2.5 turbo pro",
      "mark": "KL 2.5",
      "vendor": "Kuaishou",
      "path": "/v1/generate",
      "good_at": "Faces and hands that survive a second look. Flat 5s block price, then per extra second.",
      "resolutions": [
        "1080p"
      ],
      "default_resolution": "1080p",
      "aspect_ratios": null,
      "duration_s": {
        "min": 5,
        "max": 10,
        "default": 5,
        "only": [
          5,
          10
        ]
      },
      "audio": false,
      "image_to_video": false,
      "input": "JSON: {model, prompt, duration_s?, resolution?, aspect_ratio?, audio?, image_urls?}",
      "formula": "$0.42 for 5 seconds, $0.84 for 10",
      "example": {
        "params": {
          "duration_s": 5,
          "resolution": "1080p"
        },
        "price": "$0.42",
        "price_atomic_usdc": "420000"
      }
    },
    {
      "id": "hailuo-02-standard",
      "kind": "video",
      "title": "Hailuo 02 standard",
      "mark": "HL 02",
      "vendor": "MiniMax",
      "path": "/v1/generate",
      "good_at": "The cheap seat, and it holds a subject well. 768p only — do not ask it for a 4k plate.",
      "resolutions": [
        "768p"
      ],
      "default_resolution": "768p",
      "aspect_ratios": null,
      "duration_s": {
        "min": 6,
        "max": 10,
        "default": 6,
        "only": [
          6,
          10
        ]
      },
      "audio": false,
      "image_to_video": false,
      "input": "JSON: {model, prompt, duration_s?, resolution?, aspect_ratio?, audio?, image_urls?}",
      "formula": "$0.054 per second at 768p",
      "example": {
        "params": {
          "duration_s": 6,
          "resolution": "768p"
        },
        "price": "$0.324",
        "price_atomic_usdc": "324000"
      }
    },
    {
      "id": "veo-3.1",
      "kind": "video",
      "title": "Veo 3.1",
      "mark": "VEO 3.1",
      "vendor": "Google",
      "path": "/v1/generate",
      "good_at": "Top fidelity, with sound on request — dialogue, effects and ambience generated with the picture when audio is on. 4, 6 or 8 seconds at 720p; 8 at 1080p and 4k.",
      "resolutions": [
        "720p",
        "1080p",
        "4k"
      ],
      "default_resolution": "720p",
      "aspect_ratios": [
        "16:9",
        "9:16"
      ],
      "duration_s": {
        "min": 4,
        "max": 8,
        "default": 8,
        "only": [
          4,
          6,
          8
        ],
        "by_resolution": {
          "1080p": [
            8
          ],
          "4k": [
            8
          ]
        }
      },
      "audio": true,
      "image_to_video": true,
      "input": "JSON: {model, prompt, duration_s?, resolution?, aspect_ratio?, audio?, image_urls?}",
      "formula": "$0.24 per second at 720p or 1080p, $0.48 with audio; $0.48 at 4k, $0.72 with audio",
      "example": {
        "params": {
          "duration_s": 8,
          "resolution": "720p"
        },
        "price": "$1.92",
        "price_atomic_usdc": "1920000"
      }
    },
    {
      "id": "veo-3.1-fast",
      "kind": "video",
      "title": "Veo 3.1 Fast",
      "mark": "VEO fast",
      "vendor": "Google",
      "path": "/v1/generate",
      "good_at": "The same Veo 3.1 family tuned for turnaround, with sound available when audio is on: half the standard price or less at 720p and 1080p, and 4k at 8 seconds.",
      "resolutions": [
        "720p",
        "1080p",
        "4k"
      ],
      "default_resolution": "720p",
      "aspect_ratios": [
        "16:9",
        "9:16"
      ],
      "duration_s": {
        "min": 4,
        "max": 8,
        "default": 8,
        "only": [
          4,
          6,
          8
        ],
        "by_resolution": {
          "1080p": [
            8
          ],
          "4k": [
            8
          ]
        }
      },
      "audio": true,
      "image_to_video": true,
      "input": "JSON: {model, prompt, duration_s?, resolution?, aspect_ratio?, audio?, image_urls?}",
      "formula": "$0.12 per second at 720p or 1080p, $0.18 with audio; $0.36 at 4k, $0.42 with audio",
      "example": {
        "params": {
          "duration_s": 8,
          "resolution": "720p"
        },
        "price": "$0.96",
        "price_atomic_usdc": "960000"
      }
    },
    {
      "id": "veo-3.1-lite",
      "kind": "video",
      "title": "Veo 3.1 Lite",
      "mark": "VEO lite",
      "vendor": "Google",
      "path": "/v1/generate",
      "good_at": "The cheapest clip with its own sound at 720p or above in this catalog, with audio on. 720p, or 1080p at 8 seconds — no 4k.",
      "resolutions": [
        "720p",
        "1080p"
      ],
      "default_resolution": "720p",
      "aspect_ratios": [
        "16:9",
        "9:16"
      ],
      "duration_s": {
        "min": 4,
        "max": 8,
        "default": 8,
        "only": [
          4,
          6,
          8
        ],
        "by_resolution": {
          "1080p": [
            8
          ]
        }
      },
      "audio": true,
      "image_to_video": true,
      "input": "JSON: {model, prompt, duration_s?, resolution?, aspect_ratio?, audio?, image_urls?}",
      "formula": "$0.036 per second at 720p, $0.06 with audio; $0.06 at 1080p, $0.096 with audio",
      "example": {
        "params": {
          "duration_s": 8,
          "resolution": "720p"
        },
        "price": "$0.288",
        "price_atomic_usdc": "288000"
      }
    },
    {
      "id": "elevenlabs-tts",
      "kind": "audio",
      "title": "ElevenLabs TTS",
      "mark": null,
      "vendor": "ElevenLabs",
      "path": "/v1/audio/tts",
      "good_at": "Narration for the picture. Send the text, get quoted from its exact character count, pay, get audio back.",
      "max_chars": 5000,
      "default_voice": "21m00Tcm4TlvDq8ikWAM",
      "input": "JSON: {text, voice?}",
      "formula": "$0.00024 per character",
      "example": {
        "params": {
          "chars": 500
        },
        "price": "$0.12",
        "price_atomic_usdc": "120000"
      }
    },
    {
      "id": "ugc-product-video",
      "kind": "form",
      "title": "UGC product video",
      "mark": "UGC",
      "vendor": "kino402",
      "path": "/v1/forms/ugc-product-video",
      "good_at": "A creator-style spot from a brief instead of a prompt. Send the product name and one to five selling points; the service compiles them into a shot — handheld phone framing, natural light, platform-native aspect and pacing, the selling points spoken as beats rather than read as a list — and renders it. You get back the compiled prompt with the job, so the shot is inspectable and reusable.",
      "aspect_ratios": {
        "tiktok": "9:16",
        "reels": "9:16",
        "shorts": "9:16",
        "landscape": "16:9"
      },
      "tones": [
        "casual",
        "energetic",
        "deadpan",
        "luxury"
      ],
      "fields": [
        {
          "name": "product_name",
          "type": "string",
          "required": true,
          "max_length": 200,
          "description": "what is being sold, written the way the speaker would say it out loud."
        },
        {
          "name": "selling_points",
          "type": "string[]",
          "required": true,
          "min_items": 1,
          "max_items": 5,
          "max_length": 200,
          "description": "one claim per entry, in plain speech. They become spoken beats in the order you send them — the compiler weaves them into a continuous line of dialogue, it does not read them out as a list."
        },
        {
          "name": "platform",
          "type": "string",
          "required": false,
          "default": "tiktok",
          "enum": [
            "tiktok",
            "reels",
            "shorts",
            "landscape"
          ],
          "description": "decides aspect ratio and pacing: tiktok 9:16, reels 9:16, shorts 9:16, landscape 16:9."
        },
        {
          "name": "tone",
          "type": "string",
          "required": false,
          "default": "casual",
          "enum": [
            "casual",
            "energetic",
            "deadpan",
            "luxury"
          ],
          "description": "how the speaker delivers it, which changes the performance direction in the compiled prompt."
        },
        {
          "name": "duration_s",
          "type": "integer",
          "required": false,
          "default": 5,
          "min": 4,
          "max": 12,
          "per_model": {
            "seedance-1.5-pro": {
              "min": 4,
              "max": 12
            },
            "seedance-2.0": {
              "min": 4,
              "max": 15
            },
            "seedance-2.0-mini": {
              "min": 4,
              "max": 15
            },
            "seedance-2.5": {
              "min": 4,
              "max": 30
            }
          },
          "description": "seconds of finished video, and the beats are timed to it. 4-12 on the default renderer (seedance-1.5-pro); name another in `model` for its range — seedance-1.5-pro 4-12s; seedance-2.0 4-15s; seedance-2.0-mini 4-15s; seedance-2.5 4-30s."
        },
        {
          "name": "image_urls",
          "type": "string[]",
          "required": false,
          "max_items": 1,
          "description": "one publicly fetchable https photo of the product, used as the opening frame: the take opens on the product exactly as photographed, then the phone pulls back and the speaker brings it up, already talking. Only the first frame is pinned. Taken on seedance-1.5-pro only — with another `model` it is a 400 before any charge — and fetched once after payment verifies: a URL that does not answer 200 with a JPEG, PNG or WebP is a 400 with nothing charged."
        },
        {
          "name": "model",
          "type": "string",
          "required": false,
          "default": "seedance-1.5-pro",
          "enum": [
            "seedance-1.5-pro",
            "seedance-2.0",
            "seedance-2.0-mini",
            "seedance-2.5"
          ],
          "description": "which catalog model renders the compiled prompt, and therefore what the clip costs and how long it may run — see `per_model` on duration_s. The default is the only one that carries its own spoken audio, which a talking-head spot needs."
        }
      ],
      "input": "JSON: {product_name, selling_points[1-5], platform?, tone?, duration_s?, image_urls?, model?}",
      "formula": "the chosen renderer's own rate for the same clip, plus $0.06 to compile the brief",
      "example": {
        "params": {
          "duration_s": 5,
          "platform": "tiktok",
          "model": "seedance-1.5-pro"
        },
        "price": "$0.372",
        "price_atomic_usdc": "372000"
      }
    },
    {
      "id": "product-hero-loop",
      "kind": "form",
      "title": "Product hero loop",
      "mark": "LOOP",
      "vendor": "kino402",
      "path": "/v1/forms/product-hero-loop",
      "good_at": "A product photo becomes a seamless, silent loop for a product page, an ad or a story. Send one https photo and the product name; the clip opens and closes on that exact photo, with one slow move between — an orbit, a push-in, a float, a light sweep or a parallax drift — so it loops without a seam. You get back the compiled prompt with the job.",
      "fields": [
        {
          "name": "image_url",
          "type": "string",
          "required": true,
          "max_length": 2048,
          "description": "one publicly fetchable https photo of the product. It is the FIRST AND THE LAST frame of the clip, which is what makes the loop seamless — a clean shot of one product, nothing in hand, works best. Rendered image-to-video on seedance-1.5-pro; fetched once after payment verifies, and a URL that does not answer 200 with a JPEG, PNG or WebP is a 400 with nothing charged."
        },
        {
          "name": "product_name",
          "type": "string",
          "required": true,
          "max_length": 200,
          "description": "what the product is, in plain words. The compiler holds it exactly as photographed — shape, colour, label, proportions."
        },
        {
          "name": "motion",
          "type": "string",
          "required": false,
          "default": "orbit",
          "enum": [
            "orbit",
            "push-in",
            "float",
            "light-sweep",
            "parallax"
          ],
          "description": "the one continuous move, and it always returns to the opening frame: orbit, a slow partial arc around the product; push-in, a slow dolly in and an ease back; float, the product lifts and turns gently; light-sweep, the camera locked while a highlight glides across the surface; parallax, a subtle depth drift."
        },
        {
          "name": "aspect_ratio",
          "type": "string",
          "required": false,
          "default": "auto",
          "enum": [
            "auto",
            "1:1",
            "9:16",
            "16:9",
            "3:4",
            "4:3"
          ],
          "description": "the frame the loop is cut to. auto follows the photo; the others crop to a product page (1:1), a story (9:16) or a banner (16:9)."
        },
        {
          "name": "duration_s",
          "type": "integer",
          "required": false,
          "default": 5,
          "min": 4,
          "max": 12,
          "per_model": {
            "seedance-1.5-pro": {
              "min": 4,
              "max": 12
            }
          },
          "description": "seconds of loop, one continuous move from the photo back to the photo. 4-12 on seedance-1.5-pro."
        }
      ],
      "input": "JSON: {image_url, product_name, motion?, aspect_ratio?, duration_s?}",
      "formula": "the renderer's own silent rate for the same clip, plus $0.06 to compile the brief",
      "example": {
        "params": {
          "duration_s": 5,
          "aspect_ratio": "auto",
          "model": "seedance-1.5-pro"
        },
        "price": "$0.216",
        "price_atomic_usdc": "216000"
      }
    },
    {
      "id": "launch-teaser",
      "kind": "form",
      "title": "Launch teaser",
      "mark": "LAUNCH",
      "vendor": "kino402",
      "path": "/v1/forms/launch-teaser",
      "good_at": "An announcement clip for a product, a release or a feature — what you post the day you ship. Send the name and the one line being announced, plus up to three supporting beats; the service compiles a cinematic reveal — build-up, reveal, payoff — with an off-screen announcer speaking the lines and a music bed that resolves on the reveal, and renders it with its own audio. No on-screen text and no invented product: the voice carries the name and the words, and the reveal is light and motion. Send your logo, a screenshot or a product photo and the clip opens on it and resolves back onto it.",
      "aspect_ratios": {
        "tiktok": "9:16",
        "reels": "9:16",
        "shorts": "9:16",
        "landscape": "16:9"
      },
      "tones": [
        "hype",
        "calm",
        "playful",
        "premium"
      ],
      "fields": [
        {
          "name": "product_name",
          "type": "string",
          "required": true,
          "max_length": 200,
          "description": "what is being launched — a product, a release or a feature — the way the announcer will say it. It is spoken, never drawn: without an image_url the clip shows light and motion, not an invented object."
        },
        {
          "name": "announcement",
          "type": "string",
          "required": true,
          "max_length": 200,
          "description": "the one line being announced, spoken by the voice-over as the reveal lands. Spoken, never shown: the clip carries no on-screen text, because video models garble lettering."
        },
        {
          "name": "points",
          "type": "string[]",
          "required": false,
          "max_items": 3,
          "max_length": 200,
          "description": "up to 3 supporting beats, spoken after the announcement in the order you send them, each over its own payoff shot. The brief has to compile to a prompt of at most 2000 characters with nothing cut — every field at its maximum does not, and is a 400 naming the field to shorten."
        },
        {
          "name": "platform",
          "type": "string",
          "required": false,
          "default": "landscape",
          "enum": [
            "tiktok",
            "reels",
            "shorts",
            "landscape"
          ],
          "description": "the feed it is cut for, which decides the frame: tiktok 9:16, reels 9:16, shorts 9:16, landscape 16:9."
        },
        {
          "name": "tone",
          "type": "string",
          "required": false,
          "default": "hype",
          "enum": [
            "hype",
            "calm",
            "playful",
            "premium"
          ],
          "description": "the energy of the cut, the announcer and the music: hype builds hard to a big hit; calm swells gently; playful bounces; premium is slow, glossy and low."
        },
        {
          "name": "image_url",
          "type": "string",
          "required": false,
          "default": null,
          "max_length": 2048,
          "description": "optional — a logo, a screenshot or a product photo. When sent, it is the first AND the last frame, exactly as given (image-to-video on seedance-1.5-pro): the clip moves off it into the reveal and resolves back onto it. Without one the reveal is abstract light and motion, so send a photo when what you launch is a physical thing. Fetched once after payment verifies, and a URL that does not answer 200 with a JPEG, PNG or WebP is a 400 with nothing charged."
        },
        {
          "name": "duration_s",
          "type": "integer",
          "required": false,
          "default": 10,
          "min": 4,
          "max": 12,
          "per_model": {
            "seedance-1.5-pro": {
              "min": 4,
              "max": 12
            }
          },
          "description": "seconds of teaser; the build-up, the reveal, the payoff and the voice-over lines are timed to it. 4-12 on seedance-1.5-pro."
        }
      ],
      "input": "JSON: {product_name, announcement, points?, platform?, tone?, image_url?, duration_s?}",
      "formula": "the renderer's own rate for the same clip with audio, plus $0.06 to compile the brief",
      "example": {
        "params": {
          "duration_s": 10,
          "platform": "landscape",
          "model": "seedance-1.5-pro"
        },
        "price": "$0.683",
        "price_atomic_usdc": "683000"
      }
    },
    {
      "id": "faceless-explainer",
      "kind": "form",
      "title": "Faceless explainer",
      "mark": "EXPLAIN",
      "vendor": "kino402",
      "path": "/v1/forms/faceless-explainer",
      "good_at": "A narrated explainer short with no presenter — b-roll and voice-over. Send a topic and one to four beats; the service compiles a shot list — one shot per beat, each with its time window, hard cuts, pictures that show the beat through hands, objects, places and processes and never a face — with a narrator delivering each beat over its shot and a low music bed, and renders it with its own audio.",
      "aspect_ratios": {
        "tiktok": "9:16",
        "reels": "9:16",
        "shorts": "9:16",
        "landscape": "16:9"
      },
      "fields": [
        {
          "name": "topic",
          "type": "string",
          "required": true,
          "max_length": 200,
          "description": "what the explainer explains, in a phrase. It frames the narration and the look of every shot."
        },
        {
          "name": "points",
          "type": "string[]",
          "required": true,
          "min_items": 1,
          "max_items": 4,
          "max_length": 200,
          "description": "the narrated beats, in order, each written the way the narrator would say it. One shot per beat, each with its own time window, cut hard to the next. The brief has to compile to a prompt of at most 2000 characters with nothing cut — every field at its maximum does not, and is a 400 naming the field to shorten."
        },
        {
          "name": "style",
          "type": "string",
          "required": false,
          "default": "documentary",
          "enum": [
            "documentary",
            "cinematic",
            "macro",
            "abstract"
          ],
          "description": "the b-roll's visual language: documentary is observational and unstaged; cinematic is shallow-focus and graded; macro is extreme close-up detail; abstract is light, colour and shape as metaphor."
        },
        {
          "name": "voice",
          "type": "string",
          "required": false,
          "default": "warm",
          "enum": [
            "warm",
            "crisp",
            "deep",
            "bright"
          ],
          "description": "the narrator: warm and conversational, crisp and precise, deep and authoritative, or bright and quick."
        },
        {
          "name": "platform",
          "type": "string",
          "required": false,
          "default": "shorts",
          "enum": [
            "tiktok",
            "reels",
            "shorts",
            "landscape"
          ],
          "description": "the feed it is cut for, which decides the frame: tiktok 9:16, reels 9:16, shorts 9:16, landscape 16:9."
        },
        {
          "name": "duration_s",
          "type": "integer",
          "required": false,
          "default": 10,
          "min": 4,
          "max": 12,
          "per_model": {
            "seedance-1.5-pro": {
              "min": 4,
              "max": 12
            }
          },
          "description": "seconds of explainer, divided evenly between the shots — one per beat. 4-12 on seedance-1.5-pro."
        }
      ],
      "input": "JSON: {topic, points[1-4], style?, voice?, platform?, duration_s?}",
      "formula": "the renderer's own rate for the same clip with audio, plus $0.06 to compile the brief",
      "example": {
        "params": {
          "duration_s": 10,
          "platform": "shorts",
          "model": "seedance-1.5-pro"
        },
        "price": "$0.683",
        "price_atomic_usdc": "683000"
      }
    },
    {
      "id": "ugc-product-video-prompt",
      "kind": "prompt",
      "title": "UGC product video prompt",
      "mark": "UGC·P",
      "vendor": "kino402",
      "path": "/v1/prompts/ugc-product-video",
      "good_at": "The prompt, without the video. Send the same brief the UGC form takes — product name, one to five selling points, platform, tone — and get back the compiled shot description plus the render plan it was written for: which model, how many seconds, what resolution, what aspect ratio. It is the identical compiler the form endpoint runs behind its own payment, so the prompt you get is the prompt that would have been rendered. Take it to POST /v1/generate yourself, keep it, or edit it first.",
      "aspect_ratios": {
        "tiktok": "9:16",
        "reels": "9:16",
        "shorts": "9:16",
        "landscape": "16:9"
      },
      "tones": [
        "casual",
        "energetic",
        "deadpan",
        "luxury"
      ],
      "fields": [
        {
          "name": "product_name",
          "type": "string",
          "required": true,
          "max_length": 200,
          "description": "what is being sold, written the way the speaker would say it out loud."
        },
        {
          "name": "selling_points",
          "type": "string[]",
          "required": true,
          "min_items": 1,
          "max_items": 5,
          "max_length": 200,
          "description": "one claim per entry, in plain speech. They become spoken beats in the order you send them — the compiler weaves them into a continuous line of dialogue, it does not read them out as a list."
        },
        {
          "name": "platform",
          "type": "string",
          "required": false,
          "default": "tiktok",
          "enum": [
            "tiktok",
            "reels",
            "shorts",
            "landscape"
          ],
          "description": "decides aspect ratio and pacing: tiktok 9:16, reels 9:16, shorts 9:16, landscape 16:9."
        },
        {
          "name": "tone",
          "type": "string",
          "required": false,
          "default": "casual",
          "enum": [
            "casual",
            "energetic",
            "deadpan",
            "luxury"
          ],
          "description": "how the speaker delivers it, which changes the performance direction in the compiled prompt."
        },
        {
          "name": "duration_s",
          "type": "integer",
          "required": false,
          "default": 5,
          "min": 4,
          "max": 12,
          "per_model": {
            "seedance-1.5-pro": {
              "min": 4,
              "max": 12
            },
            "seedance-2.0": {
              "min": 4,
              "max": 15
            },
            "seedance-2.0-mini": {
              "min": 4,
              "max": 15
            },
            "seedance-2.5": {
              "min": 4,
              "max": 30
            }
          },
          "description": "seconds of finished video, and the beats are timed to it. 4-12 on the default renderer (seedance-1.5-pro); name another in `model` for its range — seedance-1.5-pro 4-12s; seedance-2.0 4-15s; seedance-2.0-mini 4-15s; seedance-2.5 4-30s."
        },
        {
          "name": "image_urls",
          "type": "string[]",
          "required": false,
          "max_items": 1,
          "description": "one publicly fetchable https photo of the product, used as the opening frame: the take opens on the product exactly as photographed, then the phone pulls back and the speaker brings it up, already talking. Only the first frame is pinned. Taken on seedance-1.5-pro only — with another `model` it is a 400 before any charge — and fetched once after payment verifies: a URL that does not answer 200 with a JPEG, PNG or WebP is a 400 with nothing charged."
        },
        {
          "name": "model",
          "type": "string",
          "required": false,
          "default": "seedance-1.5-pro",
          "enum": [
            "seedance-1.5-pro",
            "seedance-2.0",
            "seedance-2.0-mini",
            "seedance-2.5"
          ],
          "description": "which catalog model renders the compiled prompt, and therefore what the clip costs and how long it may run — see `per_model` on duration_s. The default is the only one that carries its own spoken audio, which a talking-head spot needs."
        }
      ],
      "input": "JSON: {product_name, selling_points[1-5], platform?, tone?, duration_s?, image_urls?, model?}",
      "returns": "JSON: {prompt, render_plan{model, duration_s, resolution, aspect_ratio, platform, audio, image_urls}, compiler}",
      "renders_on": "/v1/forms/ugc-product-video",
      "formula": "a flat $0.008 per compiled prompt, whatever the brief",
      "example": {
        "params": {
          "duration_s": 5,
          "platform": "tiktok",
          "model": "seedance-1.5-pro"
        },
        "price": "$0.008",
        "price_atomic_usdc": "8000"
      }
    },
    {
      "id": "product-hero-loop-prompt",
      "kind": "prompt",
      "title": "Product hero loop prompt",
      "mark": "LOOP·P",
      "vendor": "kino402",
      "path": "/v1/prompts/product-hero-loop",
      "good_at": "The loop's prompt, without the render. Send the same brief the hero-loop form takes — photo URL, product name, motion, aspect — and get back the compiled shot description and the render plan it was written for. Nothing is fetched and nothing is rendered. The plan opens a /v1/generate clip on your photo; the seamless close on the same photo is the form's.",
      "fields": [
        {
          "name": "image_url",
          "type": "string",
          "required": true,
          "max_length": 2048,
          "description": "one publicly fetchable https photo of the product. It is the FIRST AND THE LAST frame of the clip, which is what makes the loop seamless — a clean shot of one product, nothing in hand, works best. Rendered image-to-video on seedance-1.5-pro; fetched once after payment verifies, and a URL that does not answer 200 with a JPEG, PNG or WebP is a 400 with nothing charged."
        },
        {
          "name": "product_name",
          "type": "string",
          "required": true,
          "max_length": 200,
          "description": "what the product is, in plain words. The compiler holds it exactly as photographed — shape, colour, label, proportions."
        },
        {
          "name": "motion",
          "type": "string",
          "required": false,
          "default": "orbit",
          "enum": [
            "orbit",
            "push-in",
            "float",
            "light-sweep",
            "parallax"
          ],
          "description": "the one continuous move, and it always returns to the opening frame: orbit, a slow partial arc around the product; push-in, a slow dolly in and an ease back; float, the product lifts and turns gently; light-sweep, the camera locked while a highlight glides across the surface; parallax, a subtle depth drift."
        },
        {
          "name": "aspect_ratio",
          "type": "string",
          "required": false,
          "default": "auto",
          "enum": [
            "auto",
            "1:1",
            "9:16",
            "16:9",
            "3:4",
            "4:3"
          ],
          "description": "the frame the loop is cut to. auto follows the photo; the others crop to a product page (1:1), a story (9:16) or a banner (16:9)."
        },
        {
          "name": "duration_s",
          "type": "integer",
          "required": false,
          "default": 5,
          "min": 4,
          "max": 12,
          "per_model": {
            "seedance-1.5-pro": {
              "min": 4,
              "max": 12
            }
          },
          "description": "seconds of loop, one continuous move from the photo back to the photo. 4-12 on seedance-1.5-pro."
        }
      ],
      "input": "JSON: {image_url, product_name, motion?, aspect_ratio?, duration_s?}",
      "returns": "JSON: {prompt, render_plan{model, duration_s, resolution, aspect_ratio, audio, image_urls}, compiler}",
      "renders_on": "/v1/forms/product-hero-loop",
      "formula": "a flat $0.006 per compiled prompt, whatever the brief",
      "example": {
        "params": {
          "duration_s": 5,
          "aspect_ratio": "auto",
          "model": "seedance-1.5-pro"
        },
        "price": "$0.006",
        "price_atomic_usdc": "6000"
      }
    },
    {
      "id": "launch-teaser-prompt",
      "kind": "prompt",
      "title": "Launch teaser prompt",
      "mark": "LAUNCH·P",
      "vendor": "kino402",
      "path": "/v1/prompts/launch-teaser",
      "good_at": "The teaser's prompt, without the render. Send the same brief the launch-teaser form takes — name, announcement, supporting beats, platform, tone — and get back the compiled shot description with its beat sheet and voice-over lines, plus the render plan it was written for. Nothing is rendered; take it to POST /v1/generate with audio on, or keep it.",
      "aspect_ratios": {
        "tiktok": "9:16",
        "reels": "9:16",
        "shorts": "9:16",
        "landscape": "16:9"
      },
      "tones": [
        "hype",
        "calm",
        "playful",
        "premium"
      ],
      "fields": [
        {
          "name": "product_name",
          "type": "string",
          "required": true,
          "max_length": 200,
          "description": "what is being launched — a product, a release or a feature — the way the announcer will say it. It is spoken, never drawn: without an image_url the clip shows light and motion, not an invented object."
        },
        {
          "name": "announcement",
          "type": "string",
          "required": true,
          "max_length": 200,
          "description": "the one line being announced, spoken by the voice-over as the reveal lands. Spoken, never shown: the clip carries no on-screen text, because video models garble lettering."
        },
        {
          "name": "points",
          "type": "string[]",
          "required": false,
          "max_items": 3,
          "max_length": 200,
          "description": "up to 3 supporting beats, spoken after the announcement in the order you send them, each over its own payoff shot. The brief has to compile to a prompt of at most 2000 characters with nothing cut — every field at its maximum does not, and is a 400 naming the field to shorten."
        },
        {
          "name": "platform",
          "type": "string",
          "required": false,
          "default": "landscape",
          "enum": [
            "tiktok",
            "reels",
            "shorts",
            "landscape"
          ],
          "description": "the feed it is cut for, which decides the frame: tiktok 9:16, reels 9:16, shorts 9:16, landscape 16:9."
        },
        {
          "name": "tone",
          "type": "string",
          "required": false,
          "default": "hype",
          "enum": [
            "hype",
            "calm",
            "playful",
            "premium"
          ],
          "description": "the energy of the cut, the announcer and the music: hype builds hard to a big hit; calm swells gently; playful bounces; premium is slow, glossy and low."
        },
        {
          "name": "image_url",
          "type": "string",
          "required": false,
          "default": null,
          "max_length": 2048,
          "description": "optional — a logo, a screenshot or a product photo. When sent, it is the first AND the last frame, exactly as given (image-to-video on seedance-1.5-pro): the clip moves off it into the reveal and resolves back onto it. Without one the reveal is abstract light and motion, so send a photo when what you launch is a physical thing. Fetched once after payment verifies, and a URL that does not answer 200 with a JPEG, PNG or WebP is a 400 with nothing charged."
        },
        {
          "name": "duration_s",
          "type": "integer",
          "required": false,
          "default": 10,
          "min": 4,
          "max": 12,
          "per_model": {
            "seedance-1.5-pro": {
              "min": 4,
              "max": 12
            }
          },
          "description": "seconds of teaser; the build-up, the reveal, the payoff and the voice-over lines are timed to it. 4-12 on seedance-1.5-pro."
        }
      ],
      "input": "JSON: {product_name, announcement, points?, platform?, tone?, image_url?, duration_s?}",
      "returns": "JSON: {prompt, render_plan{model, duration_s, resolution, aspect_ratio, platform, audio, image_urls}, compiler}",
      "renders_on": "/v1/forms/launch-teaser",
      "formula": "a flat $0.005 per compiled prompt, whatever the brief",
      "example": {
        "params": {
          "duration_s": 10,
          "platform": "landscape",
          "model": "seedance-1.5-pro"
        },
        "price": "$0.005",
        "price_atomic_usdc": "5000"
      }
    },
    {
      "id": "faceless-explainer-prompt",
      "kind": "prompt",
      "title": "Faceless explainer prompt",
      "mark": "EXPLAIN·P",
      "vendor": "kino402",
      "path": "/v1/prompts/faceless-explainer",
      "good_at": "The explainer's shot list, without the render. Send the same brief the faceless-explainer form takes — topic, beats, style, voice, platform — and get back the compiled shot list with its time windows and narration, plus the render plan it was written for. Nothing is rendered; take it to POST /v1/generate with audio on, or keep it.",
      "aspect_ratios": {
        "tiktok": "9:16",
        "reels": "9:16",
        "shorts": "9:16",
        "landscape": "16:9"
      },
      "fields": [
        {
          "name": "topic",
          "type": "string",
          "required": true,
          "max_length": 200,
          "description": "what the explainer explains, in a phrase. It frames the narration and the look of every shot."
        },
        {
          "name": "points",
          "type": "string[]",
          "required": true,
          "min_items": 1,
          "max_items": 4,
          "max_length": 200,
          "description": "the narrated beats, in order, each written the way the narrator would say it. One shot per beat, each with its own time window, cut hard to the next. The brief has to compile to a prompt of at most 2000 characters with nothing cut — every field at its maximum does not, and is a 400 naming the field to shorten."
        },
        {
          "name": "style",
          "type": "string",
          "required": false,
          "default": "documentary",
          "enum": [
            "documentary",
            "cinematic",
            "macro",
            "abstract"
          ],
          "description": "the b-roll's visual language: documentary is observational and unstaged; cinematic is shallow-focus and graded; macro is extreme close-up detail; abstract is light, colour and shape as metaphor."
        },
        {
          "name": "voice",
          "type": "string",
          "required": false,
          "default": "warm",
          "enum": [
            "warm",
            "crisp",
            "deep",
            "bright"
          ],
          "description": "the narrator: warm and conversational, crisp and precise, deep and authoritative, or bright and quick."
        },
        {
          "name": "platform",
          "type": "string",
          "required": false,
          "default": "shorts",
          "enum": [
            "tiktok",
            "reels",
            "shorts",
            "landscape"
          ],
          "description": "the feed it is cut for, which decides the frame: tiktok 9:16, reels 9:16, shorts 9:16, landscape 16:9."
        },
        {
          "name": "duration_s",
          "type": "integer",
          "required": false,
          "default": 10,
          "min": 4,
          "max": 12,
          "per_model": {
            "seedance-1.5-pro": {
              "min": 4,
              "max": 12
            }
          },
          "description": "seconds of explainer, divided evenly between the shots — one per beat. 4-12 on seedance-1.5-pro."
        }
      ],
      "input": "JSON: {topic, points[1-4], style?, voice?, platform?, duration_s?}",
      "returns": "JSON: {prompt, render_plan{model, duration_s, resolution, aspect_ratio, platform, audio, image_urls}, compiler}",
      "renders_on": "/v1/forms/faceless-explainer",
      "formula": "a flat $0.009 per compiled prompt, whatever the brief",
      "example": {
        "params": {
          "duration_s": 10,
          "platform": "shorts",
          "model": "seedance-1.5-pro"
        },
        "price": "$0.009",
        "price_atomic_usdc": "9000"
      }
    }
  ]
}
