Guides
Sume guides: the API, Formats, agents, models, media tools and pricing, each answer dated and sourced.

How to create an SRT file from text: time it with TTS
An SRT file needs a start and end time for every line. Voice your text with TTS word timings, then write each timed sentence as a numbered block.

n8n text to speech: turn text into an audio file
Do text to speech in n8n with HTTP Request nodes: one submits the text, a Wait loop checks the job, and one downloads the audio as a binary file.

How to mix voice with background music into one file
Mix voice with background music: set the music below the voice, duck it under speech, fade it out, export one file. The Sume way: render, then detach.

AI radio commercial generator: script, voice, music bed
An AI radio commercial is a timed script, an AI voice, and a music bed mixed into one audio file. How to generate each part with Sume's API.

How to fade out audio at the end of a track
To fade out audio, lower the volume to silence over the last few seconds. Use FFmpeg's afade filter, or a Sume render for a track Sume made.

WAV vs MP3: which is better, and when to use each
WAV is exact and large; MP3 is small and lossy. Keep WAV while you edit or join audio, export MP3 last, and know that MP3 to WAV restores nothing.

ChatGPT text to speech: make an audio file with MCP
ChatGPT Voice speaks its replies. To get your own script as an audio file, add a text-to-speech tool to ChatGPT over MCP in developer mode.

How to transcribe an interview and label each speaker
Transcribe an interview in two steps: speech-to-text for the words and their times, then speaker labels from separate tracks or a pass by hand.

How to create meeting minutes from an audio recording
Create meeting minutes from a recording in two steps: transcribe the audio, then have a language model draft the summary, decisions, and action items.

Transcribe a lecture to notes with timestamps
Transcribe a lecture with sentence timestamps, then have a language model turn it into notes whose headings point back to where each topic starts.

Speech to text API in Java: transcribe audio with HttpClient
Call a speech to text API from Java with the JDK HttpClient and Jackson: post the audio URL, poll the job, then read the transcript and word times.

FAQ videos: how to make them with an AI avatar
A FAQ video answers one common question in a short clip. How to make a set with an AI avatar: one script, one render, and one presenter throughout.

Corporate talking head video with AI: CEO and team updates
Make a corporate talking head video with AI: script the message, pick a presenter, render it in 16:9 or 9:16, and host the file where staff sign in.

AI avatar for website videos: a talking welcome clip
An AI avatar for a website is a short presenter video. Render a captioned talking clip in your page's shape, then embed the MP4 with a poster image.

AI avatar for healthcare: patient education videos
Use an AI avatar in healthcare for general patient education: short, clinician-reviewed videos, captioned for waiting rooms, with no patient data.

AI avatar for events: a host for screens and lobby loops
An AI avatar can host an event's scripted parts: the welcome, housekeeping, sponsor thanks, and session intros as short 16:9 clips, joined or looped.

curl bearer token: how to send the Authorization header
Send a bearer token with curl in an Authorization: Bearer header, in double quotes so $TOKEN expands, or use --oauth2-bearer. Fixes for each 401.

Retry-After header: how long to wait after a 429 or 503
Retry-After tells a client how long to wait before retrying: a number of seconds or an HTTP date, sent with 429 or 503. How to read it and what to do.

Why an API returns 404 Not Found, and how to fix it
An API returns 404 when no route matches your path or method, or when the id doesn't exist for your credentials. How to tell them apart and fix each.

Retryable HTTP status codes: which errors to retry
Retry network errors, 408, 429, and 5xx with backoff; skip most other 4xx. Retry a POST only with an idempotency key, and read the API's retry flag.

Is POST idempotent? No, but PUT and DELETE are
No. HTTP defines GET, HEAD, OPTIONS, TRACE, PUT and DELETE as idempotent, but not POST or PATCH. An idempotency key makes a POST retry safe.

Webhook vs API: what's the difference?
An API call is your code asking a server for something; a webhook is the server calling your URL when something happens. The two work together.

Long polling vs short polling: what's the difference?
Short polling asks on a timer and gets an instant answer; long polling holds each request open until there's news or a timeout, then asks again.

Bearer token vs API key: what's the difference?
An API key is a kind of credential; Bearer is a way to send one, in the Authorization header. A key can travel as a bearer token, as OAuth tokens do.

Where to store API keys: server, CI, and local dev
Keep API keys server-side: an env var fed by a secret manager in production, your CI's secret store in pipelines, a git-ignored file on your laptop.

