Instagram Replace Audio on a published post, or re-render with Sume

Instagram added audio replacement on published feed posts. Sume can render a new soundtrack but cannot feed it into that flow. Which route keeps what.

4 min readSume
All posts

If a published Instagram feed post has audio you want to change, use Instagram's own replace-audio flow, because that is the only route that edits the existing post. Instagram's help page for replacing muted audio on a post says that when the music is muted or unavailable you can replace it with a song from Meta's Sound Collection (read 2026-10-03), which means the replacement comes from Instagram's library. Sume cannot upload a track into that flow: nothing in the Sume docs describes it. What Sume can do is render a new file with a different soundtrack, which you then publish as a new post.

The two routes side by side

I could not load Instagram's announcement page, so what happens to likes, comments and reach on replace is not stated here; read Instagram's current help text before you rely on it.

Replace in the app versus re-render and repost, read 2026-10-03
QuestionInstagram replace audioSume re-render
Edits the existing postYes, per InstagramNo, produces a new MP4 to post
Source of the new trackInstagram's libraryYour own file or Music Router output
Needs your original footageNoYes, on media.sume.com
CostNot stated on the page$0.10 per ceiling output minute for Timeline; music per generation

Render the new soundtrack

A Timeline 1.0 render takes an audio spine plus ordered video[] slots. The optional soundtrack is a bed with gain_db, loop, fade_out_seconds up to 10 and duck_db 0-20, which lowers the bed under the spine; ducking needs a real spine, not silence (duck_requires_audio_spine). Generate the bed with the Music Router, which has no duration field, so ask for the length in the prompt.

import json, os, urllib.request

API = "https://api.sume.com/v1"

def post(path, body, key):
    req = urllib.request.Request(
        f"{API}{path}",
        data=json.dumps(body).encode(),
        headers={
            "Authorization": f"Bearer {os.environ['SUME_API_KEY']}",
            "Content-Type": "application/json",
            "Idempotency-Key": key,
        },
        method="POST",
    )
    with urllib.request.urlopen(req) as res:
        return json.load(res)

render = post(
    "/timeline-1.0/render",
    {
        "audio": {"url": os.environ["SUME_VOICE_URL"], "duration_seconds": 20},
        "video": [
            {"source_url": os.environ["SUME_CLIP_URL"], "start": 0, "duration": 20}
        ],
        "soundtrack": {
            "url": os.environ["SUME_MUSIC_URL"],
            "gain_db": -18,
            "loop": True,
            "fade_out_seconds": 2,
            "duck_db": 8,
        },
    },
    "new-soundtrack-001",
)
print(render["request_id"])

Rights and the honest choice

Using Instagram's own flow keeps you inside its music licensing. A file with music baked in is your responsibility, and Instagram can mute or restrict what it detects as unlicensed. If the goal is only a different library track, use the replace flow. If the goal is a different mix (voice ducking, a looped bed, fades) or a brand-owned track, re-render with the original footage and post fresh.

Set the bed under the voice, not over it

The most common reason to change a track is that it fights the voice. duck_db lowers the soundtrack while the spine speaks, from 0 to 20 dB, and gain_db sets the bed's overall level from -60 to 12. A starting point of -18 dB on the bed with 8 dB of ducking keeps music present without masking speech, but listen on a phone speaker before you commit. loop: true repeats a short bed to cover the render, and fade_out_seconds up to 10 closes it cleanly.

Check the plan first. The unbilled POST /v1/timeline-1.0/plan returns the duration and estimated cost without reserving credits, so you can confirm a 20-second render reserves one minute at $0.10 before you submit.

Generating the bed

For a new bed, send a prompt to POST /v1/music-router/generate and omit model to let sume/music-auto choose; today that is Lyria 3.5. The prompt can run up to 5000 characters, and duration and duration_seconds are rejected, so steer length in the words: a 30-second instrumental at a stated tempo. Put exclusions in the positive prompt, such as no vocals. Music is billed at the fixed Music price per generation, not per second.

A short decision list

Run through these before choosing a route.

  • Do you only want a different song from Instagram's library on a post that already exists? Use Instagram's replace-audio flow.
  • Do you need your own track, a looped bed, or a voice duck? Re-render with the original footage.
  • Is the source footage still on hand? If not, a re-render is not possible and the in-app route is the only one.
  • Is the post tied to comments or a campaign link you cannot move? Prefer the in-app route and confirm its behavior in Instagram's current help text.
  • Are you producing several versions for testing? Render each with its own idempotency key so the retries stay separate.

Sources

Related posts

More in Use cases

All Use cases posts

Written by Sume