diff --git a/antiope-s3.cabal b/antiope-s3.cabal
--- a/antiope-s3.cabal
+++ b/antiope-s3.cabal
@@ -2,10 +2,10 @@
 --
 -- see: https://github.com/sol/hpack
 --
--- hash: 3ca4d7ebcb62cbfab41eb5730b74a19e7bfef678711ad92e24e8e7fbb5252d44
+-- hash: f7db32bbb25a8bc478a6baef9a6cfb9d6fd91a44bdf95b511e861ad4cfec0583
 
 name:           antiope-s3
-version:        6.1.4
+version:        6.1.5
 description:    Please see the README on Github at <https://github.com/arbor/antiope#readme>
 category:       Services
 homepage:       https://github.com/arbor/antiope#readme
@@ -31,6 +31,8 @@
       Antiope.S3.GetObject
       Antiope.S3.Internal
       Antiope.S3.Lazy
+      Antiope.S3.Range
+      Antiope.S3.Request
       Antiope.S3.Strict
       Antiope.S3.Types
   other-modules:
diff --git a/src/Antiope/S3/Range.hs b/src/Antiope/S3/Range.hs
new file mode 100644
--- /dev/null
+++ b/src/Antiope/S3/Range.hs
@@ -0,0 +1,14 @@
+module Antiope.S3.Range
+  ( Range(..)
+  , rangeHeaderText
+  ) where
+
+import Antiope.S3.Types      (Range (Range))
+import Data.Semigroup        ((<>))
+import Network.AWS.Data.Text
+import Prelude               hiding (last)
+
+import qualified Antiope.Core.Internal.Show as S
+
+rangeHeaderText :: Range -> Text
+rangeHeaderText (Range first last) = "bytes=" <> S.tshowNum first <> "-" <> S.tshowNum last
diff --git a/src/Antiope/S3/Request.hs b/src/Antiope/S3/Request.hs
new file mode 100644
--- /dev/null
+++ b/src/Antiope/S3/Request.hs
@@ -0,0 +1,17 @@
+{-# LANGUAGE DataKinds        #-}
+{-# LANGUAGE TypeApplications #-}
+
+module Antiope.S3.Request
+  ( getObjectUri
+  ) where
+
+import Antiope.S3.Types          (S3Uri)
+import Control.Lens
+import Data.Generics.Product.Any
+
+import qualified Network.AWS.S3 as AWS
+
+getObjectUri :: S3Uri -> AWS.GetObject
+getObjectUri uri = AWS.getObject bucket objectKey
+  where bucket    = uri ^. the @"bucket"
+        objectKey = uri ^. the @"objectKey"
diff --git a/src/Antiope/S3/Types.hs b/src/Antiope/S3/Types.hs
--- a/src/Antiope/S3/Types.hs
+++ b/src/Antiope/S3/Types.hs
@@ -9,6 +9,7 @@
   , S3Uri(..)
   , readBucketName
   , readWhile
+  , Range(..)
   ) where
 
 import Antiope.S3.Internal
@@ -50,6 +51,11 @@
 
 instance ToLogStr S3Uri where
   toLogStr s = fromString $ T.unpack $ toText s
+
+data Range = Range
+  { first :: Int
+  , last  :: Int
+  } deriving (Eq, Show, Generic)
 
 readString :: String -> RP.ReadPrec String
 readString s = do
