Seedance 2.5 from ByteDance is officially available on Apiframe.

How to Migrate to One Media API

Learn how to migrate from multiple media providers to one API using a shared contract, adapters, staged testing, and safe provider retirement.

Renaud Published August 22, 2026 August 22, 2026 · 10 min read
How to Migrate to One Media API

Using multiple media providers usually means multiple API keys, request formats, job states, retry rules, and invoices to manage. The safest way to move from several media providers to one API is to keep your app running smoothly while you swap out those provider-specific pieces behind a single, shared setup.

Use the steps below to review your current stack, define your target setup, connect it to Apiframe, move one workflow at a time, and only retire your old providers once the results hold up.

Step 1: Audit Your Current Media Providers and Workflows

Start by documenting every media-related call your app makes, before you change any live traffic. This review shows you where a provider's specific quirks have worked their way into your product.

Search your codebase for provider SDKs, base URLs, API keys, model names, webhook routes, queue workers, and billing tags. Then trace each request from the user's action all the way to the final stored file. Note what happens when a job is queued, delayed, rejected, canceled, or completed.

Create one row for each workflow, not each provider. For example, your product image flow might use one image provider today, while your ad video flow uses a second provider and a separate storage path. Treat those as two separate migrations, since they carry different levels of risk.

Audit areaWhat to recordWhy it affects migration
Request shapePrompt fields, input URLs, size, duration, model settingsMissing fields can change output quality or cause failed jobs
Job handlingSync response, task ID, polling rules, webhook eventsYour worker needs one clear state machine
Failure behaviorTimeouts, rate limits, moderation errors, refund rulesRetries can duplicate work or spend credits twice
Output handlingFile URL, format, expiry, storage destinationOld URLs may stop working after cutover
Business rulesPlan limits, customer quotas, approval stepsUsers must keep the same product behavior

Keep a sample set of both successful and failed requests. Include at least one request that uses a reference image, one long-running video job, and one request that should fail validation. Remove any API keys and private media before saving these samples.

HTTP status codes are a useful signal here. A server can return a 202 status when it has accepted a job that isn't finished yet. Your review should show whether each current provider follows that pattern, or instead hides the fact that work is still running behind a generic response.

Audit of multiple media provider workflows before API migration.

By the end of this step, you should have a list of your providers, a map of each workflow, sample requests and responses, and a list of behaviors your app depends on. For useful background on the pattern you're aiming for, see this guide on what a unified AI media API is.

Step 2: Define a Canonical Media API Contract

Before writing any connecting code, define one internal format, or "contract," that your product will always use. Your product code should call this shared contract, not Apiframe or any of your old providers directly.

Keep the first version small. A generation request may need these fields:

  • media_type, such as image, video, or music
  • model, using your own model identifier map
  • prompt
  • inputs, such as an image, video, or audio reference
  • options, for size, duration, aspect ratio, quality, or other supported settings
  • idempotency_key, so a retry does not create an unwanted second job
  • webhook_url, when your system uses event callbacks

Return a consistent job object every time. It should include your own internal job ID, the provider's job ID, status, timestamps, links to the output, and a standard error format. Use a short, clear list of states, such as queued, processing, completed, failed, and canceled. You don't need to expose every provider-specific status to your front end.

Separate fields into three groups. Required fields must work for every workflow. Optional common fields can pass through when supported. Provider-specific fields should live behind an adapter or an explicit extension object.

That last point matters. If your core contract grows a new field for every model you support, you've just rebuilt the same complexity under a new name. A video model might need a motion setting, while an image model might need a seed value. Keep those details out of your main business logic unless several workflows genuinely need them.

Define error rules in plain language. Decide which failures are safe to retry, which need a new prompt, and which should reach the user. Treat timeouts differently from content policy failures. Record the provider error for support, but return a stable code to your application.

Write down your error-handling rules in plain language. Decide which failures are safe to retry automatically, which need a new prompt from the user, and which should be shown to the user directly. Treat timeouts differently from content policy failures. Keep the original provider error on file for your support team, but return a simple, consistent error code to your application.

