---
title: Content Metadata properties
slug: cms-11/dev-docs/content-metadata-properties
docTags: 
createdAt: 2026-07-22T19:45:20.632Z
---

`EPiServer.Core.IContentData` is the base interface that content models implement. All content types, except `BlockData`, also implement the `EPiServer.Core.IContent` interface; the interface is required for a content instance to have a unique ID and its own lifecycle (that is, it can be loaded or saved individually). Through the `EPiServer.IContentRepository`, you can perform CRUD (Create, Read, Update, Delete) operations on content instances implementing `EPiServer.Core.IContent`, for example, listing and move.

There are also many additional metadata interfaces a content type can implement that define its characteristics. Here is a list of the existing metadata interfaces, with a description of each interface's purpose and which properties it contains.

## Usage

Because some of the interfaces are optional, a recommended pattern when working with a "general" `IContent` instance is to use the **is** or **as** operators to check if the instance implements an interface, as in this example:

```csharp
public static CultureInfo Language(this IContent content) {
  if (content == null) throw new ArgumentNullException(nameof(content));
  return (content is ILocale locale) ? locale.Language : CultureInfo.InvariantCulture;
}

public static bool IsModified(this IContent content) {
  if (content == null) throw new ArgumentNullException(nameof(content));
  var modifiedTrackable = content as IModifiedTrackable;
  return modifiedTrackable == null || modifiedTrackable.IsModified;
}
```

### Shared blocks

`BlockData` does not implement `IContent`, while shared block instances still have their own identity defined on `IContent`. This is accomplished so that during runtime, when a shared block instance is created (for example, through a call to `IContentRepository.GetDefault<T>` where T is a type inheriting from `BlockData`), the CMS creates a new .NET type inheriting T using a technique called **mixin** where the newly generated subclass will implement some extra interfaces (including `IContent`).

That means that a shared block instance of T will implement `IContent` while an instance of T that is a property on a Page will not.

## IContentData

Base interface for content models. It contains a backing `PropertyDataCollection` that is used when loading or saving data from the database.

| Member     | Type                     | Description                                                        |
| ---------- | ------------------------ | ------------------------------------------------------------------ |
| `Property` | `PropertyDataCollection` | Contains backing data for properties used by the content instance. |

## IContent

You can individually load or save base interfaces for content models with an identity. `IContent` inherits `IContentData`. Note that `ContentLink.ID` and `ContentGuid` is the same for language branches for a content item. So the combination of `ContentLink` or `ContentGuid` and `ILocale.Language` uniquely specifies the content instance (given that the content implements `ILocalizable`). Built-in base content types, (except `BlockData`), implement `IContent`. Shared block instances implement `IContent` (and most other metadata interfaces) at runtime.

| Member          | Type                     | Description                                                                                                                     |
| --------------- | ------------------------ | ------------------------------------------------------------------------------------------------------------------------------- |
| `Name`          | `string`                 | The name of the content instance.                                                                                               |
| `ContentLink`   | `ContentReference`       | The identifier of the content instance. If the instance represents a specific version, WorkID specifies an optional version ID. |
| `ContentGuid`   | `Guid`                   | A GUID-based identifier for the content instance.                                                                               |
| `ParentLink`    | `ContentReference`       | The parent identifier (in a tree structure) for the content instance.                                                           |
| `ContentTypeID` | `int`                    | An identifier that specifies which content type the content is an instance of.                                                  |
| `IsDeleted`     | `bool`                   | Indicates if the content instance is in the wastebasket.                                                                        |
| `Property`      | `PropertyDataCollection` | Inherited from `IContentData`.                                                                                                  |

## IVersionable

An optional interface for content that supports different versions for each language branch. There can only be at most one version published at each time. All built-in types, except `ContentFolder`, implement `IVersionable`. See [Content versions](docId\:j8EP3IlASieAMVfQu5NT1) for information regarding versions.

| Member             | Type            | Description                                                                  |
| ------------------ | --------------- | ---------------------------------------------------------------------------- |
| `Status`           | `VersionStatus` | Specifies the status of the content version.                                 |
| `IsPendingPublish` | `bool`          | Specifies if there is any published version for the current language branch. |
| `StartPublish`     | `DateTime?`     | Optional value that specifies when the content is/was published.             |
| `StopPublish`      | `DateTime?`     | Optional value that specifies when the content is/was depublished.           |

## ILocale

