video-remove-background — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited video-remove-background (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Remove the background from any video and get a clip with a transparent (alpha) or solid-color background. Powered by Bria's video editing pipeline — commercially safe, royalty-free, production-ready video background removal and subject matting.
Use this skill when the user wants to:
This skill does one thing: remove backgrounds from video files to produce transparent or solid-color clips.
Before making any API call, you need a valid Bria access token.
if [ -f ~/.bria/credentials ]; then
BRIA_ACCESS_TOKEN=$(grep '^access_token=' "$HOME/.bria/credentials" | cut -d= -f2-)
BRIA_API_KEY=$(grep '^api_token=' "$HOME/.bria/credentials" | cut -d= -f2-)
fi
if [ -z "$BRIA_ACCESS_TOKEN" ]; then
echo "NO_CREDENTIALS"
elif [ -n "$BRIA_API_KEY" ]; then
echo "READY"
else
echo "CREDENTIALS_FOUND"
fiIf the output is READY, skip straight to making API calls — no introspection needed. If the output is CREDENTIALS_FOUND, skip to Step 3. If the output is NO_CREDENTIALS, proceed to Step 2.
Start the device authorization flow:
2a. Request a device code:
DEVICE_RESPONSE=$(curl -s -X POST "https://engine.prod.bria-api.com/v2/auth/device/authorize" \
-H "Content-Type: application/json")
echo "$DEVICE_RESPONSE"Parse the response fields:
device_code — used to poll for the token (keep this, don't show to user)user_code — the code the user must enter (e.g. BRIA-XXXX)interval — seconds between poll attempts2b. Show the user a single sign-in link. Tell them exactly this — nothing more:
Connect your Bria account: Click here to sign in Your code is {user_code} — it's already filled in.
Do NOT show two links. Do NOT show the raw URL separately. Do NOT use verification_uri from the API response. Keep it to one clickable link.
2c. Poll for the token. After showing the user the code, immediately start polling. Try up to 60 times with the given interval (default 5 seconds):
for i in $(seq 1 60); do
TOKEN_RESPONSE=$(curl -s -X POST "https://engine.prod.bria-api.com/v2/auth/token" \
-d "grant_type=urn:ietf:params:oauth:grant-type:device_code" \
-d "device_code=$DEVICE_CODE")
ACCESS_TOKEN=$(printf '%s' "$TOKEN_RESPONSE" | sed -n 's/.*"access_token" *: *"\([^"]*\)".*/\1/p')
if [ -n "$ACCESS_TOKEN" ]; then
BRIA_ACCESS_TOKEN="$ACCESS_TOKEN"
REFRESH_TOKEN=$(printf '%s' "$TOKEN_RESPONSE" | sed -n 's/.*"refresh_token" *: *"\([^"]*\)".*/\1/p')
mkdir -p ~/.bria
printf 'access_token=%s\nrefresh_token=%s\n' "$BRIA_ACCESS_TOKEN" "$REFRESH_TOKEN" > "$HOME/.bria/credentials"
echo "AUTHENTICATED"
break
fi
sleep 5
doneIf the output contains AUTHENTICATED, proceed to Step 3. Otherwise the code expired — start over from Step 2a.
Do not proceed with any API call until authentication is confirmed.
Introspect the bearer token to check billing status and obtain the real API key for Bria API calls:
INTROSPECT=$(curl -s -X POST "https://engine.prod.bria-api.com/v2/auth/token/introspect" \
-d "token=$BRIA_ACCESS_TOKEN")
BILLING_STATUS=$(printf '%s' "$INTROSPECT" | sed -n 's/.*"billing_status" *: *"\([^"]*\)".*/\1/p')
if [ "$BILLING_STATUS" = "blocked" ]; then
BILLING_MSG=$(printf '%s' "$INTROSPECT" | sed -n 's/.*"billing_message" *: *"\([^"]*\)".*/\1/p')
echo "BILLING_ERROR: $BILLING_MSG"
fi
ACTIVE=$(printf '%s' "$INTROSPECT" | sed -n 's/.*"active" *: *\([^,}]*\).*/\1/p' | tr -d ' ')
if [ "$ACTIVE" = "false" ]; then
# Clear stale tokens so re-auth starts fresh (credentials file is re-created in Step 2c)
printf '' > "$HOME/.bria/credentials"
echo "TOKEN_EXPIRED"
fi
BRIA_API_KEY=$(printf '%s' "$INTROSPECT" | sed -n 's/.*"api_token" *: *"\([^"]*\)".*/\1/p')
if [ -n "$BRIA_API_KEY" ]; then
grep -v '^api_token=' "$HOME/.bria/credentials" > "$HOME/.bria/credentials.tmp" 2>/dev/null || true
printf 'api_token=%s\n' "$BRIA_API_KEY" >> "$HOME/.bria/credentials.tmp"
mv "$HOME/.bria/credentials.tmp" "$HOME/.bria/credentials"
fiInterpret the output:
BILLING_ERROR: ... — relay the message to the user exactly as shown and stop. Do not make any API calls.TOKEN_EXPIRED — the session is no longer valid. Tell the user their session expired and restart from Step 2.BRIA_API_KEY now contains the real API key and is cached for future calls. Proceed to the next section.Use bria_video_call for the API call. It handles local file upload (via Bria's video upload service), JSON construction, the API call, and async polling — all in a single function call. The API key is auto-loaded from ~/.bria/credentials.
source ~/.agents/skills/video-remove-background/references/code-examples/bria_video_client.sh
# Remove background from a local file — get a transparent video
RESULT_URL=$(bria_video_call "/path/to/clip.mp4")
echo "$RESULT_URL" # → https://...output.webm
# Remove background from a URL
RESULT_URL=$(bria_video_call "https://example.com/clip.mp4")
echo "$RESULT_URL"That's it. One function call. Video jobs are asynchronous and take longer than image jobs — the helper polls for up to 10 minutes.
Supported containers: .mp4, .mov, .webm, .avi, .gif. Supported codecs: H.264, H.265 (HEVC), VP9, AV1, PhotoJPEG. Max duration: 60 seconds. Resolution up to 16K (16000x16000).
Pass extra JSON fields as a second argument:
| Option | Values | Default | Notes |
|---|---|---|---|
background_color | Transparent, Black, White, Gray, Red, Green, Blue, Yellow, Cyan, Magenta, Orange | Transparent | Predefined names only — hex values are not supported |
output_container_and_codec | mp4_h264, mp4_h265, webm_vp9, mov_h265, mov_proresks, mkv_h264, mkv_h265, mkv_vp9, gif | webm_vp9 | See alpha-support rule below |
preserve_audio | true / false | — | Retain the input's audio track |
Important — alpha support: Withbackground_color: Transparent(the default), the output preset must support alpha. The server accepts only `webm_vp9`, `mkv_vp9`, or `mov_proresks` with Transparent — any other preset returns 422 Unprocessable Entity. When the user asks for an MP4 output, set a solidbackground_color— MP4 cannot hold transparency.
Known issues (verified June 2026): thegifpreset fails server-side with a 500 error even with a solid background — producewebm_vp9and convert with ffmpeg instead (example below).mov_proreskscompletes and returns ProRes 4444, but in testing the file lacked an alpha plane — verify alpha before relying on it, and preferwebm_vp9/mkv_vp9for transparency.
A URL to the processed video (default: transparent .webm). Output keeps the input's resolution, aspect ratio, and frame rate. Short clips process in roughly 30–60 seconds. Download the result to save it locally:
curl -sL "$RESULT_URL" -o output.webmVerifying transparency: for VP9 outputs,ffprobereportspix_fmt=yuv420peven when alpha is present — VP9 stores alpha in a WebM side channel. Check theALPHA_MODEtag instead, or decode with libvpx: ``bash ffprobe -v error -select_streams v:0 -show_entries stream_tags=alpha_mode -of default=noprint_wrappers=1 output.webm # TAG:ALPHA_MODE=1 → has alpha ffmpeg -c:v libvpx-vp9 -i output.webm -frames:v 1 frame.png # frame.png will be rgba``
source ~/.agents/skills/video-remove-background/references/code-examples/bria_video_client.sh
RESULT_URL=$(bria_video_call "/path/to/presenter.mp4" '"output_container_and_codec":"webm_vp9"')
curl -sL "$RESULT_URL" -o presenter_transparent.webm
echo "Transparent video saved to presenter_transparent.webm"MP4 doesn't support alpha, so set a solid background color:
source ~/.agents/skills/video-remove-background/references/code-examples/bria_video_client.sh
RESULT_URL=$(bria_video_call "/path/to/product_spin.mp4" '"background_color":"White","output_container_and_codec":"mp4_h264","preserve_audio":true')
curl -sL "$RESULT_URL" -o product_white_bg.mp4source ~/.agents/skills/video-remove-background/references/code-examples/bria_video_client.sh
RESULT_URL=$(bria_video_call "https://example.com/talent.mov" '"output_container_and_codec":"mkv_vp9"')
curl -sL "$RESULT_URL" -o talent_alpha.mkvThe API's gif output preset currently fails server-side — get a transparent webm and convert locally with ffmpeg:
source ~/.agents/skills/video-remove-background/references/code-examples/bria_video_client.sh
RESULT_URL=$(bria_video_call "/path/to/animation.mp4")
curl -sL "$RESULT_URL" -o cutout.webm
ffmpeg -c:v libvpx-vp9 -i cutout.webm \
-filter_complex "[0:v]split[a][b];[a]palettegen=reserve_transparent=1[p];[b][p]paletteuse=alpha_threshold=128" \
animation_transparent.gifsource ~/.agents/skills/video-remove-background/references/code-examples/bria_video_client.sh
mkdir -p cutouts
for vid in videos/*.mp4; do
[ -f "$vid" ] || continue
name=$(basename "${vid%.*}")
RESULT_URL=$(bria_video_call "$vid" '"output_container_and_codec":"webm_vp9"')
if [ -n "$RESULT_URL" ]; then
curl -sL "$RESULT_URL" -o "cutouts/${name}_transparent.webm"
echo "Done: $name"
else
echo "Failed: $name" >&2
fi
donebria_video_call sends it to Bria's video background removal endpoint (POST /v2/video/edit/remove_background)status_url; the helper polls it every 5 seconds (up to 10 minutes)| Error | Cause | Fix |
|---|---|---|
422 Unprocessable Entity | Transparent background with a non-alpha preset | Use webm_vp9/mkv_vp9/mov_proresks, or set a solid background_color |
500 "list index out of range" (job status ERROR) | gif output preset (currently broken server-side) | Output webm_vp9 and convert to GIF with ffmpeg (see example) |
413 Payload Too Large | Input resolution above 16000x16000 | Downscale the input video |
400 with duration message | Input longer than 60 seconds | Trim the video to ≤ 60s first |
| Polling timeout | Long/high-res job still processing | The helper prints the status_url — re-poll it manually, or raise BRIA_POLL_ATTEMPTS / BRIA_POLL_INTERVAL |
bria_video_call (upload + call + poll) and bria_video_upload (local file → temporary URL)~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.