# Migrate from Kentico to Agility

> Source: https://agilitycms.com/docs/developers/migrate-from-kentico

> [!NOTE]
> We last checked this guide on November 9, 2026, against Kentico's documentation for Xperience by Kentico and Kentico Xperience 13. Kentico sites differ in their customizations, so if something here doesn't match your site, Kentico's documentation for your version has the latest.

A Kentico site keeps its pages in a content tree, structures them with page types (content types in Xperience by Kentico), and lays out many pages with Page Builder widgets. The content itself maps cleanly to Agility models and linked content. The work is in the widget layouts, media URLs inside text, and the site's URL history.

## At a glance

1. **Identify your Kentico product**, because the export route depends on it ([which Kentico](#which-kentico-do-you-have)).
2. **Inventory** page types, widgets, media, cultures and URLs ([step 1](#1-inventory-the-site)).
3. **Export** from Kentico Xperience 13 or older ([step 2](#2-export-from-kentico-xperience-13-and-older)), or from Xperience by Kentico ([step 3](#3-export-from-xperience-by-kentico)).
4. **Map** pages, reusable content, widgets, categories and media to Agility ([step 4](#4-map-to-agility)).
5. **Clean up** text fields: media links, attachment links and macros ([step 5](#5-clean-up-text-fields)).
6. **Handle languages** if the site is multilingual ([step 6](#6-languages)).
7. **Import** in dependency order with the Management SDK or an AI agent ([step 7](#7-import-into-agility)).
8. **Switch over**: map current and former URLs, then cut over ([step 8](#8-urls-and-redirects)).

This guide applies the phases in [Migrating to Agility](/docs/developers/migrating-to-agility) to a Kentico site.

## Which Kentico do you have?

| Product | Support status (from Kentico) | Export route |
| --- | --- | --- |
| Xperience by Kentico | Current product. Each release is supported for at least 12 months. | Headless GraphQL API, the .NET content query API, or the database. See [step 3](#3-export-from-xperience-by-kentico). |
| Kentico Xperience 13 | Technical support ends **December 31, 2026**. During 2026 Kentico releases security hotfixes only, and from January 1, 2027 all support stops, including security repairs. | REST service, the .NET DocumentQuery API, or the database. See [step 2](#2-export-from-kentico-xperience-13-and-older). |
| Kentico 12 and 11 | Out of support (12: end of 2022 for MVC, end of 2023 for Portal Engine; 11: November 30, 2021). | Same as Xperience 13 for page content. |
| Kontent.ai (formerly Kentico Kontent) | A separate product and company | Use its own export tools, such as the [data-ops CLI](https://github.com/kontent-ai/data-ops). This guide doesn't cover it. |

Support dates are from Kentico's [support lifecycle](https://kentico.com/services/support/support-lifecycle) and [support policy](https://docs.kentico.com/developers-and-admins/installation/support-policy) pages.

## 1. Inventory the site

Record, from the Kentico admin and the database:

- **Page types or content types**, and how many pages or items each has. Mark which ones are lists of structured content (articles, products, people) and which are one-off pages.
- **Fields** on each type, and which ones are actually populated.
- **Reusable content** in the Content hub (Xperience by Kentico), and which pages reference it.
- **Page Builder widgets and sections** in use, and how many pages use each. A widget type used on only one or two pages may not need its own component.
- **Linked pages** (Xperience 13 and older): pages that appear in several places in the tree but are one page.
- **Media**: media libraries, page attachments, and content item assets (Xperience by Kentico).
- **Categories or taxonomies**, and which content uses them.
- **Cultures or languages**, if the site is multilingual.
- **Every public URL**: current URLs, alternative URLs, former URLs, the site's sitemap and your analytics. See [step 8](#8-urls-and-redirects).

Also list what isn't content: forms and their submissions, contacts and marketing data, and any commerce data. They stay in Kentico for the record, or move to whichever system will own them, such as a form provider or your CRM.

## 2. Export from Kentico Xperience 13 and older

### The REST service

The built-in REST service runs on the admin application at `/rest`. Turn it on under **Settings > Integration > REST**, where you also choose whether it serves pages, objects or both, and whether it is read-only. Use read-only for an export.

| Request | Returns |
| --- | --- |
| `GET /rest/content/currentsite/{culture}/document/{alias path}` | One page |
| `GET /rest/content/currentsite/{culture}/all/{alias path}` | A page and every page below it |
| `GET /rest/content/currentsite/{culture}/childrenof/{alias path}` | The pages directly below a page |
| `GET /rest/{object type}/...` | Non-page objects, such as categories |

What to know before you script it:

- **Ask for JSON.** Output is XML unless you add `format=json`.
- **Published or latest.** By default you get published content. Add `version=last` and `selectonlypublished=false` to include unpublished pages and the latest drafts. Decide which you are migrating and tell content owners.
- **One culture per request.** Request each culture separately, and record which culture each response is for.

See Kentico's [REST service documentation](https://docs.kentico.com/13/integrating-3rd-party-systems/xperience-rest-service/getting-data-using-rest).

### Other export options

| Option | What you get | Use it when |
| --- | --- | --- |
| [DocumentQuery and ObjectQuery](https://docs.kentico.com/13/custom-development/working-with-pages-in-the-api) (.NET) | Pages (`PublishedVersion` or `LatestVersion`) and other objects, through Kentico's own API | You want to write the export in C#, for example a console app that references the site's Kentico packages. |
| A database read | Everything, including widget layouts | You need Page Builder data or values the REST service doesn't return. Read from a copy of the database. |
| Kentico export packages | A zip for importing into another Kentico site | Not useful here. The package is a Kentico-to-Kentico format. |

If you read the database, Kentico documents the [page tables](https://docs.kentico.com/13/custom-development/working-with-pages-in-the-api/page-database-structure):

- `CMS_Tree` has one row per page, whatever the number of cultures.
- `CMS_Document` has one row per page per culture. Its `DocumentPageBuilderWidgets` column holds the page's Page Builder widgets as JSON.
- Each page type has its own table, for example `DancingGoat_Article`, with one row per page per culture.
- `View_CMS_Tree_Joined` joins the common columns of the tree and document tables.
- `CMS_Attachment` holds attachments stored in the database, and `CMS_Relationship` holds references made with Pages fields.

## 3. Export from Xperience by Kentico

### The headless GraphQL API

Each headless channel has its own GraphQL endpoint, `https://{your domain}/graphql/{channel GUID}`, authenticated with `Authorization: Bearer {API key}`. What to know:

- **It needs the Advanced license tier.**
- **It is read-only and pages at 100.** The largest `take` is 100, so page through every query.
- **Linked items are nested 5 levels deep by default.** Kentico's `MaxFieldCycleDepth` setting changes this.
- **Some content isn't returned:** content items that require authentication, custom data types and smart folder fields.
- **It serves headless channel content.** Fields of website channel pages are reachable only through linked fields, so for a website channel, use the .NET API or the database.

See Kentico's [headless content retrieval documentation](https://docs.kentico.com/developers-and-admins/development/content-retrieval/retrieve-headless-content).

### Other export options

| Option | What you get | Use it when |
| --- | --- | --- |
| [ContentRetriever](https://docs.kentico.com/developers-and-admins/development/content-retrieval/retrieve-content-items) and [ContentItemQueryBuilder](https://docs.kentico.com/developers-and-admins/api/content-item-api/reference-content-item-query) (.NET) | Website pages and reusable content items, through Kentico's own API | You are exporting a website channel, or want the export in C#. |
| A database read | Everything, including widget layouts | You need Page Builder data. Read from a copy of the database. |
| [Continuous Integration](https://docs.kentico.com/developers-and-admins/ci-cd/continuous-integration) files | Supported objects serialized as XML in `App_Data\CIRepository` | You already use CI and want to read the model from files. |

Kentico documents the [content item tables](https://docs.kentico.com/developers-and-admins/api/content-item-api/content-item-database-structure):

- `CMS_ContentItem` has one row per content item, with its content type and whether it is reusable.
- `CMS_ContentItemCommonData` has one row per item per language. Its `ContentItemCommonDataVisualBuilderWidgets` column holds the Page Builder widgets as JSON.
- Each content type has its own table, named like `DancingGoat_Coffee`.
- `CMS_ContentItemReference` holds references between items.
- `CMS_WebPageItem` holds each page's place in the content tree, and `CMS_WebPageUrlPath` its URL path per language.

### The Kentico Migration Tool as a reference

Kentico's open-source [migration tool](https://github.com/Kentico/xperience-by-kentico-kentico-migration-tool) moves Xperience 13, 12 and 11 sites into Xperience by Kentico. You don't need it to move to Agility, but its [list of supported data](https://github.com/Kentico/xperience-by-kentico-kentico-migration-tool/blob/master/docs/Supported-Data.md) is a clear map of where Kentico stores pages, widgets, attachments, categories, URLs and cultures. Read it before you write your own export.

## 4. Map to Agility

| Kentico | Agility | Notes |
| --- | --- | --- |
| Page type or content type for structured content (articles, products, people) | Content model plus a list container, and a dynamic page for each item's URL | See [Generating Dynamic Pages From Content](/docs/editors/generating-dynamic-pages-from-content). |
| Pages in the content tree that are one-off pages | Pages in the sitemap, built from a [page model](/docs/developers/page-models) and components | The tree becomes the sitemap. |
| Reusable content items (Content hub) | Content models and shared lists, referenced with linked content | |
| Page Builder widgets | [Component models](/docs/developers/component-models) placed in zones | Aim for a small set of components editors can understand, not one per widget type. Widget properties become component fields. |
| Page Builder sections and editable areas | Page model zones, and layout choices in your front end | Sections are layout. Keep only the choices editors really make. |
| Pages fields and content item references | Linked Content | |
| Linked pages | One content item shown in several places, or one page plus redirects | Agility has one item per piece of content, so pick a canonical URL. |
| Categories or taxonomies | A content model and list, such as `Category` or `Tag` | Fields that reference them become Linked Content. A small fixed set can be a Drop-down List instead. |
| Media libraries, attachments and content item assets | The Agility media library | Upload the file, then reference the returned `cdn.aglty.io` URL from an Image or File field. |
| Cultures or languages | Agility locales | See [step 6](#6-languages). |
| Forms | A form provider or your CRM | Rebuild forms in the tool that will receive submissions. |

For field types, map each Kentico field by what it holds: short text to Text, long or rich text to HTML, numbers to Number or Decimal, dates to Date/Time, a yes/no value to True/False, files to Image or File, and references to Linked Content. See [Fields](/docs/developers/fields) and [Linked Content Field Types](/docs/developers/linked-content-field-types). A linked-content field stores its selection in two companion fields, `_ValueField` (the linked item's content ID) and `_TextField`. Read back an item you set by hand in the editor and copy that shape.

## 5. Clean up text fields

Rich text from Kentico needs some work before it belongs on the new site:

- **Replace media links.** Media library files are usually linked by a permanent URL, `~/getmedia/{GUID}/{file name}`. Look up each GUID in your media export, upload the file to the Agility media library, and rewrite the link to its `cdn.aglty.io` URL. Libraries can also use direct paths to the file, so look for those too.
- **Replace attachment links.** Page attachments are linked as `~/getattachment/{GUID}/{file name}`. Treat them the same way.
- **Resolve macros.** Kentico macros are written `{% ... %}` and are evaluated when a page renders. Agility stores text as written, so replace each macro with the value it produced, or remove it.
- **Rewrite internal links.** Point links to other pages at the new page paths, so readers don't go through a redirect.
- **Strip leftovers.** Remove wrapper `div`s, inline styles and classes that only the old site used. Keep headings, lists, links and tables.

[Legacy Content Migration](/docs/developers/legacy-content-migration) covers parsing HTML into structured fields.

## 6. Languages

Kentico stores a row per page per culture: in `CMS_Document` and the page type's table in Xperience 13, and in `CMS_ContentItemCommonData` in Xperience by Kentico. URLs are per language too.

In Agility, the same content item has the **same content ID in every locale**. Create each item in your main locale, record its content ID, then save the same content ID in each other locale. See [Creating Content and Pages in Other Locales](/docs/developers/creating-content-and-pages-in-other-locales).

Build the URL map per language, and limit each redirect to its locale where the languages use different URL prefixes.

## 7. Import into Agility

Import in dependency order, keeping a map from Kentico GUID or ID to Agility content ID, page ID or asset URL:

1. Media library files, attachments and assets, uploaded to the media library.
2. Categories or taxonomy terms, and authors.
3. Reusable content items and other shared items.
4. Content items for structured page types.
5. Pages, then the components on each page, built from the widget JSON.

Store the Kentico GUID in a `SourceID` Text field so re-runs update items instead of duplicating them. Use the Management SDK, saving in sequential batches and checking every result, as shown in [Migrating Content into Agility with an AI Agent](/docs/developers/migrating-content-with-an-ai-agent#step-5-scale-up-with-a-management-sdk-script). Pages are created with the SDK's page methods; see [Pages](/docs/javascript/management-sdk/pages). An AI agent with the Agility MCP Server is a fast way to read a sample of the export, propose models and import 10 to 20 items into Staging for review first. Throughput guidance is in [Migrating to Agility](/docs/developers/migrating-to-agility#throughput-batches-limits-and-tokens).

## 8. URLs and redirects

Kentico sites keep a record of URL history, so use it:

- **List every URL.** Collect each page's current URL per language, its alternative URLs, the site's sitemap and your analytics.
- **Include former URLs.** In Xperience 13, Kentico records a former URL when a page moves, or when its slug changes and the page is published. They are listed in the **Former URLs** application. Point each one at the final new URL, so there are no redirect chains.
- **Keep paths where you can.** If URLs follow a pattern such as `/blog/{slug}`, rebuild that structure with a dynamic page and import the slug.
- **Cover old media URLs.** If people link to files by their `~/getmedia/` URLs, add redirects for the important ones.
- **Load redirects** for every URL that changes into Agility's [URL Redirections](/docs/editors/url-redirections), with a file import or the Management API, which takes up to 250 redirects per call. Your front end applies them.
- **Freeze, sync and switch** using the [Migration Cutover Runbook](/docs/developers/migration-cutover-runbook). For the final sync, re-export the items changed since your last full run.

For the SEO side, including titles, meta descriptions and sitemaps, follow [Keep Your Search Rankings Through a Migration](/docs/developers/keep-search-rankings-through-a-migration).

## Checklist

- [ ] Every page type, content type, widget type and category set has a decision: model, component, list or leave.
- [ ] The export covered every culture and paged through every query to the end.
- [ ] Counts in Agility match the export for each type, minus anything skipped on purpose.
- [ ] No text field still contains `~/getmedia/`, `~/getattachment/` or `{%` macros.
- [ ] Each locale has the right values, with the same content ID across locales.
- [ ] Every changed URL, including former URLs, has a 301 redirect to its final destination.

## Related

- [Migrating to Agility](/docs/developers/migrating-to-agility)
- [Migrating Content into Agility with an AI Agent](/docs/developers/migrating-content-with-an-ai-agent)
- [Migrate from Sitecore to Agility](/docs/developers/migrate-from-sitecore)
- [Legacy Content Migration](/docs/developers/legacy-content-migration)
- [Migration Cutover Runbook](/docs/developers/migration-cutover-runbook)
- [Keep Your Search Rankings Through a Migration](/docs/developers/keep-search-rankings-through-a-migration)
- Kentico: [Xperience 13 documentation](https://docs.kentico.com/13/), [Xperience by Kentico documentation](https://docs.kentico.com/), [Migration tool](https://github.com/Kentico/xperience-by-kentico-kentico-migration-tool)

---

## Related pages

- [Migrating to Agility](https://agilitycms.com/docs/developers/migrating-to-agility.md)
- [Migrate from WordPress to Agility](https://agilitycms.com/docs/developers/migrate-from-wordpress.md)
- [Migrate from Contentful to Agility](https://agilitycms.com/docs/developers/migrate-from-contentful.md)
- [Migrate from Sitecore to Agility](https://agilitycms.com/docs/developers/migrate-from-sitecore.md)
- [Migration Cutover Runbook](https://agilitycms.com/docs/developers/migration-cutover-runbook.md)
- [Keep Your Search Rankings Through a Migration](https://agilitycms.com/docs/developers/keep-search-rankings-through-a-migration.md)
- [Migrate from SharePoint or Power Pages to Agility](https://agilitycms.com/docs/developers/migrate-from-sharepoint-and-power-pages.md)
- [Migrate from Drupal to Agility](https://agilitycms.com/docs/developers/migrate-from-drupal.md)

Index of every docs page: https://agilitycms.com/docs/llms.txt
