diff --git a/core/modules/jsonapi/src/ResourceType/ResourceTypeBuildEvent.php b/core/modules/jsonapi/src/ResourceType/ResourceTypeBuildEvent.php
index 62868006a8..b56210ed0a 100644
--- a/core/modules/jsonapi/src/ResourceType/ResourceTypeBuildEvent.php
+++ b/core/modules/jsonapi/src/ResourceType/ResourceTypeBuildEvent.php
@@ -2,6 +2,7 @@
 
 namespace Drupal\jsonapi\ResourceType;
 
+use Drupal\Component\Assertion\Inspector;
 use Symfony\Component\EventDispatcher\Event;
 
 /**
@@ -19,6 +20,13 @@ class ResourceTypeBuildEvent extends Event {
    */
   protected $resourceTypeName;
 
+  /**
+   * The fields of the resource type to be built.
+   *
+   * @var array|\Drupal\jsonapi\ResourceType\ResourceTypeField[]
+   */
+  protected $fields;
+
   /**
    * Whether the JSON:API resource type to be built should be disabled.
    *
@@ -31,9 +39,13 @@ class ResourceTypeBuildEvent extends Event {
    *
    * @param string $resource_type_name
    *   A JSON:API resource type name.
+   * @param \Drupal\jsonapi\ResourceType\ResourceTypeField[] $fields
+   *   The fields of the resource type to be built.
    */
-  protected function __construct($resource_type_name) {
+  protected function __construct($resource_type_name, array $fields) {
+    assert(Inspector::assertAllObjects($fields, ResourceTypeField::class));
     $this->resourceTypeName = $resource_type_name;
+    $this->fields = $fields;
   }
 
   /**
@@ -41,12 +53,14 @@ protected function __construct($resource_type_name) {
    *
    * @param string $resource_type_name
    *   A JSON:API resource type name.
+   * @param \Drupal\jsonapi\ResourceType\ResourceTypeField[] $fields
+   *   The fields of the resource type to be built.
    *
    * @return \Drupal\jsonapi\ResourceType\ResourceTypeBuildEvent
    *   A new event.
    */
-  public static function create($resource_type_name) {
-    return new static($resource_type_name);
+  public static function create($resource_type_name, array $fields) {
+    return new static($resource_type_name, $fields);
   }
 
   /**
@@ -76,4 +90,43 @@ public function resourceTypeShouldBeDisabled() {
     return $this->disabled;
   }
 
+  /**
+   * Gets the current fields of the resource type to be built.
+   */
+  public function getFields() {
+    return $this->fields;
+  }
+
+  /**
+   * Sets the public name of the given field on the resource type to be built.
+   *
+   * @param \Drupal\jsonapi\ResourceType\ResourceTypeField $field
+   *   The field for which to set a public name.
+   * @param string $public_field_name
+   *   The public field name to set.
+   */
+  public function setPublicFieldName(ResourceTypeField $field, $public_field_name) {
+    foreach ($this->fields as $index => $value) {
+      if ($field === $value) {
+        $this->fields[$index] = $value->withPublicName($public_field_name);
+        return;
+      }
+    }
+  }
+
+  /**
+   * Sets the public name of the given field on the resource type to be built.
+   *
+   * @param \Drupal\jsonapi\ResourceType\ResourceTypeField $field
+   *   The field for which to set a public name.
+   */
+  public function disableField(ResourceTypeField $field) {
+    foreach ($this->fields as $index => $value) {
+      if ($field === $value) {
+        $this->fields[$index] = $value->disabled();
+        return;
+      }
+    }
+  }
+
 }
diff --git a/core/modules/jsonapi/src/ResourceType/ResourceTypeField.php b/core/modules/jsonapi/src/ResourceType/ResourceTypeField.php
index 76e35dbcc0..987f496384 100644
--- a/core/modules/jsonapi/src/ResourceType/ResourceTypeField.php
+++ b/core/modules/jsonapi/src/ResourceType/ResourceTypeField.php
@@ -95,6 +95,16 @@ public function withPublicName($public_name) {
     return new static($this->internalName, $public_name, $this->enabled, $this->hasOne);
   }
 
+  /**
+   * Gets a new instance of the field that is disabled.
+   *
+   * @return static
+   *   A new instance of the field that is disabled.
+   */
+  public function disabled() {
+    return new static($this->internalName, $this->publicName, FALSE, $this->hasOne);
+  }
+
   /**
    * Whether the field is enabled.
    *
diff --git a/core/modules/jsonapi/src/ResourceType/ResourceTypeRelationship.php b/core/modules/jsonapi/src/ResourceType/ResourceTypeRelationship.php
index e62203ca2f..8e782a527c 100644
--- a/core/modules/jsonapi/src/ResourceType/ResourceTypeRelationship.php
+++ b/core/modules/jsonapi/src/ResourceType/ResourceTypeRelationship.php
@@ -60,4 +60,14 @@ public function withPublicName($public_name) {
       : $relationship;
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function disabled() {
+    $relationship = parent::disabled();
+    return isset($this->relatableResourceTypes)
+      ? $relationship->withRelatableResourceTypes($this->relatableResourceTypes)
+      : $relationship;
+  }
+
 }
diff --git a/core/modules/jsonapi/src/ResourceType/ResourceTypeRepository.php b/core/modules/jsonapi/src/ResourceType/ResourceTypeRepository.php
index ebe0ebac57..524a9c208c 100644
--- a/core/modules/jsonapi/src/ResourceType/ResourceTypeRepository.php
+++ b/core/modules/jsonapi/src/ResourceType/ResourceTypeRepository.php
@@ -150,7 +150,7 @@ public function all() {
    */
   protected function createResourceType(EntityTypeInterface $entity_type, $bundle) {
     $raw_fields = $this->getAllFieldNames($entity_type, $bundle);
-    $event = ResourceTypeBuildEvent::create(sprintf('%s--%s', $entity_type->id(), $bundle));
+    $event = ResourceTypeBuildEvent::create(sprintf('%s--%s', $entity_type->id(), $bundle), static::getFields($raw_fields, $entity_type, $bundle));
     $this->eventDispatcher->dispatch(ResourceTypeBuildEvents::BUILD, $event);
     return new ResourceType(
       $entity_type->id(),
@@ -160,7 +160,7 @@ protected function createResourceType(EntityTypeInterface $entity_type, $bundle)
       static::isLocatableResourceType($entity_type, $bundle),
       static::isMutableResourceType($entity_type, $bundle),
       static::isVersionableResourceType($entity_type),
-      static::getFields($raw_fields, $entity_type, $bundle)
+      $event->getFields()
     );
   }
 
