diff --git a/openai-servant.cabal b/openai-servant.cabal
--- a/openai-servant.cabal
+++ b/openai-servant.cabal
@@ -4,10 +4,10 @@
 --
 -- see: https://github.com/sol/hpack
 --
--- hash: 7d9611438da3fd219c80f23301bed8d6b0ed55b71c59d82b976a6e0704630db3
+-- hash: 0f47df90d0a45b723d7b0b77c3679bccd709f8c989a14ca39f9c4f7abb0f4f08
 
 name:           openai-servant
-version:        0.1.0.0
+version:        0.2.0.0
 synopsis:       Unofficial OpenAI servant types
 description:    Unofficial description of the OpenAI API using servant types
 category:       Web
@@ -40,8 +40,10 @@
   build-depends:
       aeson
     , base >=4.7 && <5
+    , bytestring
     , casing
     , servant
+    , servant-multipart
     , text
     , time
     , vector
diff --git a/src/OpenAI/Api.hs b/src/OpenAI/Api.hs
--- a/src/OpenAI/Api.hs
+++ b/src/OpenAI/Api.hs
@@ -5,6 +5,7 @@
 import OpenAI.Resources
 
 import Servant.API
+import Servant.Multipart
 
 type OpenAIAuth = BasicAuth "OpenAI API" ()
 
@@ -13,6 +14,15 @@
 
 type OpenAIApiInternal
   = "engines" :> EnginesApi
+  :<|> "files" :> FilesApi
+  :<|> AnswerApi
+
+type FilesApi
+  = OpenAIAuth :> MultipartForm Mem FileCreate :> Post '[JSON] File
+  :<|> OpenAIAuth :> Capture "file_id" FileId :> Delete '[JSON] FileDeleteConfirmation
+
+type AnswerApi
+  = "answers" :> OpenAIAuth :> ReqBody '[JSON] AnswerReq :> Post '[JSON] AnswerResp
 
 type EnginesApi
   = OpenAIAuth :> Get '[JSON] (OpenAIList Engine)
diff --git a/src/OpenAI/Resources.hs b/src/OpenAI/Resources.hs
--- a/src/OpenAI/Resources.hs
+++ b/src/OpenAI/Resources.hs
@@ -10,6 +10,11 @@
   , defaultTextCompletionCreate
     -- * Searching
   , SearchResult(..), SearchResultCreate(..)
+    -- * File API
+  , FileCreate(..), FileId(..), File(..), FileHunk(..)
+  , FileDeleteConfirmation(..)
+    -- * Answers API
+  , AnswerReq(..), AnswerResp(..)
   )
 where
 
@@ -18,7 +23,9 @@
 import Data.Time
 import Data.Time.Clock.POSIX
 import Servant.API
+import Servant.Multipart
 import qualified Data.Aeson as A
+import qualified Data.ByteString.Lazy as BSL
 import qualified Data.Text as T
 import qualified Data.Vector as V
 
@@ -125,14 +132,75 @@
   = SearchResult
   { srDocument :: Int
   , srScore :: Double
+  , srMetadata :: Maybe T.Text
   } deriving (Show, Eq)
 
 data SearchResultCreate
   = SearchResultCreate
-  { sccrDocuments :: V.Vector T.Text
+  { sccrFile :: Maybe FileId
+  , sccrDocuments :: Maybe (V.Vector T.Text)
   , sccrQuery :: T.Text
+  , sccrReturnMetadata :: Bool
   } deriving (Show, Eq)
 
+data FileHunk
+  = FileHunk
+  { fhContent :: T.Text
+  , fhMetadata :: Maybe T.Text
+  } deriving (Show, Eq)
+
+data FileCreate
+  = FileCreate
+  { fcPurpose :: T.Text
+  , fcDocuments :: [FileHunk]
+  } deriving (Show, Eq)
+
+packDocuments :: [FileHunk] -> BSL.ByteString
+packDocuments docs =
+  BSL.intercalate "\n" $
+  map (\t -> A.encode $ A.object ["text" A..= fhContent t, "metadata" A..= fhMetadata t]) docs
+
+instance ToMultipart Mem FileCreate where
+  toMultipart rfc =
+    MultipartData
+    [ Input "purpose" (fcPurpose rfc)
+    ]
+    [ FileData "file" "data.jsonl" "application/json" (packDocuments $ fcDocuments rfc)
+    ]
+
+newtype FileId
+  = FileId { unFileId :: T.Text }
+  deriving (Show, Eq, ToJSON, FromJSON, ToHttpApiData)
+
+data File
+  = File
+  { fId :: FileId
+  , fCreatedAt :: TimeStamp
+  , fPurpose :: T.Text
+  } deriving (Show, Eq)
+
+data FileDeleteConfirmation
+  = FileDeleteConfirmation
+  { fdcId :: FileId
+  } deriving (Show, Eq)
+
+data AnswerReq
+  = AnswerReq
+  { arFile :: Maybe FileId
+  , arDocuments :: Maybe (V.Vector T.Text)
+  , arQuestion :: T.Text
+  , arSearchModel :: EngineId
+  , arModel :: EngineId
+  , arExamplesContext :: T.Text
+  , arExamples :: [[T.Text]]
+  , arReturnMetadata :: Bool
+  } deriving (Show, Eq)
+
+data AnswerResp
+  = AnswerResp
+  { arsAnswers :: [T.Text]
+  } deriving (Show, Eq)
+
 $(deriveJSON (jsonOpts 2) ''OpenAIList)
 $(deriveJSON (jsonOpts 1) ''Engine)
 $(deriveJSON (jsonOpts 2) ''TextCompletion)
@@ -140,3 +208,7 @@
 $(deriveJSON (jsonOpts 4) ''TextCompletionCreate)
 $(deriveJSON (jsonOpts 2) ''SearchResult)
 $(deriveJSON (jsonOpts 4) ''SearchResultCreate)
+$(deriveJSON (jsonOpts 1) ''File)
+$(deriveJSON (jsonOpts 3) ''FileDeleteConfirmation)
+$(deriveJSON (jsonOpts 2) ''AnswerReq)
+$(deriveJSON (jsonOpts 3) ''AnswerResp)
