---
title: Content Metadata properties
slug: cms-12/docs/content-metadata-properties
docTags: 
createdAt: 2026-08-10T15:55:53.000Z
---

`EPiServer.Core.IContentData` is the base interface that all content models implement. All content types, except `BlockData`, also implement the `EPiServer.Core.IContent` 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 the characteristics of the content type. Here is a list of the existing metadata interfaces with a description of the purpose of each interface and which properties they contain.

## 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 Optimizely Content Management System (CMS) creates a .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.

- `Property` (`PropertyDataCollection`) – Contains backing data for properties used by the content instance.

## IContent

Base interface for all content models that can have an own identity, and hence can be loaded or saved individually. `IContent` inherits `IContentData`. Note that `ContentLink.ID` and `ContentGuid` is the same for all 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`). All built-in base content types, except `BlockData`, implement `IContent`. Shared block instances implement `IContent` (and most other metadata interfaces) at runtime.

- `Name` (`string`) – The name of the content instance.
- `ContentLink` (`ContentReference`) – The identifier of the content instance. WorkID specifies an optional version ID, in case the instance represents a specific version.
- `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 one version published at most at a time. Built-in types, except `ContentFolder`, implement `IVersionable`. See [Content versions](docId:9FeC2XeFaOZ3FnE_XLc4w).

- `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`.

- `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`. All built-in types, except `ContentFolder` and `MediaData`, implement `ILocalizable`.

- `Language` (`CultureInfo`) – Inherits from `ILocale`.
- `MasterLanguage` (`CultureInfo`) – Specifies which language version contains the non-language-specific properties.
- `ExistingLanguages` (`IEnumerable<CultureInfo>`) – Specifies all existing language branches for this content.

## IReadOnly/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. All built-in base content classes implement `IReadOnly`.

- `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 with `IModifiedTrackable` because then only data that has changed needs to be persisted. Built-in base content classes implement `IModifiedTrackable`.

- `IsModified` (`bool`) – Specifies if 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. All built-in base content classes implement `IChangeTrackable`.

- `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. All built-in base content classes implement `IContentSecurable`.

- `IContentSecurityDescriptor` and `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 be implemented. All built-in base content classes, except shared blocks, implement `IRoutable`.

- `RouteSegment` (`string`) – Specifies the route segment used in the hierarchical content URL for the content instance.

## ICategorizable

An interface with content items that you could categorize should be implemented. Built-in base content classes, except content folders, implement `ICategorizable`.

- `Category` (`CategoryList`)  – A list of all categories that this content instance is categorized as.

## IInitializableContent

An optional interface for content items you can implement should be added when you create an instance of the content type.

- `void SetDefaultValues(ContentType contentType)` (`Method`) – Called when an instance of the content type is created.

## IExportable

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

- `ShouldBeImplicitlyExported` (`bool`) – Specifies whether this instance should be implicitly added to the export package when referenced by some exported entity.
