---
title: Configure content providers
slug: cms-11/dev-docs/configuring-content-providers
createdAt: 2026-07-22T19:45:17.341Z
---

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 different content provider instances registered, each with its own configuration data set, such as capabilities settings and so on.

You can register a content provider with CMS through `ContentOptions.Providers` or the `EPiServer.Core.IContentProviderManager` API interface or through, 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 in `web.config`. You can add attributes for the content provider type, which are passed into the provider instance when the instance is initialized. To register the content provider in `web.config`, add an entry to the configuration element `contentProvider` as shown in the following example:

```xml
<episerver>
  ...
  <contentProvider>
    <providers>
      <add name="custom"
           type="CustomServer.PageStore, Custom"
           entryPoint="52"
           capabilities="Create,Edit,Delete,Search,Wastebasket"/>
    </providers>
  </contentProvider>
  ...
</episerver>
```

Some attributes are mandatory (name, type) while others are optional  (`entryPoint`, `capabilities`, `iconPath`, `wastebasketName`).

- `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 appear 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 content. This capability implies that the class should implement the `Save` method.
- `Delete` – Removes (deletes) 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 move 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 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 is based on `System.Configuration.Provider.ProviderBase` and resides in `EPiServer.dll` assembly.

Use the `EPiServer.Construction.ContentFactory` 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 to be included in the search. To searching 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 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 on all custom content providers

The following example shows how to search on all 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. CMS does not index (and therefore does not search) content served by custom content providers.
:::

CMS uses a remote page provider to integrate the content between two installations. Pages appear as any local page even when they are managed by a separate installation.