Webhook security best practices: a receiver checklist
Accept HTTPS only, verify an HMAC over the raw body in constant time, reject stale timestamps, dedupe on the event id, and answer 2xx fast.

HMAC vs digital signature: what each proves for webhooks
An HMAC proves the sender holds a shared secret. A digital signature is made with a private key and checked with a public one, adding non-repudiation.

Cron expression with 6 fields: seconds first or year last?
Standard cron has 5 fields. A 6-field cron expression adds seconds at the front (Spring, Quartz, Azure Functions) or a year at the end (AWS).

PowerShell Invoke-RestMethod POST JSON with a Bearer token
Convert a hashtable with ConvertTo-Json -Depth, then call Invoke-RestMethod -Method Post -ContentType 'application/json' with a Bearer header.

Python requests retry: backoff, Retry-After, and POST
Requests doesn't retry by default. Mount urllib3's Retry on a Session with backoff and status_forcelist, and retry POST only with an Idempotency-Key.

Fetch timeout in JavaScript: AbortSignal.timeout and retry
fetch() has no timeout option. Pass signal: AbortSignal.timeout(ms), catch the TimeoutError, and retry network errors, 429 and 5xx with backoff.

Crontab curl: call an API daily and escape the % sign
A crontab line runs curl with /bin/sh, and a bare % becomes a newline. Escape it as \%, use full paths, log the output, and key the request by date.

Jenkins build periodically: cron syntax and the H symbol
Jenkins' Build periodically takes 5 cron fields plus H, a hash of the job name that spreads start times: H 20 * * * runs once in the 8 p.m. hour.

Azure DevOps scheduled pipeline: a nightly cron in UTC
Add a schedules block with a UTC cron to the pipeline YAML, set always: true to run without code changes, and key any paid API call to the date.

Cloud Scheduler trigger for a Cloud Run job, retry-safe
Add a Cloud Scheduler trigger to a Cloud Run job with a cron and a time zone. A failed task retries 3 times by default, so key paid calls to the date.

Firebase scheduled functions: call a paid API once a day
Declare a Firebase scheduled function with onSchedule, a cron and a timeZone, keep the API key in secrets, and key each paid call to scheduleTime.

Celery task retry: backoff and jitter for a paid API call
Retry a Celery task with autoretry_for, retry_backoff and max_retries, wait out retry-after on a 429, and send one Idempotency-Key on every retry.

BullMQ retry: exponential backoff for paid API jobs
Set attempts and an exponential backoff on BullMQ jobs, stop early with UnrecoverableError, and key each paid API call to the job so retries replay.

Sidekiq retry: backoff, retry count and paid API calls
Sidekiq retries a failed job 25 times over about 20 days by default. Cap it, wait retry-after with sidekiq_retry_in, and reuse one Idempotency-Key.

Slack API upload file: three calls replace files.upload
Slack deprecated files.upload. Call files.getUploadURLExternal, POST the bytes to upload_url, then files.completeUploadExternal with a channel_id.

Discord webhook send file: attach a video with files[0]
Yes: POST multipart/form-data to the webhook URL with the file as files[0] and the text in payload_json. Over 20 MiB by default, post the link.

Teams incoming webhook retired: switch to a Workflows URL
Microsoft set May 18 to 22, 2026 to disable Office 365 connectors in Teams. Create a Workflows webhook URL and POST an Adaptive Card to it instead.

Rust HMAC-SHA256: verify a webhook signature in axum
Compute HMAC-SHA256 in Rust with the hmac and sha2 crates, then verify a webhook in axum: take Bytes, MAC timestamp.body, verify_slice each entry.

Hono webhook: verify the signature on the raw body
Read the raw body with c.req.text(), verify the HMAC signature, then JSON.parse that string and answer 204. Works on Workers, Bun, Deno and Node.

Rails webhooks: verify an HMAC signature in a controller
Read request.raw_post, skip CSRF for that action only, check OpenSSL::HMAC.hexdigest against each sume-v1 entry with secure_compare, then head 204.

J cut and L cut: what they are and how to make one
A J cut plays the next shot's sound before its picture; an L cut lets a shot's sound run on under the next picture. Here's how to build each one.

How to cut a video in half (or into equal parts)
To cut a video in half, split it at its length ÷ 2 into two files. For N equal parts, part i starts at i × length ÷ N. Steps, precision, and limits.

How to split a video by file size without re-encoding
Split a video by file size: scale its length by your limit ÷ its size, cut parts that long without re-encoding, then check each part's size.