Jul 8, 2026SitecoreSitecoreAINext.jsContent Migration
Content Migration Between SitecoreAI Instances: Building an Alternative When Packages Aren't an Option
The 1.8.24 release of the SitecoreAI base image dropped support for packages. If you're in the middle of a content migration, this timing probably felt like a punch in the gut — it certainly did for me. But Sitecore's solution came in the same release: a pair of APIs designed specifically for moving content between environments without packages.
The Problem
I was halfway through migrating content from one SitecoreAI instance to another when the package support disappeared. The traditional approach — export, download, upload, import — was no longer available. I needed a way to keep moving forward without waiting for a workaround or the eventual official tooling Sitecore plans to release.
The APIs to the Rescue
Sitecore released two new REST APIs in that same build:
Content Transfer API (runs on the source environment) — packages up your content on the source side. You tell it which items to transfer and how (just the item, or the item and all descendants), and it chunks the content, encrypts it, and compresses it into segments ready to move.
Item Transfer API (runs on the destination environment) — consumes those packages. It takes the chunks, writes them into the destination database, and tracks what actually landed vs. what failed. You can also use it to retry failed transfers, inspect what was transferred, and browse the history.
The two APIs are complementary halves of a single workflow. The Content Transfer API gets your content out of the source as encrypted chunks; the Item Transfer API brings those chunks into the destination's database.
So I Built a UI For It
Both APIs are REST endpoints — powerful, but not what you'd want to use manually for ten items across two environments, let alone a hundred. I needed a guided experience. That's where the Content Migration app comes in.
It's a Next.js marketplace app built with Blok (Sitecore's design system) that walks you through the whole process:
- Connect — authorize to both your source and destination by pasting in automation client credentials. The app tests each connection and holds the tokens in memory for your session only — nothing touches disk or a database.
- Select content — browse the source's content tree via GraphQL and check the items you want to migrate.
- Configure — for each item, choose your scope (item alone, or item plus descendants) and your merge strategy (how to handle conflicts with existing content).
- Review & transfer — watch progress as the app orchestrates the whole pipeline: package the items on the source, relay the chunks to the destination, unpack them, and confirm they landed.



It also includes an Explorer to inspect transfers, see what was successfully migrated per item, browse the transfer history, and manage the package files ("blobs") on the destination.


How It Actually Works Under the Hood
The app doesn't do anything magical — it's just a user-friendly wrapper around the two APIs:
- When you hit "Start transfer," the app creates a single Content Transfer operation on the source, nominates all your selected items at once, and starts pulling chunks.
- It relays each chunk to the Item Transfer API on the destination, keeping the pipeline flowing without you having to manage the handoff manually.
- Once all chunks are uploaded, it tells the destination to consume them into the database.
- The app doesn't sit waiting for that consume to finish — it submits the request and tells you the items are "submitted." You can check the Explorer to see when the destination is actually done processing them (it's asynchronous on Sitecore's end).
The whole thing runs as a series of small steps rather than one giant blocking call, so progress updates in the UI as work happens server-side, and nothing times out.
If You're In the Same Boat
If you're migrating content between SitecoreAI instances right now and need something more than raw API calls, the app is out there and ready to use.
It's public, works, and got me through my migration while waiting for Sitecore's official tooling.
Limitations: it's an internal tool I built to solve my own problem. Use it as-is, help yourself to the code if you want to fork it or learn from it, and understand you're on your own if something breaks.
If Sitecore releases their official marketplace app for this, by all means use that instead. But until then, if you need to move items between environments, this one works.
A Note on Credentials
The app never stores your credentials anywhere. When you enter your client ID and secret, the app exchanges them for a JWT on the server side and holds that token only in memory for your browser session. When you close the browser or the session expires, it's gone. No database, no disk, no risk of accidentally committing secrets to git.
If you end up using it or have feedback, feel free to open an issue on the repo. And if you're building something similar, the code is open — grab whatever's useful.
Share this post