---
title: Configure content providers
slug: cms-12/docs/configuring-content-providers
docTags: 
createdAt: 2026-08-10T15:56:04.000Z
---

A content provider is a module that, when registered with Optimizely Content Management System (CMS), can serve the site with external data as `IContent` objects (for example `PageData` instances). A CMS site can have several registered content provider instances, each with its configuration data set, such as capabilities settings.

You can register a content provider with CMS through `ContentOptions.Providers` or the `EPiServer.Core.IContentProviderManager` API interface, which is located through the IOC container.

:::hint{type="info"}
**Note**
A custom content provider cannot deliver the start page, root page, and waste basket (recycle bin, trash).
:::

You configure content providers when register them. You can add attributes for the content provider type, which are passed into the provider instance when the instance is initialized. Following is an example of how to register a custom content provider with configuration values for the provider:

```csharp
services.Configure<ContentOptions>(o => o.AddProvider<XmlContentProvider>("xml", config => {
    config[ContentProviderParameter.EntryPoint] = _configuration.GetValue<string>(ContentProviderParameter.EntryPoint);
    config[ContentProviderParameter.Capabilities] = ContentProviderParameter.FullProviderCapability;
    config["someConfigKey"] = "someConfigValue";
}));
```

The type of the provider and the name are required. There are some built-in optional configuration values like  (`entryPoint`, `capabilities`, `iconPath`, `wastebasketName`). Then a specific content provider might have its configuration values.

- `entryPoint` – Specifies which existing page in CMS is the root for the content served by the content provider instance. The given `entryPoint` must not have any existing children in CMS. If the content provider does not give an entry point, it does not display in the `PageTree` in edit view.
- `iconPath` – Displays a custom icon in the page tree for each page served by the provider instance. The given path should be a relative path to the folder `\\Images\\ExplorerTree\\PageTree\` in the themes folder. For example, if you place an image named `_custom.gif` in `App\_Themes\\Default\\Images\\ExplorerTree\\PageTree`, the value of the `iconPath` attribute is `_custom.gif`.
- `wastebasketName` – The name of the content provider's Recycle Bin. If not given, the Recycle Bin has the same name as the registered provider.

You can specify the following capabilities if the provider instance supports it. You can specify multiple capabilities with a comma-separated list.

- `Create` – Creates content. This capability implies that the class should implement the `Save` method.
- `Edit` – Edits existing content. This capability implies that the class should implement the `Save` method.
- `Delete` – Removes (deletes) existing content. This capability implies that the class should implement the `Delete` and `DeleteChildren` methods
- `Copy` – Replicates content internally within the content served by the content provider. To support copy between providers, the capability to support is `Create`. The Copy capability implies that the class should implement the `Copy` method.
- `Move` – Moves content internally within the content served by the content provider. To support moves between providers, the capability to support is `Create` and `Delete`. The `Move` capability implies that the class should implement the `Move` method.

:::hint{type="info"}
**Note**
Moving content between content providers requires that the user has permission for the function: "Move between page providers".
:::

- `MultiLanguage` – Supports multiple language versions. This capability implies that the class should implement the `DeleteLanguageBranch` method and that the implementation of `Save` handles multiple languages. It also should take passed-in `ILanguageSelector` in consideration when serving content.
- `Search` – Looks within the properties for the content served by the provider. This capability implies that the class should implement `FindPagesWithCriteria` if it implements `IPageCriteriaQueryService` and if it inherits `ContentProvider`.
- `Security` – Checks access for content delivered by the provider (through calls to `ISecurable` interface on the `IContent` instance). For providers that have an `entryPoint` and is not supporting Security capability, the access check is performed on the page that was specified as the `entryPoint` for the provider. Pages served by the provider instance inherit the access control list (ACL) from the `entryPoint` page. If the content instance does not implement `ISecurable` and has no `entryPoint`, no access check is performed.
- `Wastebasket` – Moves content served by the provider to the wastebasket. This capability implies that the class should implement `MoveToWastebasket`. If the provider does not support `Movebasket` but supports `Delete`, then you can delete content but not move it to a wastebasket.

## Use ContentProvider for implementation

Each class registered as a content provider must inherit the `EPiServer.Core.ContentProvider` base class, which resides in `EPiServer.dll` assembly.

Use the `EPiServer.Construction.IContentFactory` class to create `IContent` instances.

## Search one or more content provider instances

If you want a content provider instance to be searchable, you must register it with the Search capability, and the registered class must implement `FindPagesWithCriteria` if it implements `IPageCriteriaQueryService` and if it inherits `ContentProvider`.

The following example shows how to call `FindPagesWithCriteria`, depending on which content providers are included in the search. To search on one or more custom content  providers, add a `PropertyCriteria` for each custom content provider to `PropertyCriteriaCollection`. Then, name the property `EPI:MultipleSearch` and the value to the name of the custom content provider.

```csharp
PropertyCriteriaCollection crits = new PropertyCriteriaCollection();
PropertyCriteria crit = new PropertyCriteria();
crit.Name = "EPI:MultipleSearch";
crit.Value = "CustomKey";
crits.Add(crit);
ServiceLocator.Current.GetInstance<IPageCriteriaQueryService>().FindPagesWithCriteria(customPageRef, crits);
```

## Search custom content providers

The following example shows how to search custom content providers, by defining only one `PropertyCriteria` and naming it `EPI:MultipleSearch` with the value "\*".

```csharp
PropertyCriteriaCollection crits = new PropertyCriteriaCollection();
PropertyCriteria crit = new PropertyCriteria();
crit.Name = "EPI:MultipleSearch";
crit.Value = "*";
crits.Add(crit);
ServiceLocator.Current.GetInstance<IPageCriteriaQueryService>().FindPagesWithCriteria(customPageRef, crits);
```

## Search on default content providers

If you do not specify `PropertyCriteria` with the name `EPI:MultipleSearch`, search occurs on the default content provider, typically serving content from the CMS database.

:::hint{type="info"}
**Note**
Only the default content provider has a full text search implemented. Optimizely does not index (and therefore does not search) content served by custom content providers.
:::
