{"openapi":"3.0.0","paths":{"/videos/url":{"post":{"operationId":"uploadVideoByUrl","summary":"Upload a video by URL","description":"Upload a video by URL. Mimetypes allowed: `video/mp4`, `video/quicktime`","tags":["videos"],"parameters":[{"name":"ttl","required":false,"in":"query","schema":{"enum":["1d","7d","30d"],"type":"string"}}],"requestBody":{"required":true,"description":"URL of the video to upload. Mimetypes allowed: `video/mp4`, `video/quicktime`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VideoUploadByUrlRequestDto"}}}},"responses":{"201":{"description":"Endpoint for uploading a video using a URL. You can use the generated `id` in the `POST /api/videos/{id}/task` endpoint to create a task","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateVideoResponseDto"}}}}},"security":[{"API_KEY":[]}]}},"/videos":{"post":{"operationId":"uploadVideo","summary":"Upload a video","description":"Upload a video via multipart/form-data. Mimetypes allowed: `video/mp4`, `video/quicktime`.","tags":["videos"],"parameters":[{"name":"ttl","required":false,"in":"query","schema":{"enum":["1d","7d","30d"],"type":"string"}}],"requestBody":{"required":true,"description":"Video to upload. Mimetypes allowed: `video/mp4`, `video/quicktime`","content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/VideoUploadRequestDto"}}}},"responses":{"201":{"description":"Endpoint for uploading a video. You can use the generated `id` in the `POST /api/videos/{id}/task` endpoint to create a task","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateVideoResponseDto"}}}}},"security":[{"API_KEY":[]}]},"get":{"operationId":"listVideos","summary":"Get list of all videos","description":"Get a paginated list of videos with metadata and associated task IDs.","tags":["videos"],"parameters":[],"requestBody":{"required":true,"description":"List all videos","content":{"application/json":{"schema":{"type":"string"}}}},"responses":{"200":{"description":"Endpoint for getting a list of all videos and associated task ids"}},"security":[{"API_KEY":[]}]}},"/videos/upload":{"post":{"operationId":"createUpload","summary":"Initiate multipart video upload","description":"Start a multipart upload session. Each chunk must be >= 5MB except the last one.","tags":["videos"],"parameters":[{"name":"ttl","required":false,"in":"query","schema":{"enum":["1d","7d","30d"],"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateVideoUploadRequestDto"}}}},"responses":{"201":{"description":"Used for initiating a multipart upload. Each chunk must be >= 5mb except the last chunk.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateVideoUploadResponseDto"}}}}},"security":[{"API_KEY":[]}]}},"/videos/upload/complete":{"post":{"operationId":"completeUpload","summary":"Complete multipart video upload","description":"Complete a multipart upload session and create a video from the uploaded parts.","tags":["videos"],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompleteVideoUploadRequestDto"}}}},"responses":{"201":{"description":"Used for completing an upload session."}},"security":[{"API_KEY":[]}]}},"/videos/{videoId}/task":{"post":{"operationId":"createTask","summary":"Create a video processing task","description":"Create a processing task for a video. The task runs asynchronously and can be polled via the task status endpoint. Webhooks are also supported for video tasks.","tags":["videos"],"parameters":[{"name":"videoId","required":true,"in":"path","schema":{"type":"string"}},{"name":"ttl","required":false,"in":"query","schema":{"enum":["1d","7d","30d"],"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateVideoTaskRequestDto"}}}},"responses":{"201":{"description":"Create a task for a video. This task will be processed asynchronously You can use the `GET /api/videos/:videoId/task/:id` endpoint to poll for the status.\nVideo id in request parameter is from the response of `POST /api/videos`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateVideoTaskResponseDto"}}}}},"security":[{"API_KEY":[]}]}},"/videos/{videoId}/task/{id}":{"get":{"operationId":"getVideoTask","summary":"Get video task status and results","description":"Get the status and results of a video task, including transcript, download URL, and error details if failed.","tags":["videos"],"parameters":[{"name":"videoId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Get the status of a video task initiated by `POST /api/videos/:videoId/task`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetVideoTaskResponseDto"}}}}},"security":[{"API_KEY":[]}]}},"/videos/{videoId}/task/{id}/approve-transcript":{"post":{"operationId":"approveTranscript","summary":"Approve video task transcript","description":"Approve the transcript for the specified task. Returns no content when successful.","tags":["videos"],"parameters":[{"name":"videoId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"204":{"description":"Approves the transcription for a specific video task.\nThis action marks the transcription as reviewed and accepted,\nallowing the task to proceed to the next processing stage.\nA successful operation returns no content, indicating the approval has been\nrecorded, and the task is now queued for further processing according to its workflow."}},"security":[{"API_KEY":[]}]}},"/videos/{videoId}/task/{id}/transcript":{"get":{"operationId":"getTranscript","summary":"Get video task transcript","description":"Get the transcript for a task as an array of word entries.","tags":["videos"],"parameters":[{"name":"videoId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Download the transcript","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WordEntryDto"}}}}}},"security":[{"API_KEY":[]}]},"put":{"operationId":"updateTranscript","summary":"Update video task transcript","description":"Update the transcript word entries for a task and return the updated transcript.","tags":["videos"],"parameters":[{"name":"videoId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"description":"Array of updated word entries","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/UpdateWordEntryDto"}}}}},"responses":{"200":{"description":"Update the transcript","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WordEntryDto"}}}}}},"security":[{"API_KEY":[]}]}},"/videos/{videoId}/clipTask/{id}":{"get":{"operationId":"getVideoClipTask","summary":"Get video clip task status and results","description":"Get the status and results (clips) of a video clip task.","tags":["videos"],"parameters":[{"name":"videoId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Get the status of a video clip task initiated by `POST /api/videos/:videoId/clipTask`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetVideoClipTaskResponseDto"}}}}},"security":[{"API_KEY":[]}]}},"/videos/{videoId}/clipTask":{"post":{"operationId":"createClipTask","summary":"Create a video clip task","description":"Create a clip generation task for a video. The task runs asynchronously and can be polled via the clip task status endpoint.","tags":["videos"],"parameters":[{"name":"videoId","required":true,"in":"path","schema":{"type":"string"}},{"name":"ttl","required":false,"in":"query","schema":{"enum":["1d","7d","30d"],"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateVideoClipTaskRequestDto"}}}},"responses":{"201":{"description":"Create a clip task for a video. This task will be processed asynchronously You can use the `GET /api/videos/:videoId/clipTask/:id` endpoint to poll for the status.\nVideo id in request parameter is from the response of `POST /api/videos`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateVideoTaskResponseDto"}}}}},"security":[{"API_KEY":[]}]}},"/fonts":{"post":{"operationId":"uploadFont","summary":"Upload a font file","description":"Upload a custom font for use in video rendering. Supported formats: .ttf, .otf, .woff, .woff2. Max size 50MB.","tags":["fonts"],"parameters":[],"requestBody":{"required":true,"description":"Font file to upload. Supported formats: .ttf, .otf, .woff, .woff2","content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/FontUploadRequestDto"}}}},"responses":{"201":{"description":"Font uploaded successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateFontResponseDto"}}}},"400":{"description":"Invalid file format or subscription limit exceeded"},"413":{"description":"Font file too large (max 50MB)"}},"security":[{"API_KEY":[]}]},"get":{"operationId":"listFonts","summary":"Get list of user fonts","description":"Retrieve a paginated list of fonts uploaded by the authenticated user.","tags":["fonts"],"parameters":[],"responses":{"200":{"description":"List of fonts retrieved successfully"}},"security":[{"API_KEY":[]}]}},"/fonts/{id}":{"get":{"operationId":"getFont","summary":"Get font details","description":"Get details for a specific font uploaded by the user, including metadata needed for rendering.","tags":["fonts"],"parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Font details retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetFontResponseDto"}}}},"404":{"description":"Font not found"}},"security":[{"API_KEY":[]}]},"delete":{"operationId":"deleteFont","summary":"Delete a font","description":"Delete a font previously uploaded by the authenticated user.","tags":["fonts"],"parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"204":{"description":"Font deleted successfully"},"404":{"description":"Font not found"}},"security":[{"API_KEY":[]}]}},"/templates":{"get":{"operationId":"getTemplates","summary":"Get list of all templates","description":"Retrieve the list of available templates including id, name, allowlisted categories, and preview URLs. Use the selected template id in the Create Task endpoint.","tags":["templates"],"parameters":[],"responses":{"200":{"description":"1. Choose the template `id` from the response you wish to add to your video.\n2. Supply the chosen `id` in the `templateId` field of the Create Task endpint.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TemplateDto"}}}}}},"security":[{"API_KEY":[]}]}},"/user-billing":{"get":{"operationId":"getUserBilling","summary":"Get remaining account balance","description":"Returns the authenticated account's remaining API credit balance in USD as a string.","tags":["billing"],"parameters":[],"responses":{"200":{"description":"Current account balance","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserBillingResponseDto"}}}}},"security":[{"API_KEY":[]}]}}},"info":{"title":"ZapCap API","description":"API for generating amazing subtitles for your videos","version":"1.0","contact":{}},"tags":[{"name":"zapcap","description":""}],"servers":[{"url":"https://api.zapcap.ai"}],"components":{"securitySchemes":{"API_KEY":{"type":"apiKey","in":"header","name":"x-api-key"}},"schemas":{"VideoUploadByUrlRequestDto":{"type":"object","properties":{"url":{"type":"string"}},"required":["url"]},"VideoStatusEnum":{"type":"string","enum":["todo","uploaded","inProgress","aborted"]},"CreateVideoResponseDto":{"type":"object","properties":{"status":{"example":"uploaded","$ref":"#/components/schemas/VideoStatusEnum"},"id":{"type":"string","description":"Use this `id` to create a video task","example":"cd97a23f-6c6d-4af7-ad66-b04ed4bb1c5e"},"storageId":{"type":"string"}},"required":["status","id","storageId"]},"VideoUploadRequestDto":{"type":"object","properties":{"file":{"type":"string","format":"binary"}},"required":["file"]},"UploadPartsDto":{"type":"object","properties":{"contentLength":{"type":"number","description":"Size of part in bytes. Must be >= 5mb except for the last part.\nAs a recommendation chunk your file by at least 10mb for performance.","example":10485760}},"required":["contentLength"]},"CreateVideoUploadRequestDto":{"type":"object","properties":{"uploadParts":{"type":"array","items":{"$ref":"#/components/schemas/UploadPartsDto"}},"filename":{"type":"string","description":"Name of the file","example":"sample.mp4"}},"required":["uploadParts","filename"]},"CreateVideoUploadResponseDto":{"type":"object","properties":{"uploadId":{"type":"string","description":"Upload id you will need to pass back to the ZapCap API when finalising the upload session."},"videoId":{"type":"string","description":"Video id which will be used for subsequent requests when processing the video."},"urls":{"description":"Presigned upload URLs. You need to upload parts in the order the urls are returned in the array.","type":"array","items":{"type":"string"}},"storageId":{"type":"string"}},"required":["uploadId","videoId","urls","storageId"]},"CompleteVideoUploadRequestDto":{"type":"object","properties":{}},"SubsOptionsDto":{"type":"object","properties":{"emoji":{"type":"boolean","description":"Whether to enable or disable emojis in the subtitles.","example":true},"emojiAnimation":{"type":"boolean","description":"Whether the emoji's should be animated or not.","example":true},"emphasizeKeywords":{"type":"boolean","description":"Whether the important words should be highlighted or not.\nHighlighted keywords can be coloured different or stand out in a specific manner depending on the template chosen.\nIn most templates, the highlight keyword will be coloured randomly from from 3 colours which can be overridden using the `renderOptions.highlightOptions` object.","example":true},"animation":{"type":"boolean","description":"Whether the subtitles should be animated.","example":true},"punctuation":{"type":"boolean","description":"Whether punctuation should be added to the subtitles.","example":true},"displayWords":{"type":"number","description":"Number of words to display. Note, this is a guidance, numbers shown won't strictly equal the provided value\nFor horizontal videos, the limit is 6-12, and for the rest the limit is 1-6","example":2}}},"StyleOptionsDto":{"type":"object","properties":{"top":{"type":"number","description":"The Y position of the subtitles, represented as a percentage of the video's height.\nThe higher the value, the lower the subtitles will be on the video.","example":40},"fontUppercase":{"type":"boolean","description":"Whether the subtitles should be uppercased.","example":true},"fontShadow":{"type":"string","description":"Font shadow of subtitles.\ns - small\nm - medium\nl - large","example":"none","enum":["none","s","m","l"]},"fontSize":{"type":"number","description":"Font size of subtitles.","example":46},"fontWeight":{"type":"number","description":"Font weight of subtitles. Refer to the numerical values for font-weight in css.","example":900},"fontColor":{"type":"string","description":"Base colour of subtitles.","example":"#ffffff"},"stroke":{"type":"string","description":"Font stroke of subtitles.\ns - small\nm - medium\nl - large","example":"none","enum":["none","s","m","l"]},"strokeColor":{"type":"string","description":"Color of the stroke.","example":"#000000"},"fontId":{"type":"string","description":"ID of a font previously uploaded via POST /fonts. Takes precedence over\nany template default font when the task is rendered.","example":"123e4567-e89b-12d3-a456-426614174000"}}},"HighlightOptionsDto":{"type":"object","properties":{"randomColourOne":{"type":"string","description":"Random colour option one.","example":"#2bf82a"},"randomColourTwo":{"type":"string","description":"Random colour option two.","example":"#fdfa14"},"randomColourThree":{"type":"string","description":"Random colour option three.","example":"#f01916"}}},"RenderOptionsDto":{"type":"object","properties":{"subsOptions":{"description":"This object controls the subtitle rows appearance and config.","allOf":[{"$ref":"#/components/schemas/SubsOptionsDto"}]},"styleOptions":{"description":"This object controls the subtitles' font and config.","allOf":[{"$ref":"#/components/schemas/StyleOptionsDto"}]},"highlightOptions":{"description":"This object controls the colouring option of important words","allOf":[{"$ref":"#/components/schemas/HighlightOptionsDto"}]}}},"CustomBrollDto":{"type":"object","properties":{"startTime":{"type":"number","description":"Start time of the broll in seconds","example":10},"endTime":{"type":"number","description":"End time of the broll in seconds","example":20},"url":{"type":"string","description":"URL of the broll. It must be publicly accessible.","example":"https://example.com/broll.mp4"}},"required":["startTime","endTime","url"]},"BrollOptionsDto":{"type":"object","properties":{"brollPercent":{"type":"number","description":"Percentage of brolls to use (0-100)","example":50},"customBrolls":{"description":"Custom brolls to use. Mutually exclusive with brollPercent.\nOverlapping brolls are not allowed (i.e., endTime of one broll must be less than or equal to startTime of the next one).\n\nBehavior in different scenarios:\n- Scenario 1: If the broll's time range is greater than the main video's duration, the broll will be truncated to match the video's duration.\n- Scenario 2: If the broll's time range is greater than the broll video's duration, the broll will be rendered in full and its last frame will be repeated as needed.","type":"array","items":{"$ref":"#/components/schemas/CustomBrollDto"}}}},"TranscribeSettingsDto":{"type":"object","properties":{"broll":{"description":"Configure brolls","allOf":[{"$ref":"#/components/schemas/BrollOptionsDto"}]}}},"ExportSettingsDto":{"type":"object","properties":{"fps":{"type":"number","description":"FPS the video is exported with. Default is 30.\nCommon values: 23.976, 24, 25, 29.97, 30, 50, 59.94, 60"},"quality":{"type":"string","description":"Quality of the export. Default is standard.\n\"standard\": 1080p\n\"quadHD\": 2k\n\"ultraHD\": 4k\n\nIgnored when `outputMode` is `transparent` and explicit `width`/`height`\nare provided.","enum":["standard","quadHD","ultraHD"]},"speed":{"type":"string","description":"Speed of the export. Default is standard.\nIn general the next speed level should see 2x increase in export speed.","enum":["standard","fast","ultraFast"]},"greenScreen":{"type":"boolean","description":"When enabled, exports the video with a green screen background.\nThis allows for easy compositing in video editing software.\nNote: This is an experimental flag — kept for backwards compatibility.\nPrefer `outputMode: \"greenScreen\"` going forward.\n@default false"},"outputMode":{"type":"string","description":"Output mode controls how captions are composited.\n- `composited` (default): captions burned onto the source video. Output is .mp4.\n- `greenScreen`: captions on a #04F404 green canvas (chroma-key in NLE). Output is .mp4.\n- `transparent`: captions on a fully transparent canvas (alpha channel) for\n  NLE plugin overlays — no source video required. Output container depends\n  on `outputCodec`.\n\nWhen `transparent`, `width` and `height` are required.","enum":["composited","greenScreen","transparent"]},"outputCodec":{"type":"string","description":"Codec for transparent-mode renders. Only valid when `outputMode` is `transparent`.\n- `prores4444` (default): ProRes 4444 in `.mov`. Editor-standard, drops\n  into every NLE natively. Larger files (~5GB / 60s 1080p).\n- `vp9`: VP9 with alpha in `.webm`. Smaller files; weaker NLE-native\n  support but plays in browsers.","enum":["prores4444","vp9"]},"width":{"type":"number","description":"Output width in pixels. Required when `outputMode` is `transparent`.\nOtherwise defaults to the source video's resolution per `quality`."},"height":{"type":"number","description":"Output height in pixels. Required when `outputMode` is `transparent`.\nOtherwise defaults to the source video's resolution per `quality`."}}},"NotificationDto":{"type":"object","properties":{"recipient":{"type":"string","description":"A generic recipient. Its behavior will change depending on the notification type. For webhooks, the recipient is expected to be a webhook endpoint accepting a POST request.\n\nIn the POST request, a signature will be sent which you can use to verify the authenticity of the message. Your webhook secret can be found on https://platform.zapcap.ai/dashboard/api-key."},"type":{"type":"string","description":"Specifies the type of notification to be sent. Currently, only webhook notifications are supported.","enum":["webhook"]},"notificationsFor":{"type":"array","description":"Allows you to subscribe to task notifications for the chosen notification type.\n\nYou may select any combination of tasks. Once a corresponding task transitions to a terminal state, a notification will be sent.\n\nPlease note, if a task fails, a notification will be sent for only one of the events which was opted in to.","items":{"type":"string","enum":["transcript","render","renderProgress"]}}},"required":["recipient","type","notificationsFor"]},"UpdateWordEntryDto":{"type":"object","properties":{"text":{"type":"string","description":"The subtitle text","example":"Hello"},"type":{"type":"string","description":"Type of the entry","example":"word"},"end_time":{"type":"number","description":"End time in seconds","example":3.18},"start_time":{"type":"number","description":"Start time in seconds","example":2.12},"emoji":{"type":"string","description":"Emoji representation of the word","nullable":true,"example":"😊"},"important":{"type":"boolean","description":"Indicates if the word is important, and should be highlighted."},"fontFamily":{"type":"string","description":"Font family for rendering this specific word"},"fontWeight":{"type":"number","description":"Font weight for rendering this specific word"},"fontFileKey":{"type":"string","description":"Font file key for rendering this specific word"},"fontId":{"type":"string","description":"Font ID to use for rendering this specific word. Must be a valid font ID owned by the user. This will be resolved to font properties and not stored.","example":"54abe67d-be14-4c78-800b-01d12bcfaaa6"}},"required":["text","type","end_time","start_time"]},"AutoCutSettingsDto":{"type":"object","properties":{"silenceRemoval":{"type":"number","description":"The lower the value, the less gap will be allowed between words.\nSo for fast cuts (shorter videos) a lower value should be used.\nValues allowed are between 0 and 1.","example":0.3},"disfluencyRemoval":{"type":"boolean","description":"Whether to remove disfluencies.","example":false,"default":false}}},"ReferenceTranscriptEntryDto":{"type":"object","properties":{"text":{"type":"string","description":"The phrase text (one SRT cue)","example":"Hello world, how are you?"},"start_time":{"type":"number","description":"Start time in seconds (used for matching confidence)","example":1.5},"end_time":{"type":"number","description":"End time in seconds (used for matching confidence)","example":3.2}},"required":["text","start_time","end_time"]},"CreateVideoTaskRequestDto":{"type":"object","properties":{"templateId":{"type":"string","description":"Template `id` gotten from Get Templates endpoint","example":"a51c5222-47a7-4c37-b052-7b9853d66bf6"},"autoApprove":{"type":"boolean","description":"Optional flag to automatically approve the task upon creation.\nWhen set to true, the task is immediately marked as approved, allowing it to proceed to the next stage of processing without requiring manual approval.\nThis is useful for workflows where immediate processing of the task is desired, bypassing the need for an explicit approval step.","default":false},"transcriptTaskId":{"type":"string","description":"Providing this will copy the transcript from another task.\nThis is useful for workflows where you want to use the same transcript for multiple rendering tasks.\nIf the transcript's duration is longer than the video's duration, the transcript will be truncated. If the video's duration is longer, the video will not be truncated.\nIt will simply be rendered without the subtitles beyond the provided transcript.","example":"cd97a23f-6c6d-4af7-ad66-b04ed4bb1c5e"},"language":{"type":"string","description":"Language the subtitles should be in\nValid languages:\n'af','am','ar','as','az','ba','be','bg','bn','bo','br','bs','ca','cs','cy','da',\n'de','el','en','es','et','eu','fa','fi','fo','fr','gl','gu','ha','haw','he','hi',\n'hr','ht','hu','hy','id','is','it','ja','jw','ka','kk','km','kn','ko','la','lb',\n'ln','lo','lt','lv','mg','mi','mk','ml','mn','mr','ms','mt','my','ne','nl','nn',\n'no','oc','pa','pl','ps','pt','ro','ru','sa','sd','si','sk','sl','sn','so','sq',\n'sr','su','sv','sw','ta','te','tg','th','tk','tl','tr','tt','uk','ur','uz','vi',\n'yi','yo','zh','yue'"},"translateTo":{"type":"string","description":"Target language to translate the original transcript to."},"renderOptions":{"description":"Override render defaults. You are able to control various aspects of the subtitles using this property.","allOf":[{"$ref":"#/components/schemas/RenderOptionsDto"}]},"transcribeSettings":{"description":"Configure transcribe options","allOf":[{"$ref":"#/components/schemas/TranscribeSettingsDto"}]},"exportSettings":{"description":"Export settings.","allOf":[{"$ref":"#/components/schemas/ExportSettingsDto"}]},"notification":{"description":"Configure notifications on task status change. Refer to the [docs](https://platform.zapcap.ai/docs/webhooks/) for a complete overview.","allOf":[{"$ref":"#/components/schemas/NotificationDto"}]},"transcript":{"description":"This supports a \"Bring your own Transcription\" model. When this is supplied, the ZapCap API will not transcribe your video and instead use the provided value.","type":"array","items":{"$ref":"#/components/schemas/UpdateWordEntryDto"}},"autoCutSettings":{"description":"Configure auto silence settings","allOf":[{"$ref":"#/components/schemas/AutoCutSettingsDto"}]},"referenceTranscript":{"description":"Reference transcript for spelling correction (phrase-level).\n\nUse this when you have an SRT file but need word-level timestamps.\nThe AI will transcribe the video to generate word timing, and use\nthese phrases to correct word spellings via matching.\n\nTiming bounds (start_time/end_time) improve matching confidence.\n\nIf you already have word-level timing, use the `transcript` field\ninstead to bypass transcription entirely.","type":"array","items":{"$ref":"#/components/schemas/ReferenceTranscriptEntryDto"}},"dictionary":{"description":"A list of domain-specific words or phrases (e.g., brand names, product names,\ntechnical terms) to improve transcription accuracy.","type":"array","items":{"type":"string"}}},"required":["templateId"]},"CreateVideoTaskResponseDto":{"type":"object","properties":{"taskId":{"type":"string","description":"`id` to use when querying the processing task's status in the Get Video Task endpoint","example":"54abe67d-be14-4c78-800b-01d12bcfaaa6"}},"required":["taskId"]},"VideoTaskStatusEnum":{"type":"string","enum":["pending","transcribing","transcriptionCompleted","rendering","completed","failed"]},"BrollOption":{"type":"object","properties":{"keyword":{"type":"string"},"preview":{"type":"string"},"startTime":{"type":"number"},"endTime":{"type":"number"}},"required":["preview","startTime","endTime"]},"GetVideoTaskResponseDto":{"type":"object","properties":{"status":{"example":"completed","$ref":"#/components/schemas/VideoTaskStatusEnum"},"id":{"type":"string","example":"54abe67d-be14-4c78-800b-01d12bcfaaa6"},"transcript":{"type":"string","nullable":true,"description":"Url to download the transcript. Link is valid for 1 hour."},"brolls":{"nullable":true,"description":"Broll clips","type":"array","items":{"$ref":"#/components/schemas/BrollOption"}},"downloadUrl":{"type":"string","nullable":true,"description":"Url to download the final file. Link is valid for 1 hour"},"storageIds":{"type":"object","properties":{"original":{"required":true,"type":"string","nullable":true},"transcript":{"required":true,"type":"string","nullable":true},"render":{"required":true,"type":"string","nullable":true}}},"transcriptApproved":{"type":"boolean","description":"Whether the transcript has been approved."},"error":{"type":"string","description":"Error description"}},"required":["status","id","transcript","brolls","downloadUrl","storageIds"]},"WordEntryDto":{"type":"object","properties":{"text":{"type":"string","description":"The subtitle text","example":"Hello"},"type":{"type":"string","description":"Type of the entry","example":"word"},"confidence":{"type":"number","description":"Confidence score for the word recognition","example":0.95},"end_time":{"type":"number","description":"End time in seconds","example":3.18},"start_time":{"type":"number","description":"Start time in seconds","example":2.12},"emoji":{"type":"string","description":"Emoji representation of the word","nullable":true,"example":"😊"},"important":{"type":"boolean","description":"Indicates if the word is important, and should be highlighted."},"fontFamily":{"type":"string","description":"Font family for rendering this specific word"},"fontWeight":{"type":"number","description":"Font weight for rendering this specific word"},"fontFileKey":{"type":"string","description":"Font file key for rendering this specific word"}},"required":["text","type","confidence","end_time","start_time"]},"VideoClipTaskStatusEnum":{"type":"string","enum":["pending","completed","failed","clipping","clipped"]},"GetVideoClipTaskResponseDto":{"type":"object","properties":{"status":{"example":"completed","$ref":"#/components/schemas/VideoClipTaskStatusEnum"},"id":{"type":"string","example":"54abe67d-be14-4c78-800b-01d12bcfaaa6"},"clips":{"type":"object","description":"Array of clips"},"storageIds":{"type":"object","properties":{"metadata":{"required":false,"type":"string"},"transcript":{"required":false,"type":"string"},"original":{"required":false,"type":"string"}}},"error":{"type":"string","description":"Error description"}},"required":["status","id","clips","storageIds"]},"CreateVideoClipTaskRequestDto":{"type":"object","properties":{"maxClips":{"type":"number","description":"Maximum number of clips that can be returned.\nNote: Number of clips returned can be less than the specified value\nMust be >= 1 && <= 5\nYou will only be charged based on the number of clips returned, not the value of maxClips"},"durationRange":{"type":"string","enum":["lt_30s","gte_30s_lt_60s","gte_60s_lt_90s","gte_90s_lt_180s"]},"clipExtractMode":{"type":"string","enum":["auto","manual","clips_metadata"]}},"required":["maxClips","durationRange","clipExtractMode"]},"FontUploadRequestDto":{"type":"object","properties":{"file":{"type":"string","format":"binary","description":"Font file to upload. Supported formats: .ttf, .otf, .woff, .woff2"}},"required":["file"]},"CreateFontResponseDto":{"type":"object","properties":{"id":{"type":"string","description":"Id of the font","example":"54abe67d-be14-4c78-800b-01d12bcfaaa6"},"filename":{"type":"string","description":"Filename of the uploaded font","example":"MyCustomFont.ttf"},"fontFamily":{"type":"string","description":"Font family name extracted from the font","example":"Roboto"},"fontStyle":{"type":"string","description":"Font style (weight/style combination)","example":"Regular, Bold, Italic, Bold Italic"},"remainingFontLimit":{"type":"number","description":"Number of fonts the user can still upload based on their subscription tier","example":4}},"required":["id","filename","fontFamily","fontStyle","remainingFontLimit"]},"GetFontResponseDto":{"type":"object","properties":{"id":{"type":"string","description":"Id of the font","example":"54abe67d-be14-4c78-800b-01d12bcfaaa6"},"filename":{"type":"string","description":"Filename of the uploaded font","example":"MyCustomFont.ttf"},"fontFamily":{"type":"string","description":"Font family name extracted from the font","example":"Roboto"},"fontStyle":{"type":"string","description":"Font style (weight/style combination)","example":"Regular, Bold, Italic, Bold Italic"},"createdAt":{"format":"date-time","type":"string","description":"When the font was uploaded","example":"2024-01-15T10:30:00Z"},"downloadUrl":{"type":"string","description":"Presigned download URL (valid for 1 hour)","example":"https://s3.amazonaws.com/bucket/fonts/user123/font456.ttf?signature=..."}},"required":["id","filename","fontFamily","fontStyle","createdAt"]},"TemplateDto":{"type":"object","properties":{"id":{"type":"string","example":"a51c5222-47a7-4c37-b052-7b9853d66bf6"},"categories":{"description":"Categories the template can be belongs to. Animated has animated emojis, highlighted has highlighted emphasis words, and basic has no emojis.","example":["animated","highlighted","basic"],"type":"array","items":{"type":"string"}},"previewUrl":{"type":"string","description":"URL to the preview video of the template. The video is a 1 second preview of the template.","example":"https://cdn.zapcap.ai/templates/7b946549-ae16-4085-9dd3-c20c82504daa.mp4","deprecated":true},"previews":{"type":"object","properties":{"previewMp4":{"required":true,"type":"string"},"previewGif":{"required":true,"type":"string"}}}},"required":["id","categories","previewUrl","previews"]},"UserBillingResponseDto":{"type":"object","properties":{"balance":{"type":"string","description":"Available balance in USD","example":"30"}},"required":["balance"]}}}}