diff --git a/substrate/client/rpc-api/src/author/error.rs b/substrate/client/rpc-api/src/author/error.rs
index 8149a1f8d1afee64ea701d3f1fe11636a040b2d9..648dbb295d8d041d154e154e40cc8a1c53f699df 100644
--- a/substrate/client/rpc-api/src/author/error.rs
+++ b/substrate/client/rpc-api/src/author/error.rs
@@ -57,7 +57,7 @@ pub enum Error {
 }
 
 /// Base code for all authorship errors.
-const BASE_ERROR: i32 = 1000;
+const BASE_ERROR: i32 = crate::error::base::AUTHOR;
 /// Extrinsic has an invalid format.
 const BAD_FORMAT: i32 = BASE_ERROR + 1;
 /// Error during transaction verification in runtime.
diff --git a/substrate/client/rpc-api/src/chain/error.rs b/substrate/client/rpc-api/src/chain/error.rs
index cfb429bcffd126b9ff9268fb84e20ae588b98965..652192942588856209a37d18cfb6f1c3e22203b6 100644
--- a/substrate/client/rpc-api/src/chain/error.rs
+++ b/substrate/client/rpc-api/src/chain/error.rs
@@ -37,7 +37,7 @@ pub enum Error {
 }
 
 /// Base error code for all chain errors.
-const BASE_ERROR: i32 = 3000;
+const BASE_ERROR: i32 = crate::error::base::CHAIN;
 
 impl From<Error> for JsonRpseeError {
 	fn from(e: Error) -> Self {
diff --git a/substrate/client/rpc-api/src/dev/error.rs b/substrate/client/rpc-api/src/dev/error.rs
index 2896e66bc0a3547b255ad7c097c7ac896503f51b..8e4ddb55e35d77fee79cdb9411ab3b0647b12661 100644
--- a/substrate/client/rpc-api/src/dev/error.rs
+++ b/substrate/client/rpc-api/src/dev/error.rs
@@ -44,7 +44,7 @@ pub enum Error {
 }
 
 /// Base error code for all dev errors.
-const BASE_ERROR: i32 = 6000;
+const BASE_ERROR: i32 = crate::error::base::DEV;
 
 impl From<Error> for JsonRpseeError {
 	fn from(e: Error) -> Self {
diff --git a/substrate/client/rpc-api/src/error.rs b/substrate/client/rpc-api/src/error.rs
new file mode 100644
index 0000000000000000000000000000000000000000..72941e3145b94424bc16fdd77d0dc2117e89eecb
--- /dev/null
+++ b/substrate/client/rpc-api/src/error.rs
@@ -0,0 +1,28 @@
+// This file is part of Substrate.
+
+// Copyright (C) Parity Technologies (UK) Ltd.
+// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0
+
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see <https://www.gnu.org/licenses/>.
+
+/// Base error code for RPC modules.
+pub mod base {
+	pub const AUTHOR: i32 = 1000;
+	pub const SYSTEM: i32 = 2000;
+	pub const CHAIN: i32 = 3000;
+	pub const STATE: i32 = 4000;
+	pub const OFFCHAIN: i32 = 5000;
+	pub const DEV: i32 = 6000;
+	pub const STATEMENT: i32 = 7000;
+}
diff --git a/substrate/client/rpc-api/src/lib.rs b/substrate/client/rpc-api/src/lib.rs
index 83054584370a199266500b563541a74f57c0ece7..b99c237dc859bc1fd03a87c63b365956b7a6f5a1 100644
--- a/substrate/client/rpc-api/src/lib.rs
+++ b/substrate/client/rpc-api/src/lib.rs
@@ -22,6 +22,7 @@
 
 #![warn(missing_docs)]
 
+mod error;
 mod policy;
 
 pub use policy::DenyUnsafe;
diff --git a/substrate/client/rpc-api/src/offchain/error.rs b/substrate/client/rpc-api/src/offchain/error.rs
index 5ca0476087a5c6d03c98509cd78bf13d34cd099c..679e100089734357cb27580e43fecf6917985935 100644
--- a/substrate/client/rpc-api/src/offchain/error.rs
+++ b/substrate/client/rpc-api/src/offchain/error.rs
@@ -38,7 +38,7 @@ pub enum Error {
 }
 
 /// Base error code for all offchain errors.
-const BASE_ERROR: i32 = 5000;
+const BASE_ERROR: i32 = crate::error::base::OFFCHAIN;
 
 impl From<Error> for JsonRpseeError {
 	fn from(e: Error) -> Self {
diff --git a/substrate/client/rpc-api/src/state/error.rs b/substrate/client/rpc-api/src/state/error.rs
index c69b3d9199ce6d661b37782514f07efee5af321a..9857784e3545cdd3bf944293542c2a31a373cb60 100644
--- a/substrate/client/rpc-api/src/state/error.rs
+++ b/substrate/client/rpc-api/src/state/error.rs
@@ -55,7 +55,7 @@ pub enum Error {
 }
 
 /// Base code for all state errors.
-const BASE_ERROR: i32 = 4000;
+const BASE_ERROR: i32 = crate::error::base::STATE;
 
 impl From<Error> for JsonRpseeError {
 	fn from(e: Error) -> Self {
diff --git a/substrate/client/rpc-api/src/statement/error.rs b/substrate/client/rpc-api/src/statement/error.rs
index 549b147115fb2a04ff96167be0dc1218d06edf14..8438cc3ec9e940a9a023bd6510f337d9cc08f4f3 100644
--- a/substrate/client/rpc-api/src/statement/error.rs
+++ b/substrate/client/rpc-api/src/statement/error.rs
@@ -38,7 +38,7 @@ pub enum Error {
 }
 
 /// Base error code for all statement errors.
-const BASE_ERROR: i32 = 6000;
+const BASE_ERROR: i32 = crate::error::base::STATEMENT;
 
 impl From<Error> for JsonRpseeError {
 	fn from(e: Error) -> Self {
diff --git a/substrate/client/rpc-api/src/system/error.rs b/substrate/client/rpc-api/src/system/error.rs
index 4ad0f1b690a19d4d54b7956552f345d84f49071f..713ade9210d328265c49f8d5d924f92b69e1d2a4 100644
--- a/substrate/client/rpc-api/src/system/error.rs
+++ b/substrate/client/rpc-api/src/system/error.rs
@@ -39,7 +39,7 @@ pub enum Error {
 }
 
 // Base code for all system errors.
-const BASE_ERROR: i32 = 2000;
+const BASE_ERROR: i32 = crate::error::base::SYSTEM;
 // Provided block range couldn't be resolved to a list of blocks.
 const NOT_HEALTHY_ERROR: i32 = BASE_ERROR + 1;
 // Peer argument is malformatted.