<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Seurch Documentation on Seurch Docs</title><link>https://docs.seurch.eu/</link><description>Recent content in Seurch Documentation on Seurch Docs</description><generator>Hugo</generator><language>en</language><atom:link href="https://docs.seurch.eu/index.xml" rel="self" type="application/rss+xml"/><item><title>Authentication</title><link>https://docs.seurch.eu/api/authentication/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.seurch.eu/api/authentication/</guid><description>&lt;h1 id="authentication"&gt;Authentication&lt;a class="anchor" href="#authentication"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Every API request must carry a valid &lt;strong&gt;API key&lt;/strong&gt;. Keys are issued per user; a
request without one gets &lt;code&gt;401&lt;/code&gt;, and a request with a bad or revoked one is
rejected.&lt;/p&gt;
&lt;blockquote class='book-hint important'&gt;
&lt;p&gt;The API is a &lt;a href="https://docs.seurch.eu/self-hosting/"&gt;self-hosted&lt;/a&gt; feature, so keys are
issued on &lt;strong&gt;your own instance&lt;/strong&gt;, not on the hosted seurch.eu service.&lt;/p&gt;&lt;/blockquote&gt;&lt;h2 id="getting-a-key"&gt;Getting a key&lt;a class="anchor" href="#getting-a-key"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;On your instance:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;In the web UI:&lt;/strong&gt; &lt;strong&gt;Settings → API keys&lt;/strong&gt;, create a key (optionally name it).
The full key is shown &lt;strong&gt;once&lt;/strong&gt;, copy it immediately.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;From the command line&lt;/strong&gt; (admins):
&lt;code&gt;python manage.py create_api_key &amp;lt;username&amp;gt; --name &amp;quot;my script&amp;quot;&lt;/code&gt;, see
&lt;a href="https://docs.seurch.eu/self-hosting/api-keys/"&gt;Issuing API keys&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A key looks like:&lt;/p&gt;</description></item><item><title>Getting started</title><link>https://docs.seurch.eu/user-guide/getting-started/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.seurch.eu/user-guide/getting-started/</guid><description>&lt;h1 id="getting-started"&gt;Getting started&lt;a class="anchor" href="#getting-started"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id="sign-in"&gt;Sign in&lt;a class="anchor" href="#sign-in"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Seurch requires an account, there is no anonymous &lt;strong&gt;search&lt;/strong&gt;. The account
itself, though, can be &lt;strong&gt;anonymous&lt;/strong&gt;: only a username and password are needed,
&lt;strong&gt;no email or personal details are required&lt;/strong&gt; (an email is optional, and only
for password reset, see &lt;a href="https://docs.seurch.eu/user-guide/account/"&gt;Your account&lt;/a&gt;). On the hosted
service, accounts are invite-only during the alpha; on a self-hosted instance
the administrator creates them.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Go to your Seurch instance (the hosted service is at
&lt;a href="https://seurch.eu/"&gt;seurch.eu&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Sign in&lt;/strong&gt; and enter your username and password.&lt;/li&gt;
&lt;li&gt;You land on the search home page.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If you forget your password and added an email to your account, use the
&lt;strong&gt;Forgot password?&lt;/strong&gt; link to reset it. Without an email on file a lost password
cannot be recovered, see &lt;a href="https://docs.seurch.eu/user-guide/account/"&gt;Your account&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Requirements</title><link>https://docs.seurch.eu/self-hosting/requirements/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.seurch.eu/self-hosting/requirements/</guid><description>&lt;h1 id="requirements"&gt;Requirements&lt;a class="anchor" href="#requirements"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id="runtime"&gt;Runtime&lt;a class="anchor" href="#runtime"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Component&lt;/th&gt;
					&lt;th&gt;Notes&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;A container runtime&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Docker or Podman, to run the published image.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;PostgreSQL&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;The application database. Any reasonably recent PostgreSQL (16+) works.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;A Brave Search API key&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;The minimum for useful results, see &lt;a href="https://docs.seurch.eu/self-hosting/search-providers/"&gt;Search providers&lt;/a&gt;. The free tier is enough to start.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Outbound HTTPS&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;The server calls upstream providers; if you run behind an allowlist, see the &lt;a href="https://docs.seurch.eu/self-hosting/search-providers/#network-allowlist"&gt;provider hosts&lt;/a&gt;.&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Everything else, the web server, static-file serving and translation-catalog
compilation, is built into the image.&lt;/p&gt;</description></item><item><title>Quick start</title><link>https://docs.seurch.eu/self-hosting/quick-start/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.seurch.eu/self-hosting/quick-start/</guid><description>&lt;h1 id="quick-start"&gt;Quick start&lt;a class="anchor" href="#quick-start"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;The fastest way to a running instance is the Docker image. You need a
PostgreSQL database and, at minimum, a &lt;a href="https://docs.seurch.eu/self-hosting/search-providers/"&gt;Brave Search API
key&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="with-docker"&gt;With Docker&lt;a class="anchor" href="#with-docker"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker run -p 8000:8000 &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -e &lt;span class="nv"&gt;SECRET_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;your-long-random-secret &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -e &lt;span class="nv"&gt;DATABASE_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;postgres://user:password@db-host:5432/seurch &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -e &lt;span class="nv"&gt;ALLOWED_HOSTS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;search.example.com &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -e &lt;span class="nv"&gt;BRAVE_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;your-brave-key &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -e &lt;span class="nv"&gt;BRAVE_SUGGEST_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;your-brave-suggest-key &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -e &lt;span class="nv"&gt;MARGINALIA_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;public &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; seurch&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;On start the container:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Applies database &lt;strong&gt;migrations&lt;/strong&gt; (a no-op once the schema is current).&lt;/li&gt;
&lt;li&gt;Serves the app with &lt;strong&gt;gunicorn&lt;/strong&gt; (2 workers) on port &lt;strong&gt;8000&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Serves its own static files via
&lt;a href="https://whitenoise.readthedocs.io/"&gt;WhiteNoise&lt;/a&gt; (compressed and hashed), no
separate web server or CDN required.&lt;/li&gt;
&lt;li&gt;Answers a health check at &lt;strong&gt;&lt;code&gt;/up&lt;/code&gt;&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The translation catalogs and static files are compiled at build time, so there
is nothing else to run.&lt;/p&gt;</description></item><item><title>Rate limits</title><link>https://docs.seurch.eu/api/rate-limits/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.seurch.eu/api/rate-limits/</guid><description>&lt;h1 id="rate-limits"&gt;Rate limits&lt;a class="anchor" href="#rate-limits"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Each API key has its own budget, enforced by &lt;strong&gt;two limits that apply together&lt;/strong&gt;.
A request must satisfy both:&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Limit&lt;/th&gt;
					&lt;th&gt;Default&lt;/th&gt;
					&lt;th&gt;Purpose&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Burst&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;60/min&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Short-term cap, protects upstream providers from a runaway client.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Sustained&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;5000/day&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Caps total daily volume.&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;On a self-hosted instance these are configurable with &lt;code&gt;API_THROTTLE_BURST&lt;/code&gt; and
&lt;code&gt;API_THROTTLE_SUSTAINED&lt;/code&gt;, see
&lt;a href="https://docs.seurch.eu/self-hosting/configuration/#public-api-rate-limits"&gt;Configuration&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="when-you-exceed-a-limit"&gt;When you exceed a limit&lt;a class="anchor" href="#when-you-exceed-a-limit"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Exceeding either limit returns:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;HTTP 429 Too Many Requests&lt;/code&gt;&lt;/pre&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nt"&gt;&amp;#34;detail&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Request was throttled. Expected available in 12 seconds.&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;DRF includes a &lt;code&gt;Retry-After&lt;/code&gt; hint in the message; back off and retry after the
indicated time. A robust client should handle &lt;code&gt;429&lt;/code&gt; with exponential backoff.&lt;/p&gt;</description></item><item><title>Web search</title><link>https://docs.seurch.eu/user-guide/web-search/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.seurch.eu/user-guide/web-search/</guid><description>&lt;h1 id="web-search"&gt;Web search&lt;a class="anchor" href="#web-search"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;The &lt;strong&gt;Web&lt;/strong&gt; tab is Seurch&amp;rsquo;s core. It can draw on three independent web indexes
and blend whatever you enable into one ranked list.&lt;/p&gt;
&lt;h2 id="the-three-engines"&gt;The three engines&lt;a class="anchor" href="#the-three-engines"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Engine&lt;/th&gt;
					&lt;th&gt;What it is&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Brave&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;A large independent web index (also powers Images, News and Videos).&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Mojeek&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;An independent UK search index with its own crawler.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Marginalia&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;A non-commercial index focused on the small, non-commercial web.&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;You choose which engines to use in &lt;strong&gt;Settings → Engines&lt;/strong&gt;. Enable just one for a
single source, or several to blend them. All three are on by default.&lt;/p&gt;</description></item><item><title>Configuration</title><link>https://docs.seurch.eu/self-hosting/configuration/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.seurch.eu/self-hosting/configuration/</guid><description>&lt;h1 id="configuration"&gt;Configuration&lt;a class="anchor" href="#configuration"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Seurch is configured entirely through &lt;strong&gt;environment variables&lt;/strong&gt; (in production)
or a &lt;code&gt;.env&lt;/code&gt; file (in development). The repository ships an &lt;code&gt;.env.example&lt;/code&gt;
documenting every variable; this page is the reference.&lt;/p&gt;
&lt;h2 id="core"&gt;Core&lt;a class="anchor" href="#core"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Variable&lt;/th&gt;
					&lt;th&gt;Purpose&lt;/th&gt;
					&lt;th&gt;Notes&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;SECRET_KEY&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Django secret key&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;Required in production.&lt;/strong&gt; Long and random.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;DEBUG&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Debug mode&lt;/td&gt;
					&lt;td&gt;Keep &lt;strong&gt;&lt;code&gt;False&lt;/code&gt;&lt;/strong&gt; (the default) in production.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;ALLOWED_HOSTS&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Comma-separated hostnames the app will serve&lt;/td&gt;
					&lt;td&gt;e.g. &lt;code&gt;search.example.com&lt;/code&gt;.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;DATABASE_URL&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;PostgreSQL connection URL&lt;/td&gt;
					&lt;td&gt;e.g. &lt;code&gt;postgres://user:pass@host:5432/seurch&lt;/code&gt;.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;LOG_LEVEL&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Logging verbosity&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;DEBUG&lt;/code&gt; / &lt;code&gt;INFO&lt;/code&gt; / &lt;code&gt;WARNING&lt;/code&gt; / &lt;code&gt;ERROR&lt;/code&gt; (default &lt;code&gt;INFO&lt;/code&gt;).&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="search-providers"&gt;Search providers&lt;a class="anchor" href="#search-providers"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;These keys decide which engines, media tabs and knowledge cards are available.
A provider with no key is simply hidden (not shown as broken). Full details on
&lt;a href="https://docs.seurch.eu/self-hosting/search-providers/"&gt;Search providers&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Conventions</title><link>https://docs.seurch.eu/api/conventions/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.seurch.eu/api/conventions/</guid><description>&lt;h1 id="conventions"&gt;Conventions&lt;a class="anchor" href="#conventions"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id="shared-query-parameters"&gt;Shared query parameters&lt;a class="anchor" href="#shared-query-parameters"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The search endpoints accept a common set of parameters. Each maps to an option
the website keeps in its preferences cookie, here they&amp;rsquo;re explicit in the URL.&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Parameter&lt;/th&gt;
					&lt;th&gt;Applies to&lt;/th&gt;
					&lt;th&gt;Values&lt;/th&gt;
					&lt;th&gt;Default&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;q&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;all search endpoints&lt;/td&gt;
					&lt;td&gt;The query string (&lt;strong&gt;required&lt;/strong&gt;)&lt;/td&gt;
					&lt;td&gt;—&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;engine&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;web, images, news, videos, cards&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;brave&lt;/code&gt;, &lt;code&gt;mojeek&lt;/code&gt;, &lt;code&gt;marginalia&lt;/code&gt;, or &lt;code&gt;all&lt;/code&gt;; comma/space-separate several&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;all&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;safe&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;web, images, news, videos, cards&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;on&lt;/code&gt; / &lt;code&gt;off&lt;/code&gt; (&lt;code&gt;off&lt;/code&gt;, &lt;code&gt;false&lt;/code&gt;, &lt;code&gt;0&lt;/code&gt;, &lt;code&gt;no&lt;/code&gt; all mean off)&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;on&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;lang&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;most endpoints&lt;/td&gt;
					&lt;td&gt;A language code, e.g. &lt;code&gt;en&lt;/code&gt;, &lt;code&gt;fr&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;empty (auto)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;page&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;web, images, news, videos&lt;/td&gt;
					&lt;td&gt;Page number, &lt;code&gt;1&lt;/code&gt;–&lt;code&gt;50&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;1&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;date&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;web, news, videos&lt;/td&gt;
					&lt;td&gt;Time range: &lt;code&gt;d&lt;/code&gt; (day), &lt;code&gt;w&lt;/code&gt; (week), &lt;code&gt;m&lt;/code&gt; (month), &lt;code&gt;y&lt;/code&gt; (year)&lt;/td&gt;
					&lt;td&gt;none&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Notes:&lt;/p&gt;</description></item><item><title>Search tabs</title><link>https://docs.seurch.eu/user-guide/search-tabs/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.seurch.eu/user-guide/search-tabs/</guid><description>&lt;h1 id="search-tabs"&gt;Search tabs&lt;a class="anchor" href="#search-tabs"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Besides the Web tab, Seurch has dedicated tabs for images, news, videos, maps
and translation. Each runs your query against sources suited to that kind of
content. A tab only appears when the instance has the provider it needs
configured.&lt;/p&gt;
&lt;h2 id="images"&gt;Images&lt;a class="anchor" href="#images"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Image results come from the Brave image index, blended with &lt;strong&gt;Pixabay&lt;/strong&gt; where it
is enabled. Results are shown as a thumbnail grid.&lt;/p&gt;
&lt;p&gt;Click any image to open a &lt;strong&gt;lightbox&lt;/strong&gt; (much like Google Images):&lt;/p&gt;</description></item><item><title>Instant answers</title><link>https://docs.seurch.eu/user-guide/instant-answers/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.seurch.eu/user-guide/instant-answers/</guid><description>&lt;h1 id="instant-answers"&gt;Instant answers&lt;a class="anchor" href="#instant-answers"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;For common utility queries, Seurch shows an &lt;strong&gt;instant answer&lt;/strong&gt; right at the top
of the web results, so you get the answer without clicking through. This is in
the spirit of DuckDuckGo&amp;rsquo;s instant answers.&lt;/p&gt;
&lt;p&gt;Almost every instant answer is computed &lt;strong&gt;locally on the server&lt;/strong&gt;, with no third
party involved and nothing about your query sent anywhere.&lt;/p&gt;
&lt;h2 id="what-you-can-ask"&gt;What you can ask&lt;a class="anchor" href="#what-you-can-ask"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Category&lt;/th&gt;
					&lt;th&gt;Example queries&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;Calculator&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;2+2&lt;/code&gt;, &lt;code&gt;sqrt(16)*3&lt;/code&gt;, &lt;code&gt;15% of 200&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Unit conversion&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;5 km to miles&lt;/code&gt;, &lt;code&gt;100 f to c&lt;/code&gt;, &lt;code&gt;2 cups to ml&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Base conversion&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;0xff in decimal&lt;/code&gt;, &lt;code&gt;255 in binary&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Colour&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;#4f46e5&lt;/code&gt;, &lt;code&gt;rgb(255,128,0)&lt;/code&gt;, &lt;code&gt;color picker&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;World clock&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;time in tokyo&lt;/code&gt;, &lt;code&gt;what time is it in new york&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;QR code&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;qr code https://example.com&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Hash / UUID&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;md5 hello&lt;/code&gt;, &lt;code&gt;sha256 of test&lt;/code&gt;, &lt;code&gt;uuid&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Password&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;password generator&lt;/code&gt;, &lt;code&gt;strong password&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Unix time&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;unix timestamp&lt;/code&gt;, &lt;code&gt;1700000000 to date&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Encode / decode&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;base64 encode hi&lt;/code&gt;, &lt;code&gt;url decode foo%20bar&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;JSON / Regex&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;json formatter&lt;/code&gt;, &lt;code&gt;regex tester&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;HTTP / Ports&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;http 404&lt;/code&gt;, &lt;code&gt;port 443&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Randomisers&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;roll 2d6&lt;/code&gt;, &lt;code&gt;flip a coin&lt;/code&gt;, &lt;code&gt;random number 1-100&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Timer&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;timer 5 minutes&lt;/code&gt;, &lt;code&gt;stopwatch&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;What&amp;rsquo;s my IP&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;what's my ip&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="multilingual-triggers"&gt;Multilingual triggers&lt;a class="anchor" href="#multilingual-triggers"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Instant answers fire in &lt;strong&gt;seven languages&lt;/strong&gt;, English, French, German, Spanish,
Italian, Portuguese and Dutch. For example, all of these work:&lt;/p&gt;</description></item><item><title>Search endpoints</title><link>https://docs.seurch.eu/api/search/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.seurch.eu/api/search/</guid><description>&lt;h1 id="search-endpoints"&gt;Search endpoints&lt;a class="anchor" href="#search-endpoints"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;The bread-and-butter endpoints: web, image, news and video search, plus the
&amp;ldquo;similar images&amp;rdquo; helper. All take the &lt;a href="https://docs.seurch.eu/api/conventions/"&gt;shared parameters&lt;/a&gt;
(&lt;code&gt;q&lt;/code&gt;, &lt;code&gt;engine&lt;/code&gt;, &lt;code&gt;safe&lt;/code&gt;, &lt;code&gt;lang&lt;/code&gt;, &lt;code&gt;page&lt;/code&gt;, &lt;code&gt;date&lt;/code&gt;).&lt;/p&gt;
&lt;h2 id="web-search"&gt;Web search&lt;a class="anchor" href="#web-search"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;GET /api/v1/web/?q=...&lt;/code&gt;&lt;/pre&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -H &lt;span class="s2"&gt;&amp;#34;Authorization: Api-Key seurch_sk_&amp;lt;prefix&amp;gt;.&amp;lt;secret&amp;gt;&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;https://search.example.com/api/v1/web/?q=climate&amp;amp;engine=all&amp;amp;lang=en&amp;amp;date=w&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;query&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;climate&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;tab&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;web&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;page&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;engine&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;brave&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;mojeek&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;marginalia&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;correction&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;results&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;title&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Climate change&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;url&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;https://example.org/climate&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;description&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;...&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;display_url&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;example.org&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;favicon_url&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;https://...&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;age&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;2 days ago&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;source&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;all&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;source_label&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Brave, Mojeek, Marginalia&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;sitelinks&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;source&lt;/code&gt; / &lt;code&gt;source_label&lt;/code&gt; — which engine(s) returned the result. &lt;code&gt;brave&lt;/code&gt; /
&lt;code&gt;mojeek&lt;/code&gt; / &lt;code&gt;marginalia&lt;/code&gt; for a single engine, or &lt;code&gt;both&lt;/code&gt; / &lt;code&gt;all&lt;/code&gt; for cross-engine
agreement (&lt;code&gt;source_label&lt;/code&gt; is the readable form).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;correction&lt;/code&gt; — a suggested spelling correction, or &lt;code&gt;&amp;quot;&amp;quot;&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="image-search"&gt;Image search&lt;a class="anchor" href="#image-search"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;GET /api/v1/images/?q=...&lt;/code&gt;&lt;/pre&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;query&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;golden retriever&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;tab&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;images&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;page&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;engine&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;brave&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;results&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;title&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;...&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;url&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;https://example.com/page&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;source&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;example.com&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;thumbnail&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;https://.../thumb.jpg&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="similar-images"&gt;Similar images&lt;a class="anchor" href="#similar-images"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Mirrors the website&amp;rsquo;s lightbox &amp;ldquo;similar images&amp;rdquo; grid, an image search seeded
from an opened image&amp;rsquo;s caption.&lt;/p&gt;</description></item><item><title>Search providers</title><link>https://docs.seurch.eu/self-hosting/search-providers/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.seurch.eu/self-hosting/search-providers/</guid><description>&lt;h1 id="search-providers"&gt;Search providers&lt;a class="anchor" href="#search-providers"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Seurch blends results from several independent providers. &lt;strong&gt;Which tabs and cards
appear depends on which keys you set.&lt;/strong&gt; A provider with no key is hidden, the
affected tab or card simply doesn&amp;rsquo;t show, rather than displaying an error.&lt;/p&gt;
&lt;p&gt;All upstream calls happen &lt;strong&gt;server-side&lt;/strong&gt;; keys are never exposed to the browser.&lt;/p&gt;
&lt;p&gt;This page is the &lt;strong&gt;overview&lt;/strong&gt; of which key enables what. For step-by-step signup
instructions for each provider, see
&lt;a href="https://docs.seurch.eu/self-hosting/provider-keys/"&gt;Getting API keys&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Getting API keys</title><link>https://docs.seurch.eu/self-hosting/provider-keys/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.seurch.eu/self-hosting/provider-keys/</guid><description>&lt;h1 id="getting-api-keys"&gt;Getting API keys&lt;a class="anchor" href="#getting-api-keys"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Step-by-step guides for obtaining each provider&amp;rsquo;s key. None are required to boot
Seurch, but at least one &lt;strong&gt;web engine&lt;/strong&gt; (Brave is the easiest) is needed for
useful results. Each provider you skip simply hides its tab or card, see
&lt;a href="https://docs.seurch.eu/self-hosting/search-providers/"&gt;Search providers&lt;/a&gt; for what each one enables.&lt;/p&gt;
&lt;p&gt;Once you have a key, set the matching environment variable (see
&lt;a href="https://docs.seurch.eu/self-hosting/configuration/"&gt;Configuration&lt;/a&gt;) and restart the app.&lt;/p&gt;
&lt;blockquote class='book-hint note'&gt;
&lt;p&gt;All of these have a &lt;strong&gt;free tier&lt;/strong&gt; that is generous enough for a personal or
small-team instance, Seurch caches aggressively and only calls the paid card
APIs when a query actually matches. The shared keys (&lt;code&gt;public&lt;/code&gt; for Marginalia,
anonymous Stack Exchange) need no signup at all.&lt;/p&gt;</description></item><item><title>Knowledge cards</title><link>https://docs.seurch.eu/user-guide/knowledge-cards/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.seurch.eu/user-guide/knowledge-cards/</guid><description>&lt;h1 id="knowledge-cards"&gt;Knowledge cards&lt;a class="anchor" href="#knowledge-cards"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;When your &lt;strong&gt;web&lt;/strong&gt; search (first page) is about a well-known subject, Seurch shows
up to three &lt;strong&gt;knowledge cards&lt;/strong&gt; beside the results, a quick summary so you often
don&amp;rsquo;t need to click through at all.&lt;/p&gt;
&lt;h2 id="the-cards"&gt;The cards&lt;a class="anchor" href="#the-cards"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Card&lt;/th&gt;
					&lt;th&gt;Source&lt;/th&gt;
					&lt;th&gt;Shows&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Wikipedia&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Wikipedia&lt;/td&gt;
					&lt;td&gt;A summary, image and link for the subject. This is the anchor card, it also helps detect what the other cards should show.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Film / TV&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;&lt;a href="https://www.themoviedb.org/"&gt;TMDB&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;Details for a movie or TV show: poster, rating, year, overview.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Places&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;&lt;a href="https://www.tripadvisor.com/"&gt;TripAdvisor&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;A restaurant, hotel or attraction: rating, address (which links to the &lt;a href="https://docs.seurch.eu/user-guide/search-tabs/"&gt;map&lt;/a&gt;) and a link.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Q&amp;amp;A&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;&lt;a href="https://stackexchange.com/"&gt;Stack Exchange&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;The top question and answer for a technical query.&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="how-theyre-chosen"&gt;How they&amp;rsquo;re chosen&lt;a class="anchor" href="#how-theyre-chosen"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Seurch only shows a card when your query genuinely matches that kind of subject:&lt;/p&gt;</description></item><item><title>Maps</title><link>https://docs.seurch.eu/api/maps/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.seurch.eu/api/maps/</guid><description>&lt;h1 id="maps"&gt;Maps&lt;a class="anchor" href="#maps"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Geocode a place name or reverse-geocode a coordinate pair, using OpenStreetMap&amp;rsquo;s
Nominatim. No provider key is required.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;GET /api/v1/maps/&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="geocode-a-place-name"&gt;Geocode a place name&lt;a class="anchor" href="#geocode-a-place-name"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;GET /api/v1/maps/?q=&amp;lt;place&amp;gt;&amp;amp;limit=&amp;lt;n&amp;gt;&amp;amp;lang=&amp;lt;code&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;q&lt;/code&gt; — the place or address to look up (&lt;strong&gt;required&lt;/strong&gt; in this mode).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;limit&lt;/code&gt; — max results, &lt;code&gt;1&lt;/code&gt;–&lt;code&gt;50&lt;/code&gt; (default &lt;code&gt;10&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;lang&lt;/code&gt; — preferred language for names.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -H &lt;span class="s2"&gt;&amp;#34;Authorization: Api-Key seurch_sk_&amp;lt;prefix&amp;gt;.&amp;lt;secret&amp;gt;&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;https://search.example.com/api/v1/maps/?q=Eiffel+Tower&amp;amp;limit=1&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;query&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Eiffel Tower&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;places&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Eiffel Tower&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;display_name&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Eiffel Tower, Paris, France&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;lat&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;48.8584&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;lon&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;2.2945&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;category&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;tourism&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;attraction&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;addresstype&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;tourism&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;importance&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.82&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;embed_url&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;https://www.openstreetmap.org/export/embed.html?...&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;mini_embed_url&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;https://...&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;osm_url&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;https://www.openstreetmap.org/...&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;directions_url&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;https://www.openstreetmap.org/directions?...&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;geo_uri&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;geo:48.8584,2.2945&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="reverse-geocode-coordinates"&gt;Reverse geocode coordinates&lt;a class="anchor" href="#reverse-geocode-coordinates"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Pass &lt;code&gt;lat&lt;/code&gt; and &lt;code&gt;lon&lt;/code&gt; instead of &lt;code&gt;q&lt;/code&gt;:&lt;/p&gt;</description></item><item><title>Bangs</title><link>https://docs.seurch.eu/user-guide/bangs/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.seurch.eu/user-guide/bangs/</guid><description>&lt;h1 id="bangs"&gt;Bangs&lt;a class="anchor" href="#bangs"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;Bangs&lt;/strong&gt; are &lt;code&gt;!shortcuts&lt;/code&gt; you type in the search box to send a query straight to
another site or to a different Seurch tab. Seurch understands the widely-used
DuckDuckGo-style bang vocabulary, thousands of sites, plus a few of its own.&lt;/p&gt;
&lt;p&gt;The bang definitions come from &lt;a href="https://github.com/kagisearch/bangs"&gt;Kagi&amp;rsquo;s open-source bangs
repository&lt;/a&gt;, the same community-maintained
&lt;code&gt;!bang&lt;/code&gt; list Kagi publishes. Self-hosters refresh it with &lt;code&gt;make bangs&lt;/code&gt;, see
&lt;a href="https://docs.seurch.eu/self-hosting/maintenance/#bang-definitions"&gt;Maintenance&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;A bang can sit anywhere in the query, the rest of the text is the search terms.&lt;/p&gt;</description></item><item><title>Translate</title><link>https://docs.seurch.eu/api/translate/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.seurch.eu/api/translate/</guid><description>&lt;h1 id="translate"&gt;Translate&lt;a class="anchor" href="#translate"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Translate text between languages, powered by the instance&amp;rsquo;s LibreTranslate. This
endpoint accepts &lt;strong&gt;GET or POST&lt;/strong&gt;, use POST to keep long text out of the URL and
logs.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;GET /api/v1/translate/
POST /api/v1/translate/&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="translate-text"&gt;Translate text&lt;a class="anchor" href="#translate-text"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Parameter&lt;/th&gt;
					&lt;th&gt;Required&lt;/th&gt;
					&lt;th&gt;Meaning&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;q&lt;/code&gt; (or &lt;code&gt;text&lt;/code&gt;)&lt;/td&gt;
					&lt;td&gt;yes&lt;/td&gt;
					&lt;td&gt;The text to translate&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;target&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;yes&lt;/td&gt;
					&lt;td&gt;Target language code (e.g. &lt;code&gt;fr&lt;/code&gt;)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;source&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;no&lt;/td&gt;
					&lt;td&gt;Source language code; defaults to &lt;code&gt;auto&lt;/code&gt; (detect)&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# GET&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -H &lt;span class="s2"&gt;&amp;#34;Authorization: Api-Key seurch_sk_&amp;lt;prefix&amp;gt;.&amp;lt;secret&amp;gt;&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;https://search.example.com/api/v1/translate/?q=hello&amp;amp;target=fr&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# POST (better for long text)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -X POST -H &lt;span class="s2"&gt;&amp;#34;Authorization: Api-Key seurch_sk_&amp;lt;prefix&amp;gt;.&amp;lt;secret&amp;gt;&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -d &lt;span class="s2"&gt;&amp;#34;q=hello world&amp;#34;&lt;/span&gt; -d &lt;span class="s2"&gt;&amp;#34;target=fr&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;https://search.example.com/api/v1/translate/&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;source&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;auto&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;target&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;fr&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;translated_text&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;bonjour le monde&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;detected_lang&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;en&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;detected_lang&lt;/code&gt; is filled only when &lt;code&gt;source&lt;/code&gt; was &lt;code&gt;auto&lt;/code&gt; (otherwise empty).&lt;/li&gt;
&lt;li&gt;If translation isn&amp;rsquo;t configured on the instance, the endpoint returns
&lt;strong&gt;&lt;code&gt;503&lt;/code&gt;&lt;/strong&gt; with &lt;code&gt;{&amp;quot;detail&amp;quot;: &amp;quot;Translation is unavailable or not configured on this deployment.&amp;quot;}&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="list-available-languages"&gt;List available languages&lt;a class="anchor" href="#list-available-languages"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;GET /api/v1/translate/languages/&lt;/code&gt;&lt;/pre&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;languages&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nt"&gt;&amp;#34;code&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;en&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;English&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nt"&gt;&amp;#34;code&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;fr&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;French&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The list reflects whatever the connected LibreTranslate instance offers, see
&lt;a href="https://docs.seurch.eu/self-hosting/translation/"&gt;Translation&lt;/a&gt; for the self-hosting
side.&lt;/p&gt;</description></item><item><title>Translation</title><link>https://docs.seurch.eu/self-hosting/translation/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.seurch.eu/self-hosting/translation/</guid><description>&lt;h1 id="translation-libretranslate"&gt;Translation (LibreTranslate)&lt;a class="anchor" href="#translation-libretranslate"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;The &lt;strong&gt;Translate&lt;/strong&gt; tab is powered by &lt;a href="https://libretranslate.com/"&gt;LibreTranslate&lt;/a&gt;,
an open-source, self-hostable machine-translation server. Seurch calls it
server-side, no third-party translation service is involved.&lt;/p&gt;
&lt;h2 id="enabling-the-tab"&gt;Enabling the tab&lt;a class="anchor" href="#enabling-the-tab"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Point Seurch at a LibreTranslate instance with &lt;code&gt;LIBRETRANSLATE_URL&lt;/code&gt;:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;LIBRETRANSLATE_URL=http://libretranslate:5000&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Set&lt;/strong&gt; it and the Translate tab (and its setting) appear, with whatever
languages that instance offers.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Leave it unset&lt;/strong&gt; and the Translate tab and its setting are disabled
entirely.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="running-libretranslate"&gt;Running LibreTranslate&lt;a class="anchor" href="#running-libretranslate"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The development stack starts a local LibreTranslate automatically (&lt;code&gt;make up&lt;/code&gt;
brings one up at &lt;code&gt;http://localhost:5000&lt;/code&gt;). For production, run your own, for
example:&lt;/p&gt;</description></item><item><title>Instant &amp; cards</title><link>https://docs.seurch.eu/api/instant-cards/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.seurch.eu/api/instant-cards/</guid><description>&lt;h1 id="instant-answers--knowledge-cards"&gt;Instant answers &amp;amp; knowledge cards&lt;a class="anchor" href="#instant-answers--knowledge-cards"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;These two endpoints mirror the website&amp;rsquo;s inline answers and side panels. Because
their content varies by answer type and provider, they return &lt;strong&gt;provider-shaped
JSON&lt;/strong&gt; rather than a fixed per-field schema, treat the structures as data and
read the fields you need.&lt;/p&gt;
&lt;h2 id="instant-answers"&gt;Instant answers&lt;a class="anchor" href="#instant-answers"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;GET /api/v1/instant/?q=...&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Returns the instant answer for a utility query (maths, unit/base/colour
conversion, weather, currency, world clock, hashes, QR, &amp;ldquo;what&amp;rsquo;s my IP&amp;rdquo;, …), or
&lt;code&gt;null&lt;/code&gt; when the query isn&amp;rsquo;t one Seurch answers inline.&lt;/p&gt;</description></item><item><title>Settings</title><link>https://docs.seurch.eu/user-guide/settings/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.seurch.eu/user-guide/settings/</guid><description>&lt;h1 id="settings"&gt;Settings&lt;a class="anchor" href="#settings"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Open &lt;strong&gt;Settings&lt;/strong&gt; from the home page or the menu to tailor Seurch to you. Your
preferences &lt;strong&gt;sync to your account&lt;/strong&gt; automatically and are restored on any
device you sign in on. They are also stored in your browser, so they apply even
before you sign in.&lt;/p&gt;
&lt;h2 id="what-you-can-change"&gt;What you can change&lt;a class="anchor" href="#what-you-can-change"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Setting&lt;/th&gt;
					&lt;th&gt;Options&lt;/th&gt;
					&lt;th&gt;Default&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Engines&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Any mix of Brave / Mojeek / Marginalia&lt;/td&gt;
					&lt;td&gt;All enabled&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Safe search&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;On / Off&lt;/td&gt;
					&lt;td&gt;On&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Search language&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Auto, or one of the seven UI languages&lt;/td&gt;
					&lt;td&gt;Auto (your browser)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Interface language&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Auto, or one of the seven UI languages&lt;/td&gt;
					&lt;td&gt;Auto&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Theme&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;System / Light / Dark&lt;/td&gt;
					&lt;td&gt;System&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Open links&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Same tab / New tab&lt;/td&gt;
					&lt;td&gt;Same tab&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Proxy images&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;On / Off&lt;/td&gt;
					&lt;td&gt;Off&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Lazy-load knowledge cards&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;On / Off&lt;/td&gt;
					&lt;td&gt;On&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Data sources&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Per-provider on/off toggles&lt;/td&gt;
					&lt;td&gt;All enabled&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="engines"&gt;Engines&lt;a class="anchor" href="#engines"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Pick which web indexes Seurch queries and blends, see
&lt;a href="https://docs.seurch.eu/user-guide/web-search/"&gt;Web search&lt;/a&gt;. This is also where you manage your
&lt;strong&gt;blocked sites&lt;/strong&gt; and &lt;strong&gt;custom &lt;a href="https://docs.seurch.eu/user-guide/bangs/"&gt;bangs&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>Users &amp; access</title><link>https://docs.seurch.eu/self-hosting/users/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.seurch.eu/self-hosting/users/</guid><description>&lt;h1 id="users--access"&gt;Users &amp;amp; access&lt;a class="anchor" href="#users--access"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Seurch is &lt;strong&gt;login-only&lt;/strong&gt; with &lt;strong&gt;no public registration&lt;/strong&gt;, so as the
administrator you control who has an account. This is what keeps an instance
private to your users.&lt;/p&gt;
&lt;h2 id="creating-accounts"&gt;Creating accounts&lt;a class="anchor" href="#creating-accounts"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Create users with Django&amp;rsquo;s standard management command:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Docker&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker &lt;span class="nb"&gt;exec&lt;/span&gt; -it &amp;lt;container&amp;gt; python manage.py createsuperuser
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# From source&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;make superuser&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;createsuperuser&lt;/code&gt; makes an admin account; for ordinary users you can create them
the same way (or from the Django admin once you have a superuser). Each account
needs a username and password; an email is optional (see below).&lt;/p&gt;</description></item><item><title>API keys</title><link>https://docs.seurch.eu/self-hosting/api-keys/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.seurch.eu/self-hosting/api-keys/</guid><description>&lt;h1 id="api-keys"&gt;API keys&lt;a class="anchor" href="#api-keys"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Users access the &lt;a href="https://docs.seurch.eu/api/"&gt;public API&lt;/a&gt; with per-user API keys.
Users can manage their own keys in the web UI (&lt;strong&gt;Settings → API keys&lt;/strong&gt;), and you
can manage them from the command line.&lt;/p&gt;
&lt;h2 id="how-keys-are-stored"&gt;How keys are stored&lt;a class="anchor" href="#how-keys-are-stored"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;A key looks like &lt;code&gt;seurch_sk_&amp;lt;prefix&amp;gt;.&amp;lt;secret&amp;gt;&lt;/code&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;prefix&lt;/strong&gt; (8 characters) is stored in the clear for fast lookup.&lt;/li&gt;
&lt;li&gt;Only a &lt;strong&gt;SHA-256 hash&lt;/strong&gt; of the secret is stored, never the secret itself.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So a key&amp;rsquo;s full value is shown &lt;strong&gt;exactly once&lt;/strong&gt;, at creation, and cannot be
recovered afterwards, only revoked.&lt;/p&gt;</description></item><item><title>Meta endpoints</title><link>https://docs.seurch.eu/api/meta/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.seurch.eu/api/meta/</guid><description>&lt;h1 id="meta-endpoints"&gt;Meta endpoints&lt;a class="anchor" href="#meta-endpoints"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Helpers for autocomplete, provider health, key introspection and endpoint
discovery. The root, &lt;code&gt;status/&lt;/code&gt; and &lt;code&gt;key/&lt;/code&gt; &lt;strong&gt;don&amp;rsquo;t&lt;/strong&gt; count toward your monthly
search usage (they still count against the raw rate limit).&lt;/p&gt;
&lt;h2 id="suggestions"&gt;Suggestions&lt;a class="anchor" href="#suggestions"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Search-bar autocomplete suggestions for a query. &lt;em&gt;(Counts as a search.)&lt;/em&gt;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;GET /api/v1/suggest/?q=...&lt;/code&gt;&lt;/pre&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -H &lt;span class="s2"&gt;&amp;#34;Authorization: Api-Key seurch_sk_&amp;lt;prefix&amp;gt;.&amp;lt;secret&amp;gt;&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;https://search.example.com/api/v1/suggest/?q=clim&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;query&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;clim&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;suggestions&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;climate&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;climate change&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;climbing&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="provider-status"&gt;Provider status&lt;a class="anchor" href="#provider-status"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Current up/down status of each configured upstream provider, the data behind the
&lt;code&gt;/status&lt;/code&gt; page. &lt;em&gt;(Does not count toward usage.)&lt;/em&gt;&lt;/p&gt;</description></item><item><title>Your account</title><link>https://docs.seurch.eu/user-guide/account/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.seurch.eu/user-guide/account/</guid><description>&lt;h1 id="your-account"&gt;Your account&lt;a class="anchor" href="#your-account"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id="signing-in"&gt;Signing in&lt;a class="anchor" href="#signing-in"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Seurch is login-only, every search happens under your account, and there is no
public sign-up form. On the hosted service, accounts are invite-only during the
alpha; on a self-hosted instance the administrator creates accounts.&lt;/p&gt;
&lt;p&gt;Your account can be &lt;strong&gt;anonymous&lt;/strong&gt;: it needs only a username and password, with
&lt;strong&gt;no email or other personal details&lt;/strong&gt;. There is no anonymous &lt;em&gt;search&lt;/em&gt; (you&amp;rsquo;re
always signed in), but the account behind it need not identify you.&lt;/p&gt;</description></item><item><title>Errors</title><link>https://docs.seurch.eu/api/errors/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.seurch.eu/api/errors/</guid><description>&lt;h1 id="errors"&gt;Errors&lt;a class="anchor" href="#errors"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;The API uses standard HTTP status codes and returns a JSON body describing the
problem.&lt;/p&gt;
&lt;h2 id="status-codes"&gt;Status codes&lt;a class="anchor" href="#status-codes"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Code&lt;/th&gt;
					&lt;th&gt;Meaning&lt;/th&gt;
					&lt;th&gt;Typical cause&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;200&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;OK&lt;/td&gt;
					&lt;td&gt;Successful request.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;400&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Bad request&lt;/td&gt;
					&lt;td&gt;A bad parameter, e.g. a missing &lt;code&gt;q&lt;/code&gt;, a non-integer &lt;code&gt;page&lt;/code&gt;, or an unknown &lt;code&gt;engine&lt;/code&gt;.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;401&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Unauthorized&lt;/td&gt;
					&lt;td&gt;No API key sent (or no recognised auth header).&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;403&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Forbidden&lt;/td&gt;
					&lt;td&gt;Key belongs to a disabled account.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;429&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Too many requests&lt;/td&gt;
					&lt;td&gt;A &lt;a href="https://docs.seurch.eu/api/rate-limits/"&gt;rate limit&lt;/a&gt; was exceeded.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;503&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Service unavailable&lt;/td&gt;
					&lt;td&gt;A dependent service isn&amp;rsquo;t configured, e.g. translation when LibreTranslate is unset.&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="error-bodies"&gt;Error bodies&lt;a class="anchor" href="#error-bodies"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="validation-errors-400"&gt;Validation errors (&lt;code&gt;400&lt;/code&gt;)&lt;a class="anchor" href="#validation-errors-400"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Field-keyed messages:&lt;/p&gt;</description></item><item><title>Maintenance</title><link>https://docs.seurch.eu/self-hosting/maintenance/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.seurch.eu/self-hosting/maintenance/</guid><description>&lt;h1 id="maintenance"&gt;Maintenance&lt;a class="anchor" href="#maintenance"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Seurch needs little ongoing care, but a few &lt;strong&gt;management commands&lt;/strong&gt; keep it tidy
and current. Run them on a schedule (a cron job, a systemd timer, or your
orchestrator&amp;rsquo;s scheduled-task feature). Run each inside the container
(&lt;code&gt;docker exec &amp;lt;container&amp;gt; python manage.py …&lt;/code&gt;) or via &lt;code&gt;make&lt;/code&gt; / &lt;code&gt;uv run&lt;/code&gt; from
source.&lt;/p&gt;
&lt;h2 id="scheduled-tasks"&gt;Scheduled tasks&lt;a class="anchor" href="#scheduled-tasks"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Command&lt;/th&gt;
					&lt;th&gt;What it does&lt;/th&gt;
					&lt;th&gt;Suggested schedule&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;clear_expired_cache&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Deletes expired search-result cache rows&lt;/td&gt;
					&lt;td&gt;Daily&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;check_provider_health&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Probes providers with a free health endpoint so &lt;code&gt;/status&lt;/code&gt; stays current, without spending paid quota&lt;/td&gt;
					&lt;td&gt;Every ~10 minutes&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;refresh_currency&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Refreshes cached exchange rates and prunes the instant-answer cache&lt;/td&gt;
					&lt;td&gt;Daily (optional, also self-refreshes on demand)&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;A cron example:&lt;/p&gt;</description></item><item><title>Privacy</title><link>https://docs.seurch.eu/user-guide/privacy/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.seurch.eu/user-guide/privacy/</guid><description>&lt;h1 id="privacy"&gt;Privacy&lt;a class="anchor" href="#privacy"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Seurch is built to be a private alternative to surveillance-funded search. Here
is what that means in practice.&lt;/p&gt;
&lt;h2 id="what-seurch-does-not-do"&gt;What Seurch does not do&lt;a class="anchor" href="#what-seurch-does-not-do"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;No tracking.&lt;/strong&gt; Seurch does not follow you around the web or across sessions
to build a profile.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No ads.&lt;/strong&gt; There is no advertising, so there is no incentive to profile you.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No selling data.&lt;/strong&gt; Your searches are not a product sold to anyone.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="how-your-queries-are-handled"&gt;How your queries are handled&lt;a class="anchor" href="#how-your-queries-are-handled"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Searches run &lt;strong&gt;server-side&lt;/strong&gt;. Seurch talks to upstream providers (Brave,
Mojeek, Marginalia and the rest) on your behalf, so those providers don&amp;rsquo;t see
your browser or IP, they see Seurch&amp;rsquo;s server.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Provider API keys never reach your browser.&lt;/strong&gt; All upstream calls happen on
the server.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Image proxying&lt;/strong&gt; (optional, in &lt;a href="https://docs.seurch.eu/user-guide/settings/"&gt;Settings&lt;/a&gt;) routes
thumbnails through the Seurch server so source sites don&amp;rsquo;t see your browser
either.&lt;/li&gt;
&lt;li&gt;Results are briefly &lt;strong&gt;cached&lt;/strong&gt; on the server to keep things fast and reduce
load on providers; the cache is keyed to the query, not to you.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="your-data"&gt;Your data&lt;a class="anchor" href="#your-data"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Your &lt;strong&gt;settings&lt;/strong&gt; sync to your account so they follow you across devices. You
can &lt;a href="https://docs.seurch.eu/user-guide/settings/"&gt;export or delete&lt;/a&gt; them.&lt;/li&gt;
&lt;li&gt;Your &lt;strong&gt;email&lt;/strong&gt;, if you add one, is used only for password reset, see
&lt;a href="https://docs.seurch.eu/user-guide/account/"&gt;Your account&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="where-its-run"&gt;Where it&amp;rsquo;s run&lt;a class="anchor" href="#where-its-run"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The hosted service is operated in the European Union under European privacy law.
Because the search engine is open source, anyone can audit how it works, or
&lt;a href="https://docs.seurch.eu/self-hosting/"&gt;run their own copy&lt;/a&gt; and be the only operator
who ever touches their data.&lt;/p&gt;</description></item><item><title>Browser setup</title><link>https://docs.seurch.eu/user-guide/browser-setup/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.seurch.eu/user-guide/browser-setup/</guid><description>&lt;h1 id="browser-setup"&gt;Browser setup&lt;a class="anchor" href="#browser-setup"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;You can make Seurch the search engine that fires when you type in the browser address bar or search box. This page covers every major browser, including how to set Seurch for &lt;strong&gt;private / incognito&lt;/strong&gt; windows specifically.&lt;/p&gt;
&lt;h2 id="the-search-url"&gt;The search URL&lt;a class="anchor" href="#the-search-url"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;When a browser asks for your search engine URL, use:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;https://seurch.eu/?q=%s&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Replace &lt;code&gt;seurch.eu&lt;/code&gt; with your own instance&amp;rsquo;s hostname if you are self-hosting.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;%s&lt;/code&gt; is a placeholder the browser fills in with your query. Some browsers label this field &lt;strong&gt;Search URL&lt;/strong&gt; or &lt;strong&gt;Query URL&lt;/strong&gt;; the format is the same.&lt;/p&gt;</description></item><item><title>Production notes</title><link>https://docs.seurch.eu/self-hosting/production/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.seurch.eu/self-hosting/production/</guid><description>&lt;h1 id="production-notes"&gt;Production notes&lt;a class="anchor" href="#production-notes"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;A few things worth knowing when you run Seurch for real users.&lt;/p&gt;
&lt;h2 id="the-image"&gt;The image&lt;a class="anchor" href="#the-image"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Serves the app with &lt;strong&gt;gunicorn&lt;/strong&gt; (2 workers) on port &lt;strong&gt;8000&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Serves its own static files via
&lt;a href="https://whitenoise.readthedocs.io/"&gt;WhiteNoise&lt;/a&gt;, compressed and hashed, so
you don&amp;rsquo;t need a separate static-file server or CDN.&lt;/li&gt;
&lt;li&gt;Compiles translation catalogs and collects static files &lt;strong&gt;at build time&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Runs database &lt;strong&gt;migrations on start&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="reverse-proxy-and-tls"&gt;Reverse proxy and TLS&lt;a class="anchor" href="#reverse-proxy-and-tls"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Put a TLS-terminating reverse proxy in front (Caddy, nginx, Traefik, …) and
forward to port 8000. Set:&lt;/p&gt;</description></item></channel></rss>