diff --git a/prdoc/pr_3154.prdoc b/prdoc/pr_3154.prdoc
new file mode 100644
index 0000000000000000000000000000000000000000..2dfc1b27810cf75683a374cd15f4bcb7b11105f0
--- /dev/null
+++ b/prdoc/pr_3154.prdoc
@@ -0,0 +1,9 @@
+title: "Contracts: Stabilize caller_is_root API"
+
+doc:
+  - audience: Runtime Dev
+    description: |
+      Removed the `#[unstable]` attrribute on `caller_is_root` host function.
+
+crates:
+  - name: pallet-contracts
diff --git a/substrate/frame/contracts/src/wasm/runtime.rs b/substrate/frame/contracts/src/wasm/runtime.rs
index 3e49b68f86b6c966c2a526f4124bc09771bc92d1..3af0d04a3ad1378aa6826382b8babc9d5bf90a5a 100644
--- a/substrate/frame/contracts/src/wasm/runtime.rs
+++ b/substrate/frame/contracts/src/wasm/runtime.rs
@@ -1542,7 +1542,6 @@ pub mod env {
 
 	/// Checks whether the caller of the current contract is root.
 	/// See [`pallet_contracts_uapi::HostFn::caller_is_root`].
-	#[unstable]
 	fn caller_is_root(ctx: _, _memory: _) -> Result<u32, TrapReason> {
 		ctx.charge_gas(RuntimeCosts::CallerIsRoot)?;
 		Ok(ctx.ext.caller_is_root() as u32)
diff --git a/substrate/frame/contracts/uapi/src/host.rs b/substrate/frame/contracts/uapi/src/host.rs
index 21350bc4eb3e42ffbdfd8b951cd66fdffbd5360e..c8b9ae8b2def9e253fd6523c0ac15faf6fd36f29 100644
--- a/substrate/frame/contracts/uapi/src/host.rs
+++ b/substrate/frame/contracts/uapi/src/host.rs
@@ -277,9 +277,6 @@ pub trait HostFn {
 	///
 	/// A return value of `true` indicates that this contract is being called by a root origin,
 	/// and `false` indicates that the caller is a signed origin.
-	#[deprecated(
-		note = "Unstable function. Behaviour can change without further notice. Use only for testing."
-	)]
 	fn caller_is_root() -> u32;
 
 	/// Clear the value at the given key in the contract storage.