detach_source_has_no_audio: check probe.has_audio first
Audio detach fails with detach_source_has_no_audio on silent video. Probe has_audio with a free frames-false video inspect first. Refusal codes listed.

detach_source_has_no_audio means the video you passed to audio detach has no audio track. Prevent it by probing first: a video inspect with frames: false returns probe.has_audio and makes no stills. The probe-only inspect is not billed, per the Sume pricing notes, so the check costs nothing.
The guard
Probe, then detach only when the clip has sound. The inspect default is mode: sync, which waits up to 30 seconds.
import os, requests
BASE = "https://api.sume.com"
H = {"Authorization": "Bearer " + os.environ["SUME_API_KEY"]}
url = "https://media.sume.com/artifacts/artf_demo/talk.mp4"
r = requests.post(BASE + "/v1/video-inspect",
headers={**H, "Idempotency-Key": "probe-001"},
json={"video_url": url, "frames": False})
r.raise_for_status()
print(r.json()) # read probe.has_audio before detachingStable refusal codes
These are the codes the detach docs list; each means a different fix.
| Code | Meaning | Fix |
|---|---|---|
detach_source_has_no_audio | No audio track | Probe first; skip silent clips |
audio_detach_range_empty | end <= start, or range over 900 s | Correct the range |
detach_start_past_source | start beyond the duration | Use a start inside the clip |
source_duration_exceeded | Source over 1800 s | Trim first |
unsupported_media_source | Not a media.sume.com URL | Import with POST /v1/media-imports |
source_not_found | Dead URL or other workspace | Check the artifact id |
Cost of the mistake
A detach is $0.01. The point of the probe is less the cent than the batch: a loop over 500 clips with 40 silent ones fails 40 jobs and leaves 40 failed jobs to sort out. Filter on has_audio and you queue only the files that will succeed.
Sources
Related posts
More in Developers
- Docs page to explainer video: chunk the script under the TTS cap
Split a long document into voice-over chunks under Sume's 20,000-character TTS request limit and price them at $0.0475 per 1,000 characters. Runnable Python.
- Does Seedance audio cost extra on Sume? generate_audio and the price
Seedance prices on Sume are per video token and carry no separate audio line. What generate_audio does, what it defaults to, and the 10 s price either way.
- Draft on Grok Imagine, finish on Seedance 2.5: two calls, one prompt
A Python flow that renders a prompt on grok-imagine-video-1.5 for $0.125, then re-sends the approved text to seedance-2.5 at 1080p for $14.22.
- Elixir Req: submit and poll a Sume video job after Sora
An Elixir script using Req: POST /v1/videos with an Idempotency-Key, poll every 30 seconds, stop on completed, failed or cancelled. Req never retries the POST.
Written by Sume