This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<spanid="plugin-development"></span><spanid="dev-plugin"></span><h1>Plugin Development<aclass="headerlink"href="#module-searx.plugins"title="Link to this heading">¶</a></h1>
<asideclass="sidebar">
<pclass="sidebar-title">Further reading ..</p>
<ulclass="simple">
<li><p><aclass="reference internal"href="../../admin/plugins.html#plugins-admin"><spanclass="std std-ref">List of plugins</span></a></p></li>
<li><p>on each result item: <aclass="reference internal"href="#searx.plugins.Plugin.on_result"title="searx.plugins.Plugin.on_result"><codeclass="xref py py-obj docutils literal notranslate"><spanclass="pre">Plugin.on_result</span></code></a></p></li>
</ul>
<p>For a coding example have a look at <aclass="reference internal"href="self_info.html#self-info-plugin"><spanclass="std std-ref">Self-Info</span></a>.</p>
<emclass="property"><spanclass="pre">class</span><spanclass="w"></span></em><spanclass="sig-prename descclassname"><spanclass="pre">searx.plugins.</span></span><spanclass="sig-name descname"><spanclass="pre">Plugin</span></span><aclass="reference internal"href="../../_modules/searx/plugins/_core.html#Plugin"><spanclass="viewcode-link"><spanclass="pre">[source]</span></span></a><aclass="headerlink"href="#searx.plugins.Plugin"title="Link to this definition">¶</a></dt>
<spanclass="sig-name descname"><spanclass="pre">info</span></span><emclass="property"><spanclass="p"><spanclass="pre">:</span></span><spanclass="w"></span><aclass="reference internal"href="#searx.plugins.PluginInfo"title="searx.plugins._core.PluginInfo"><spanclass="pre">PluginInfo</span></a></em><aclass="headerlink"href="#searx.plugins.Plugin.info"title="Link to this definition">¶</a></dt>
<dd><p>Informations about the <em>plugin</em>, see <aclass="reference internal"href="#searx.plugins.PluginInfo"title="searx.plugins.PluginInfo"><codeclass="xref py py-obj docutils literal notranslate"><spanclass="pre">PluginInfo</span></code></a>.</p>
<spanclass="sig-name descname"><spanclass="pre">log</span></span><emclass="property"><spanclass="p"><spanclass="pre">:</span></span><spanclass="w"></span><aclass="reference external"href="https://docs.python.org/3/library/logging.html#logging.Logger"title="(in Python v3.13)"><spanclass="pre">Logger</span></a></em><aclass="headerlink"href="#searx.plugins.Plugin.log"title="Link to this definition">¶</a></dt>
<dd><p>A logger object, is automatically initialized when calling the
constructor (if not already set in the subclass).</p>
<spanclass="sig-name descname"><spanclass="pre">post_search</span></span><spanclass="sig-paren">(</span><emclass="sig-param"><spanclass="n"><spanclass="pre">request</span></span><spanclass="p"><spanclass="pre">:</span></span><spanclass="w"></span><spanclass="n"><aclass="reference internal"href="../extended_types.html#searx.extended_types.SXNG_Request"title="searx.extended_types.SXNG_Request"><spanclass="pre">SXNG_Request</span></a></span></em>, <emclass="sig-param"><spanclass="n"><spanclass="pre">search</span></span><spanclass="p"><spanclass="pre">:</span></span><spanclass="w"></span><spanclass="n"><aclass="reference internal"href="../../src/searx.search.html#searx.search.SearchWithPlugins"title="searx.search.SearchWithPlugins"><spanclass="pre">SearchWithPlugins</span></a></span></em><spanclass="sig-paren">)</span><spanclass="sig-return"><spanclass="sig-return-icon">→</span><spanclass="sig-return-typehint"><aclass="reference external"href="https://docs.python.org/3/library/constants.html#None"title="(in Python v3.13)"><spanclass="pre">None</span></a><spanclass="w"></span><spanclass="p"><spanclass="pre">|</span></span><spanclass="w"></span><aclass="reference external"href="https://docs.python.org/3/library/typing.html#typing.Sequence"title="(in Python v3.13)"><spanclass="pre">Sequence</span></a><spanclass="p"><spanclass="pre">[</span></span><aclass="reference internal"href="../result_types/base_result.html#searx.result_types._base.Result"title="searx.result_types._base.Result"><spanclass="pre">Result</span></a><spanclass="p"><spanclass="pre">]</span></span></span></span><aclass="reference internal"href="../../_modules/searx/plugins/_core.html#Plugin.post_search"><spanclass="viewcode-link"><spanclass="pre">[source]</span></span></a><aclass="headerlink"href="#searx.plugins.Plugin.post_search"title="Link to this definition">¶</a></dt>
<dd><p>Runs AFTER the search request. Can return a list of <codeclass="xref py py-obj docutils literal notranslate"><spanclass="pre">Result</span></code>
<emclass="property"><spanclass="pre">class</span><spanclass="w"></span></em><spanclass="sig-prename descclassname"><spanclass="pre">searx.plugins.</span></span><spanclass="sig-name descname"><spanclass="pre">PluginInfo</span></span><spanclass="sig-paren">(</span><emclass="sig-param"><spanclass="n"><spanclass="pre">id:</span><spanclass="pre">str</span></span></em>, <emclass="sig-param"><spanclass="n"><spanclass="pre">name:</span><spanclass="pre">str</span></span></em>, <emclass="sig-param"><spanclass="n"><spanclass="pre">description:</span><spanclass="pre">str</span></span></em>, <emclass="sig-param"><spanclass="n"><spanclass="pre">preference_section:</span><spanclass="pre">~typing.Literal['general'</span></span></em>, <emclass="sig-param"><spanclass="n"><spanclass="pre">'ui'</span></span></em>, <emclass="sig-param"><spanclass="n"><spanclass="pre">'privacy'</span></span></em>, <emclass="sig-param"><spanclass="n"><spanclass="pre">'query']</span><spanclass="pre">|</span><spanclass="pre">None</span><spanclass="pre">=</span><spanclass="pre">'general'</span></span></em>, <emclass="sig-param"><spanclass="n"><spanclass="pre">examples:</span><spanclass="pre">list[str]</span><spanclass="pre">=</span><spanclass="pre"><factory></span></span></em>, <emclass="sig-param"><spanclass="n"><spanclass="pre">keywords:</span><spanclass="pre">list[str]</span><spanclass="pre">=</span><spanclass="pre"><factory></span></span></em><spanclass="sig-paren">)</span><aclass="reference internal"href="../../_modules/searx/plugins/_core.html#PluginInfo"><spanclass="viewcode-link"><spanclass="pre">[source]</span></span></a><aclass="headerlink"href="#searx.plugins.PluginInfo"title="Link to this definition">¶</a></dt>
<dd><p>Object that holds informations about a <em>plugin</em>, these infos are shown to
the user in the Preferences menu.</p>
<p>To be able to translate the information into other languages, the text must
be written in English and translated with <aclass="reference external"href="https://python-babel.github.io/flask-babel/index.html#flask_babel.gettext"title="(in Flask-Babel)"><codeclass="xref py py-obj docutils literal notranslate"><spanclass="pre">flask_babel.gettext</span></code></a>.</p>
<spanclass="sig-name descname"><spanclass="pre">id</span></span><emclass="property"><spanclass="p"><spanclass="pre">:</span></span><spanclass="w"></span><aclass="reference external"href="https://docs.python.org/3/library/stdtypes.html#str"title="(in Python v3.13)"><spanclass="pre">str</span></a></em><aclass="headerlink"href="#searx.plugins.PluginInfo.id"title="Link to this definition">¶</a></dt>
<dd><p>The ID-selector in HTML/CSS <cite>#<id></cite>.</p>
<spanclass="sig-name descname"><spanclass="pre">name</span></span><emclass="property"><spanclass="p"><spanclass="pre">:</span></span><spanclass="w"></span><aclass="reference external"href="https://docs.python.org/3/library/stdtypes.html#str"title="(in Python v3.13)"><spanclass="pre">str</span></a></em><aclass="headerlink"href="#searx.plugins.PluginInfo.name"title="Link to this definition">¶</a></dt>
<spanclass="sig-name descname"><spanclass="pre">description</span></span><emclass="property"><spanclass="p"><spanclass="pre">:</span></span><spanclass="w"></span><aclass="reference external"href="https://docs.python.org/3/library/stdtypes.html#str"title="(in Python v3.13)"><spanclass="pre">str</span></a></em><aclass="headerlink"href="#searx.plugins.PluginInfo.description"title="Link to this definition">¶</a></dt>
<dd><p>Short description of the <em>answerer</em>.</p>
<emclass="property"><spanclass="pre">class</span><spanclass="w"></span></em><spanclass="sig-prename descclassname"><spanclass="pre">searx.plugins.</span></span><spanclass="sig-name descname"><spanclass="pre">PluginStorage</span></span><aclass="reference internal"href="../../_modules/searx/plugins/_core.html#PluginStorage"><spanclass="viewcode-link"><spanclass="pre">[source]</span></span></a><aclass="headerlink"href="#searx.plugins.PluginStorage"title="Link to this definition">¶</a></dt>
<dd><p>A storage for managing the <em>plugins</em> of SearXNG.</p>
<spanclass="sig-name descname"><spanclass="pre">legacy_plugins</span></span><emclass="property"><spanclass="w"></span><spanclass="p"><spanclass="pre">=</span></span><spanclass="w"></span><spanclass="pre">['ahmia_filter',</span><spanclass="pre">'calculator',</span><spanclass="pre">'hostnames',</span><spanclass="pre">'oa_doi_rewrite',</span><spanclass="pre">'tor_check',</span><spanclass="pre">'tracker_url_remover',</span><spanclass="pre">'unit_converter']</span></em><aclass="headerlink"href="#searx.plugins.PluginStorage.legacy_plugins"title="Link to this definition">¶</a></dt>
<dd><p>Internal plugins implemented in the legacy style (as module / deprecated!).</p>
<spanclass="sig-name descname"><spanclass="pre">plugin_list</span></span><emclass="property"><spanclass="p"><spanclass="pre">:</span></span><spanclass="w"></span><aclass="reference external"href="https://docs.python.org/3/library/stdtypes.html#set"title="(in Python v3.13)"><spanclass="pre">set</span></a><spanclass="p"><spanclass="pre">[</span></span><aclass="reference internal"href="#searx.plugins.Plugin"title="searx.plugins._core.Plugin"><spanclass="pre">Plugin</span></a><spanclass="p"><spanclass="pre">]</span></span></em><aclass="headerlink"href="#searx.plugins.PluginStorage.plugin_list"title="Link to this definition">¶</a></dt>
<dd><p>The list of <codeclass="xref py py-obj docutils literal notranslate"><spanclass="pre">Plugins</span></code> in this storage.</p>
<spanclass="sig-name descname"><spanclass="pre">load_builtins</span></span><spanclass="sig-paren">(</span><spanclass="sig-paren">)</span><aclass="reference internal"href="../../_modules/searx/plugins/_core.html#PluginStorage.load_builtins"><spanclass="viewcode-link"><spanclass="pre">[source]</span></span></a><aclass="headerlink"href="#searx.plugins.PluginStorage.load_builtins"title="Link to this definition">¶</a></dt>
<dd><p>Load plugin modules from:</p>
<ulclass="simple">
<li><p>the python packages in <aclass="extlink-origin reference external"href="https://github.com/searxng/searxng/blob/master/searx/plugins">git://searx/plugins</a> and</p></li>
<li><p>the external plugins from <aclass="reference internal"href="../../admin/settings/settings_plugins.html#settings-plugins"><spanclass="std std-ref">Plugins</span></a>.</p></li>
<spanclass="sig-name descname"><spanclass="pre">register</span></span><spanclass="sig-paren">(</span><emclass="sig-param"><spanclass="n"><spanclass="pre">plugin</span></span><spanclass="p"><spanclass="pre">:</span></span><spanclass="w"></span><spanclass="n"><aclass="reference internal"href="#searx.plugins.Plugin"title="searx.plugins._core.Plugin"><spanclass="pre">Plugin</span></a></span></em><spanclass="sig-paren">)</span><aclass="reference internal"href="../../_modules/searx/plugins/_core.html#PluginStorage.register"><spanclass="viewcode-link"><spanclass="pre">[source]</span></span></a><aclass="headerlink"href="#searx.plugins.PluginStorage.register"title="Link to this definition">¶</a></dt>
<dd><p>Register a <aclass="reference internal"href="#searx.plugins.Plugin"title="searx.plugins.Plugin"><codeclass="xref py py-obj docutils literal notranslate"><spanclass="pre">Plugin</span></code></a>. In case of name collision (if two
plugins have same ID) a <aclass="reference external"href="https://docs.python.org/3/library/exceptions.html#KeyError"title="(in Python v3.13)"><codeclass="xref py py-obj docutils literal notranslate"><spanclass="pre">KeyError</span></code></a> exception is raised.</p>
<spanclass="sig-name descname"><spanclass="pre">register_by_fqn</span></span><spanclass="sig-paren">(</span><emclass="sig-param"><spanclass="n"><spanclass="pre">fqn</span></span><spanclass="p"><spanclass="pre">:</span></span><spanclass="w"></span><spanclass="n"><aclass="reference external"href="https://docs.python.org/3/library/stdtypes.html#str"title="(in Python v3.13)"><spanclass="pre">str</span></a></span></em><spanclass="sig-paren">)</span><aclass="reference internal"href="../../_modules/searx/plugins/_core.html#PluginStorage.register_by_fqn"><spanclass="viewcode-link"><spanclass="pre">[source]</span></span></a><aclass="headerlink"href="#searx.plugins.PluginStorage.register_by_fqn"title="Link to this definition">¶</a></dt>
<dd><p>Register a <aclass="reference internal"href="#searx.plugins.Plugin"title="searx.plugins.Plugin"><codeclass="xref py py-obj docutils literal notranslate"><spanclass="pre">Plugin</span></code></a> via its fully qualified class name (FQN).
The FQNs of external plugins could be read from a configuration, for
<spanclass="sig-name descname"><spanclass="pre">init</span></span><spanclass="sig-paren">(</span><emclass="sig-param"><spanclass="n"><spanclass="pre">app</span></span><spanclass="p"><spanclass="pre">:</span></span><spanclass="w"></span><spanclass="n"><aclass="reference external"href="https://flask.palletsprojects.com/en/stable/api/#flask.Flask"title="(in Flask v3.1.x)"><spanclass="pre">Flask</span></a></span></em><spanclass="sig-paren">)</span><spanclass="sig-return"><spanclass="sig-return-icon">→</span><spanclass="sig-return-typehint"><aclass="reference external"href="https://docs.python.org/3/library/constants.html#None"title="(in Python v3.13)"><spanclass="pre">None</span></a></span></span><aclass="reference internal"href="../../_modules/searx/plugins/_core.html#PluginStorage.init"><spanclass="viewcode-link"><spanclass="pre">[source]</span></span></a><aclass="headerlink"href="#searx.plugins.PluginStorage.init"title="Link to this definition">¶</a></dt>
<dd><p>Calls the method <aclass="reference internal"href="#searx.plugins.Plugin.init"title="searx.plugins.Plugin.init"><codeclass="xref py py-obj docutils literal notranslate"><spanclass="pre">Plugin.init</span></code></a> of each plugin in this
storage. Depending on its return value, the plugin is removed from
<emclass="property"><spanclass="pre">class</span><spanclass="w"></span></em><spanclass="sig-prename descclassname"><spanclass="pre">searx.plugins._core.</span></span><spanclass="sig-name descname"><spanclass="pre">ModulePlugin</span></span><spanclass="sig-paren">(</span><emclass="sig-param"><spanclass="n"><spanclass="pre">mod</span></span><spanclass="p"><spanclass="pre">:</span></span><spanclass="w"></span><spanclass="n"><aclass="reference external"href="https://docs.python.org/3/library/types.html#types.ModuleType"title="(in Python v3.13)"><spanclass="pre">ModuleType</span></a></span></em><spanclass="sig-paren">)</span><aclass="reference internal"href="../../_modules/searx/plugins/_core.html#ModulePlugin"><spanclass="viewcode-link"><spanclass="pre">[source]</span></span></a><aclass="headerlink"href="#searx.plugins._core.ModulePlugin"title="Link to this definition">¶</a></dt>
<spanclass="sig-name descname"><spanclass="pre">post_search</span></span><spanclass="sig-paren">(</span><emclass="sig-param"><spanclass="n"><spanclass="pre">request</span></span><spanclass="p"><spanclass="pre">:</span></span><spanclass="w"></span><spanclass="n"><aclass="reference internal"href="../extended_types.html#searx.extended_types.SXNG_Request"title="searx.extended_types.SXNG_Request"><spanclass="pre">SXNG_Request</span></a></span></em>, <emclass="sig-param"><spanclass="n"><spanclass="pre">search</span></span><spanclass="p"><spanclass="pre">:</span></span><spanclass="w"></span><spanclass="n"><aclass="reference internal"href="../../src/searx.search.html#searx.search.SearchWithPlugins"title="searx.search.SearchWithPlugins"><spanclass="pre">SearchWithPlugins</span></a></span></em><spanclass="sig-paren">)</span><spanclass="sig-return"><spanclass="sig-return-icon">→</span><spanclass="sig-return-typehint"><aclass="reference external"href="https://docs.python.org/3/library/constants.html#None"title="(in Python v3.13)"><spanclass="pre">None</span></a><spanclass="w"></span><spanclass="p"><spanclass="pre">|</span></span><spanclass="w"></span><aclass="reference external"href="https://docs.python.org/3/library/stdtypes.html#list"title="(in Python v3.13)"><spanclass="pre">list</span></a><spanclass="p"><spanclass="pre">[</span></span><aclass="reference internal"href="../result_types/base_result.html#searx.result_types._base.Result"title="searx.result_types._base.Result"><spanclass="pre">Result</span></a><spanclass="p"><spanclass="pre">]</span></span></span></span><aclass="reference internal"href="../../_modules/searx/plugins/_core.html#ModulePlugin.post_search"><spanclass="viewcode-link"><spanclass="pre">[source]</span></span></a><aclass="headerlink"href="#searx.plugins._core.ModulePlugin.post_search"title="Link to this definition">¶</a></dt>
<dd><p>Runs AFTER the search request. Can return a list of <codeclass="xref py py-obj docutils literal notranslate"><spanclass="pre">Result</span></code>