diff --git a/pandoc-lua-engine.cabal b/pandoc-lua-engine.cabal
--- a/pandoc-lua-engine.cabal
+++ b/pandoc-lua-engine.cabal
@@ -1,6 +1,6 @@
 cabal-version:       2.4
 name:                pandoc-lua-engine
-version:             0.4.2
+version:             0.4.3
 build-type:          Simple
 license:             GPL-2.0-or-later
 license-file:        COPYING.md
diff --git a/src/Text/Pandoc/Lua/Module/MediaBag.hs b/src/Text/Pandoc/Lua/Module/MediaBag.hs
--- a/src/Text/Pandoc/Lua/Module/MediaBag.hs
+++ b/src/Text/Pandoc/Lua/Module/MediaBag.hs
@@ -27,6 +27,7 @@
 import Text.Pandoc.Lua.Orphans ()
 import Text.Pandoc.Lua.PandocLua (unPandocLua)
 import Text.Pandoc.MIME (MimeType)
+import Text.Pandoc.SelfContained (makeDataURI)
 
 import qualified Data.ByteString.Lazy as BL
 import qualified Data.Text as T
@@ -60,6 +61,7 @@
       , items   `since` makeVersion [2,7,3]
       , list    `since` makeVersion [2,0]
       , lookup  `since` makeVersion [2,0]
+      , make_data_uri `since` makeVersion [3,7,1]
       , write   `since` makeVersion [3,0]
       ]
   , moduleOperations = []
@@ -242,6 +244,29 @@
   , "    local diagram_url = 'https://pandoc.org/diagram.jpg'"
   , "    local mt, contents = pandoc.mediabag.fetch(diagram_url)"
   ]
+
+make_data_uri :: DocumentedFunction PandocError
+make_data_uri = defun "make_data_uri"
+  ### (\mime raw -> pure $ makeDataURI (mime, raw))
+  <#> parameter Lua.peekText "string" "mime_type" "MIME type of the data"
+  <#> parameter Lua.peekByteString "string" "raw_data" "data to encode"
+  =#> functionResult Lua.pushText "string" "data uri"
+  #? T.unlines
+  [ "Convert the input data into a data URI as defined by RFC 2397."
+  , ""
+  , "Example:"
+  , ""
+  , "    -- Embed an unofficial pandoc logo"
+  , "    local pandoc_logo_url = 'https://raw.githubusercontent.com/'"
+  , "      .. 'tarleb/pandoc-logo/main/pandoc.svg'"
+  , ""
+  , "    local datauri = pandoc.mediabag.make_data_uri("
+  , "      pandoc.mediabag.fetch(pandoc_logo_url)"
+  , "    )"
+  , ""
+  , "    local image = pandoc.Image('Logo', datauri)"
+  ]
+
 
 -- | Extract the mediabag or just a single entry.
 write :: DocumentedFunction PandocError
diff --git a/src/Text/Pandoc/Lua/Module/Pandoc.hs b/src/Text/Pandoc/Lua/Module/Pandoc.hs
--- a/src/Text/Pandoc/Lua/Module/Pandoc.hs
+++ b/src/Text/Pandoc/Lua/Module/Pandoc.hs
@@ -25,6 +25,7 @@
 import Data.Maybe (fromMaybe)
 import Data.Proxy (Proxy (Proxy))
 import Data.Text.Encoding.Error (UnicodeException)
+import Data.Version (makeVersion)
 import HsLua
 import System.Exit (ExitCode (..))
 import Text.Pandoc.Class ( PandocMonad, FileInfo (..), FileTree
@@ -151,7 +152,7 @@
 otherConstructors :: [DocumentedFunction PandocError]
 otherConstructors =
   [ mkAttr
-  , mkCaption
+  , mkCaption `since` makeVersion [3,6,1]
   , mkCell
   , mkAttributeList
   , mkCitation
diff --git a/test/lua/module/pandoc-mediabag.lua b/test/lua/module/pandoc-mediabag.lua
--- a/test/lua/module/pandoc-mediabag.lua
+++ b/test/lua/module/pandoc-mediabag.lua
@@ -104,4 +104,15 @@
     end),
   },
 
+  group 'make_data_uri' {
+    test('returns a data URI', function ()
+      local uri = mediabag.make_data_uri('text/plain', 'foo')
+      assert.are_equal(uri:sub(1,5), 'data:')
+    end),
+    test('URI specifies the given MIME type', function ()
+      local mimetype = 'text/plain'
+      local uri = mediabag.make_data_uri(mimetype, 'foo')
+      assert.are_equal(uri:sub(6, 5 + #mimetype), mimetype)
+    end),
+  }
 }
