[{"id":"article_video","name":"Article to Video","description":"Turn an article, blog post or newsletter (URL or pasted text) into a narrated 9:16 short with word-synced captions over a looping background.","inputSchema":{"type":"object","properties":{"source":{"oneOf":[{"type":"object","properties":{"kind":{"type":"string","const":"url"},"url":{"type":"string","format":"uri","description":"Public article, blog or newsletter URL."}},"required":["kind","url"]},{"type":"object","properties":{"kind":{"type":"string","const":"text"},"text":{"type":"string","minLength":1,"maxLength":60000,"description":"Pasted article text. The script step needs 90 to 4000 words."}},"required":["kind","text"]}],"description":"Where the article comes from: a URL we fetch, or the text itself."},"length":{"default":"standard","description":"short ~30s, standard ~60s, deep ~90s.","type":"string","enum":["short","standard","deep"]},"tone":{"default":"explainer","type":"string","enum":["explainer","punchy","authority"]},"voiceId":{"default":"onwK4e9ZLuTAKqWW03F9","description":"Narrator voice. See GET /v1/options voices tagged article_video.","type":"string","enum":["onwK4e9ZLuTAKqWW03F9","JBFqnCBsd6RMkjVDRZzb","EXAVITQu4vr4xnSDxMaL","pNInz6obpgDQGcFmaJgB","LcfcDJNUP1GQjkzn1xUU","TxGEqnHWrfWFTfGW9XjX"]},"captionPresetId":{"description":"Caption style. See GET /v1/options captionPresets.","type":"string","enum":["hormozi","beast","ali","iman","devin","matt","kendrick","laura","doug","carlos","nick","fire","neon","william","leon","luke","classicWhite"]},"silent":{"default":false,"description":"Render with no narration. Refused unless explicitly true.","type":"boolean"}},"required":["source"],"additionalProperties":false,"description":"Plain-text guide for agents: https://api.ghostshorts.com/v1/templates/article_video.txt"},"defaults":{"length":"standard","tone":"explainer","voiceId":"onwK4e9ZLuTAKqWW03F9","silent":false,"aspectRatio":"9:16"},"freeTools":["script"],"paidSteps":[{"step":"narration","credits":"1 credit per minute of narration (legacy plans); included on current plans within fair use"},{"step":"render","credits":"1 video from the monthly allowance (current plans); export counter on legacy plans"}],"notes":["The script is condensed from the source and must stay faithful to it: every figure, quote and named person in the script must appear in the source.","Source text must be 90 to 4000 words after extraction.","Background footage is chosen server-side."]},{"id":"quiz_video","name":"AI Quiz Video","description":"A multiple-choice quiz short: question card, countdown, answer reveal with a fact line, narrated, over a looping background.","inputSchema":{"type":"object","properties":{"topic":{"type":"string","minLength":2,"maxLength":200,"description":"What the quiz is about, e.g. \"the Roman Empire\"."},"difficulty":{"default":"medium","type":"string","enum":["easy","medium","hard"]},"questionCount":{"default":5,"anyOf":[{"type":"number","const":5},{"type":"number","const":7},{"type":"number","const":10}]},"categoryId":{"description":"Optional steer for the generator.","type":"string","enum":["general-knowledge","geography","history","science","movies-tv","music","sports","food-drink","video-games","logos-brands"]},"videoTitle":{"description":"Title on the intro card.","type":"string","minLength":1,"maxLength":48},"voiceId":{"default":"LcfcDJNUP1GQjkzn1xUU","description":"Narrator voice. See GET /v1/options voices tagged quiz_video.","type":"string","enum":["LcfcDJNUP1GQjkzn1xUU","EXAVITQu4vr4xnSDxMaL","pNInz6obpgDQGcFmaJgB","TxGEqnHWrfWFTfGW9XjX","JBFqnCBsd6RMkjVDRZzb","onwK4e9ZLuTAKqWW03F9"]},"theme":{"default":"neon","type":"string","enum":["neon","sunset","classic"]},"font":{"default":"anton","type":"string","enum":["anton","bangers","bebas-neue","poppins"]},"countdownSeconds":{"default":5,"anyOf":[{"type":"number","const":3},{"type":"number","const":5},{"type":"number","const":7}]},"captionsEnabled":{"default":false,"type":"boolean"},"silent":{"default":false,"description":"Render with no narration. Refused unless explicitly true.","type":"boolean"}},"required":["topic"],"additionalProperties":false,"description":"Plain-text guide for agents: https://api.ghostshorts.com/v1/templates/quiz_video.txt"},"defaults":{"difficulty":"medium","questionCount":5,"voiceId":"LcfcDJNUP1GQjkzn1xUU","theme":"neon","font":"anton","countdownSeconds":5,"captionsEnabled":false,"silent":false,"aspectRatio":"9:16"},"freeTools":["script"],"paidSteps":[{"step":"narration","credits":"1 credit per minute of narration across the whole pack (legacy plans); included on current plans within fair use"},{"step":"render","credits":"1 video from the monthly allowance (current plans); export counter on legacy plans"}],"notes":["Get the pack free first with POST /v1/scripts (template quiz_video), check the answers, then pass its projectId to POST /v1/videos.","Questions are AI-generated. Check answers before publishing, especially dates and award years.","Topics that target a group of people are refused."]},{"id":"reddit_story","name":"Reddit Story","description":"Your own Reddit-style story (title plus 800 to 5000 characters of text, written by you: nothing is generated for it), narrated by an AI voice with word-synced captions over gameplay footage, with a Reddit title card. Narration is mandatory: there is no silent option. Free first: POST /v1/previews returns a ~10 second narration teaser for 0 credits.","inputSchema":{"type":"object","properties":{"title":{"type":"string","minLength":1,"maxLength":200,"description":"Post title, narrated first and shown on the title card."},"text":{"type":"string","minLength":800,"maxLength":5000,"description":"The story body, 800 to 5000 characters."},"author":{"default":"Anonymous","type":"string","maxLength":32},"voiceId":{"default":"pNInz6obpgDQGcFmaJgB","description":"Narrator voice. See GET /v1/options voices tagged reddit_story.","type":"string","enum":["pNInz6obpgDQGcFmaJgB","2EiwWnXFnvU5JabPnv8n","CwhRBWXzGAHq8TQ4Fs17","EXAVITQu4vr4xnSDxMaL","FGY2WhTYpPnrIDTdsKH5","IKne3meq5aSn9XLyUdCD","JBFqnCBsd6RMkjVDRZzb","N2lVS1w4EtoT3dr4eOWO","SAz9YHcvj6GT2YYXdXww","SOYHLrjzK2X1ezoPC6cr","TX3LPaxmHKxFdv7VOQHJ","Xb7hH8MSUJpSbSDYk0k2","XrExE9yKIg1WjnnlVkGX","bIHbv24MWmeRgasZH58o","cgSgspJ2msm6clMCkdW9","cjVigY5qzO86Huf0OWal","iP95p4xoKVk53GoZ742B","nPczCjzI2devNBz1zQrb","onwK4e9ZLuTAKqWW03F9","pFZP5JQG7iQjIQuC4Bku","pqHfZKP75CvOlQylNhV4","vERmHY5ZzBsIRPzH78Rb","papd083UqIoSWdSkh3fG","zAr1POVZUrr1zkX0T94t","EIdfNdxb4fnsE39tEAB1","5Spsi3mCH9e7futpnGE5","G1QUjBCuRBbLbAmYlTgl","6wsXez7Nsh9HQSbtqwIK","SfXg52J54dixBlOl016v","Yf6I1OzNemrgGRsc8z1I","z0gdR3nhVl1Ig2kiEigL","wAWUBOIVEUw9IEUYoNzR","6XNSYkDqZ1blajSVtPok","LNzr3u01PIEDg0fRlvE7","GxxMAMfQkDlnqjpzjLHH","RBnMinrYKeccY3vaUxlZ","sZXOZNdVMeHi5J0uiQF7","8ng6vvUHRpznlJL92xmU","x5tvfc5X0Qh4cqmLpgrs","20ptB7Wn4Q2sMkAxK1qK","JaUVfDrFcfwGIsv8X2kN","iWydkXKoiVtvdn4vLKp9","HnnPtoATgzx4ubChwm24","C1DBnkwmDIzoLOPlBvSg","hIssydxXZ1WuDorjx6Ic","NacdHGUYR1k3M0FAbAia","87QJokeqzysrKtZFt7jl"]},"language":{"default":"en","description":"Narration language (ISO 639-1).","type":"string","minLength":2,"maxLength":5},"backgroundVideoAssetId":{"description":"A background video id from GET /v1/options backgrounds.assets. Mutually exclusive with backgroundCategory.","type":"string","minLength":1},"backgroundCategory":{"description":"Pick any background from this category. Mutually exclusive with backgroundVideoAssetId.","type":"string","enum":["Minecraft","Mario Kart","GTA V","Subway Surfers","Satisfying","Backrooms","Roblox"]},"backgroundVideoUrl":{"description":"Your own footage by public https URL. Video is converted for rendering (H.264 baseline, 1080x1920, cropped to fill, silent); files up to 300 MB / 10 min. Mutually exclusive with backgroundVideoAssetId and backgroundCategory.","type":"string","minLength":1,"maxLength":2048},"backgroundAudioAssetId":{"description":"Background music id from GET /v1/options music.","type":"string","minLength":1},"backgroundAudioUrl":{"description":"Your own track by public https URL. Converted to MP3 for rendering; files up to 30 MB / 10 min. Mutually exclusive with backgroundAudioAssetId.","type":"string","minLength":1,"maxLength":2048},"backgroundAudioVolume":{"default":30,"type":"integer","minimum":0,"maximum":100},"captionPresetId":{"default":"hormozi","type":"string","enum":["hormozi","beast","ali","iman","devin","matt","kendrick","laura","doug","carlos","nick","fire","neon","william","leon","luke","classicWhite"]},"captionPosition":{"default":"middle","type":"string","enum":["top","middle","bottom"]},"captionsEnabled":{"default":true,"type":"boolean"},"titleCardTheme":{"default":"dark","type":"string","enum":["dark","light"]},"voiceSpeed":{"default":1,"type":"number","minimum":0.85,"maximum":1.25},"stability":{"default":50,"type":"number","minimum":0,"maximum":100},"similarity":{"default":75,"type":"number","minimum":0,"maximum":100},"pitch":{"default":1,"type":"number","minimum":0.5,"maximum":2}},"required":["title","text"],"additionalProperties":false,"description":"Plain-text guide for agents: https://api.ghostshorts.com/v1/templates/reddit_story.txt"},"defaults":{"author":"Anonymous","voiceId":"pNInz6obpgDQGcFmaJgB","language":"en","backgroundVideoAssetId":"92992e79fd7bc6f5","backgroundCategory":"Subway Surfers","backgroundAudioVolume":30,"captionPresetId":"hormozi","captionPosition":"middle","captionsEnabled":true,"titleCardTheme":"dark","voiceSpeed":1,"stability":50,"similarity":75,"pitch":1,"aspectRatio":"9:16"},"freeTools":["preview"],"paidSteps":[{"step":"narration","credits":"1 credit per minute of narration, estimated at 15 characters per second (legacy plans); included on current plans within fair use"},{"step":"render","credits":"1 video from the monthly allowance (current plans); export counter on legacy plans"}],"notes":["The story text is yours; nothing is generated for it.","With no background field set, the Subway Surfers default background is used.","Own media by URL is fetched before anything is charged. The same URL is reused for 30 days without re-fetching; up to 20 new URLs per day. Failures: MEDIA_FETCH_FAILED, MEDIA_INVALID, MEDIA_TOO_LONG, MEDIA_QUOTA_EXCEEDED.","Narration always runs on POST /v1/videos, even for a projectId from POST /v1/previews: the teaser is never reused as the narration."]},{"id":"fake_text_message","name":"Text Messages","description":"Your own chat conversation (written by you: nothing is generated for it) rendered as an iMessage, WhatsApp, Instagram or Tinder chat over gameplay footage, with each message voiced by an AI voice for \"me\" and one for \"them\". Returns one MP4; pass cutAfterMessage to get the exact millisecond where the next message appears, for splicing.","inputSchema":{"type":"object","properties":{"platform":{"default":"imessage","description":"Chat skin. \"ios\" is accepted as an alias of \"imessage\".","type":"string","enum":["imessage","whatsapp","instagram","tinder","ios"]},"theme":{"default":"dark","description":"Light or dark chat skin.","type":"string","enum":["dark","light"]},"contact":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":40,"description":"The contact shown in the chat header."},"avatarAssetId":{"description":"An image asset you own (or a system image) for the contact avatar.","type":"string","minLength":1}},"required":["name"],"additionalProperties":false},"messages":{"minItems":1,"maxItems":80,"type":"array","items":{"type":"object","properties":{"sender":{"type":"string","enum":["me","them"],"description":"\"me\" is the phone owner (right-hand bubbles); \"them\" is the contact."},"text":{"description":"The message text. Send text or imageAssetId, not both.","type":"string","minLength":1,"maxLength":500},"imageAssetId":{"description":"An image asset you own (or a system image) shown as a photo message, held 3 seconds.","type":"string","minLength":1},"delayMs":{"description":"Gap in milliseconds before this message appears. Defaults to the pacing preset.","type":"integer","minimum":0,"maximum":10000},"timestampLabel":{"description":"Timestamp row shown above this message, e.g. \"Today 8:12 PM\".","type":"string","minLength":1,"maxLength":40},"gapLabel":{"description":"A time-gap row shown before this message, e.g. \"4 days later\". Fixed at voice-generation time (900 ms).","type":"string","minLength":1,"maxLength":40},"receipt":{"description":"Receipt label under this message, free text, e.g. \"Read 8:14 PM\" or \"Delivered\".","type":"string","minLength":1,"maxLength":30},"typingIndicatorBefore":{"description":"Show a typing bubble before this message (at least 800 ms; fixed at voice-generation time).","type":"boolean"}},"required":["sender"],"additionalProperties":false},"description":"The conversation, in order."},"pacing":{"default":"normal","description":"Default gap for messages without delayMs: fast 0 ms, normal 0 ms, slow 1000 ms.","type":"string","enum":["fast","normal","slow"]},"voices":{"default":{"enabled":true,"me":"pNInz6obpgDQGcFmaJgB","them":"EXAVITQu4vr4xnSDxMaL"},"type":"object","properties":{"enabled":{"default":true,"description":"Must be true: every Text Messages video is voiced (the bubble timing comes from the voice clips).","type":"boolean"},"me":{"default":"pNInz6obpgDQGcFmaJgB","description":"Voice for \"me\". See GET /v1/options voices tagged fake_text_message.","type":"string","enum":["pNInz6obpgDQGcFmaJgB","2EiwWnXFnvU5JabPnv8n","CwhRBWXzGAHq8TQ4Fs17","EXAVITQu4vr4xnSDxMaL","FGY2WhTYpPnrIDTdsKH5","IKne3meq5aSn9XLyUdCD","JBFqnCBsd6RMkjVDRZzb","N2lVS1w4EtoT3dr4eOWO","SAz9YHcvj6GT2YYXdXww","SOYHLrjzK2X1ezoPC6cr","TX3LPaxmHKxFdv7VOQHJ","Xb7hH8MSUJpSbSDYk0k2","XrExE9yKIg1WjnnlVkGX","bIHbv24MWmeRgasZH58o","cgSgspJ2msm6clMCkdW9","cjVigY5qzO86Huf0OWal","iP95p4xoKVk53GoZ742B","nPczCjzI2devNBz1zQrb","onwK4e9ZLuTAKqWW03F9","pFZP5JQG7iQjIQuC4Bku","pqHfZKP75CvOlQylNhV4","vERmHY5ZzBsIRPzH78Rb","papd083UqIoSWdSkh3fG","zAr1POVZUrr1zkX0T94t","EIdfNdxb4fnsE39tEAB1","5Spsi3mCH9e7futpnGE5","G1QUjBCuRBbLbAmYlTgl","6wsXez7Nsh9HQSbtqwIK","SfXg52J54dixBlOl016v","Yf6I1OzNemrgGRsc8z1I","z0gdR3nhVl1Ig2kiEigL","wAWUBOIVEUw9IEUYoNzR","6XNSYkDqZ1blajSVtPok","LNzr3u01PIEDg0fRlvE7","GxxMAMfQkDlnqjpzjLHH","RBnMinrYKeccY3vaUxlZ","sZXOZNdVMeHi5J0uiQF7","8ng6vvUHRpznlJL92xmU","x5tvfc5X0Qh4cqmLpgrs","20ptB7Wn4Q2sMkAxK1qK","JaUVfDrFcfwGIsv8X2kN","iWydkXKoiVtvdn4vLKp9","HnnPtoATgzx4ubChwm24","C1DBnkwmDIzoLOPlBvSg","hIssydxXZ1WuDorjx6Ic","NacdHGUYR1k3M0FAbAia","87QJokeqzysrKtZFt7jl"]},"them":{"default":"EXAVITQu4vr4xnSDxMaL","description":"Voice for \"them\".","type":"string","enum":["pNInz6obpgDQGcFmaJgB","2EiwWnXFnvU5JabPnv8n","CwhRBWXzGAHq8TQ4Fs17","EXAVITQu4vr4xnSDxMaL","FGY2WhTYpPnrIDTdsKH5","IKne3meq5aSn9XLyUdCD","JBFqnCBsd6RMkjVDRZzb","N2lVS1w4EtoT3dr4eOWO","SAz9YHcvj6GT2YYXdXww","SOYHLrjzK2X1ezoPC6cr","TX3LPaxmHKxFdv7VOQHJ","Xb7hH8MSUJpSbSDYk0k2","XrExE9yKIg1WjnnlVkGX","bIHbv24MWmeRgasZH58o","cgSgspJ2msm6clMCkdW9","cjVigY5qzO86Huf0OWal","iP95p4xoKVk53GoZ742B","nPczCjzI2devNBz1zQrb","onwK4e9ZLuTAKqWW03F9","pFZP5JQG7iQjIQuC4Bku","pqHfZKP75CvOlQylNhV4","vERmHY5ZzBsIRPzH78Rb","papd083UqIoSWdSkh3fG","zAr1POVZUrr1zkX0T94t","EIdfNdxb4fnsE39tEAB1","5Spsi3mCH9e7futpnGE5","G1QUjBCuRBbLbAmYlTgl","6wsXez7Nsh9HQSbtqwIK","SfXg52J54dixBlOl016v","Yf6I1OzNemrgGRsc8z1I","z0gdR3nhVl1Ig2kiEigL","wAWUBOIVEUw9IEUYoNzR","6XNSYkDqZ1blajSVtPok","LNzr3u01PIEDg0fRlvE7","GxxMAMfQkDlnqjpzjLHH","RBnMinrYKeccY3vaUxlZ","sZXOZNdVMeHi5J0uiQF7","8ng6vvUHRpznlJL92xmU","x5tvfc5X0Qh4cqmLpgrs","20ptB7Wn4Q2sMkAxK1qK","JaUVfDrFcfwGIsv8X2kN","iWydkXKoiVtvdn4vLKp9","HnnPtoATgzx4ubChwm24","C1DBnkwmDIzoLOPlBvSg","hIssydxXZ1WuDorjx6Ic","NacdHGUYR1k3M0FAbAia","87QJokeqzysrKtZFt7jl"]}},"additionalProperties":false},"background":{"default":{},"type":"object","properties":{"category":{"description":"Pick any background from this category (GET /v1/options backgrounds.categories).","type":"string","enum":["Minecraft","Mario Kart","GTA V","Subway Surfers","Satisfying","Backrooms","Roblox"]},"assetId":{"description":"A background video id from GET /v1/options backgrounds.assets, or your own upload.","type":"string","minLength":1},"ownUrl":{"description":"Your own footage by public https URL. Video is converted for rendering (H.264 baseline, 1080x1920, cropped to fill, silent); files up to 300 MB / 10 min.","type":"string","minLength":1,"maxLength":2048}},"additionalProperties":false},"music":{"default":{},"type":"object","properties":{"assetId":{"description":"Background music id from GET /v1/options music. Omit for none.","type":"string","minLength":1},"ownUrl":{"description":"Your own track by public https URL. Converted to MP3 for rendering; files up to 30 MB / 10 min.","type":"string","minLength":1,"maxLength":2048},"volume":{"description":"0-100. Default 30.","type":"integer","minimum":0,"maximum":100}},"additionalProperties":false},"captions":{"description":"Text captions pinned to messages, up to 20.","maxItems":20,"type":"array","items":{"type":"object","properties":{"afterMessage":{"type":"integer","minimum":1,"maximum":9007199254740991,"description":"1-based number of the message this caption follows (at most the number of messages)."},"text":{"type":"string","minLength":1,"maxLength":120,"description":"Caption text."},"delayMs":{"default":0,"description":"Milliseconds after that message appears. Default 0.","type":"integer","minimum":0,"maximum":10000},"position":{"default":"below_card","description":"Default below_card.","type":"string","enum":["below_card","above_card"]}},"required":["afterMessage","text"],"additionalProperties":false}},"hookText":{"description":"Hook shown before the conversation.","type":"object","properties":{"text":{"type":"string","minLength":1,"maxLength":120,"description":"The hook line."},"seconds":{"default":2,"description":"How long the hook holds before the chat starts. Default 2.","type":"number","minimum":0.5,"maximum":10}},"required":["text"],"additionalProperties":false},"endCard":{"description":"End card shown after the last message.","type":"object","properties":{"line1":{"type":"string","minLength":1,"maxLength":80},"line2":{"type":"string","minLength":1,"maxLength":80},"seconds":{"default":2.5,"description":"How long the end card holds. Default 2.5.","type":"number","minimum":0.5,"maximum":10}},"required":["line1"],"additionalProperties":false},"sfx":{"description":"Message sounds, each default false. Honoured, but silent until the sound library is uploaded.","type":"object","properties":{"send":{"default":false,"type":"boolean"},"receive":{"default":false,"type":"boolean"},"typing":{"default":false,"type":"boolean"}},"additionalProperties":false},"layout":{"description":"Chat card layout.","type":"object","properties":{"style":{"default":"card_over_background","description":"The chat card over the background video.","type":"string","enum":["card_over_background"]},"cardWidthPct":{"default":80,"description":"Card width as a percentage of the frame. Default 80.","type":"integer","minimum":40,"maximum":100},"cardHeight":{"default":"fit","description":"fit (default): the card grows with the conversation. full: fixed-height card, the wizard's legacy look.","type":"string","enum":["full","fit"]}},"additionalProperties":false},"cutAfterMessage":{"description":"1-based message number. The video reports cutAtMs: where message N+1 appears (or the end of the video when N is the last message), so you can split the MP4 there.","type":"integer","minimum":1,"maximum":80}},"required":["contact","messages"],"additionalProperties":false,"description":"Plain-text guide for agents: https://api.ghostshorts.com/v1/templates/fake_text_message.txt"},"defaults":{"platform":"imessage","theme":"dark","pacing":"normal","voices":{"enabled":true,"me":"pNInz6obpgDQGcFmaJgB","them":"EXAVITQu4vr4xnSDxMaL"},"background":{"assetId":"92992e79fd7bc6f5","category":"Subway Surfers"},"aspectRatio":"9:16"},"freeTools":[],"paidSteps":[{"step":"voices","credits":"1 credit per minute of voiced text, estimated at 15 characters per second (legacy plans); included on current plans within fair use"},{"step":"render","credits":"1 video from the monthly allowance (current plans); export counter on legacy plans"}],"notes":["The conversation is yours; nothing is generated for it.","Each message stays on screen for the length of its voice clip; delayMs (or pacing) adds a gap before it.","With no background fields, the Subway Surfers default background is used.","Own media by URL is fetched before anything is charged. The same URL is reused for 30 days without re-fetching; up to 20 new URLs per day. Failures: MEDIA_FETCH_FAILED, MEDIA_INVALID, MEDIA_TOO_LONG, MEDIA_QUOTA_EXCEEDED.","Gap rows and typing bubbles are timed into the narration when voices are generated, so they are fixed for the video.","sfx toggles are honoured but play nothing until the sound library is uploaded.","hookText, endCard, captions, sfx and layout are objects; hookText is { text, seconds? }, not a bare string.","cutAtMs on the video is null until the render is queued, and null when cutAfterMessage was not sent."]}]