{"openapi":"3.1.0","info":{"title":"Scriptbeat API","version":"0.1.0","description":"A fully local video/podcast script structure and pacing toolkit: structure templates by content type, words-per-minute pacing math, a computed hook/body/CTA outline generator, podcast format guidance, and a script-formatting glossary.\n\nEvery operation is read-only or compute-only. The same tools are available over MCP (streamable HTTP) at https://scriptbeat.connectorbay.com/mcp.","contact":{"name":"Unify Dynamics LLC","email":"hr@unifydynamics.com","url":"https://connectorbay.com/scriptbeat/docs"},"termsOfService":"https://connectorbay.com/scriptbeat/terms"},"servers":[{"url":"https://scriptbeat.connectorbay.com"}],"externalDocs":{"url":"https://connectorbay.com/scriptbeat/docs"},"security":[{},{"bearer":[]}],"components":{"securitySchemes":{"bearer":{"type":"http","scheme":"bearer","description":"Optional. A Pro API key raises rate limits; no credentials are required."}},"schemas":{"Error":{"type":"object","properties":{"ok":{"const":false},"error":{"type":"object"}}}}},"paths":{"/v1/tools/structure_template":{"post":{"operationId":"structure_template","summary":"The ordered structural sections for a content type — tutorial, vlog, interview, narrative, explainer, or","description":"The ordered structural sections for a content type — tutorial, vlog, interview, narrative, explainer, or\n    review — each with its purpose and typical percentage of total runtime. Use for \"what's the structure of a\n    good tutorial video\", \"how should an interview episode be structured\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"content_type":{"description":"A content type.","examples":["tutorial"],"minLength":1,"title":"Content Type","type":"string"}},"required":["content_type"],"title":"structure_templateArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/content_type_list":{"post":{"operationId":"content_type_list","summary":"Every content type this reference has a structure template for. Use for \"what content types do you cover\".","description":"Every content type this reference has a structure template for. Use for \"what content types do you cover\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"content_type_listArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/pacing_guide":{"post":{"operationId":"pacing_guide","summary":"Words-per-minute pacing ranges and a pacing note for a content type, or all of them. Use for \"how fast","description":"Words-per-minute pacing ranges and a pacing note for a content type, or all of them. Use for \"how fast\n    should a vlog script be paced\", \"what wpm should a tutorial be\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"content_type":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"A content type; omit for all.","examples":["vlog"],"title":"Content Type"}},"title":"pacing_guideArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/word_count_for_duration":{"post":{"operationId":"word_count_for_duration","summary":"Computes the target word count for a given duration, using an explicit WPM, a content type's default WPM, or","description":"Computes the target word count for a given duration, using an explicit WPM, a content type's default WPM, or\n    a 150 wpm overall-average default. Use for \"how many words do I need for a 10 minute video\", \"word count for a\n    3 minute tutorial script\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"duration_seconds":{"description":"Target duration in seconds.","examples":[600],"exclusiveMinimum":0,"maximum":36000,"title":"Duration Seconds","type":"number"},"wpm":{"anyOf":[{"exclusiveMinimum":0,"maximum":500,"type":"number"},{"type":"null"}],"default":null,"description":"Explicit words-per-minute; overrides content_type's default.","title":"Wpm"},"content_type":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"A content type to use its default WPM, if wpm isn't given.","title":"Content Type"}},"required":["duration_seconds"],"title":"word_count_for_durationArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/duration_for_word_count":{"post":{"operationId":"duration_for_word_count","summary":"Computes the estimated spoken duration for a given word count, using an explicit WPM, a content type's","description":"Computes the estimated spoken duration for a given word count, using an explicit WPM, a content type's\n    default WPM, or a 150 wpm overall-average default. Use for \"how long will a 1500 word script take to read\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"word_count":{"description":"A script's word count.","examples":[1500],"exclusiveMinimum":0,"maximum":1000000,"title":"Word Count","type":"integer"},"wpm":{"anyOf":[{"exclusiveMinimum":0,"maximum":500,"type":"number"},{"type":"null"}],"default":null,"description":"Explicit words-per-minute; overrides content_type's default.","title":"Wpm"},"content_type":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"A content type to use its default WPM, if wpm isn't given.","title":"Content Type"}},"required":["word_count"],"title":"duration_for_word_countArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/hook_body_cta_outline":{"post":{"operationId":"hook_body_cta_outline","summary":"Computes a full time-boxed hook/body/CTA-style outline for a content type and target length: each","description":"Computes a full time-boxed hook/body/CTA-style outline for a content type and target length: each\n    structural section's seconds and target word count, using that content type's real proportions. Use for \"give\n    me a full outline for a 5 minute explainer about X\", \"outline a 10 minute tutorial video\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"content_type":{"description":"A content type.","examples":["explainer"],"minLength":1,"title":"Content Type","type":"string"},"target_length_seconds":{"description":"Target total length in seconds.","examples":[300],"exclusiveMinimum":0,"maximum":36000,"title":"Target Length Seconds","type":"number"},"topic":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"The topic, for context in the returned outline (not used in the math).","title":"Topic"},"wpm":{"anyOf":[{"exclusiveMinimum":0,"maximum":500,"type":"number"},{"type":"null"}],"default":null,"description":"Override the content type's default WPM.","title":"Wpm"}},"required":["content_type","target_length_seconds"],"title":"hook_body_cta_outlineArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/retention_pacing_tips":{"post":{"operationId":"retention_pacing_tips","summary":"General audience-retention pacing advice: hooks, pattern interrupts, cutting dead air, signposting","description":"General audience-retention pacing advice: hooks, pattern interrupts, cutting dead air, signposting\n    structure. Use for \"how do I keep viewers watching\", \"how do I improve retention in my videos\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"retention_pacing_tipsArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/podcast_format_info":{"post":{"operationId":"podcast_format_info","summary":"Structure and pacing notes for a podcast format: solo/monologue, interview, panel/roundtable, or narrative/","description":"Structure and pacing notes for a podcast format: solo/monologue, interview, panel/roundtable, or narrative/\n    serial. Use for \"how should a solo podcast be structured\", \"what's different about panel podcast pacing\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"format":{"description":"A podcast format.","examples":["interview"],"minLength":1,"title":"Format","type":"string"}},"required":["format"],"title":"podcast_format_infoArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/podcast_format_list":{"post":{"operationId":"podcast_format_list","summary":"Every podcast format this reference covers. Use for \"what podcast formats do you cover\".","description":"Every podcast format this reference covers. Use for \"what podcast formats do you cover\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"podcast_format_listArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/scriptbeat_glossary":{"post":{"operationId":"scriptbeat_glossary","summary":"Definitions of script-formatting terms: cold open, A-roll, B-roll, lower third, cutaway, VO, SFX cue, beat,","description":"Definitions of script-formatting terms: cold open, A-roll, B-roll, lower third, cutaway, VO, SFX cue, beat,\n    run-time, teaser, CTA, show notes. Use for \"what's a cold open\", \"what does VO mean\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"term":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"A specific term to look up; omit to list all.","title":"Term"}},"title":"scriptbeat_glossaryArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}}}}