diff --git a/modules/core_search_facets/src/Plugin/facets/facet_source/CoreNodeSearchFacetSource.php b/modules/core_search_facets/src/Plugin/facets/facet_source/CoreNodeSearchFacetSource.php
index c09d652..7bb815e 100644
--- a/modules/core_search_facets/src/Plugin/facets/facet_source/CoreNodeSearchFacetSource.php
+++ b/modules/core_search_facets/src/Plugin/facets/facet_source/CoreNodeSearchFacetSource.php
@@ -355,4 +355,11 @@ class CoreNodeSearchFacetSource extends FacetSourcePluginBase implements CoreSea
     return ['module' => ['node', 'search']];
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function getFieldDefinitions() {
+    // Get and return an array field definitions.
+  }
+
 }
diff --git a/src/FacetSource/FacetSourcePluginBase.php b/src/FacetSource/FacetSourcePluginBase.php
index 14317fb..f64f021 100644
--- a/src/FacetSource/FacetSourcePluginBase.php
+++ b/src/FacetSource/FacetSourcePluginBase.php
@@ -4,6 +4,7 @@ namespace Drupal\facets\FacetSource;
 
 use Drupal\Core\Plugin\PluginBase;
 use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
+use Drupal\facets\Exception\Exception;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 use Drupal\Facets\FacetInterface;
 use Drupal\Core\Form\FormStateInterface;
@@ -146,4 +147,15 @@ abstract class FacetSourcePluginBase extends PluginBase implements FacetSourcePl
     $this->facet->setFieldIdentifier($field_identifier);
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function getFieldDefinition($field_name) {
+    if (isset($this->getFieldDefinitions()[$field_name])) {
+      return $this->getFieldDefinitions()[$field_name];
+    }
+
+    throw new Exception("Field with name {$field_name} does not have a definition");
+  }
+
 }
diff --git a/src/FacetSource/FacetSourcePluginInterface.php b/src/FacetSource/FacetSourcePluginInterface.php
index 733ad79..1f52f2f 100644
--- a/src/FacetSource/FacetSourcePluginInterface.php
+++ b/src/FacetSource/FacetSourcePluginInterface.php
@@ -98,4 +98,18 @@ interface FacetSourcePluginInterface extends PluginFormInterface, DependentPlugi
    */
   public function getSearchKeys();
 
+  /**
+   * Returns the defined fields indexed on the facet source.
+   *
+   * @return \Drupal\Core\TypedData\DataDefinitionInterface[]
+   */
+  public function getFieldDefinitions();
+
+  /**
+   * Returns one defined field from the facet source.
+   *
+   * @return \Drupal\Core\TypedData\DataDefinitionInterface
+   */
+  public function getFieldDefinition($field_name);
+
 }
diff --git a/src/FacetSource/SearchApiFacetSourceInterface.php b/src/FacetSource/SearchApiFacetSourceInterface.php
index 3438cec..5633ef0 100644
--- a/src/FacetSource/SearchApiFacetSourceInterface.php
+++ b/src/FacetSource/SearchApiFacetSourceInterface.php
@@ -2,10 +2,12 @@
 
 namespace Drupal\facets\FacetSource;
 
+use Drupal\facets\FacetSourceInterface;
+
 /**
  * A facet source that uses Search API as a base.
  */
-interface SearchApiFacetSourceInterface {
+interface SearchApiFacetSourceInterface extends FacetSourceInterface {
 
   /**
    * Returns the search_api index.
diff --git a/src/Plugin/facets/facet_source/SearchApiDisplay.php b/src/Plugin/facets/facet_source/SearchApiDisplay.php
index f236f30..97ba970 100644
--- a/src/Plugin/facets/facet_source/SearchApiDisplay.php
+++ b/src/Plugin/facets/facet_source/SearchApiDisplay.php
@@ -321,4 +321,13 @@ class SearchApiDisplay extends FacetSourcePluginBase {
       ->createInstance($this->pluginDefinition['display_id']);
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function getFieldDefinitions() {
+    return array_map(function ($item) {
+      $item->getDataDefinition();
+    }, $this->getIndex()->getFields());
+  }
+
 }
