diff --git a/typo3/sysext/linkvalidator/Documentation/CodeSnippets/Api/AbstractLinktype.rst.txt b/typo3/sysext/linkvalidator/Documentation/CodeSnippets/Api/AbstractLinktype.rst.txt
new file mode 100644
index 0000000000000000000000000000000000000000..a4c0e3b01d0fa03b4f659c9d322bed4120fa96d8
--- /dev/null
+++ b/typo3/sysext/linkvalidator/Documentation/CodeSnippets/Api/AbstractLinktype.rst.txt
@@ -0,0 +1,53 @@
+.. Generated by https://github.com/linawolf/t3docs_restructured_api_tools
+.. bin/typo3  restructured_api_tools:php_domain '\\TYPO3\\CMS\\Linkvalidator\\Linktype\\AbstractLinktype' > output/AbstractLinktype.rst.txt
+
+.. php:namespace::  TYPO3\CMS\Linkvalidator\Linktype
+
+.. php:class:: abstract AbstractLinktype
+
+   This class provides Check Base plugin implementation
+
+
+   .. php:method:: getIdentifier()
+
+      :returntype: string
+
+   .. php:method:: setAdditionalConfig(array config)
+
+      Function to override config of Linktype. Should be used only
+      if necessary. Add additional configuration to TSconfig.
+
+      :param array $config: the config
+
+   .. php:method:: fetchType(unknown value, unknown type, unknown key)
+
+      Base type fetching method, based on the type that softRefParserObj returns
+
+      :param unknown $value: the value
+      :param unknown $type: the type
+      :param unknown $key: the key
+
+   .. php:method:: getErrorParams()
+
+      Get the value of the private property errorParams
+
+
+   .. php:method:: getBrokenUrl(unknown row)
+
+      Construct a valid Url for browser output
+
+      :param unknown $row: the row
+
+   .. php:method:: checkLink(unknown url, unknown softRefEntry, unknown reference)
+
+      Checks a given link for validity
+
+      :param unknown $url: the url
+      :param unknown $softRefEntry: the softRefEntry
+      :param unknown $reference: the reference
+
+   .. php:method:: getErrorMessage(unknown errorParams)
+
+      Generate the localized error message from the error params saved from the parsing
+
+      :param unknown $errorParams: the errorParams
diff --git a/typo3/sysext/linkvalidator/Documentation/CodeSnippets/Api/LinkAnalyzerResult.rst.txt b/typo3/sysext/linkvalidator/Documentation/CodeSnippets/Api/LinkAnalyzerResult.rst.txt
new file mode 100644
index 0000000000000000000000000000000000000000..75be84d62b79b120c7277b0911cc67e8f1b44396
--- /dev/null
+++ b/typo3/sysext/linkvalidator/Documentation/CodeSnippets/Api/LinkAnalyzerResult.rst.txt
@@ -0,0 +1,53 @@
+.. Generated by https://github.com/linawolf/t3docs_restructured_api_tools
+.. php:namespace::  TYPO3\CMS\Linkvalidator\Result
+
+.. php:class:: LinkAnalyzerResult
+
+   Used to work with LinkAnalyzer results
+
+
+   .. php:method:: getResultForTask(int page, int depth, array pageRow, array modTSconfig, array searchFields = array (), array linkTypes = array (), string languages = '')
+
+      Call LinkAnalyzer with provided task configuration and process result values
+
+      :param int $page: the page
+      :param int $depth: the depth
+      :param array $pageRow: the pageRow
+      :param array $modTSconfig: the modTSconfig
+      :param array $searchFields: the searchFields, default: array ()
+      :param array $linkTypes: the linkTypes, default: array ()
+      :param string $languages: the languages, default: ''
+      :returntype: self
+
+   .. php:method:: setBrokenLinks(array brokenLinks)
+
+      :param array $brokenLinks: the brokenLinks
+
+   .. php:method:: getBrokenLinks()
+
+      :returntype: array
+
+   .. php:method:: setNewBrokenLinkCounts(array newBrokenLinkCounts)
+
+      :param array $newBrokenLinkCounts: the newBrokenLinkCounts
+
+   .. php:method:: getNewBrokenLinkCounts()
+
+      :returntype: array
+
+   .. php:method:: setOldBrokenLinkCounts(array oldBrokenLinkCounts)
+
+      :param array $oldBrokenLinkCounts: the oldBrokenLinkCounts
+
+   .. php:method:: getOldBrokenLinkCounts()
+
+      :returntype: array
+
+   .. php:method:: getTotalBrokenLinksCount()
+
+      :returntype: int
+
+   .. php:method:: isDifferentToLastResult()
+
+      :returntype: bool
+
diff --git a/typo3/sysext/linkvalidator/Documentation/CodeSnippets/Api/LinktypeInterface.rst.txt b/typo3/sysext/linkvalidator/Documentation/CodeSnippets/Api/LinktypeInterface.rst.txt
new file mode 100644
index 0000000000000000000000000000000000000000..bd00b40340d33e81de4b08d1cb18df5880e3d96c
--- /dev/null
+++ b/typo3/sysext/linkvalidator/Documentation/CodeSnippets/Api/LinktypeInterface.rst.txt
@@ -0,0 +1,60 @@
+.. Generated by https://github.com/linawolf/t3docs_restructured_api_tools
+.. ddev exec bin/typo3  restructured_api_tools:php_domain '\\TYPO3\\CMS\\Linkvalidator\\Linktype\\LinktypeInterface' > output/LinktypeInterface.rst.txt
+
+.. php:namespace::  TYPO3\CMS\Linkvalidator\Linktype
+
+.. php:interface:: LinktypeInterface
+
+   All linktypes handled by the LinkValidator must implement this interface.
+
+   If `autoconfigure` is enabled in the :file:`Services.yaml`
+   classes implementing this interface are registered automatically as linktypes.
+   Otherwise the tag `linkvalidator.linktype` must be set in the
+   :file:`Services.yaml`.
+
+   .. php:method:: getIdentifier()
+
+      Returns the unique identifier of the linktype
+
+      :returntype: string
+
+   .. php:method:: checkLink(unknown url, unknown softRefEntry, unknown reference)
+
+      Checks a given link for validity
+
+      :param unknown $url: the url
+      :param unknown $softRefEntry: the softRefEntry
+      :param unknown $reference: the reference
+
+   .. php:method:: setAdditionalConfig(array config)
+
+      Function to override config of Linktype. Should be used only
+      if necessary. Add additional configuration to TSconfig.
+
+      :param array $config: the config
+
+   .. php:method:: fetchType(unknown value, unknown type, unknown key)
+
+      Base type fetching method, based on the type that softRefParserObj returns.
+
+      :param unknown $value: the value
+      :param unknown $type: the type
+      :param unknown $key: the key
+
+   .. php:method:: getErrorParams()
+
+      Get the value of the private property errorParams.
+
+
+   .. php:method:: getBrokenUrl(unknown row)
+
+      Construct a valid Url for browser output
+
+      :param unknown $row: the row
+
+   .. php:method:: getErrorMessage(unknown errorParams)
+
+      Generate the localized error message from the error params saved from the parsing
+
+      :param unknown $errorParams: the errorParams
+
diff --git a/typo3/sysext/linkvalidator/Documentation/CodeSnippets/Examples/ActivateCustomLinktypeTsConfig.rst.txt b/typo3/sysext/linkvalidator/Documentation/CodeSnippets/Examples/ActivateCustomLinktypeTsConfig.rst.txt
new file mode 100644
index 0000000000000000000000000000000000000000..605063953e4732be6dcdef27b609eab2cd3ea98c
--- /dev/null
+++ b/typo3/sysext/linkvalidator/Documentation/CodeSnippets/Examples/ActivateCustomLinktypeTsConfig.rst.txt
@@ -0,0 +1,8 @@
+
+.. code-block:: typoscript
+    :caption: EXT:examples/Configuration/TsConfig/Page/Extension/Linkvalidator.typoscript
+
+    mod.linkvalidator {
+       linktypes = db,file,external,example
+    }
+
diff --git a/typo3/sysext/linkvalidator/Documentation/CodeSnippets/Examples/ExampleLinkType.rst.txt b/typo3/sysext/linkvalidator/Documentation/CodeSnippets/Examples/ExampleLinkType.rst.txt
new file mode 100644
index 0000000000000000000000000000000000000000..fdaac5356e271a9a7697ca745437410726c8b3e5
--- /dev/null
+++ b/typo3/sysext/linkvalidator/Documentation/CodeSnippets/Examples/ExampleLinkType.rst.txt
@@ -0,0 +1,30 @@
+.. code-block:: php
+    :caption: EXT:examples/Classes/LinkValidator/LinkType/ExampleLinkType.php
+
+    use TYPO3\CMS\Linkvalidator\Linktype\AbstractLinktype;
+
+    class ExampleLinkType extends AbstractLinktype
+    {
+        protected string $identifier = 'example';
+
+        public function checkLink($url, $softRefEntry, $reference)
+        {
+            $isValidUrl = false;
+            // TODO: Implement checkLink() method.
+            return $isValidUrl;
+        }
+
+        public function getErrorMessage($errorParams)
+        {
+            $lang = $this->getLanguageService();
+            switch ($errorParams['errno'] ?? 0) {
+                case 404:
+                    $message = $lang->getLL('list.report.pagenotfound404');
+                    break;
+                default:
+                    // fall back to generic error message
+                    $message = sprintf($lang->getLL('list.report.externalerror'), $errorParams['errno']);
+            }
+            return $message;
+        }
+    }
diff --git a/typo3/sysext/linkvalidator/Documentation/Configuration/Index.rst b/typo3/sysext/linkvalidator/Documentation/Configuration/Index.rst
index dcfd8ae3c7c13c847a1379f55c6d929271ceb635..2f9d8fa0ce94163c1a99933379a53b18e369531e 100644
--- a/typo3/sysext/linkvalidator/Documentation/Configuration/Index.rst
+++ b/typo3/sysext/linkvalidator/Documentation/Configuration/Index.rst
@@ -122,8 +122,8 @@ linktypes
 
          external: Check links to external files.
 