Use the Apiframe API documentation as the target reference for authentication, generation endpoints, job polling, and webhooks. Apiframe uses theX-API-Keyheader and returns a job ID with a queued status for async generation.

Key takeaway: Your app should understand what a media job means in general, not need to know how each individual provider happens to represent one.

By the end of this step, you should have a versioned contract, a consistent set of job states, stable error codes, and clear rules for handling fields that don't map cleanly across providers.

Step 3: Map Your Contract to Apiframe

Now connect your internal contract to Apiframe through one simple integration layer. Apiframe gives you a single REST API for image, video, and music generation, so this layer can share authentication and job handling across all three media types.

Map your internal media type to the right endpoint:

  • Images usePOST /v2/images/generate.
  • Videos usePOST /v2/videos/generate.
  • Music usesPOST /v2/music/generate.
  • Job checks useGET /v2/jobs/{id}.

Keep model names in a configuration file rather than scattering them throughout your application code. If a workflow starts with one image model and later switches to another, update the mapping first. The rest of the flow should still work the same way: submit a prompt, get back a job ID, and wait for it to complete.

Here is a minimal image request through Apiframe:

bash
curl -X POST https://api.apiframe.ai/v2/images/generate \ -H "X-API-Key: afk_your_api_key" \ -H "Content-Type: application/json" \ -d '{"model":"midjourney","prompt":"a red bicycle on a wet street"}'

Your adapter should translate Apiframe's response into your own job format right away. Don't pass the raw response deep into the rest of your app. That habit makes any future provider change much harder.

Map input media with care. A direct provider may accept a public URL, a base64 string, or an uploaded file. Pick one input form for your internal contract.

Check every model's supported controls before you map them. Resolution, duration, aspect ratio, reference images, native audio, and multi-shot transitions may not exist for every model. Your adapter should reject unsupported combinations before it submits a paid job.

Also decide where credits get tracked in your own system. Apiframe reserves credits when a request is accepted and automatically refunds them if a job fails. Even so, your own usage tracking should log the request and its final outcome, so a customer can see a clear history of what they used.

Mapping a canonical media contract to one image video and music API.

By now you should have one adapter that handles auth, request translation, job normalization, and output mapping. Test it with one image request before adding video and music. A narrow first test makes schema mistakes much easier to find.

Step 4: Build Adapters and Migrate One Media Workflow at a Time

Move your lowest-risk workflow first. This is the safest way to migrate from multiple providers to one API without turning your entire release into a single point of failure.

Choose a workflow with clear, simple input and output rules. Internal image generation is often easier to test than a customer-facing video editor, since video involves more timing and playback concerns. Don't start with the workflow that carries your biggest revenue risk.

Build the new path alongside the old one. Put both behind a feature flag or routing rule. A given request should have one clear source of truth for its result, even if a second path runs in parallel for comparison. Never let two paths update the same customer record without a clear rule for which one wins.

Use a shadow mode whenever it's safe to duplicate a request. Send the same prompt and settings to Apiframe, but don't show its output to the user yet. Compare completion status, output size, render time, moderation results, and estimated cost. For video, also compare duration and playback quality.

Some jobs shouldn't be duplicated. A music request might raise usage-rights or cost concerns that make generating it twice wasteful. In that case, migrate a small set of new jobs instead of replaying old ones.

Keep provider-specific translation in separate modules. One module should turn your contract into an Apiframe request. A legacy module can keep the old provider alive during the transition. Both modules should return the same internal job object.

Use a queue for long jobs. Store the request before submission, then save the upstream job ID as soon as Apiframe accepts it. If the network drops after submission, use your idempotency rules and reconciliation worker before trying again.

For reference media, keep a durable copy under your own control if your product needs access beyond a provider's retention window. Apiframe's Assets API can store images, videos, and audio once for reuse across multiple generation requests. Apiframe itself hosts generated media on its CDN for 3 months before automatic deletion, so move files to your own storage if your customer or legal requirements call for longer retention.

Pro Tip: Add a migration flag to each workflow, not just each environment. That lets you move internal users first, then a small customer group, without shipping a new build for every traffic change.

Once the first workflow meets its quality and cost checks, migrate the next one. Keep the adapter boundary in place even after the old route disappears. It gives you a place to change models without spreading provider details through your product.