An optional interface for content that specifies which language a specific content instance has. All built-in types except `ContentFolder` implements `ILocale`.

| Member     | Type          | Description                                                                                                                           |
| ---------- | ------------- | ------------------------------------------------------------------------------------------------------------------------------------- |
| `Language` | `CultureInfo` | Specifies the language of a content instance. `CultureInfo.InvariantCulture` means that the content instance is not culture-specific. |

## ILocalizable

An optional interface for content that support multiple language branches. Inherits `ILocale`. Built-in types, (except `ContentFolder` and `MediaData`), implement `ILocalizable`.

| Member              | Type                       | Description                                                                           |
| ------------------- | -------------------------- | ------------------------------------------------------------------------------------- |
| `Language`          | `CultureInfo`              | Inherits from `ILocale`.                                                              |
| `MasterLanguage`    | `CultureInfo`              | Specifies which language version that contains the none language-specific properties. |
| `ExistingLanguages` | `IEnumerable<CultureInfo>` | Specifies existing language branches for this content.                                |

## IReadOnly and IReadOnly`<T>`

An optional interface for content that support read-only instances. It is highly recommended that content types implement `IReadOnly`, which ensures the integrity of the content instances when instances are served from the cache and hence reused across different requests. Built-in base content classes implement `IReadOnly`.

| Member                           | Type     | Description                                         |
| -------------------------------- | -------- | --------------------------------------------------- |
| `IsReadOnly`                     | `bool`   | Specifies if the current instance is read-only.     |
| `void MakeReadOnly()`            | `Method` | Makes an instance read-only.                        |
| `object/T CreateWritableClone()` | `Method` | Creates a writable clone from a read-only instance. |

## IModifiedTrackable

An optional interface for content instances that support modified tracking. There is a high-performance gain during save operations if you use `IModifiedTrackable` because only data that has actually changed needs to be persisted. Built-in base content classes implement `IModifiedTrackable`.

| Member                 | Type     | Description                                        |
| ---------------------- | -------- | -------------------------------------------------- |
| `IsModified`           | `bool`   | Specifies it the current instance is modified.     |
| `void ResetModified()` | `Method` | Sets the content instance in a non-modified state. |

## IChangeTrackable

An optional interface for content instances that support tracking of changes. Built-in base content classes implement `IChangeTrackable`.

| Member                 | Type     | Description                                        |
| ---------------------- | -------- | -------------------------------------------------- |
| `IsModified`           | `bool`   | Specifies if the current instance is modified.     |
| `void ResetModified()` | `Method` | Sets the content instance in a non-modified state. |

## IContentSecurable

An optional interface for content instances that support access checks. Built-in base content classes implement `IContentSecurable`.

| Member                                                      | Type     | Description                                                                               |
| ----------------------------------------------------------- | -------- | ----------------------------------------------------------------------------------------- |
| `IContentSecurityDescriptor GetContentSecurityDescriptor()` | `Method` | Gets the security descriptor for the content instance where access rights can be checked. |

## IRoutable

An interface that content items that should be routable through a content URL should implement. Built-in base content classes, except shared blocks, implement `IRoutable`.

| Member         | Type     | Description                                                                                        |
| -------------- | -------- | -------------------------------------------------------------------------------------------------- |
| `RouteSegment` | `string` | Specifies the route segment that is used for the content instance in the hierarchical content url. |

## ICategorizable

An interface that content items that should be possible to categorize should implement. Built-in base content classes, except content folders, implement `ICategorizable`.

| Member     | Type           | Description                                                            |
| ---------- | -------------- | ---------------------------------------------------------------------- |
| `Category` | `CategoryList` | A list of all categories that this content instance is categorized as. |

## IInitializableContent

If you should add default values when you create an instance of the content type, you can optionally implement the  `IInitializableContent` interface for content items.

| Member                                           | Type     | Description                                                |
| ------------------------------------------------ | -------- | ---------------------------------------------------------- |
| `void SetDefaultValues(ContentType contentType)` | `Method` | Called when a new instance of the content type is created. |

## IExportable

An optional interface that specifies how a content instance should be handled during export.

| Member                       | Type   | Description                                                                                                               |
| ---------------------------- | ------ | ------------------------------------------------------------------------------------------------------------------------- |
| `ShouldBeImplicitlyExported` | `bool` | Specifies whether this instance should be implicitly added to the export package when referenced by some exported entity. |