-         This list may be extended by other extensions providing a linktype
-         checker.
+         This list may be extended by other extensions providing a
+         :ref:`custom linktype implementation <linktype-implementation>`.
 
    Default
          db,file,external
diff --git a/typo3/sysext/linkvalidator/Documentation/Development/Api/AbstractLinktype.rst b/typo3/sysext/linkvalidator/Documentation/Development/Api/AbstractLinktype.rst
new file mode 100644
index 0000000000000000000000000000000000000000..50d908406eef363e38760e6affdb0601054c4c66
--- /dev/null
+++ b/typo3/sysext/linkvalidator/Documentation/Development/Api/AbstractLinktype.rst
@@ -0,0 +1,9 @@
+.. include:: /Includes.rst.txt
+
+.. _linkvalidatorapi-AbstractLinktype:
+
+================
+AbstractLinktype
+================
+
+.. include:: /CodeSnippets/Api/AbstractLinktype.rst.txt
diff --git a/typo3/sysext/linkvalidator/Documentation/Development/Api/Index.rst b/typo3/sysext/linkvalidator/Documentation/Development/Api/Index.rst
new file mode 100644
index 0000000000000000000000000000000000000000..14a0fa840a2ca4acda4c99f4da28506cb4e44b6a
--- /dev/null
+++ b/typo3/sysext/linkvalidator/Documentation/Development/Api/Index.rst
@@ -0,0 +1,19 @@
+.. include:: /Includes.rst.txt
+
+.. _api:
+
+===
+API
+===
+
+The following classes, interfaces and events are frequently used by developers
+of third party extensions. For the complete API have a look into the code.
+
+.. toctree::
+    :titlesonly:
+
+    AbstractLinktype
+    LinktypeInterface
+    LinkAnalyzerResult
+    BeforeRecordIsAnalyzedEvent <https://docs.typo3.org/m/typo3/reference-coreapi/main/en-us/ApiOverview/Hooks/Events/Linkvalidator/BeforeRecordIsAnalyzedEvent.html>
+    ModifyValidatorTaskEmailEvent <https://docs.typo3.org/m/typo3/reference-coreapi/main/en-us/ApiOverview/Hooks/Events/Linkvalidator/ModifyValidatorTaskEmailEvent.html>
diff --git a/typo3/sysext/linkvalidator/Documentation/Development/Api/LinkAnalyzerResult.rst b/typo3/sysext/linkvalidator/Documentation/Development/Api/LinkAnalyzerResult.rst
new file mode 100644
index 0000000000000000000000000000000000000000..36b8605828f619c44f64b415ed8cc4be2c8603bc
--- /dev/null
+++ b/typo3/sysext/linkvalidator/Documentation/Development/Api/LinkAnalyzerResult.rst
@@ -0,0 +1,15 @@
+.. include:: /Includes.rst.txt
+
+.. _linkvalidatorapi-LinkAnalyzerResult:
+
+==================
+LinkAnalyzerResult
+==================
+
+The :php:`LinkAnalyzerResult` can be manipulated by the event
+:ref:`TYPO3\\CMS\\Linkvalidator\\Event\\ModifyValidatorTaskEmailEvent <t3coreapi:ModifyValidatorTaskEmailEvent>`.
+
+API
+===
+
+.. include:: /CodeSnippets/Api/LinkAnalyzerResult.rst.txt
diff --git a/typo3/sysext/linkvalidator/Documentation/Development/Api/LinktypeInterface.rst b/typo3/sysext/linkvalidator/Documentation/Development/Api/LinktypeInterface.rst
new file mode 100644
index 0000000000000000000000000000000000000000..11bc4ea06638bb40b96f901b3ca57904f8b6361d
--- /dev/null
+++ b/typo3/sysext/linkvalidator/Documentation/Development/Api/LinktypeInterface.rst
@@ -0,0 +1,9 @@
+.. include:: /Includes.rst.txt
+
+.. _linkvalidatorapi-LinktypeInterface:
+
+=================
+LinktypeInterface
+=================
+
+.. include:: /CodeSnippets/Api/LinktypeInterface.rst.txt
diff --git a/typo3/sysext/linkvalidator/Documentation/Development/Index.rst b/typo3/sysext/linkvalidator/Documentation/Development/Index.rst
new file mode 100644
index 0000000000000000000000000000000000000000..76b4e28defddd78b061fe3b4ab04ee5d4bb7820f
--- /dev/null
+++ b/typo3/sysext/linkvalidator/Documentation/Development/Index.rst
@@ -0,0 +1,42 @@
+.. include:: /Includes.rst.txt
+
+.. _development:
+
+===========
+Development
+===========
+
+.. container:: row m-0 p-0
+
+   .. container:: col-md-6 pl-0 pr-3 py-3 m-0
+
+      .. container:: card px-0 h-100
+
+         .. rst-class:: card-header h3
+
+            .. rubric:: :ref:`Implementation of a custom linktype <linktype-implementation>`
+
+         .. container:: card-body
+
+            The LinkValidator uses so called `linktypes` to check for different
+            types of links. Learn how to implement a custom linktype within
+            an extension.
+
+   .. container:: col-md-6 pl-0 pr-3 py-3 m-0
+
+      .. container:: card px-0 h-100
+
+         .. rst-class:: card-header h3
+
+            .. rubric:: :ref:`API <api>`
+
+         .. container:: card-body
+
+            Overview of important classes and interfaces in the public API.
+
+.. toctree::
+    :hidden:
+    :titlesonly:
+
+    LinkTypeImplementation
+    Api/Index
diff --git a/typo3/sysext/linkvalidator/Documentation/Development/LinkTypeImplementation.rst b/typo3/sysext/linkvalidator/Documentation/Development/LinkTypeImplementation.rst
new file mode 100644
index 0000000000000000000000000000000000000000..30ce37bc435af37f6bc1453c3f945bfb93b050e5
--- /dev/null
+++ b/typo3/sysext/linkvalidator/Documentation/Development/LinkTypeImplementation.rst
@@ -0,0 +1,80 @@
+.. include:: /Includes.rst.txt
+
+.. _linktype-implementation:
+
+================
+Custom linktypes
+================
+
+The LinkValidator uses so called "linktypes" to check for different types of
+links, for example internal or external links.
+
+All "linktypes" have to implement the
+:php:interface:`TYPO3\\CMS\\Linkvalidator\\Linktype\\LinktypeInterface`.
+
+Classes implementing the :php:`LinktypeInterface` are automatically
+registered, if :ref:`autoconfigure <t3coreapi:dependency-injection-autoconfigure>`
+is enabled in :file:`Services.yaml`.
+
+Alternatively, one can manually tag a custom "linktype" with the
+:yaml:`linkvalidator.linktype` tag:
+
+.. code-block:: yaml
+
+    Vendor\Extension\Linktype\MyCustomLinktype:
+      tags:
+        - name: linkvalidator.linktype
+
+Due to the autoconfiguration, the identifier has to be provided by the
+class directly, using the method :php:`getIdentifier()`.
+
+When extending :php:class:`TYPO3\\CMS\\Linkvalidator\\Linktype\\AbstractLinktype`
+it is sufficient to set the :php:`$identifier` class property.
+
+Example
+=======
+
+You can find the following example in the extension
+`t3docs/examples <https://github.com/TYPO3-Documentation/t3docs-examples>`__.
+
+Extend :php:class:`TYPO3\\CMS\\Linkvalidator\\Linktype\\AbstractLinktype` to create
+a custom linktype:
+
+.. include:: /CodeSnippets/Examples/ExampleLinkType.rst.txt
+
+Activate the new linktype in the page tsconfig:
+
+.. include:: /CodeSnippets/Examples/ActivateCustomLinktypeTsConfig.rst.txt
+
+The extension that provides the linktype must have a
+:file:`Configuration/Services.yaml` file that contains either:
+
+.. code-block:: yaml
+    :caption: EXT:examples/Configuration/Services.yaml
+
+    services:
+       _defaults:
+          autoconfigure: true
+
+Or if autoconfiguration is not desired for some reason:
+
+.. code-block:: yaml
+    :caption: EXT:examples/Configuration/Services.yaml
+
+    services:
+       T3docs\Examples\LinkValidator\LinkType\ExampleLinkType:
+          tags:
+             -  name: linkvalidator.linktype
+
+Migration from TYPO3 11 LTS and below
+=====================================
+
+Remove :php:`$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['linkvalidator']['checkLinks']`
+from your :file:`ext_localconf.php` file.
+
+If :yaml:`autoconfigure` is not enabled in your :file:`Configuration/Services.(yaml|php)`,
+add the tag :yaml:`linkvalidator.linktype` manually to your `linktype` service.
+
+Additionally, make sure to either implement
+:php:`public function getIdentifier(): string` or, in case your `linktype` extends
+:php:`AbstractLinktype`, to set the `$identifier` class property.
diff --git a/typo3/sysext/linkvalidator/Documentation/Index.rst b/typo3/sysext/linkvalidator/Documentation/Index.rst
index f8823ac5b4629ed2c2e18e9ccb980585a02e5ea3..1391072c93e4d28352f8f4a36227504d901a4a70 100644
--- a/typo3/sysext/linkvalidator/Documentation/Index.rst
+++ b/typo3/sysext/linkvalidator/Documentation/Index.rst
@@ -47,6 +47,7 @@ send status mails when broken links are detected.
    Editors/Index
    Administration/Index
    Configuration/Index
+   Development/Index
    LargeSites/Index
 
 .. Meta Menu