Step 5: Test, Monitor, Cut Over, and Retire Legacy Providers

Finish the migration with staged traffic, clear metrics, and a rollback plan ready to go. Switching everything over at once tends to hide problems until your customers find them for you.

Start with an internal test. Then route a small, low-risk slice of real traffic through Apiframe. Only expand further once the results stay within the limits you set during your initial review.

Track each workflow using the same set of measurements. Our guide to unified media API latency and performance covers these in more depth, but at minimum, watch:

  • Acceptance rate and validation failures
  • Time from submission to completion
  • Failed and timed-out jobs
  • Retry count and duplicate-job count
  • Output review results
  • Credits used per successful result
  • Webhook delivery and processing errors

Set alerts based on customer impact. A rise in queue time matters more than a small shift in average speed if it means users are actually waiting longer. Also watch the slowest outliers, since a handful of very slow video jobs can make a whole workflow feel broken, even if the average looks fine.

Test your webhooks as if they were an unreliable connection. Send the same event twice. Deliver events out of order. Simulate a temporary server error. Your handler should verify each event, find the right job, ignore duplicates, and recover cleanly if delivery fails. Return error information your systems can actually read and act on.

Keep the legacy provider route available during the first cutover window. Use a staged migration pattern: run a small test, compare results and invoices, then shift traffic in stages rather than changing every request at once.

Decide on a rollback trigger before you launch. Examples include a failed-job rate above an agreed limit, a noticeable rise in support tickets, or a cost per completed asset that's higher than your old route. Rolling back should just mean changing your routing rule, not reverting code.

After the new path holds steady, retire the old provider in this order:

  1. Stop new traffic.
  2. Drain or cancel old queued jobs.
  3. Keep read access to old job records.
  4. Export invoices and usage data.
  5. Remove old keys from active secrets.
  6. Delete unused queues and webhook routes.
  7. Cancel the provider account only after the retention and contract checks pass.

Leave a short written record of the migration behind. Note the final model mapping, who owns the rollback decision, your data retention choice, and the date the old route went inactive. Six months from now, that note could save you a long investigation.

FAQ

How long does it take to migrate from multiple media providers to one API?

It depends on how many workflows you have and how different your providers are. A small image workflow might move quickly once its request and job states are mapped out. Video and music usually need more testing, since jobs run longer and support different controls. Estimate each workflow on its own, then move them in stages rather than setting a single deadline for everything.

Should I replace every provider at once?

No. Migrate your lowest-risk workflow first. Keep the old route running while you compare output quality, failure rates, cost, and support signals. A staged rollout gives you a way to roll back, and it also reveals which provider-specific assumptions are still baked into your app before they affect every media feature.

What should a unified media API contract include?

A shared contract should include media type, model, prompt, input references, common options, job ID, status, output references, and a standard error format. Add a unique retry ID (idempotency key) so retries stay safe. Keep model-specific settings inside an extension object or adapter, so your core application never becomes locked into one provider's specific request format.

Can Apiframe handle image, video, and music in one integration?

Yes. Apiframe supports image, video, and music generation through a single REST API. You call the matching generation endpoint, receive a job ID, then check the job status or use a webhook. Switching models is just a change to the model parameter, while your authentication and core job handling stay the same.

How do I know when to shut down the old providers?

Only retire an old provider once the new route consistently meets your quality, reliability, cost, and data requirements over a set observation period. Stop sending it new traffic first, keep your old records, export your billing data, and remove your API keys last. Keep a tested rollback path in place until queued jobs and any open support cases have cleared.

Conclusion

Build your shared contract before you move any real traffic, then migrate your lowest-risk workflow through an adapter and measure it side by side with your old path. Apiframe is a solid target if your product needs image, video, and music generation behind one API. Start with a single test request using the Apiframe getting started guide, then expand only once your own data supports the switch. For help deciding which models fit each workflow, our guide to choosing an AI media API and the Apiframe model catalog are good places to start.

The Apiframe dispatch

New models, engineering write-ups, and build guides in your inbox. No noise, unsubscribe anytime.