diff --git a/Documentation/conf.py.in b/Documentation/conf.py.in
index 34fa3956f49e..2c75a75799e6 100644
--- a/Documentation/conf.py.in
+++ b/Documentation/conf.py.in
@@ -75,11 +75,11 @@ pygments_style = None
 doxylink = {
     'doxy-pub': (
         '@TOP_BUILDDIR@/Documentation/api-html/tagfile.xml',
-        '../api-html/',
+        'api-html/',
     ),
     'doxy-int': (
         '@TOP_BUILDDIR@/Documentation/internal-api-html/tagfile.xml',
-        '../internal-api-html/',
+        'internal-api-html/',
     ),
 }
 
diff --git a/Documentation/install-doxygen.sh b/Documentation/install-doxygen.sh
new file mode 100755
index 000000000000..ea5a19dc8fda
--- /dev/null
+++ b/Documentation/install-doxygen.sh
@@ -0,0 +1,18 @@
+#!/bin/sh
+# SPDX-License-Identifier: GPL-2.0-or-later
+# Copyright (C) 2025, Ideas on Board Oy
+#
+# Author: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
+#
+# Move Doxygen-generated API documentation to correct location
+
+doc_dir="${MESON_INSTALL_DESTDIR_PREFIX}/$1"
+shift
+dirs="$*"
+
+echo "Moving API documentation"
+
+for dir in $dirs ; do
+	rm -r "${doc_dir}/html/${dir}"
+	mv "${doc_dir}/${dir}" "${doc_dir}/html/"
+done
diff --git a/Documentation/meson.build b/Documentation/meson.build
index 8cf7775902f3..022770968fcf 100644
--- a/Documentation/meson.build
+++ b/Documentation/meson.build
@@ -193,6 +193,9 @@ if sphinx.found()
                   install_dir : doc_install_dir,
                   install_tag : 'doc')
 
+    meson.add_install_script('install-doxygen.sh', doc_install_dir,
+                             'api-html', 'internal-api-html')
+
     custom_target('documentation-linkcheck',
                   command : [sphinx, '-W', '-b', 'linkcheck',
                              '-c', sphinx_conf_dir,
