diff --git a/antiope-core.cabal b/antiope-core.cabal
--- a/antiope-core.cabal
+++ b/antiope-core.cabal
@@ -2,10 +2,10 @@
 --
 -- see: https://github.com/sol/hpack
 --
--- hash: e43ecb88a209266883977d64d766cb81e588268747897a9fdb6d2deb846f36d1
+-- hash: 49d3954b7ca5d249a62dc367c7c8c2b64ef67819769acc7855ef3b3173072a0b
 
 name:           antiope-core
-version:        6.1.3
+version:        6.1.4
 description:    Please see the README on Github at <https://github.com/arbor/antiope#readme>
 category:       Services
 homepage:       https://github.com/arbor/antiope#readme
@@ -28,6 +28,7 @@
 library
   exposed-modules:
       Antiope.Core
+      Antiope.Core.Error
       Antiope.Env
       Antiope.Orphans
   other-modules:
@@ -40,8 +41,10 @@
     , amazonka-core
     , base >=4.7 && <5
     , bytestring
+    , exceptions
     , generic-lens
     , http-client
+    , http-types
     , lens
     , monad-logger
     , mtl
@@ -64,8 +67,10 @@
     , antiope-core
     , base >=4.7 && <5
     , bytestring
+    , exceptions
     , generic-lens
     , http-client
+    , http-types
     , lens
     , monad-logger
     , mtl
diff --git a/src/Antiope/Core/Error.hs b/src/Antiope/Core/Error.hs
new file mode 100644
--- /dev/null
+++ b/src/Antiope/Core/Error.hs
@@ -0,0 +1,22 @@
+{-# LANGUAGE ScopedTypeVariables #-}
+
+module Antiope.Core.Error
+  ( handle404ToNone
+  ) where
+
+import Control.Monad.Catch       (catch, throwM)
+import Network.AWS               (Error (..), MonadAWS, ServiceError (..))
+import Network.HTTP.Types.Status (Status (..))
+
+import qualified Data.ByteString.Lazy as LBS
+
+handle404ToNone :: MonadAWS m
+  => m a
+  -> m (Maybe a)
+handle404ToNone f = do
+  ebs <- (Right <$> f) `catch` \(err :: Error) -> case err of
+    (ServiceError (ServiceError' _ (Status 404 _) _ _ _ _)) -> return (Left LBS.empty)
+    _                                                       -> throwM err
+  case ebs of
+    Right bs -> return (Just bs)
+    Left _   -> return Nothing
