diff --git a/Redfish.md b/Redfish.md
index fb93efa..4e5a19b 100644
--- a/Redfish.md
+++ b/Redfish.md
@@ -880,6 +880,8 @@
 - Socket
 - SparePartNumber
 - Status
+- ThrottleCauses
+- Throttled
 - TotalCores
 - TotalThreads
 - Version
diff --git a/redfish-core/lib/processor.hpp b/redfish-core/lib/processor.hpp
index 19b059a..90938c9 100644
--- a/redfish-core/lib/processor.hpp
+++ b/redfish-core/lib/processor.hpp
@@ -19,6 +19,7 @@
 #include "dbus_singleton.hpp"
 #include "dbus_utility.hpp"
 #include "error_messages.hpp"
+#include "generated/enums/processor.hpp"
 #include "health.hpp"
 #include "query.hpp"
 #include "registries/privilege_registry.hpp"
@@ -292,6 +293,100 @@
         "org.freedesktop.DBus.ObjectManager", "GetManagedObjects");
 }
 
+/**
+ * @brief Translates throttle cause DBUS property to redfish.
+ *
+ * @param[in] dbusSource    The throttle cause from DBUS
+ *
+ * @return Returns as a string, the throttle cause in Redfish terms. If
+ * translation cannot be done, returns "Unknown" throttle reason.
+ */
+inline processor::ThrottleCause
+    dbusToRfThrottleCause(const std::string& dbusSource)
+{
+    if (dbusSource ==
+        "xyz.openbmc_project.Control.Power.Throttle.ThrottleReasons.ClockLimit")
+    {
+        return processor::ThrottleCause::ClockLimit;
+    }
+    if (dbusSource ==
+        "xyz.openbmc_project.Control.Power.Throttle.ThrottleReasons.ManagementDetectedFault")
+    {
+        return processor::ThrottleCause::ManagementDetectedFault;
+    }
+    if (dbusSource ==
+        "xyz.openbmc_project.Control.Power.Throttle.ThrottleReasons.PowerLimit")
+    {
+        return processor::ThrottleCause::PowerLimit;
+    }
+    if (dbusSource ==
+        "xyz.openbmc_project.Control.Power.Throttle.ThrottleReasons.ThermalLimit")
+    {
+        return processor::ThrottleCause::ThermalLimit;
+    }
+    if (dbusSource ==
+        "xyz.openbmc_project.Control.Power.Throttle.ThrottleReasons.Unknown")
+    {
+        return processor::ThrottleCause::Unknown;
+    }
+    return processor::ThrottleCause::Invalid;
+}
+
+inline void
+    readThrottleProperties(const std::shared_ptr<bmcweb::AsyncResp>& aResp,
+                           const boost::system::error_code& ec,
+                           const dbus::utility::DBusPropertiesMap& properties)
+{
+    if (ec)
+    {
+        BMCWEB_LOG_ERROR << "Processor Throttle getAllProperties error " << ec;
+        messages::internalError(aResp->res);
+        return;
+    }
+
+    const bool* status = nullptr;
+    const std::vector<std::string>* causes = nullptr;
+
+    if (!sdbusplus::unpackPropertiesNoThrow(dbus_utils::UnpackErrorPrinter(),
+                                            properties, "Throttled", status,
+                                            "ThrottleCauses", causes))
+    {
+        messages::internalError(aResp->res);
+        return;
+    }
+
+    aResp->res.jsonValue["Throttled"] = *status;
+    nlohmann::json::array_t rCauses;
+    for (const std::string& cause : *causes)
+    {
+        processor::ThrottleCause rfCause = dbusToRfThrottleCause(cause);
+        if (rfCause == processor::ThrottleCause::Invalid)
+        {
+            messages::internalError(aResp->res);
+            return;
+        }
+
+        rCauses.emplace_back(rfCause);
+    }
+    aResp->res.jsonValue["ThrottleCauses"] = std::move(rCauses);
+}
+
+inline void
+    getThrottleProperties(const std::shared_ptr<bmcweb::AsyncResp>& aResp,
+                          const std::string& service,
+                          const std::string& objectPath)
+{
+    BMCWEB_LOG_DEBUG << "Get processor throttle resources";
+
+    sdbusplus::asio::getAllProperties(
+        *crow::connections::systemBus, service, objectPath,
+        "xyz.openbmc_project.Control.Power.Throttle",
+        [aResp](const boost::system::error_code& ec,
+                const dbus::utility::DBusPropertiesMap& properties) {
+        readThrottleProperties(aResp, ec, properties);
+        });
+}
+
 inline void getCpuAssetData(std::shared_ptr<bmcweb::AsyncResp> aResp,
                             const std::string& service,
                             const std::string& objPath)
@@ -684,7 +779,7 @@
     BMCWEB_LOG_DEBUG << "Get available system processor resources.";
 
     // GetSubTree on all interfaces which provide info about a Processor
-    constexpr std::array<std::string_view, 8> interfaces = {
+    constexpr std::array<std::string_view, 9> interfaces = {
         "xyz.openbmc_project.Common.UUID",
         "xyz.openbmc_project.Inventory.Decorator.Asset",
         "xyz.openbmc_project.Inventory.Decorator.Revision",
@@ -692,7 +787,8 @@
         "xyz.openbmc_project.Inventory.Decorator.LocationCode",
         "xyz.openbmc_project.Inventory.Item.Accelerator",
         "xyz.openbmc_project.Control.Processor.CurrentOperatingConfig",
-        "xyz.openbmc_project.Inventory.Decorator.UniqueIdentifier"};
+        "xyz.openbmc_project.Inventory.Decorator.UniqueIdentifier",
+        "xyz.openbmc_project.Control.Power.Throttle"};
     dbus::utility::getSubTree(
         "/xyz/openbmc_project/inventory", 0, interfaces,
         [resp, processorId, handler = std::forward<Handler>(handler)](
@@ -794,6 +890,10 @@
             {
                 getCpuUniqueId(aResp, serviceName, objectPath);
             }
+            else if (interface == "xyz.openbmc_project.Control.Power.Throttle")
+            {
+                getThrottleProperties(aResp, serviceName, objectPath);
+            }
         }
     }
 }
@@ -1260,7 +1360,7 @@
             boost::beast::http::field::link,
             "</redfish/v1/JsonSchemas/Processor/Processor.json>; rel=describedby");
         asyncResp->res.jsonValue["@odata.type"] =
-            "#Processor.v1_11_0.Processor";
+            "#Processor.v1_18_0.Processor";
         asyncResp->res.jsonValue["@odata.id"] = boost::urls::format(
             "/redfish/v1/Systems/system/Processors/{}", processorId);
 
