diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,9 @@
+# Version [0.7.1.0](https://github.com/blockfrost/blockfrost-haskell/compare/v0.7.0.0...v0.7.1.0) (2023-01-03)
+
+* Additions
+  * `NetworkEraSummary`, `NetworkEraBound`, `NetworkEraParameters` types and `_networkEras` endpoint [#33](https://github.com/blockfrost/blockfrost-haskell/pull/33/)
+  * `ToSample ScriptHashList` instance
+
 # Version [0.7.0.0](https://github.com/blockfrost/blockfrost-haskell/compare/v0.6.0.0...v0.7.0.0) (2022-10-11)
 
 * Changes
diff --git a/blockfrost-api.cabal b/blockfrost-api.cabal
--- a/blockfrost-api.cabal
+++ b/blockfrost-api.cabal
@@ -1,6 +1,6 @@
 cabal-version:       2.2
 name:                blockfrost-api
-version:             0.7.0.0
+version:             0.7.1.0
 synopsis:            API definitions for blockfrost.io
 description:         Core types and Servant API description
 homepage:            https://github.com/blockfrost/blockfrost-haskell
diff --git a/src/Blockfrost/API/Cardano/Network.hs b/src/Blockfrost/API/Cardano/Network.hs
--- a/src/Blockfrost/API/Cardano/Network.hs
+++ b/src/Blockfrost/API/Cardano/Network.hs
@@ -18,4 +18,10 @@
         :- Summary "Network information"
         :> Description "Return detailed network information."
         :> Get '[JSON] Network
+    , _networkEras
+        :: route
+        :- Summary "Query summary of blockchain eras"
+        :> Description "Returns start and end of each era along with parameters that can vary between hard forks."
+        :> "eras"
+        :> Get '[JSON] [NetworkEraSummary]
     } deriving (Generic)
diff --git a/src/Blockfrost/Lens.hs b/src/Blockfrost/Lens.hs
--- a/src/Blockfrost/Lens.hs
+++ b/src/Blockfrost/Lens.hs
@@ -47,8 +47,11 @@
 makeFields ''TxMetaCBOR
 
 makeFields ''Network
-makeFields ''NetworkSupply
-makeFields ''NetworkStake
+makeFieldsNoPrefix ''NetworkSupply
+makeFieldsNoPrefix ''NetworkStake
+makeFieldsNoPrefix ''NetworkEraSummary
+makeFieldsNoPrefix ''NetworkEraBound
+makeFieldsNoPrefix ''NetworkEraParameters
 
 makeFields ''PoolEpoch
 makeFields ''PoolInfo
diff --git a/src/Blockfrost/Types/Cardano/Epochs.hs b/src/Blockfrost/Types/Cardano/Epochs.hs
--- a/src/Blockfrost/Types/Cardano/Epochs.hs
+++ b/src/Blockfrost/Types/Cardano/Epochs.hs
@@ -157,7 +157,10 @@
                (\(kLang, vParams) -> do
                  l <- parseJSON
                     $ toJSON
-                    $ (\(x:xs) -> Data.Char.toLower x:xs)
+                    $ (\lang -> case lang of
+                        [] -> fail "Absurd empty language in CostModels"
+                        (x:xs) -> Data.Char.toLower x:xs
+                      )
                     $ Data.Aeson.Key.toString kLang
                  ps <- parseParams vParams
                  pure (l, Data.Map.fromList ps)
diff --git a/src/Blockfrost/Types/Cardano/Network.hs b/src/Blockfrost/Types/Cardano/Network.hs
--- a/src/Blockfrost/Types/Cardano/Network.hs
+++ b/src/Blockfrost/Types/Cardano/Network.hs
@@ -6,10 +6,15 @@
   ( Network (..)
   , NetworkStake (..)
   , NetworkSupply (..)
+  , NetworkEraSummary (..)
+  , NetworkEraBound (..)
+  , NetworkEraParameters (..)
   ) where
 
+import Data.Time (NominalDiffTime)
+import Data.Word (Word64)
 import Deriving.Aeson
-import Servant.Docs (ToSample (..), singleSample)
+import Servant.Docs (ToSample (..), samples, singleSample)
 
 import Blockfrost.Types.Shared
 
@@ -71,3 +76,71 @@
 instance ToSample Network where
   toSamples = pure $ singleSample $
     Network netSupplySample netStakeSample
+
+-- | Time bounds of an era.
+data NetworkEraBound = NetworkEraBound
+  { _boundEpoch :: Epoch, -- ^ The epoch number bounding a specific era.
+    _boundSlot  :: Slot, -- ^ The slot number bounding a specific era.
+    _boundTime  :: NominalDiffTime -- ^ The time, relative to network system start, bounding a specific era.
+  }
+  deriving stock (Show, Eq, Generic)
+  deriving (FromJSON, ToJSON)
+  via CustomJSON '[FieldLabelModifier '[StripPrefix "_bound", CamelToSnake]] NetworkEraBound
+
+netEraBoundSample0 :: NetworkEraBound
+netEraBoundSample0 =
+  NetworkEraBound
+    { _boundEpoch = 4
+    , _boundSlot = 86_400
+    , _boundTime = 1_728_000
+    }
+
+netEraBoundSample1 :: NetworkEraBound
+netEraBoundSample1 =
+  NetworkEraBound
+    { _boundEpoch = 5
+    , _boundSlot = 518_400
+    , _boundTime = 2_160_00
+    }
+
+instance ToSample NetworkEraBound where
+  toSamples = pure $ samples [netEraBoundSample0, netEraBoundSample1]
+
+-- | Parameters for a network era which can vary between hardforks.
+data NetworkEraParameters = NetworkEraParameters
+  { _parametersEpochLength :: EpochLength, -- ^ Number of slots in an epoch.
+    _parametersSlotLength  :: NominalDiffTime, -- ^ How long a slot lasts.
+    _parametersSafeZone    :: Word64 -- ^ Number of slots from the tip of the ledger in which a hardfork will not happen.
+  }
+  deriving stock (Show, Eq, Generic)
+  deriving (FromJSON, ToJSON)
+  via CustomJSON '[FieldLabelModifier '[StripPrefix "_parameters", CamelToSnake]] NetworkEraParameters
+
+netEraParamSample :: NetworkEraParameters
+netEraParamSample =
+  NetworkEraParameters
+    { _parametersEpochLength = 432_000
+    , _parametersSlotLength = 1
+    , _parametersSafeZone = 129_600
+    }
+
+instance ToSample NetworkEraParameters where
+  toSamples = pure $ singleSample netEraParamSample
+
+-- | Summary of information about network eras.
+data NetworkEraSummary = NetworkEraSummary
+  { _networkEraStart      :: NetworkEraBound, -- ^ Start of a specific era.
+    _networkEraEnd        :: NetworkEraBound, -- ^ End of a specific era.
+    _networkEraParameters :: NetworkEraParameters -- ^ Active parameters for a specific era.
+  }
+  deriving stock (Show, Eq, Generic)
+  deriving (FromJSON, ToJSON)
+  via CustomJSON '[FieldLabelModifier '[StripPrefix "_networkEra", CamelToSnake]] NetworkEraSummary
+
+instance ToSample NetworkEraSummary where
+  toSamples = pure . singleSample $
+    NetworkEraSummary
+      { _networkEraStart = netEraBoundSample0
+      , _networkEraEnd = netEraBoundSample1
+      , _networkEraParameters = netEraParamSample
+      }
diff --git a/src/Blockfrost/Types/Shared/Epoch.hs b/src/Blockfrost/Types/Shared/Epoch.hs
--- a/src/Blockfrost/Types/Shared/Epoch.hs
+++ b/src/Blockfrost/Types/Shared/Epoch.hs
@@ -1,9 +1,8 @@
 -- | Epoch
