{"openapi":"3.1.0","info":{"title":"Sandstorm API","version":"2026-10-20","description":"Generate on-brand images, video and audio, read your brand kit and library, and search competitor ads. Authenticate with `Authorization: Bearer sk_live_…`. Generations are queued: create one, then poll it, wait with `Prefer: wait=<seconds>`, or take the webhook. Each key may send 300 requests a minute."},"servers":[{"url":"https://sandbox.ads.dev"}],"security":[{"ApiKey":[]}],"tags":[{"name":"Generations","description":"Run a model"},{"name":"Models","description":"What each model takes and costs"},{"name":"Library","description":"The brand's files"},{"name":"Brand","description":"The brand kit, offers, characters and voices"},{"name":"Competitors","description":"Ads other brands are running"},{"name":"Webhooks","description":"Signed events when generations finish"},{"name":"Keys","description":"Making keys, with a Sandstorm sign-in"}],"components":{"schemas":{"CreateGeneration":{"oneOf":[{"$ref":"#/components/schemas/Create_nano_banana_pro"},{"$ref":"#/components/schemas/Create_nano_banana_pro_edit"},{"$ref":"#/components/schemas/Create_nano_banana_2"},{"$ref":"#/components/schemas/Create_nano_banana_2_edit"},{"$ref":"#/components/schemas/Create_nano_banana_2_lite"},{"$ref":"#/components/schemas/Create_nano_banana_2_lite_edit"},{"$ref":"#/components/schemas/Create_gpt_image_2_5_flare"},{"$ref":"#/components/schemas/Create_gpt_image_2_5_flare_edit"},{"$ref":"#/components/schemas/Create_gpt_image_2_5_sunburst"},{"$ref":"#/components/schemas/Create_gpt_image_2_5_sunburst_edit"},{"$ref":"#/components/schemas/Create_seedream_5_pro"},{"$ref":"#/components/schemas/Create_seedream_5_pro_edit"},{"$ref":"#/components/schemas/Create_seedream_5_lite"},{"$ref":"#/components/schemas/Create_seedream_5_lite_edit"},{"$ref":"#/components/schemas/Create_seedream_5_pro_layers"},{"$ref":"#/components/schemas/Create_topaz_upscale"},{"$ref":"#/components/schemas/Create_seedance_2_5_text_to_video"},{"$ref":"#/components/schemas/Create_seedance_2_5_image_to_video"},{"$ref":"#/components/schemas/Create_seedance_2_5_reference_to_video"},{"$ref":"#/components/schemas/Create_seedance_2_5_finish"},{"$ref":"#/components/schemas/Create_kling_3_pro_image_to_video"},{"$ref":"#/components/schemas/Create_kling_o3_pro_reference_to_video"},{"$ref":"#/components/schemas/Create_gemini_omni_flash_text_to_video"},{"$ref":"#/components/schemas/Create_gemini_omni_flash_image_to_video"},{"$ref":"#/components/schemas/Create_gemini_omni_flash_reference_to_video"},{"$ref":"#/components/schemas/Create_gemini_omni_flash_edit"},{"$ref":"#/components/schemas/Create_sync_3_lipsync"},{"$ref":"#/components/schemas/Create_elevenlabs_voiceover"},{"$ref":"#/components/schemas/Create_elevenlabs_music"},{"$ref":"#/components/schemas/Create_elevenlabs_sound_effects"},{"$ref":"#/components/schemas/Create_elevenlabs_voice_changer"},{"$ref":"#/components/schemas/Create_elevenlabs_voice_isolator"},{"$ref":"#/components/schemas/Create_minimax_music"},{"$ref":"#/components/schemas/Create_sonilo_music"}],"discriminator":{"propertyName":"model","mapping":{"nano-banana-pro":"#/components/schemas/Create_nano_banana_pro","nano-banana-pro/edit":"#/components/schemas/Create_nano_banana_pro_edit","nano-banana-2":"#/components/schemas/Create_nano_banana_2","nano-banana-2/edit":"#/components/schemas/Create_nano_banana_2_edit","nano-banana-2-lite":"#/components/schemas/Create_nano_banana_2_lite","nano-banana-2-lite/edit":"#/components/schemas/Create_nano_banana_2_lite_edit","gpt-image-2.5-flare":"#/components/schemas/Create_gpt_image_2_5_flare","gpt-image-2.5-flare/edit":"#/components/schemas/Create_gpt_image_2_5_flare_edit","gpt-image-2.5-sunburst":"#/components/schemas/Create_gpt_image_2_5_sunburst","gpt-image-2.5-sunburst/edit":"#/components/schemas/Create_gpt_image_2_5_sunburst_edit","seedream-5-pro":"#/components/schemas/Create_seedream_5_pro","seedream-5-pro/edit":"#/components/schemas/Create_seedream_5_pro_edit","seedream-5-lite":"#/components/schemas/Create_seedream_5_lite","seedream-5-lite/edit":"#/components/schemas/Create_seedream_5_lite_edit","seedream-5-pro/layers":"#/components/schemas/Create_seedream_5_pro_layers","topaz/upscale":"#/components/schemas/Create_topaz_upscale","seedance-2.5/text-to-video":"#/components/schemas/Create_seedance_2_5_text_to_video","seedance-2.5/image-to-video":"#/components/schemas/Create_seedance_2_5_image_to_video","seedance-2.5/reference-to-video":"#/components/schemas/Create_seedance_2_5_reference_to_video","seedance-2.5/finish":"#/components/schemas/Create_seedance_2_5_finish","kling-3-pro/image-to-video":"#/components/schemas/Create_kling_3_pro_image_to_video","kling-o3-pro/reference-to-video":"#/components/schemas/Create_kling_o3_pro_reference_to_video","gemini-omni-flash/text-to-video":"#/components/schemas/Create_gemini_omni_flash_text_to_video","gemini-omni-flash/image-to-video":"#/components/schemas/Create_gemini_omni_flash_image_to_video","gemini-omni-flash/reference-to-video":"#/components/schemas/Create_gemini_omni_flash_reference_to_video","gemini-omni-flash/edit":"#/components/schemas/Create_gemini_omni_flash_edit","sync-3/lipsync":"#/components/schemas/Create_sync_3_lipsync","elevenlabs/voiceover":"#/components/schemas/Create_elevenlabs_voiceover","elevenlabs/music":"#/components/schemas/Create_elevenlabs_music","elevenlabs/sound-effects":"#/components/schemas/Create_elevenlabs_sound_effects","elevenlabs/voice-changer":"#/components/schemas/Create_elevenlabs_voice_changer","elevenlabs/voice-isolator":"#/components/schemas/Create_elevenlabs_voice_isolator","minimax/music":"#/components/schemas/Create_minimax_music","sonilo/music":"#/components/schemas/Create_sonilo_music"}}},"Create_nano_banana_pro":{"type":"object","title":"nano-banana-pro","description":"Photoreal images from a prompt: people, products and first frames for video. Up to 4K.","required":["model","input"],"properties":{"model":{"type":"string","enum":["nano-banana-pro"]},"input":{"type":"object","properties":{"prompt":{"type":"string","minLength":3,"maxLength":50000,"description":"What the image shows, as one paragraph; 150 to 350 words of concrete detail work best."},"aspect_ratio":{"default":"1:1","description":"Shape of the image as width:height; 1:1 when left out.","type":"string","enum":["1:1","21:9","16:9","3:2","4:3","5:4","4:5","3:4","2:3","9:16"]},"resolution":{"default":"2K","description":"Output resolution; 2K when left out.","type":"string","enum":["1K","2K","4K"]},"output_format":{"default":"png","description":"File format; png when left out.","type":"string","enum":["png","jpeg","webp"]},"name":{"type":"string","minLength":2,"maxLength":80,"description":"What the output is called in your library; made from the prompt when left out."}},"required":["prompt"]},"webhook_url":{"type":"string","format":"uri","description":"An https URL to POST a signed generation event to when it finishes"}},"additionalProperties":false},"Create_nano_banana_pro_edit":{"type":"object","title":"nano-banana-pro/edit","description":"Change an image or combine several by instruction: a new background, color or setting.","required":["model","input"],"properties":{"model":{"type":"string","enum":["nano-banana-pro/edit"]},"input":{"type":"object","properties":{"prompt":{"type":"string","minLength":3,"maxLength":50000,"description":"The change to make, or how the images come together, naming each image by its place in images."},"aspect_ratio":{"default":"auto","description":"Shape of the image as width:height, or auto to follow the images given; auto when left out.","type":"string","enum":["auto","1:1","21:9","16:9","3:2","4:3","5:4","4:5","3:4","2:3","9:16"]},"resolution":{"default":"2K","description":"Output resolution; 2K when left out.","type":"string","enum":["1K","2K","4K"]},"output_format":{"default":"png","description":"File format; png when left out.","type":"string","enum":["png","jpeg","webp"]},"images":{"minItems":1,"maxItems":14,"type":"array","items":{"type":"string"},"description":"The 1 to 14 images to edit or combine, in the order the prompt names them, each an asset id (asset_…) or an https URL."},"seed":{"description":"Integer seed for a more repeatable edit; random when left out.","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"name":{"type":"string","minLength":2,"maxLength":80,"description":"What the output is called in your library; made from the prompt when left out."}},"required":["prompt","images"]},"webhook_url":{"type":"string","format":"uri","description":"An https URL to POST a signed generation event to when it finishes"}},"additionalProperties":false},"Create_nano_banana_2":{"type":"object","title":"nano-banana-2","description":"Faster than Pro for many variations, and the only one that makes 4:1 and 8:1 banners.","required":["model","input"],"properties":{"model":{"type":"string","enum":["nano-banana-2"]},"input":{"type":"object","properties":{"prompt":{"type":"string","minLength":3,"maxLength":50000,"description":"What the image shows, as one paragraph; 150 to 350 words of concrete detail work best."},"aspect_ratio":{"default":"1:1","description":"Shape of the image as width:height; 1:1 when left out.","type":"string","enum":["1:1","21:9","16:9","3:2","4:3","5:4","4:5","3:4","2:3","9:16","4:1","1:4","8:1","1:8"]},"resolution":{"default":"2K","description":"Output resolution; 2K when left out.","type":"string","enum":["1K","2K","4K"]},"output_format":{"default":"png","description":"File format; png when left out.","type":"string","enum":["png","jpeg","webp"]},"name":{"type":"string","minLength":2,"maxLength":80,"description":"What the output is called in your library; made from the prompt when left out."}},"required":["prompt"]},"webhook_url":{"type":"string","format":"uri","description":"An https URL to POST a signed generation event to when it finishes"}},"additionalProperties":false},"Create_nano_banana_2_edit":{"type":"object","title":"nano-banana-2/edit","description":"Many edits or variations of images you already have, faster than Pro.","required":["model","input"],"properties":{"model":{"type":"string","enum":["nano-banana-2/edit"]},"input":{"type":"object","properties":{"prompt":{"type":"string","minLength":3,"maxLength":50000,"description":"The change to make, or how the images come together, naming each image by its place in images."},"aspect_ratio":{"default":"auto","description":"Shape of the image as width:height, or auto to follow the images given; auto when left out.","type":"string","enum":["auto","1:1","21:9","16:9","3:2","4:3","5:4","4:5","3:4","2:3","9:16","4:1","1:4","8:1","1:8"]},"resolution":{"default":"2K","description":"Output resolution; 2K when left out.","type":"string","enum":["1K","2K","4K"]},"output_format":{"default":"png","description":"File format; png when left out.","type":"string","enum":["png","jpeg","webp"]},"images":{"minItems":1,"maxItems":14,"type":"array","items":{"type":"string"},"description":"The 1 to 14 images to edit or combine, in the order the prompt names them, each an asset id (asset_…) or an https URL."},"seed":{"description":"Integer seed for a more repeatable edit; random when left out.","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"name":{"type":"string","minLength":2,"maxLength":80,"description":"What the output is called in your library; made from the prompt when left out."}},"required":["prompt","images"]},"webhook_url":{"type":"string","format":"uri","description":"An https URL to POST a signed generation event to when it finishes"}},"additionalProperties":false},"Create_nano_banana_2_lite":{"type":"object","title":"nano-banana-2-lite","description":"The fastest image model, for concepts, previews and lots of options before a final.","required":["model","input"],"properties":{"model":{"type":"string","enum":["nano-banana-2-lite"]},"input":{"type":"object","properties":{"prompt":{"type":"string","minLength":3,"maxLength":50000,"description":"What the image shows, as one paragraph; 150 to 350 words of concrete detail work best."},"aspect_ratio":{"default":"1:1","description":"Shape of the image as width:height; 1:1 when left out.","type":"string","enum":["1:1","21:9","16:9","3:2","4:3","5:4","4:5","3:4","2:3","9:16","4:1","1:4","8:1","1:8"]},"output_format":{"default":"png","description":"File format; png when left out.","type":"string","enum":["png","jpeg","webp"]},"name":{"type":"string","minLength":2,"maxLength":80,"description":"What the output is called in your library; made from the prompt when left out."}},"required":["prompt"]},"webhook_url":{"type":"string","format":"uri","description":"An https URL to POST a signed generation event to when it finishes"}},"additionalProperties":false},"Create_nano_banana_2_lite_edit":{"type":"object","title":"nano-banana-2-lite/edit","description":"Quick drafts of an edit, and many options to choose from.","required":["model","input"],"properties":{"model":{"type":"string","enum":["nano-banana-2-lite/edit"]},"input":{"type":"object","properties":{"prompt":{"type":"string","minLength":3,"maxLength":50000,"description":"The change to make, or how the images come together, naming each image by its place in images."},"aspect_ratio":{"default":"auto","description":"Shape of the image as width:height, or auto to follow the images given; auto when left out.","type":"string","enum":["auto","1:1","21:9","16:9","3:2","4:3","5:4","4:5","3:4","2:3","9:16","4:1","1:4","8:1","1:8"]},"output_format":{"default":"png","description":"File format; png when left out.","type":"string","enum":["png","jpeg","webp"]},"images":{"minItems":1,"maxItems":14,"type":"array","items":{"type":"string"},"description":"The 1 to 14 images to edit or combine, in the order the prompt names them, each an asset id (asset_…) or an https URL."},"seed":{"description":"Integer seed for a more repeatable edit; random when left out.","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"name":{"type":"string","minLength":2,"maxLength":80,"description":"What the output is called in your library; made from the prompt when left out."}},"required":["prompt","images"]},"webhook_url":{"type":"string","format":"uri","description":"An https URL to POST a signed generation event to when it finishes"}},"additionalProperties":false},"Create_gpt_image_2_5_flare":{"type":"object","title":"gpt-image-2.5-flare","description":"Images that carry copy and typography, follow an exact layout or need a transparent background.","required":["model","input"],"properties":{"model":{"type":"string","enum":["gpt-image-2.5-flare"]},"input":{"type":"object","properties":{"prompt":{"type":"string","minLength":1,"maxLength":32000,"description":"Single-paragraph image prompt (150-350 words), with any words the image must show written out exactly."},"aspect_ratio":{"default":"1:1","description":"Shape of the image as width:height; 1:1 when left out.","type":"string","enum":["1:1","21:9","16:9","3:2","4:3","5:4","4:5","3:4","2:3","9:16"]},"resolution":{"default":"2K","description":"Output resolution; 2K when left out.","type":"string","enum":["1K","2K","4K"]},"width":{"description":"Exact width in pixels for a fixed placement, passed with height in place of aspect_ratio and resolution, with both sides multiples of 16 up to 3840, at most 3:1 either way, and 655,360 to 8,294,400 pixels in all; none when left out.","type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"height":{"description":"Exact height in pixels, passed with width under the same rules; none when left out.","type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"background":{"default":"auto","description":"transparent for a cutout with no background, opaque for a filled one, or auto to let the model choose; auto when left out.","type":"string","enum":["auto","transparent","opaque"]},"output_format":{"default":"png","description":"File format; png when left out, and a transparent background needs png or webp.","type":"string","enum":["png","jpeg","webp"]},"name":{"type":"string","minLength":2,"maxLength":80,"description":"What the output is called in your library; made from the prompt when left out."}},"required":["prompt"]},"webhook_url":{"type":"string","format":"uri","description":"An https URL to POST a signed generation event to when it finishes"}},"additionalProperties":false},"Create_gpt_image_2_5_flare_edit":{"type":"object","title":"gpt-image-2.5-flare/edit","description":"Ads built around your product or logo images, with the copy set in the image. Up to 16 references.","required":["model","input"],"properties":{"model":{"type":"string","enum":["gpt-image-2.5-flare/edit"]},"input":{"type":"object","properties":{"prompt":{"type":"string","minLength":1,"maxLength":32000,"description":"The change to make, or how the images come together, naming each image by its place in images and writing out exactly any words the image must show."},"aspect_ratio":{"default":"auto","description":"Shape of the image as width:height, or auto to let the model pick the size; auto when left out.","type":"string","enum":["auto","1:1","21:9","16:9","3:2","4:3","5:4","4:5","3:4","2:3","9:16"]},"resolution":{"default":"2K","description":"Output resolution, not used when aspect_ratio is auto; 2K when left out.","type":"string","enum":["1K","2K","4K"]},"width":{"description":"Exact width in pixels for a fixed placement, passed with height in place of aspect_ratio and resolution, with both sides multiples of 16 up to 3840, at most 3:1 either way, and 655,360 to 8,294,400 pixels in all; none when left out.","type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"height":{"description":"Exact height in pixels, passed with width under the same rules; none when left out.","type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"background":{"default":"auto","description":"transparent for a cutout with no background, opaque for a filled one, or auto to let the model choose; auto when left out.","type":"string","enum":["auto","transparent","opaque"]},"output_format":{"default":"png","description":"File format; png when left out, and a transparent background needs png or webp.","type":"string","enum":["png","jpeg","webp"]},"images":{"minItems":1,"maxItems":16,"type":"array","items":{"type":"string"},"description":"The 1 to 16 images to edit or combine, in the order the prompt names them, each an asset id (asset_…) or an https URL."},"mask":{"type":"string","description":"An image the size of the first of images, as an asset id (asset_…) or an https URL, with an alpha channel that is fully transparent where that image should change; the model takes it as guidance, so the rest can shift slightly. None when left out, so the prompt alone scopes the change."},"name":{"type":"string","minLength":2,"maxLength":80,"description":"What the output is called in your library; made from the prompt when left out."}},"required":["prompt","images"]},"webhook_url":{"type":"string","format":"uri","description":"An https URL to POST a signed generation event to when it finishes"}},"additionalProperties":false},"Create_gpt_image_2_5_sunburst":{"type":"object","title":"gpt-image-2.5-sunburst","description":"The slower, precision GPT model, for intricate detail and final passes.","required":["model","input"],"properties":{"model":{"type":"string","enum":["gpt-image-2.5-sunburst"]},"input":{"type":"object","properties":{"prompt":{"type":"string","minLength":1,"maxLength":32000,"description":"Single-paragraph image prompt (150-350 words), with any words the image must show written out exactly."},"aspect_ratio":{"default":"1:1","description":"Shape of the image as width:height; 1:1 when left out.","type":"string","enum":["1:1","21:9","16:9","3:2","4:3","5:4","4:5","3:4","2:3","9:16"]},"resolution":{"default":"2K","description":"Output resolution; 2K when left out.","type":"string","enum":["1K","2K","4K"]},"width":{"description":"Exact width in pixels for a fixed placement, passed with height in place of aspect_ratio and resolution, with both sides multiples of 16 up to 3840, at most 3:1 either way, and 655,360 to 8,294,400 pixels in all; none when left out.","type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"height":{"description":"Exact height in pixels, passed with width under the same rules; none when left out.","type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"background":{"default":"auto","description":"transparent for a cutout with no background, opaque for a filled one, or auto to let the model choose; auto when left out.","type":"string","enum":["auto","transparent","opaque"]},"output_format":{"default":"png","description":"File format; png when left out, and a transparent background needs png or webp.","type":"string","enum":["png","jpeg","webp"]},"name":{"type":"string","minLength":2,"maxLength":80,"description":"What the output is called in your library; made from the prompt when left out."}},"required":["prompt"]},"webhook_url":{"type":"string","format":"uri","description":"An https URL to POST a signed generation event to when it finishes"}},"additionalProperties":false},"Create_gpt_image_2_5_sunburst_edit":{"type":"object","title":"gpt-image-2.5-sunburst/edit","description":"Precision edits from up to 16 reference images.","required":["model","input"],"properties":{"model":{"type":"string","enum":["gpt-image-2.5-sunburst/edit"]},"input":{"type":"object","properties":{"prompt":{"type":"string","minLength":1,"maxLength":32000,"description":"The change to make, or how the images come together, naming each image by its place in images and writing out exactly any words the image must show."},"aspect_ratio":{"default":"auto","description":"Shape of the image as width:height, or auto to let the model pick the size; auto when left out.","type":"string","enum":["auto","1:1","21:9","16:9","3:2","4:3","5:4","4:5","3:4","2:3","9:16"]},"resolution":{"default":"2K","description":"Output resolution, not used when aspect_ratio is auto; 2K when left out.","type":"string","enum":["1K","2K","4K"]},"width":{"description":"Exact width in pixels for a fixed placement, passed with height in place of aspect_ratio and resolution, with both sides multiples of 16 up to 3840, at most 3:1 either way, and 655,360 to 8,294,400 pixels in all; none when left out.","type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"height":{"description":"Exact height in pixels, passed with width under the same rules; none when left out.","type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"background":{"default":"auto","description":"transparent for a cutout with no background, opaque for a filled one, or auto to let the model choose; auto when left out.","type":"string","enum":["auto","transparent","opaque"]},"output_format":{"default":"png","description":"File format; png when left out, and a transparent background needs png or webp.","type":"string","enum":["png","jpeg","webp"]},"images":{"minItems":1,"maxItems":16,"type":"array","items":{"type":"string"},"description":"The 1 to 16 images to edit or combine, in the order the prompt names them, each an asset id (asset_…) or an https URL."},"mask":{"type":"string","description":"An image the size of the first of images, as an asset id (asset_…) or an https URL, with an alpha channel that is fully transparent where that image should change; the model takes it as guidance, so the rest can shift slightly. None when left out, so the prompt alone scopes the change."},"name":{"type":"string","minLength":2,"maxLength":80,"description":"What the output is called in your library; made from the prompt when left out."}},"required":["prompt","images"]},"webhook_url":{"type":"string","format":"uri","description":"An https URL to POST a signed generation event to when it finishes"}},"additionalProperties":false},"Create_seedream_5_pro":{"type":"object","title":"seedream-5-pro","description":"Apparel and product imagery, swimwear included, and in-image text in 14 languages.","required":["model","input"],"properties":{"model":{"type":"string","enum":["seedream-5-pro"]},"input":{"type":"object","properties":{"prompt":{"type":"string","minLength":3,"description":"Single-paragraph image prompt, at most 600 words, with the exact words the image must show written out."},"aspect_ratio":{"default":"1:1","description":"Shape of the image as width:height; 1:1 when left out.","type":"string","enum":["1:1","21:9","16:9","3:2","4:3","5:4","4:5","3:4","2:3","9:16"]},"resolution":{"default":"2K","description":"Output resolution, 1.5K for drafts at half the price and 2K for finals; 2K when left out.","type":"string","enum":["1.5K","2K"]},"output_format":{"default":"png","description":"File format; png when left out.","type":"string","enum":["png","jpeg"]},"name":{"type":"string","minLength":2,"maxLength":80,"description":"What the output is called in your library; made from the prompt when left out."}},"required":["prompt"]},"webhook_url":{"type":"string","format":"uri","description":"An https URL to POST a signed generation event to when it finishes"}},"additionalProperties":false},"Create_seedream_5_pro_edit":{"type":"object","title":"seedream-5-pro/edit","description":"Targeted changes that keep the rest of the frame, from up to 10 images.","required":["model","input"],"properties":{"model":{"type":"string","enum":["seedream-5-pro/edit"]},"input":{"type":"object","properties":{"prompt":{"type":"string","minLength":3,"description":"The change to make as one paragraph, at most 600 words, naming each image by its place in images (image 1, image 2), with the exact words the result must show written out."},"aspect_ratio":{"default":"auto","description":"Shape of the result as width:height, or auto to keep the shape the images suggest; auto when left out.","type":"string","enum":["auto","1:1","21:9","16:9","3:2","4:3","5:4","4:5","3:4","2:3","9:16"]},"resolution":{"default":"2K","description":"Output resolution, 1.5K for drafts at half the price and 2K for finals; 2K when left out.","type":"string","enum":["1.5K","2K"]},"output_format":{"default":"png","description":"File format; png when left out.","type":"string","enum":["png","jpeg"]},"images":{"minItems":1,"maxItems":10,"type":"array","items":{"type":"string"},"description":"The images to edit or combine, in the order the prompt names them, at most 10, each an asset id (asset_…) or an https URL."},"name":{"type":"string","minLength":2,"maxLength":80,"description":"What the output is called in your library; made from the prompt when left out."}},"required":["prompt","images"]},"webhook_url":{"type":"string","format":"uri","description":"An https URL to POST a signed generation event to when it finishes"}},"additionalProperties":false},"Create_seedream_5_lite":{"type":"object","title":"seedream-5-lite","description":"Faster than Pro, for drafts and 3K or 4K finals.","required":["model","input"],"properties":{"model":{"type":"string","enum":["seedream-5-lite"]},"input":{"type":"object","properties":{"prompt":{"type":"string","minLength":3,"description":"Single-paragraph image prompt, at most 600 words, with the exact words the image must show written out."},"aspect_ratio":{"default":"1:1","description":"Shape of the image as width:height; 1:1 when left out.","type":"string","enum":["1:1","21:9","16:9","3:2","4:3","5:4","4:5","3:4","2:3","9:16"]},"resolution":{"default":"2K","description":"Output resolution, 2K, 3K or 4K, all at one price; 2K when left out.","type":"string","enum":["2K","3K","4K"]},"name":{"type":"string","minLength":2,"maxLength":80,"description":"What the output is called in your library; made from the prompt when left out."}},"required":["prompt"]},"webhook_url":{"type":"string","format":"uri","description":"An https URL to POST a signed generation event to when it finishes"}},"additionalProperties":false},"Create_seedream_5_lite_edit":{"type":"object","title":"seedream-5-lite/edit","description":"Fast edits from up to 14 images, at up to 4K.","required":["model","input"],"properties":{"model":{"type":"string","enum":["seedream-5-lite/edit"]},"input":{"type":"object","properties":{"prompt":{"type":"string","minLength":3,"description":"The change to make as one paragraph, at most 600 words, naming each image by its place in images (image 1, image 2), with the exact words the result must show written out."},"aspect_ratio":{"default":"auto","description":"Shape of the result as width:height, or auto to keep the shape the images suggest; auto when left out.","type":"string","enum":["auto","1:1","21:9","16:9","3:2","4:3","5:4","4:5","3:4","2:3","9:16"]},"resolution":{"default":"2K","description":"Output resolution, 2K, 3K or 4K, all at one price; 2K when left out.","type":"string","enum":["2K","3K","4K"]},"images":{"minItems":1,"maxItems":14,"type":"array","items":{"type":"string"},"description":"The images to edit or combine, in the order the prompt names them, at most 14, each an asset id (asset_…) or an https URL."},"name":{"type":"string","minLength":2,"maxLength":80,"description":"What the output is called in your library; made from the prompt when left out."}},"required":["prompt","images"]},"webhook_url":{"type":"string","format":"uri","description":"An https URL to POST a signed generation event to when it finishes"}},"additionalProperties":false},"Create_seedream_5_pro_layers":{"type":"object","title":"seedream-5-pro/layers","description":"Split one image into editable layers: background, product, headline and logo.","required":["model","input"],"properties":{"model":{"type":"string","enum":["seedream-5-pro/layers"]},"input":{"type":"object","properties":{"image":{"type":"string","description":"The image to split into layers, as an asset id (asset_…) or an https URL."},"prompt":{"default":"Return name and description in english.","description":"One sentence on how to split, group or name the layers; asks for English names and descriptions when left out.","type":"string","minLength":3},"resolution":{"default":"2K","description":"Resolution of the layers, 1.5K for drafts and 2K for finals; 2K when left out.","type":"string","enum":["1.5K","2K"]},"name":{"type":"string","minLength":2,"maxLength":80,"description":"What the output is called in your library; made from the prompt when left out."}},"required":["image"]},"webhook_url":{"type":"string","format":"uri","description":"An https URL to POST a signed generation event to when it finishes"}},"additionalProperties":false},"Create_topaz_upscale":{"type":"object","title":"topaz/upscale","description":"Enlarge an image and recover sharpness without inventing content.","required":["model","input"],"properties":{"model":{"type":"string","enum":["topaz/upscale"]},"input":{"type":"object","properties":{"image":{"type":"string","description":"The image to enlarge, as an asset id (asset_…) or an https URL."},"upscale_factor":{"default":2,"description":"How many times wider and taller the image comes out, from 1 to 4, so 2 makes four times the pixels; 2 when left out.","type":"number","minimum":1,"maximum":4},"preset":{"default":"standard","description":"standard suits most photos, high_fidelity keeps the fine detail of a professional shot, low_resolution recovers a small or compressed source, cgi suits renders and illustrations, and text keeps lettering and shapes crisp; standard when left out.","type":"string","enum":["standard","high_fidelity","low_resolution","cgi","text"]},"face_enhancement":{"default":true,"description":"Whether faces get their detail recovered; true when left out, and false for a shot with no people in it.","type":"boolean"},"output_format":{"default":"jpeg","description":"jpeg is the smaller file and png keeps every pixel; jpeg when left out.","type":"string","enum":["jpeg","png"]},"name":{"type":"string","minLength":2,"maxLength":80,"description":"What the output is called in your library; made from the prompt when left out."}},"required":["image"]},"webhook_url":{"type":"string","format":"uri","description":"An https URL to POST a signed generation event to when it finishes"}},"additionalProperties":false},"Create_seedance_2_5_text_to_video":{"type":"object","title":"seedance-2.5/text-to-video","description":"A clip from a prompt alone, with sound, speech and music. 4 to 30 seconds.","required":["model","input"],"properties":{"model":{"type":"string","enum":["seedance-2.5/text-to-video"]},"input":{"type":"object","properties":{"prompt":{"type":"string","minLength":3,"maxLength":50000,"description":"What happens in the clip."},"aspect_ratio":{"default":"auto","description":"Shape of the clip as width:height, or auto to let the model decide; auto when left out.","type":"string","enum":["auto","21:9","16:9","4:3","1:1","3:4","9:16"]},"draft":{"default":false,"description":"Whether to make a cheap 480p draft, whatever resolution says, that seedance-2.5/finish can finish at 1080p within 7 days; false when left out.","type":"boolean"},"duration":{"default":"auto","description":"Length in whole seconds from 4 to 30, or auto to let the model decide; auto when left out.","anyOf":[{"type":"string","const":"auto"},{"type":"integer","minimum":4,"maximum":30}]},"resolution":{"default":"720p","description":"Output resolution; 720p when left out.","type":"string","enum":["480p","720p","1080p"]},"generate_audio":{"default":true,"description":"Whether the clip gets sound, speech and music made for it; true when left out.","type":"boolean"},"codec":{"default":"auto","description":"Video codec; auto when left out.","type":"string","enum":["auto","H264","H265"]},"bitrate_mode":{"default":"standard","description":"high asks for a larger, higher quality file; standard when left out.","type":"string","enum":["standard","high"]},"output_format":{"default":"mp4","description":"mp4 plays anywhere, mov keeps more color for grading; mp4 when left out.","type":"string","enum":["mp4","mov"]},"return_last_frame":{"default":false,"description":"Whether the last frame is also saved as an image, to start the next clip from; false when left out.","type":"boolean"},"name":{"type":"string","minLength":2,"maxLength":80,"description":"What the output is called in your library; made from the prompt when left out."}},"required":["prompt"]},"webhook_url":{"type":"string","format":"uri","description":"An https URL to POST a signed generation event to when it finishes"}},"additionalProperties":false},"Create_seedance_2_5_image_to_video":{"type":"object","title":"seedance-2.5/image-to-video","description":"Bring a still to life, or join two frames with motion. 4 to 30 seconds.","required":["model","input"],"properties":{"model":{"type":"string","enum":["seedance-2.5/image-to-video"]},"input":{"type":"object","properties":{"prompt":{"type":"string","minLength":3,"maxLength":50000,"description":"What happens in the clip, from the start image to the end image when one is given."},"start_image":{"type":"string","description":"The image the clip opens on, as an asset id (asset_…) or an https URL; the clip takes its shape."},"end_image":{"type":"string","description":"The image the clip ends on, as an asset id (asset_…) or an https URL; none when left out, so the model picks the ending."},"draft":{"default":false,"description":"Whether to make a cheap 480p draft, whatever resolution says, that seedance-2.5/finish can finish at 1080p within 7 days; false when left out.","type":"boolean"},"duration":{"default":"auto","description":"Length in whole seconds from 4 to 30, or auto to let the model decide; auto when left out.","anyOf":[{"type":"string","const":"auto"},{"type":"integer","minimum":4,"maximum":30}]},"resolution":{"default":"720p","description":"Output resolution; 720p when left out.","type":"string","enum":["480p","720p","1080p"]},"generate_audio":{"default":true,"description":"Whether the clip gets sound, speech and music made for it; true when left out.","type":"boolean"},"codec":{"default":"auto","description":"Video codec; auto when left out.","type":"string","enum":["auto","H264","H265"]},"bitrate_mode":{"default":"standard","description":"high asks for a larger, higher quality file; standard when left out.","type":"string","enum":["standard","high"]},"output_format":{"default":"mp4","description":"mp4 plays anywhere, mov keeps more color for grading; mp4 when left out.","type":"string","enum":["mp4","mov"]},"return_last_frame":{"default":false,"description":"Whether the last frame is also saved as an image, to start the next clip from; false when left out.","type":"boolean"},"name":{"type":"string","minLength":2,"maxLength":80,"description":"What the output is called in your library; made from the prompt when left out."}},"required":["prompt","start_image"]},"webhook_url":{"type":"string","format":"uri","description":"An https URL to POST a signed generation event to when it finishes"}},"additionalProperties":false},"Create_seedance_2_5_reference_to_video":{"type":"object","title":"seedance-2.5/reference-to-video","description":"Motion that keeps the look of images, the movement of clips or the sound of audio you pass.","required":["model","input"],"properties":{"model":{"type":"string","enum":["seedance-2.5/reference-to-video"]},"input":{"type":"object","properties":{"prompt":{"type":"string","minLength":3,"maxLength":50000,"description":"What happens in the clip, citing each image, video or audio by its place in its list as @Image1, @Video1 or @Audio1."},"task":{"default":"auto","description":"reference makes a new clip from the references, editing changes the first of videos, extension continues it; auto when left out, which lets the model decide.","type":"string","enum":["auto","reference","editing","extension"]},"images":{"default":[],"description":"Up to 30 images, each an asset id (asset_…) or an https URL; none when left out.","maxItems":30,"type":"array","items":{"type":"string"}},"videos":{"default":[],"description":"Up to 10 videos, 30 seconds together at most, each an asset id (asset_…) or an https URL; none when left out.","maxItems":10,"type":"array","items":{"type":"string"}},"audio":{"default":[],"description":"Up to 10 wav or mp3 files, 30 seconds together at most, each an asset id (asset_…) or an https URL; none when left out.","maxItems":10,"type":"array","items":{"type":"string"}},"aspect_ratio":{"default":"auto","description":"Shape of the clip as width:height, or auto to follow the references; auto when left out.","type":"string","enum":["auto","21:9","16:9","4:3","1:1","3:4","9:16"]},"seed":{"description":"Integer seed for a more repeatable take; random when left out.","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"draft":{"default":false,"description":"Whether to make a cheap 480p draft, whatever resolution says, that seedance-2.5/finish can finish at 1080p within 7 days; false when left out.","type":"boolean"},"duration":{"default":"auto","description":"Length in whole seconds from 4 to 30, or auto to let the model decide; auto when left out.","anyOf":[{"type":"string","const":"auto"},{"type":"integer","minimum":4,"maximum":30}]},"resolution":{"default":"720p","description":"Output resolution; 720p when left out.","type":"string","enum":["480p","720p","1080p"]},"generate_audio":{"default":true,"description":"Whether the clip gets sound, speech and music made for it; true when left out.","type":"boolean"},"codec":{"default":"auto","description":"Video codec; auto when left out.","type":"string","enum":["auto","H264","H265"]},"bitrate_mode":{"default":"standard","description":"high asks for a larger, higher quality file; standard when left out.","type":"string","enum":["standard","high"]},"output_format":{"default":"mp4","description":"mp4 plays anywhere, mov keeps more color for grading; mp4 when left out.","type":"string","enum":["mp4","mov"]},"return_last_frame":{"default":false,"description":"Whether the last frame is also saved as an image, to start the next clip from; false when left out.","type":"boolean"},"name":{"type":"string","minLength":2,"maxLength":80,"description":"What the output is called in your library; made from the prompt when left out."}},"required":["prompt"]},"webhook_url":{"type":"string","format":"uri","description":"An https URL to POST a signed generation event to when it finishes"}},"additionalProperties":false},"Create_seedance_2_5_finish":{"type":"object","title":"seedance-2.5/finish","description":"Finish a 480p draft at 1080p, within 7 days of making it.","required":["model","input"],"properties":{"model":{"type":"string","enum":["seedance-2.5/finish"]},"input":{"type":"object","properties":{"draft":{"type":"string","maxLength":42,"description":"The draft to finish: the asset id of a Seedance 2.5 clip made with draft set to true."},"name":{"type":"string","minLength":2,"maxLength":80,"description":"What the output is called in your library; made from the prompt when left out."}},"required":["draft"]},"webhook_url":{"type":"string","format":"uri","description":"An https URL to POST a signed generation event to when it finishes"}},"additionalProperties":false},"Create_kling_3_pro_image_to_video":{"type":"object","title":"kling-3-pro/image-to-video","description":"A clip that opens on your image and can end on a second one.","required":["model","input"],"properties":{"model":{"type":"string","enum":["kling-3-pro/image-to-video"]},"input":{"type":"object","properties":{"prompt":{"description":"What happens in the clip, up to 2500 characters; leave it out when multi_prompt gives the shots instead.","type":"string","minLength":3,"maxLength":2500},"multi_prompt":{"description":"Shots cut end to end in one clip, in order, which together run 3 to 15 seconds; in place of prompt and duration, and none when left out.","minItems":1,"type":"array","items":{"type":"object","properties":{"prompt":{"type":"string","minLength":3,"maxLength":2500,"description":"What happens in this shot."},"duration":{"default":5,"description":"Length of this shot in whole seconds from 1 to 15; 5 when left out.","type":"integer","minimum":1,"maximum":15}},"required":["prompt"]}},"start_image":{"type":"string","description":"The image the clip opens on, as an asset id (asset_…) or an https URL."},"end_image":{"type":"string","description":"The image the clip ends on, as an asset id (asset_…) or an https URL; none when left out, so the model picks the ending."},"negative_prompt":{"description":"What the clip must not show, such as \"lens flare, morphing faces\"; Kling's own \"blur, distort, and low quality\" when left out.","type":"string","minLength":1,"maxLength":2500},"cfg_scale":{"default":0.5,"description":"How closely the clip keeps to the prompt, from 0 to 1; 0.5 when left out.","type":"number","minimum":0,"maximum":1},"duration":{"description":"Length in whole seconds from 3 to 15; 5 when left out, and left out with multi_prompt, whose shot lengths add up to the clip's.","type":"integer","minimum":3,"maximum":15},"generate_audio":{"default":true,"description":"Whether the clip gets sound and speech made for it; true when left out.","type":"boolean"},"shot_type":{"default":"customize","description":"customize cuts multi_prompt shots as written, intelligent lets Kling decide the shot structure; customize when left out.","type":"string","enum":["customize","intelligent"]},"name":{"type":"string","minLength":2,"maxLength":80,"description":"What the output is called in your library; made from the prompt when left out."}},"required":["start_image"]},"webhook_url":{"type":"string","format":"uri","description":"An https URL to POST a signed generation event to when it finishes"}},"additionalProperties":false},"Create_kling_o3_pro_reference_to_video":{"type":"object","title":"kling-o3-pro/reference-to-video","description":"Keeps a person, product or character true to up to 4 reference images.","required":["model","input"],"properties":{"model":{"type":"string","enum":["kling-o3-pro/reference-to-video"]},"input":{"type":"object","properties":{"prompt":{"description":"What happens in the clip, up to 2500 characters; leave it out when multi_prompt gives the shots instead.","type":"string","minLength":3,"maxLength":2500},"multi_prompt":{"description":"Shots cut end to end in one clip, in order, which together run 3 to 15 seconds; in place of prompt and duration, and none when left out.","minItems":1,"type":"array","items":{"type":"object","properties":{"prompt":{"type":"string","minLength":3,"maxLength":2500,"description":"What happens in this shot."},"duration":{"default":5,"description":"Length of this shot in whole seconds from 1 to 15; 5 when left out.","type":"integer","minimum":1,"maximum":15}},"required":["prompt"]}},"start_image":{"type":"string","description":"The image the clip opens on, as an asset id (asset_…) or an https URL; none when left out, so the model composes the opening from the prompt and the references."},"end_image":{"type":"string","description":"The image the clip ends on, as an asset id (asset_…) or an https URL; none when left out, so the model picks the ending."},"images":{"default":[],"description":"Up to 4 images whose subject or look the clip keeps, each an asset id (asset_…) or an https URL, cited in the prompt as @Image1, @Image2 in this order; none when left out.","maxItems":4,"type":"array","items":{"type":"string"}},"elements":{"default":[],"description":"Characters or objects held to one look across the clip, cited in the prompt as @Element1, @Element2 in this order; images and elements take 4 together at most, and none when left out.","maxItems":4,"type":"array","items":{"anyOf":[{"type":"object","properties":{"frontal_image":{"type":"string","description":"A front view of the character or object, as an asset id (asset_…) or an https URL."},"reference_images":{"minItems":1,"maxItems":3,"type":"array","items":{"type":"string"},"description":"1 to 3 more views of the same character or object, from other angles, each an asset id (asset_…) or an https URL."}},"required":["frontal_image","reference_images"],"additionalProperties":false},{"type":"object","properties":{"video":{"type":"string","description":"A clip of the character or object, 3 to 10 seconds at 720 to 2160 px a side, as an asset id (asset_…) or an https URL, in place of images."}},"required":["video"],"additionalProperties":false}]}},"aspect_ratio":{"default":"16:9","description":"Shape of the clip as width:height; 16:9 when left out.","type":"string","enum":["16:9","9:16","1:1"]},"duration":{"description":"Length in whole seconds from 3 to 15; 5 when left out, and left out with multi_prompt, whose shot lengths add up to the clip's.","type":"integer","minimum":3,"maximum":15},"generate_audio":{"default":true,"description":"Whether the clip gets sound and speech made for it; true when left out.","type":"boolean"},"shot_type":{"default":"customize","description":"customize cuts multi_prompt shots as written, intelligent lets Kling decide the shot structure; customize when left out.","type":"string","enum":["customize","intelligent"]},"name":{"type":"string","minLength":2,"maxLength":80,"description":"What the output is called in your library; made from the prompt when left out."}}},"webhook_url":{"type":"string","format":"uri","description":"An https URL to POST a signed generation event to when it finishes"}},"additionalProperties":false},"Create_gemini_omni_flash_text_to_video":{"type":"object","title":"gemini-omni-flash/text-to-video","description":"A clip from a prompt, from a 360p draft to a 4K take.","required":["model","input"],"properties":{"model":{"type":"string","enum":["gemini-omni-flash/text-to-video"]},"input":{"type":"object","properties":{"prompt":{"type":"string","minLength":3,"maxLength":20000,"description":"What happens in the clip, with any spoken line in double quotes."},"aspect_ratio":{"default":"9:16","description":"Shape of the clip, portrait 9:16 or landscape 16:9; 9:16 when left out.","type":"string","enum":["9:16","16:9"]},"duration":{"default":8,"description":"Length in whole seconds from 3 to 10; 8 when left out.","type":"integer","minimum":3,"maximum":10},"resolution":{"default":"720p","description":"Output resolution, 360p for a cheap draft up to 4k, and the price per second rises with it; 720p when left out.","type":"string","enum":["360p","720p","1080p","4k"]},"name":{"type":"string","minLength":2,"maxLength":80,"description":"What the output is called in your library; made from the prompt when left out."}},"required":["prompt"]},"webhook_url":{"type":"string","format":"uri","description":"An https URL to POST a signed generation event to when it finishes"}},"additionalProperties":false},"Create_gemini_omni_flash_image_to_video":{"type":"object","title":"gemini-omni-flash/image-to-video","description":"A clip that opens on your image, from 360p to 4K.","required":["model","input"],"properties":{"model":{"type":"string","enum":["gemini-omni-flash/image-to-video"]},"input":{"type":"object","properties":{"prompt":{"type":"string","minLength":3,"maxLength":20000,"description":"How the image comes to life, up to the end image when one is given, with any spoken line in double quotes."},"start_image":{"type":"string","description":"The image the clip opens on, as an asset id (asset_…) or an https URL."},"end_image":{"type":"string","description":"The image the clip ends on, as an asset id (asset_…) or an https URL; none when left out, so the model picks the ending."},"aspect_ratio":{"default":"9:16","description":"Shape of the clip, portrait 9:16 or landscape 16:9; 9:16 when left out.","type":"string","enum":["9:16","16:9"]},"duration":{"default":8,"description":"Length in whole seconds from 3 to 10; 8 when left out.","type":"integer","minimum":3,"maximum":10},"resolution":{"default":"720p","description":"Output resolution, 360p for a cheap draft up to 4k, and the price per second rises with it; 720p when left out.","type":"string","enum":["360p","720p","1080p","4k"]},"name":{"type":"string","minLength":2,"maxLength":80,"description":"What the output is called in your library; made from the prompt when left out."}},"required":["prompt","start_image"]},"webhook_url":{"type":"string","format":"uri","description":"An https URL to POST a signed generation event to when it finishes"}},"additionalProperties":false},"Create_gemini_omni_flash_reference_to_video":{"type":"object","title":"gemini-omni-flash/reference-to-video","description":"A clip guided by up to 10 images or 3 short clips.","required":["model","input"],"properties":{"model":{"type":"string","enum":["gemini-omni-flash/reference-to-video"]},"input":{"type":"object","properties":{"prompt":{"type":"string","minLength":3,"maxLength":20000,"description":"What happens in the clip, citing each image or video inline by its place in its list from 0, as <IMAGE_REF_0> or <VIDEO_REF_0>, with any spoken line in double quotes."},"images":{"default":[],"description":"Up to 10 images of the faces, products or places to keep, each an asset id (asset_…) or an https URL; none when left out.","maxItems":10,"type":"array","items":{"type":"string"}},"videos":{"default":[],"description":"Up to 3 videos, each shorter than 3 seconds, for a likeness or a motion to copy, whose sound is ignored, each an asset id (asset_…) or an https URL; none when left out.","maxItems":3,"type":"array","items":{"type":"string"}},"aspect_ratio":{"default":"9:16","description":"Shape of the clip, portrait 9:16 or landscape 16:9; 9:16 when left out.","type":"string","enum":["9:16","16:9"]},"duration":{"default":8,"description":"Length in whole seconds from 3 to 10; 8 when left out.","type":"integer","minimum":3,"maximum":10},"resolution":{"default":"720p","description":"Output resolution, 360p for a cheap draft up to 4k, and the price per second rises with it; 720p when left out.","type":"string","enum":["360p","720p","1080p","4k"]},"name":{"type":"string","minLength":2,"maxLength":80,"description":"What the output is called in your library; made from the prompt when left out."}},"required":["prompt"]},"webhook_url":{"type":"string","format":"uri","description":"An https URL to POST a signed generation event to when it finishes"}},"additionalProperties":false},"Create_gemini_omni_flash_edit":{"type":"object","title":"gemini-omni-flash/edit","description":"Change one thing in a clip of 10 seconds or less, such as the background or the weather.","required":["model","input"],"properties":{"model":{"type":"string","enum":["gemini-omni-flash/edit"]},"input":{"type":"object","properties":{"prompt":{"type":"string","minLength":3,"maxLength":20000,"description":"One simple change to make, ending with \"Keep everything else the same.\" to hold the rest of the scene."},"video":{"type":"string","description":"The video to edit, 10 seconds or shorter, as an asset id (asset_…) or an https URL."},"resolution":{"description":"Output resolution; the source video's own when left out, so set it only to step the clip up or down.","type":"string","enum":["360p","720p","1080p","4k"]},"name":{"type":"string","minLength":2,"maxLength":80,"description":"What the output is called in your library; made from the prompt when left out."}},"required":["prompt","video"]},"webhook_url":{"type":"string","format":"uri","description":"An https URL to POST a signed generation event to when it finishes"}},"additionalProperties":false},"Create_sync_3_lipsync":{"type":"object","title":"sync-3/lipsync","description":"Re-sync the speaker’s lips to new audio: dubs, new lines and fixed takes.","required":["model","input"],"properties":{"model":{"type":"string","enum":["sync-3/lipsync"]},"input":{"type":"object","properties":{"video":{"type":"string","description":"The video to re-sync, as an asset id (asset_…) or an https URL, showing one clear, front-facing speaker."},"audio":{"type":"string","description":"The speech the lips follow, as an asset id (asset_…) or an https URL: a new voiceover, a dub, or the clip's own track saved as audio."},"sync_mode":{"default":"cut_off","description":"What happens when the audio and the video differ in length: cut_off ends the clip at the shorter one, loop and bounce replay the video, from the start or forward then back, until the audio ends, silence keeps the longer one with silence after the audio, and remap retimes the video to the audio; cut_off when left out.","type":"string","enum":["cut_off","loop","bounce","silence","remap"]},"name":{"type":"string","minLength":2,"maxLength":80,"description":"What the output is called in your library; made from the prompt when left out."}},"required":["video","audio"]},"webhook_url":{"type":"string","format":"uri","description":"An https URL to POST a signed generation event to when it finishes"}},"additionalProperties":false},"Create_elevenlabs_voiceover":{"type":"object","title":"elevenlabs/voiceover","description":"Speak a script aloud in any library voice.","required":["model","input"],"properties":{"model":{"type":"string","enum":["elevenlabs/voiceover"]},"input":{"type":"object","properties":{"text":{"type":"string","minLength":1,"maxLength":5000,"description":"The script to read aloud, up to 5000 characters, written as it should sound: inline audio tags in square brackets direct the delivery, such as [whispering], [laughs], [excited], [pause] or [door slams], and a word in IPA between slashes, such as /ˈnaɪki/, fixes its pronunciation."},"voice":{"default":"Jessica","description":"The voice that reads the script: a premade voice name, or a voice id from GET /v1/voices; Jessica when left out.","type":"string","minLength":1,"maxLength":64},"stability":{"default":"natural","description":"creative varies the delivery most and robust keeps it steadiest; natural when left out.","type":"string","enum":["creative","natural","robust"]},"similarity_boost":{"default":0.75,"description":"How closely the speech holds to the voice, from 0 to 1; high values can carry the quirks of its source recording, and 0.75 when left out.","type":"number","minimum":0,"maximum":1},"language_code":{"description":"The language to speak in, as a two-letter ISO 639-1 code such as en, pt or es; read from the script when left out.","type":"string","pattern":"^[a-z]{2}$"},"name":{"type":"string","minLength":2,"maxLength":80,"description":"What the output is called in your library; made from the prompt when left out."}},"required":["text"]},"webhook_url":{"type":"string","format":"uri","description":"An https URL to POST a signed generation event to when it finishes"}},"additionalProperties":false},"Create_elevenlabs_music":{"type":"object","title":"elevenlabs/music","description":"Background tracks, jingles and songs, with or without vocals.","required":["model","input"],"properties":{"model":{"type":"string","enum":["elevenlabs/music"]},"input":{"type":"object","properties":{"prompt":{"type":"string","minLength":3,"maxLength":4100,"description":"The track: genre, mood, instruments, tempo, and any lyrics or vocal style, up to 4100 characters."},"duration":{"default":"auto","description":"Length in whole seconds from 3 to 600, or auto to let the model decide; auto when left out.","anyOf":[{"type":"string","const":"auto"},{"type":"integer","minimum":3,"maximum":600}]},"force_instrumental":{"default":false,"description":"true guarantees a track with no vocals; false when left out.","type":"boolean"},"name":{"type":"string","minLength":2,"maxLength":80,"description":"What the output is called in your library; made from the prompt when left out."}},"required":["prompt"]},"webhook_url":{"type":"string","format":"uri","description":"An https URL to POST a signed generation event to when it finishes"}},"additionalProperties":false},"Create_elevenlabs_sound_effects":{"type":"object","title":"elevenlabs/sound-effects","description":"Impacts, ambiences, foley and interface sounds from a description.","required":["model","input"],"properties":{"model":{"type":"string","enum":["elevenlabs/sound-effects"]},"input":{"type":"object","properties":{"prompt":{"type":"string","minLength":3,"maxLength":450,"description":"The sound in plain words, such as \"glass shattering on a tile floor\", up to 450 characters."},"duration":{"default":"auto","description":"Length in seconds from 0.5 to 22, or auto to fit the sound; auto when left out.","anyOf":[{"type":"string","const":"auto"},{"type":"number","minimum":0.5,"maximum":22}]},"prompt_influence":{"default":0.3,"description":"How closely the sound follows the prompt, from 0 to 1; 0.3 when left out.","type":"number","minimum":0,"maximum":1},"loop":{"default":false,"description":"Whether the sound loops seamlessly end to start; false when left out.","type":"boolean"},"name":{"type":"string","minLength":2,"maxLength":80,"description":"What the output is called in your library; made from the prompt when left out."}},"required":["prompt"]},"webhook_url":{"type":"string","format":"uri","description":"An https URL to POST a signed generation event to when it finishes"}},"additionalProperties":false},"Create_elevenlabs_voice_changer":{"type":"object","title":"elevenlabs/voice-changer","description":"Re-voice a recording into another voice, keeping its timing and emotion.","required":["model","input"],"properties":{"model":{"type":"string","enum":["elevenlabs/voice-changer"]},"input":{"type":"object","properties":{"audio":{"type":"string","description":"The recording to re-voice, as an asset id (asset_…) or an https URL, at most 5 minutes; clean single-speaker audio works best."},"voice":{"type":"string","pattern":"^[A-Za-z0-9]{20}$","description":"The voice id the recording is re-voiced into, from GET /v1/voices."},"remove_background_noise":{"default":false,"description":"Whether to strip background noise from the recording first; only for a noisy source, since it can hurt a clean one; false when left out.","type":"boolean"},"name":{"type":"string","minLength":2,"maxLength":80,"description":"What the output is called in your library; made from the prompt when left out."}},"required":["audio","voice"]},"webhook_url":{"type":"string","format":"uri","description":"An https URL to POST a signed generation event to when it finishes"}},"additionalProperties":false},"Create_elevenlabs_voice_isolator":{"type":"object","title":"elevenlabs/voice-isolator","description":"Pull the voice out of a recording, removing noise, music and ambience.","required":["model","input"],"properties":{"model":{"type":"string","enum":["elevenlabs/voice-isolator"]},"input":{"type":"object","properties":{"audio":{"type":"string","description":"The audio to isolate the voice in, as an asset id (asset_…) or an https URL."},"name":{"type":"string","minLength":2,"maxLength":80,"description":"What the output is called in your library; made from the prompt when left out."}},"required":["audio"]},"webhook_url":{"type":"string","format":"uri","description":"An https URL to POST a signed generation event to when it finishes"}},"additionalProperties":false},"Create_minimax_music":{"type":"object","title":"minimax/music","description":"Songs sung from your lyrics, or instrumentals.","required":["model","input"],"properties":{"model":{"type":"string","enum":["minimax/music"]},"input":{"type":"object","properties":{"prompt":{"type":"string","minLength":10,"maxLength":2000,"description":"The style of the track: genre, mood, instruments, tempo and where it plays, from 10 to 2000 characters."},"lyrics":{"description":"The words to sing, a line per line with tags such as [Verse], [Chorus] and [Bridge], up to 3500 characters, or auto to have MiniMax write them from the prompt; none when left out or empty, which makes an instrumental.","anyOf":[{"type":"string","const":"auto"},{"type":"string","maxLength":3500}]},"name":{"type":"string","minLength":2,"maxLength":80,"description":"What the output is called in your library; made from the prompt when left out."}},"required":["prompt"]},"webhook_url":{"type":"string","format":"uri","description":"An https URL to POST a signed generation event to when it finishes"}},"additionalProperties":false},"Create_sonilo_music":{"type":"object","title":"sonilo/music","description":"Instrumental music to the exact second, trained only on licensed music and cleared for ads.","required":["model","input"],"properties":{"model":{"type":"string","enum":["sonilo/music"]},"input":{"type":"object","properties":{"prompt":{"type":"string","minLength":1,"description":"The track: genre, mood, instruments, tempo and where it plays."},"duration":{"type":"integer","minimum":1,"maximum":600,"description":"Length in whole seconds from 1 to 600; the track runs exactly this long."},"name":{"type":"string","minLength":2,"maxLength":80,"description":"What the output is called in your library; made from the prompt when left out."}},"required":["prompt","duration"]},"webhook_url":{"type":"string","format":"uri","description":"An https URL to POST a signed generation event to when it finishes"}},"additionalProperties":false},"GenerationEvent":{"type":"object","properties":{"id":{"type":"string","description":"The same for every delivery of one event, so a retry can be told apart"},"object":{"type":"string","enum":["event"]},"type":{"type":"string","enum":["generation.succeeded","generation.failed","generation.canceled"]},"created_at":{"type":"string"},"data":{"$ref":"#/components/schemas/Generation"}},"required":["id","object","type","created_at","data"]},"Generation":{"type":"object","properties":{"id":{"type":"string","example":"gen_6c1f0e9a7b2d4c55a1e3f08b9d2c4e71"},"object":{"type":"string","enum":["generation"]},"model":{"type":"string"},"status":{"type":"string","enum":["queued","running","succeeded","failed","canceled"],"description":"queued, then running, then succeeded, failed or canceled"},"output":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"object":{"type":"string","enum":["asset"]},"type":{"type":"string","enum":["image","video","audio"]},"name":{"type":["string","null"]},"url":{"type":"string"},"content_type":{"type":"string"},"width":{"type":"number"},"height":{"type":"number"},"duration":{"type":"number"},"role":{"type":"string","enum":["main","last_frame","layer"]},"layer":{"type":"object","properties":{"name":{"type":["string","null"]},"description":{"type":["string","null"]},"x":{"type":"number"},"y":{"type":"number"},"width":{"type":"number"},"height":{"type":"number"},"z_index":{"type":"number"}},"required":["name","description","x","y","width","height","z_index"]}},"required":["id","object","type","name","url","content_type","role"]},"description":"What it made, saved to your library; the main file comes first"},"error":{"type":["object","null"],"properties":{"code":{"type":"string","enum":["invalid_input","insufficient_credits","generation_failed"]},"message":{"type":"string"}},"required":["code","message"],"description":"Why it failed; failed generations are free"},"credits":{"type":["number","null"],"description":"What it was charged, in credits of $0.05, once it finished"},"created_at":{"type":"string"},"started_at":{"type":["string","null"]},"completed_at":{"type":["string","null"]}},"required":["id","object","model","status","output","error","credits","created_at","started_at","completed_at"]},"ModelList":{"type":"object","properties":{"object":{"type":"string","enum":["list"]},"data":{"type":"array","items":{"$ref":"#/components/schemas/Model"}},"has_more":{"type":"boolean"},"next_cursor":{"type":["string","null"],"description":"Pass as `cursor` for the next page"}},"required":["object","data","has_more","next_cursor"]},"Model":{"type":"object","properties":{"id":{"type":"string"},"object":{"type":"string","enum":["model"]},"name":{"type":"string"},"type":{"type":"string","enum":["image","video","audio"]},"task":{"type":"string"},"summary":{"type":"string"},"pricing":{"type":"object","properties":{"rates":{"type":"array","items":{"type":"object","properties":{"unit":{"type":"string","description":"What one rate is for: an image, a second, a minute, a character, a request or a token"},"usd":{"type":"number"},"when":{"type":"object","additionalProperties":{},"description":"The input settings the rate applies to; empty when it applies to all"}},"required":["unit","usd","when"]}}},"required":["rates"],"description":"What a generation costs per unit, in USD. A generation is charged in credits of $0.05, rounded up, and only when it succeeds."},"input_schema":{"type":"object","additionalProperties":{},"description":"The JSON Schema of `input`"}},"required":["id","object","name","type","task","summary","pricing","input_schema"]},"Error":{"type":"object","properties":{"error":{"type":"object","properties":{"type":{"type":"string","enum":["invalid_request_error","authentication_error","permission_error","not_found_error","billing_error","rate_limit_error","api_error"]},"code":{"type":"string","description":"A stable code to branch on, such as invalid_input or insufficient_credits"},"message":{"type":"string","description":"What went wrong and how to fix it"},"param":{"type":"string","description":"The part of the request at fault, such as input.prompt"},"request_id":{"type":"string"}},"required":["type","code","message","request_id"]}},"required":["error"]},"GenerationList":{"type":"object","properties":{"object":{"type":"string","enum":["list"]},"data":{"type":"array","items":{"$ref":"#/components/schemas/Generation"}},"has_more":{"type":"boolean"},"next_cursor":{"type":["string","null"],"description":"Pass as `cursor` for the next page"}},"required":["object","data","has_more","next_cursor"]},"LibraryAssetList":{"type":"object","properties":{"object":{"type":"string","enum":["list"]},"data":{"type":"array","items":{"$ref":"#/components/schemas/LibraryAsset"}},"has_more":{"type":"boolean"},"next_cursor":{"type":["string","null"],"description":"Pass as `cursor` for the next page"}},"required":["object","data","has_more","next_cursor"]},"LibraryAsset":{"type":"object","properties":{"id":{"type":"string"},"object":{"type":"string","enum":["asset"]},"type":{"type":"string","enum":["image","video","audio","file"]},"name":{"type":["string","null"]},"url":{"type":["string","null"]},"content_type":{"type":["string","null"]},"width":{"type":"number"},"height":{"type":"number"},"duration":{"type":"number"},"caption":{"type":["string","null"],"description":"What the image shows, when it has been described"},"liked":{"type":"boolean"},"offer":{"type":["string","null"],"description":"The offer the file is a photo of, offer_…"},"created_at":{"type":"string"}},"required":["id","object","type","name","url","content_type","caption","liked","offer","created_at"]},"Asset":{"type":"object","properties":{"id":{"type":"string"},"object":{"type":"string","enum":["asset"]},"type":{"type":"string","enum":["image","video","audio","file"]},"name":{"type":["string","null"]},"url":{"type":["string","null"]},"content_type":{"type":["string","null"]},"width":{"type":"number"},"height":{"type":"number"},"duration":{"type":"number"}},"required":["id","object","type","name","url","content_type"]},"Brand":{"type":"object","properties":{"object":{"type":"string","enum":["brand"]},"id":{"type":"string","format":"uuid","description":"Send it as `Sandstorm-Brand` to work on this brand with a key made on another"},"name":{"type":"string"},"summary":{"type":["string","null"]},"voice":{"type":["string","null"],"description":"How the brand sounds, by surface"},"audience":{"type":["string","null"]},"positioning":{"type":["string","null"]},"preferences":{"type":["string","null"],"description":"Taboos and preferences found in what the brand published"},"rules":{"type":"array","items":{"type":"object","properties":{"kind":{"type":"string","enum":["preference","taboo"]},"text":{"type":"string"}},"required":["kind","text"]},"description":"Rules people at the brand stated, newest first. They outrank everything above."},"colors":{"type":"array","items":{"type":"object","properties":{"hex":{"type":"string"},"role":{"type":["string","null"]},"name":{"type":["string","null"]}},"required":["hex","role","name"]}},"typography":{"type":"array","items":{"type":"object","properties":{"role":{"type":"string","description":"heading1 to heading4, body, cta, link or overline"},"font_family":{"type":["string","null"]},"font_size":{"type":["string","null"]},"font_weight":{"type":["string","null"]},"letter_spacing":{"type":["string","null"]},"text_transform":{"type":["string","null"]}},"required":["role","font_family","font_size","font_weight","letter_spacing","text_transform"]}},"button":{"type":["object","null"],"properties":{"text":{"type":"string"},"color":{"type":["string","null"]},"background_color":{"type":["string","null"]},"border_radius":{"type":["string","null"]},"font_family":{"type":["string","null"]},"font_size":{"type":["string","null"]},"font_weight":{"type":["string","null"]}},"required":["text","color","background_color","border_radius","font_family","font_size","font_weight"],"description":"The site's primary call-to-action button"},"fonts":{"type":"array","items":{"type":"object","properties":{"family":{"type":"string"},"headings":{"type":"boolean"},"body":{"type":"boolean"},"files":{"type":"array","items":{"type":"object","properties":{"weight":{"type":"string"},"style":{"type":"string"},"url":{"type":"string"}},"required":["weight","style","url"]}}},"required":["family","headings","body","files"]}},"logos":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"An asset id, usable as a media input"},"variant":{"type":"string","enum":["icon","light","dark"],"description":"icon for a small mark, light for dark backgrounds, dark for light ones"},"format":{"type":["string","null"]},"width":{"type":["number","null"]},"height":{"type":["number","null"]},"url":{"type":["string","null"]}},"required":["id","variant","format","width","height","url"]}}},"required":["object","id","name","summary","voice","audience","positioning","preferences","rules","colors","typography","button","fonts","logos"]},"OfferList":{"type":"object","properties":{"object":{"type":"string","enum":["list"]},"data":{"type":"array","items":{"$ref":"#/components/schemas/OfferSummary"}},"has_more":{"type":"boolean"},"next_cursor":{"type":["string","null"],"description":"Pass as `cursor` for the next page"}},"required":["object","data","has_more","next_cursor"]},"OfferSummary":{"type":"object","properties":{"id":{"type":"string"},"object":{"type":"string","enum":["offer"]},"name":{"type":"string"},"kind":{"type":"string","description":"product, service, bundle"},"priority":{"type":"string","description":"hero, evergreen, seasonal"},"summary":{"type":"string"},"photo_count":{"type":"integer"},"variant_count":{"type":"integer"}},"required":["id","object","name","kind","priority","summary","photo_count","variant_count"]},"Offer":{"type":"object","properties":{"id":{"type":"string"},"object":{"type":"string","enum":["offer"]},"name":{"type":"string"},"kind":{"type":"string","description":"product, service, bundle"},"priority":{"type":"string","description":"hero, evergreen, seasonal"},"photo_count":{"type":"integer"},"description":{"type":["string","null"]},"context":{"type":["string","null"],"description":"Notes on how to sell it"},"variants":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"sku":{"type":["string","null"]},"price":{"type":["string","null"]},"compare_at_price":{"type":["string","null"]},"sizes":{"type":"array","items":{"type":"string"}},"photo_count":{"type":"integer"},"photos":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"An asset id, usable as a media input"},"url":{"type":["string","null"]},"width":{"type":["number","null"]},"height":{"type":["number","null"]},"orientation":{"type":["string","null"]},"shot_type":{"type":["string","null"]},"caption":{"type":["string","null"]},"liked":{"type":"boolean"}},"required":["id","url","width","height","orientation","shot_type","caption","liked"]}}},"required":["id","name","sku","price","compare_at_price","sizes","photo_count","photos"]}},"photos":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"An asset id, usable as a media input"},"url":{"type":["string","null"]},"width":{"type":["number","null"]},"height":{"type":["number","null"]},"orientation":{"type":["string","null"]},"shot_type":{"type":["string","null"]},"caption":{"type":["string","null"]},"liked":{"type":"boolean"}},"required":["id","url","width","height","orientation","shot_type","caption","liked"]},"description":"Photos of the offer that belong to no one variant"}},"required":["id","object","name","kind","priority","photo_count","description","context","variants","photos"]},"CharacterList":{"type":"object","properties":{"object":{"type":"string","enum":["list"]},"data":{"type":"array","items":{"$ref":"#/components/schemas/Character"}},"has_more":{"type":"boolean"},"next_cursor":{"type":["string","null"],"description":"Pass as `cursor` for the next page"}},"required":["object","data","has_more","next_cursor"]},"Character":{"type":"object","properties":{"id":{"type":"string"},"object":{"type":"string","enum":["character"]},"name":{"type":"string"},"kind":{"type":"string","description":"subject, product, place, voice, style"},"description":{"type":["string","null"]},"usage":{"type":["string","null"]},"must_match":{"type":"array","items":{"type":"string"},"description":"What every image of it has to keep, such as Face or Wardrobe"},"items":{"type":"array","items":{"type":"object","properties":{"asset":{"type":"string","description":"An asset id, usable as a media input"},"type":{"type":"string","enum":["image","video","audio"]},"role":{"type":"string","description":"reference, first_frame, last_frame"},"angle":{"type":["string","null"]},"usage":{"type":["string","null"]},"url":{"type":["string","null"]}},"required":["asset","type","role","angle","usage","url"]}}},"required":["id","object","name","kind","description","usage","must_match","items"]},"VoiceList":{"type":"object","properties":{"object":{"type":"string","enum":["list"]},"data":{"type":"array","items":{"$ref":"#/components/schemas/Voice"}},"has_more":{"type":"boolean"},"next_cursor":{"type":["string","null"],"description":"Pass as `cursor` for the next page"}},"required":["object","data","has_more","next_cursor"]},"Voice":{"type":"object","properties":{"id":{"type":"string","description":"Pass as `voice` to a voiceover or voice change"},"object":{"type":"string","enum":["voice"]},"name":{"type":"string"},"gender":{"type":"string"},"age":{"type":"string"},"accent":{"type":"string"},"descriptive":{"type":"string"},"use_case":{"type":"string"},"description":{"type":["string","null"]},"preview_url":{"type":["string","null"],"description":"A public sample to play"}},"required":["id","object","name","gender","age","accent","descriptive","use_case","description","preview_url"]},"AdvertiserList":{"type":"object","properties":{"object":{"type":"string","enum":["list"]},"data":{"type":"array","items":{"$ref":"#/components/schemas/Advertiser"}},"has_more":{"type":"boolean"},"next_cursor":{"type":["string","null"],"description":"Pass as `cursor` for the next page"}},"required":["object","data","has_more","next_cursor"]},"Advertiser":{"type":"object","properties":{"id":{"type":"string"},"object":{"type":"string","enum":["advertiser"]},"name":{"type":["string","null"]},"ads":{"type":"integer"},"active_ads":{"type":"integer"},"followed":{"type":"boolean","description":"Whether your organization follows it"},"sync":{"type":"string","enum":["synced","syncing","failed","never"]},"synced_at":{"type":["string","null"]}},"required":["id","object","name","ads","active_ads","followed","sync","synced_at"]},"AdList":{"type":"object","properties":{"object":{"type":"string","enum":["list"]},"data":{"type":"array","items":{"$ref":"#/components/schemas/AdSummary"}},"has_more":{"type":"boolean"},"next_cursor":{"type":["string","null"],"description":"Pass as `cursor` for the next page"}},"required":["object","data","has_more","next_cursor"]},"AdSummary":{"type":"object","properties":{"id":{"type":"string"},"object":{"type":"string","enum":["ad"]},"advertiser":{"type":["string","null"]},"advertiser_name":{"type":["string","null"]},"platform":{"type":["string","null"]},"format":{"type":["string","null"]},"status":{"type":["string","null"]},"title":{"type":["string","null"]},"body":{"type":["string","null"]},"cta_text":{"type":["string","null"]},"active_days":{"type":["number","null"]},"started_at":{"type":["string","null"]},"ad_library_url":{"type":["string","null"]}},"required":["id","object","advertiser","advertiser_name","platform","format","status","title","body","cta_text","active_days","started_at","ad_library_url"]},"Ad":{"type":"object","properties":{"id":{"type":"string"},"object":{"type":"string","enum":["ad"]},"advertiser":{"type":["string","null"]},"advertiser_name":{"type":["string","null"]},"platform":{"type":["string","null"]},"format":{"type":["string","null"]},"status":{"type":["string","null"]},"title":{"type":["string","null"]},"body":{"type":["string","null"]},"cta_text":{"type":["string","null"]},"active_days":{"type":["number","null"]},"started_at":{"type":["string","null"]},"ad_library_url":{"type":["string","null"]},"duration":{"type":["number","null"]},"caption":{"type":["string","null"]},"cta_type":{"type":["string","null"]},"link_url":{"type":["string","null"]},"link_description":{"type":["string","null"]},"ended_at":{"type":["string","null"]},"first_seen_at":{"type":["string","null"]},"last_seen_at":{"type":["string","null"]},"variants":{"type":["number","null"]},"transcript":{"type":["string","null"]},"media_url":{"type":["string","null"],"description":"The ad's image or video"}},"required":["id","object","advertiser","advertiser_name","platform","format","status","title","body","cta_text","active_days","started_at","ad_library_url","duration","caption","cta_type","link_url","link_description","ended_at","first_seen_at","last_seen_at","variants","transcript","media_url"]},"Person":{"type":"object","properties":{"object":{"type":"string","enum":["person"]},"id":{"type":"string"},"email":{"type":["string","null"]},"organizations":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":["string","null"]},"current":{"type":"boolean","description":"The organization Sandstorm opens for this person"},"role":{"type":["string","null"]},"brand":{"type":["string","null"],"description":"The brand this person last worked on there"}},"required":["id","name","current","role","brand"]}}},"required":["object","id","email","organizations"]},"ApiKey":{"type":"object","properties":{"object":{"type":"string","enum":["api_key"]},"id":{"type":"string"},"name":{"type":"string"},"key":{"type":"string","description":"The key itself, shown this once"},"prefix":{"type":"string"},"organization":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":["string","null"]}},"required":["id","name"]},"brand":{"type":["object","null"],"properties":{"id":{"type":"string"},"name":{"type":["string","null"]}},"required":["id","name"]},"created_at":{"type":"string"}},"required":["object","id","name","key","prefix","organization","brand","created_at"]},"WebhookSecret":{"type":"object","properties":{"object":{"type":"string","enum":["webhook_secret"]},"secret":{"type":"string"}},"required":["object","secret"]}},"securitySchemes":{"ApiKey":{"type":"http","scheme":"bearer","description":"An sk_live_ key. Send `Sandstorm-Brand` with a brand id to act on another brand of the key's organization."},"SignIn":{"type":"http","scheme":"bearer","description":"A Sandstorm sign-in, which /login.mjs gets for you; only for making keys."}},"parameters":{}},"paths":{"/v1/models":{"get":{"tags":["Models"],"operationId":"listModels","summary":"List models","description":"Every model a generation can run, with its price and the JSON Schema of its input. It needs no key.","security":[],"parameters":[{"schema":{"type":"string","enum":["image","video","audio"],"description":"Only image, video or audio models"},"required":false,"description":"Only image, video or audio models","name":"type","in":"query"}],"responses":{"200":{"description":"The models","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModelList"}}}},"400":{"description":"The request is not valid; `error.param` names the part at fault","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No API key, or not a valid one","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"More than 300 requests a minute","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/models/{id}":{"get":{"tags":["Models"],"operationId":"getModel","summary":"Get a model","security":[],"parameters":[{"schema":{"type":"string","example":"nano-banana-pro/edit"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"The model","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Model"}}}},"400":{"description":"The request is not valid; `error.param` names the part at fault","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No API key, or not a valid one","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such thing","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"More than 300 requests a minute","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/generations":{"post":{"tags":["Generations"],"operationId":"createGeneration","summary":"Create a generation","description":"Queues a generation of one model. It answers at once with the queued generation, or, with `Prefer: wait`, holds the request until it finishes.","parameters":[{"schema":{"type":"string","description":"`wait=<seconds>`, up to 200, answers the finished generation if it finishes in time"},"required":false,"description":"`wait=<seconds>`, up to 200, answers the finished generation if it finishes in time","name":"prefer","in":"header"},{"schema":{"type":"string","minLength":1,"maxLength":255,"description":"Any unique string. Retrying with the same key answers the first generation instead of starting another."},"required":false,"description":"Any unique string. Retrying with the same key answers the first generation instead of starting another.","name":"idempotency-key","in":"header"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateGeneration"}}}},"responses":{"200":{"description":"It finished; `status` says how","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Generation"}}}},"202":{"description":"It is queued or running; poll it, wait on it or take the webhook","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Generation"}}}},"400":{"description":"The request is not valid; `error.param` names the part at fault","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No API key, or not a valid one","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Not enough credits","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key cannot use that brand","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The Idempotency-Key was used with a different request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"More than 300 requests a minute","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Sandstorm could not take the request; retry it","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"get":{"tags":["Generations"],"operationId":"listGenerations","summary":"List generations","description":"Your generations, newest first.","parameters":[{"schema":{"type":"integer","minimum":1,"maximum":100,"default":20,"description":"How many to list, from 1 to 100; 20 when left out"},"required":false,"description":"How many to list, from 1 to 100; 20 when left out","name":"limit","in":"query"},{"schema":{"type":"string","minLength":1,"description":"`next_cursor` from the previous page"},"required":false,"description":"`next_cursor` from the previous page","name":"cursor","in":"query"},{"schema":{"type":"string","enum":["queued","running","succeeded","failed","canceled"]},"required":false,"name":"status","in":"query"},{"schema":{"type":"string"},"required":false,"name":"model","in":"query"}],"responses":{"200":{"description":"The generations","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerationList"}}}},"400":{"description":"The request is not valid; `error.param` names the part at fault","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No API key, or not a valid one","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"More than 300 requests a minute","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/generations/{id}":{"get":{"tags":["Generations"],"operationId":"getGeneration","summary":"Get a generation","description":"With `Prefer: wait`, holds the request until the generation finishes or the wait is up.","parameters":[{"schema":{"type":"string","example":"gen_6c1f0e9a7b2d4c55a1e3f08b9d2c4e71"},"required":true,"name":"id","in":"path"},{"schema":{"type":"string","description":"`wait=<seconds>`, up to 200, answers the finished generation if it finishes in time"},"required":false,"description":"`wait=<seconds>`, up to 200, answers the finished generation if it finishes in time","name":"prefer","in":"header"}],"responses":{"200":{"description":"The generation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Generation"}}}},"400":{"description":"The request is not valid; `error.param` names the part at fault","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No API key, or not a valid one","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such thing","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"More than 300 requests a minute","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/generations/{id}/cancel":{"post":{"tags":["Generations"],"operationId":"cancelGeneration","summary":"Cancel a generation","description":"Stops a queued generation at no charge. One the model is already making is stopped where the model allows it; where it does not, it finishes and is charged.","parameters":[{"schema":{"type":"string","example":"gen_6c1f0e9a7b2d4c55a1e3f08b9d2c4e71"},"required":true,"name":"id","in":"path"}],"responses":{"202":{"description":"Cancelling","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Generation"}}}},"400":{"description":"The request is not valid; `error.param` names the part at fault","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No API key, or not a valid one","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such thing","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The request conflicts with the current state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"More than 300 requests a minute","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/assets":{"get":{"tags":["Library"],"operationId":"listAssets","summary":"List your library","description":"The brand's library, newest first: uploads, offer photos and anything liked.","parameters":[{"schema":{"type":"string","enum":["image","video","audio"]},"required":false,"name":"type","in":"query"},{"schema":{"type":"string","description":"Only photos of this offer, offer_…"},"required":false,"description":"Only photos of this offer, offer_…","name":"offer","in":"query"},{"schema":{"type":"string","enum":["true","false"],"description":"Only liked files"},"required":false,"description":"Only liked files","name":"liked","in":"query"},{"schema":{"type":"string","enum":["true","false"],"description":"Archived files instead of live ones"},"required":false,"description":"Archived files instead of live ones","name":"archived","in":"query"},{"schema":{"type":"integer","minimum":1,"maximum":50,"default":20,"description":"How many to list, from 1 to 50; 20 when left out"},"required":false,"description":"How many to list, from 1 to 50; 20 when left out","name":"limit","in":"query"},{"schema":{"type":"string","minLength":1,"description":"`next_cursor` from the previous page"},"required":false,"description":"`next_cursor` from the previous page","name":"cursor","in":"query"}],"responses":{"200":{"description":"The files","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LibraryAssetList"}}}},"400":{"description":"The request is not valid; `error.param` names the part at fault","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No API key, or not a valid one","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"More than 300 requests a minute","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"tags":["Library"],"operationId":"importAsset","summary":"Import a file","description":"Copies a public https file into your library, so later generations can take it by id.","parameters":[{"schema":{"type":"string","minLength":1,"maxLength":255},"required":false,"name":"idempotency-key","in":"header"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","description":"A public https link to a png, jpeg, webp, mp4, mov, mp3 or m4a file"},"name":{"type":"string","minLength":1,"maxLength":200,"description":"What the file is called in your library"}},"required":["url"]}}}},"responses":{"201":{"description":"Imported","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Asset"}}}},"400":{"description":"The request is not valid; `error.param` names the part at fault","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No API key, or not a valid one","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"More than 300 requests a minute","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Sandstorm could not take the request; retry it","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/assets/{id}":{"get":{"tags":["Library"],"operationId":"getAsset","summary":"Get an asset","parameters":[{"schema":{"type":"string","example":"asset_9c1e77aa"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"The asset","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Asset"}}}},"400":{"description":"The request is not valid; `error.param` names the part at fault","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No API key, or not a valid one","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such thing","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"More than 300 requests a minute","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/brand":{"get":{"tags":["Brand"],"operationId":"getBrand","summary":"Get the brand kit","description":"The brand's identity: voice, rules, colors, type, fonts and logos. `Sandstorm-Brand` picks another brand of the organization.","responses":{"200":{"description":"The brand kit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brand"}}}},"400":{"description":"The request is not valid; `error.param` names the part at fault","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No API key, or not a valid one","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such thing","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"More than 300 requests a minute","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/offers":{"get":{"tags":["Brand"],"operationId":"listOffers","summary":"List offers","description":"What the brand sells: products, services and bundles.","parameters":[{"schema":{"type":"string","minLength":1,"description":"Words to match"},"required":false,"description":"Words to match","name":"query","in":"query"},{"schema":{"type":"integer","minimum":1,"maximum":50,"default":20,"description":"How many to list, from 1 to 50; 20 when left out"},"required":false,"description":"How many to list, from 1 to 50; 20 when left out","name":"limit","in":"query"},{"schema":{"type":"string","pattern":"^\\d+$","description":"`next_cursor` from the previous page"},"required":false,"description":"`next_cursor` from the previous page","name":"cursor","in":"query"}],"responses":{"200":{"description":"The offers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OfferList"}}}},"400":{"description":"The request is not valid; `error.param` names the part at fault","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No API key, or not a valid one","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"More than 300 requests a minute","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/offers/{id}":{"get":{"tags":["Brand"],"operationId":"getOffer","summary":"Get an offer","description":"An offer with its variants and photos; the photos are asset ids that generations take.","parameters":[{"schema":{"type":"string","example":"offer_0f8e2b6a4c1d4e7f9a3b5c7d9e1f2a4b"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"The offer","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Offer"}}}},"400":{"description":"The request is not valid; `error.param` names the part at fault","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No API key, or not a valid one","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such thing","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"More than 300 requests a minute","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/characters":{"get":{"tags":["Brand"],"operationId":"listCharacters","summary":"List characters","description":"The people, products, places, voices and styles the brand keeps consistent across ads.","parameters":[{"schema":{"type":"string","minLength":1,"description":"Words in the name"},"required":false,"description":"Words in the name","name":"query","in":"query"},{"schema":{"type":"string","enum":["subject","product","place","voice","style"]},"required":false,"name":"kind","in":"query"},{"schema":{"type":"string","pattern":"^\\d+$","description":"`next_cursor` from the previous page"},"required":false,"description":"`next_cursor` from the previous page","name":"cursor","in":"query"}],"responses":{"200":{"description":"The characters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CharacterList"}}}},"400":{"description":"The request is not valid; `error.param` names the part at fault","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No API key, or not a valid one","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"More than 300 requests a minute","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/voices":{"get":{"tags":["Brand"],"operationId":"listVoices","summary":"Find voices","description":"Ready-made voices for voiceovers and voice changes.","parameters":[{"schema":{"type":"string","minLength":1,"description":"Words in the name or description"},"required":false,"description":"Words in the name or description","name":"query","in":"query"},{"schema":{"type":"string","enum":["male","female","neutral"]},"required":false,"name":"gender","in":"query"},{"schema":{"type":"string","enum":["young","middle_aged","old"]},"required":false,"name":"age","in":"query"},{"schema":{"type":"string","minLength":1,"description":"Such as american, british or australian"},"required":false,"description":"Such as american, british or australian","name":"accent","in":"query"},{"schema":{"type":"string","minLength":1,"description":"Such as advertisement, narrative_story or social_media"},"required":false,"description":"Such as advertisement, narrative_story or social_media","name":"use_case","in":"query"},{"schema":{"type":"integer","minimum":1,"maximum":20,"default":20,"description":"How many to list, from 1 to 20; 20 when left out"},"required":false,"description":"How many to list, from 1 to 20; 20 when left out","name":"limit","in":"query"}],"responses":{"200":{"description":"The voices","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VoiceList"}}}},"400":{"description":"The request is not valid; `error.param` names the part at fault","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No API key, or not a valid one","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"More than 300 requests a minute","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/advertisers":{"get":{"tags":["Competitors"],"operationId":"listAdvertisers","summary":"Find advertisers","description":"Brands whose ads Sandstorm tracks, by name.","parameters":[{"schema":{"type":"string","minLength":1,"description":"A brand name"},"required":true,"description":"A brand name","name":"query","in":"query"},{"schema":{"type":"integer","minimum":1,"maximum":20,"default":20,"description":"How many to list, from 1 to 20; 20 when left out"},"required":false,"description":"How many to list, from 1 to 20; 20 when left out","name":"limit","in":"query"}],"responses":{"200":{"description":"The advertisers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdvertiserList"}}}},"400":{"description":"The request is not valid; `error.param` names the part at fault","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No API key, or not a valid one","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"More than 300 requests a minute","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ads":{"get":{"tags":["Competitors"],"operationId":"listAds","summary":"Search ads","description":"Ads other brands run. Filters alone answer at once; `query` searches what the ads say and show.","parameters":[{"schema":{"type":"string","minLength":1,"description":"What the ads say or show; across every tracked brand unless `advertiser` narrows it"},"required":false,"description":"What the ads say or show; across every tracked brand unless `advertiser` narrows it","name":"query","in":"query"},{"schema":{"type":"string","description":"Only these advertisers, advertiser_…, several separated by commas"},"required":false,"description":"Only these advertisers, advertiser_…, several separated by commas","name":"advertiser","in":"query"},{"schema":{"type":"string","description":"Only these platforms: meta, linkedin, google, several separated by commas"},"required":false,"description":"Only these platforms: meta, linkedin, google, several separated by commas","name":"platform","in":"query"},{"schema":{"type":"string","description":"Only these formats: image, video, carousel, dco, several separated by commas"},"required":false,"description":"Only these formats: image, video, carousel, dco, several separated by commas","name":"format","in":"query"},{"schema":{"type":"string","enum":["active","inactive"]},"required":false,"name":"status","in":"query"},{"schema":{"type":["integer","null"],"minimum":0,"description":"Only ads that ran at least this many days"},"required":false,"description":"Only ads that ran at least this many days","name":"min_active_days","in":"query"},{"schema":{"type":"string","format":"date","description":"Only ads that started on or after this day, YYYY-MM-DD"},"required":false,"description":"Only ads that started on or after this day, YYYY-MM-DD","name":"started_after","in":"query"},{"schema":{"type":"string","format":"date","description":"Only ads that started before this day, YYYY-MM-DD"},"required":false,"description":"Only ads that started before this day, YYYY-MM-DD","name":"started_before","in":"query"},{"schema":{"type":"integer","minimum":1,"maximum":50,"default":20,"description":"How many to list, from 1 to 50; 20 when left out"},"required":false,"description":"How many to list, from 1 to 50; 20 when left out","name":"limit","in":"query"},{"schema":{"type":"string","pattern":"^\\d+$","description":"`next_cursor` from the previous page"},"required":false,"description":"`next_cursor` from the previous page","name":"cursor","in":"query"}],"responses":{"200":{"description":"The ads","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdList"}}}},"400":{"description":"The request is not valid; `error.param` names the part at fault","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No API key, or not a valid one","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"More than 300 requests a minute","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ads/{id}":{"get":{"tags":["Competitors"],"operationId":"getAd","summary":"Get an ad","description":"All of an ad: its copy, dates, transcript and media.","parameters":[{"schema":{"type":"string","example":"ad_5e1c9a3b"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"The ad","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ad"}}}},"400":{"description":"The request is not valid; `error.param` names the part at fault","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No API key, or not a valid one","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such thing","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"More than 300 requests a minute","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/me":{"get":{"tags":["Keys"],"operationId":"getMe","summary":"Get the signed-in person","description":"Who the Sandstorm sign-in belongs to, and their organizations. It takes a sign-in, not an API key.","security":[{"SignIn":[]}],"responses":{"200":{"description":"The person","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Person"}}}},"400":{"description":"The request is not valid; `error.param` names the part at fault","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No API key, or not a valid one","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"More than 300 requests a minute","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/keys":{"post":{"tags":["Keys"],"operationId":"createKey","summary":"Make an API key","description":"Makes a key for one of your organizations. It takes a sign-in, not an API key; /login.mjs does this for you.","security":[{"SignIn":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100,"description":"What the key is for"},"organization":{"type":"string","format":"uuid","description":"Which organization; needed when you belong to several"},"brand":{"type":"string","format":"uuid","description":"The brand the key works on; the one you last used when left out"}}}}}},"responses":{"201":{"description":"The key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKey"}}}},"400":{"description":"The request is not valid; `error.param` names the part at fault","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No API key, or not a valid one","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key cannot use that brand","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The request conflicts with the current state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"More than 300 requests a minute","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/webhooks/secret":{"get":{"tags":["Webhooks"],"operationId":"getWebhookSecret","summary":"Get your webhook secret","description":"Verify `Sandstorm-Signature` with it. It stays the same for as long as the key lives.","responses":{"200":{"description":"The secret","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookSecret"}}}},"400":{"description":"The request is not valid; `error.param` names the part at fault","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No API key, or not a valid one","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"More than 300 requests a minute","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}},"webhooks":{"generation":{"post":{"summary":"A generation finished","description":"Sent to a generation's `webhook_url` when it finishes, signed in `sandstorm-signature`. Answer 2xx; anything else is retried 5 times over about 7 hours.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerationEvent"}}}},"responses":{"200":{"description":"Received"}}}}}}