diff --git a/include/libcamera/request.h b/include/libcamera/request.h
index e3db5243aaf3cf30..2d5a5964e99eb75f 100644
--- a/include/libcamera/request.h
+++ b/include/libcamera/request.h
@@ -37,6 +37,7 @@ public:
 	~Request();
 
 	ControlList &controls() { return *controls_; }
+	ControlList &metadata() { return *metadata_; }
 	const std::map<Stream *, Buffer *> &buffers() const { return bufferMap_; }
 	int addBuffer(std::unique_ptr<Buffer> buffer);
 	Buffer *findBuffer(Stream *stream) const;
@@ -58,6 +59,7 @@ private:
 	Camera *camera_;
 	CameraControlValidator *validator_;
 	ControlList *controls_;
+	ControlList *metadata_;
 	std::map<Stream *, Buffer *> bufferMap_;
 	std::unordered_set<Buffer *> pending_;
 
diff --git a/src/libcamera/request.cpp b/src/libcamera/request.cpp
index 19f6d0b9a0aeb03c..23d3ab6f422c406e 100644
--- a/src/libcamera/request.cpp
+++ b/src/libcamera/request.cpp
@@ -65,6 +65,11 @@ Request::Request(Camera *camera, uint64_t cookie)
 	 */
 	validator_ = new CameraControlValidator(camera);
 	controls_ = new ControlList(validator_);
+
+	/**
+	 * \todo: Add a validator for metadata controls.
+	 */
+	metadata_ = new ControlList(nullptr);
 }
 
 Request::~Request()
@@ -74,6 +79,7 @@ Request::~Request()
 		delete buffer;
 	}
 
+	delete metadata_;
 	delete controls_;
 	delete validator_;
 }
@@ -161,6 +167,14 @@ Buffer *Request::findBuffer(Stream *stream) const
 	return it->second;
 }
 
+/**
+ * \fn Request::metadata()
+ * \brief Retrieve the request's metadata
+ * \todo Offer a read-only API towards applications while keeping a read/write
+ * API internally.
+ * \return The metadata associated with the request
+ */
+
 /**
  * \fn Request::cookie()
  * \brief Retrieve the cookie set when the request was created
