bradtraversy.dev — 2026-05-08-vidpipe-transcript-fallback.md
home.md projects/ tools/ devlog/ × articles/ now.md about.md
2026-05-08 · #vidpipe · #devlog #postmortem #decision

# when your transcript provider goes down

vidpipe’s primary transcript source is supadata. they’re good: residential proxy access i can’t replicate cheaply, fast api, mostly fine. but this week they had a few short outages over a few days, and one of them landed in the middle of a fresh channel auto-generation. the pipeline failed silently, the user saw a generic “failed” pill, and there was no retry path short of waiting it out.

shipped three things on top of that.

a retry button

failed channel videos are now retriable. one click resets the row, drops the stale video record, and re-kicks the pipeline. the same applies to videos that were skipped for being out of credits. once you top up, retry pulls the row through.

i considered reusing the existing video record on retry, but you inherit stale state (articleStatus: 'failed', etc.) and the surface gets messy. cleaner to drop and recreate. the worker already refunds on failure, so the second charge is the only charge that sticks.

a fallback transcript provider

when supadata returns a 5xx, a 429, or a network timeout, the orchestrator now falls through to a second provider, youtube-transcript.io. validation runs at the orchestrator level so junk-caption detection works the same regardless of which vendor served.

the criterion for fallback is transient errors only. a 404 stays a 404. a different vendor can’t conjure captions that don’t exist.

picking the fallback was the more interesting part. four alternatives looked at:

  • searchapi.io: strongest stability signal (anthropic, scale ai listed as customers; monthly changelogs; us corp; 99.9% sla). but a meaningful monthly minimum that doesn’t fit a fallback that should rarely fire.
  • apify codepoetry actor: pay-per-run, has whisper fallback for caption-less videos. but the actor is a solo-dev hobby project (~160 lifetime users, no reviews). apify-the-platform is rock-solid; individual actors are third-party developer code. the trust signal is the actor, not the platform.
  • youtube-transcript.io: smaller vendor, less brand signal, but a flat monthly fee and a working api. picked it.
  • transcriptapi.com: too thin for either role.

the framing that helped: a fallback has different economics than a primary. for a primary you pay for stability (sla, customer logos, the works). for a fallback that should rarely fire, you want a flat low cost so the idle months don’t burn money on insurance you barely use. that ruled out the high-floor option for this slot, even though it would have been the right pick if i needed a primary.

the email i didn’t send

side quest. while testing, a separate failure mode surfaced: videos that exceed the user’s tier max-length get skipped with a clear reason in the database, but the dashboard was hiding it behind a generic “failed” pill. the user has no idea why.

i started building a notification path: schema field, email function, dedupe table, the works. then i stopped. did i actually want to send an email for this?

probably not. the action this nudge wants (“maybe upgrade”) isn’t urgent the way “you ran out of credits” is. it’s a soft signal, not a hard ceiling. and email fatigue is real. every notification you add raises the cost of the legitimate ones.

ripped the email path out and shipped the five-line fix instead: render the existing skip reason in red below the date on failed rows. immediate clarity, zero new infrastructure.

the over-engineered fix is usually the one you build first. the right one is usually shorter than you think.

// EOF 2026-05-08-vidpipe-transcript-fallback.md
main
2026-05-08-vidpipe-transcript-fallback.md
UTF-8
LF
Markdown
Ln 1, Col 1