-
-module Blockfrost.Types.Shared.Epoch
-  where
+module Blockfrost.Types.Shared.Epoch where
 
 import Data.Aeson (FromJSON, ToJSON)
+import Data.Word (Word64)
 import GHC.Generics
 import Servant.API (Capture, FromHttpApiData (..), ToHttpApiData (..))
 import Servant.Docs (DocCapture (..), ToCapture (..), ToSample (..), samples)
@@ -19,4 +18,17 @@
   toCapture _ = DocCapture "epoch_number" "Epoch for specific epoch slot."
 
 instance ToSample Epoch where
-    toSamples = pure $ samples [425, 500, 1200]
+  toSamples = pure $ samples [425, 500, 1200]
+
+newtype EpochLength = EpochLength Word64
+  deriving stock (Eq, Ord, Show, Generic)
+  deriving newtype (Num, Enum, Real, Integral, FromHttpApiData, ToHttpApiData, FromJSON, ToJSON)
+
+unEpochLength :: EpochLength -> Word64
+unEpochLength (EpochLength u) = u
+
+instance ToCapture (Capture "epoch_length" EpochLength) where
+  toCapture _ = DocCapture "epoch_length" "Epoch size in a specific Cardano era."
+
+instance ToSample EpochLength where
+  toSamples = pure $ samples [21600, 86400, 432000]
diff --git a/src/Blockfrost/Types/Shared/ScriptHash.hs b/src/Blockfrost/Types/Shared/ScriptHash.hs
--- a/src/Blockfrost/Types/Shared/ScriptHash.hs
+++ b/src/Blockfrost/Types/Shared/ScriptHash.hs
@@ -12,7 +12,7 @@
 import qualified Data.Vector
 import GHC.Generics
 import Servant.API (Capture, FromHttpApiData (..), ToHttpApiData (..))
-import Servant.Docs (DocCapture (..), ToCapture (..), ToSample (..), samples)
+import Servant.Docs (DocCapture (..), ToCapture (..), ToSample (..), samples, singleSample)
 
 -- | Script Hash newtype
 newtype ScriptHash = ScriptHash { unScriptHash :: Text }
@@ -45,11 +45,17 @@
       parseJSON' _          = fail "Unexpected type for ScriptHash"
   parseJSON _         = fail "Expected array for [ScriptHash]"
 
+instance ToSample ScriptHashList where
+  toSamples = pure $ singleSample $ ScriptHashList $ map ScriptHash
+    [ "67f33146617a5e61936081db3b2117cbf59bd2123748f58ac9678656"
+    , "e1457a0c47dfb7a2f6b8fbb059bdceab163c05d34f195b87b9f2b30e"
+    ]
+
 instance ToSample ScriptHash where
-    toSamples _ = samples $ map ScriptHash
-      [ "67f33146617a5e61936081db3b2117cbf59bd2123748f58ac9678656"
-      , "e1457a0c47dfb7a2f6b8fbb059bdceab163c05d34f195b87b9f2b30e"
-      ]
+  toSamples _ = samples $ map ScriptHash
+    [ "67f33146617a5e61936081db3b2117cbf59bd2123748f58ac9678656"
+    , "e1457a0c47dfb7a2f6b8fbb059bdceab163c05d34f195b87b9f2b30e"
+    ]
 
 instance ToCapture (Capture "script_hash" ScriptHash) where
   toCapture _ = DocCapture "script_hash" "Hash of the script."
