<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Searpa Documentation on Searpa Docs</title><link>https://docs.searpa.eu/</link><description>Recent content in Searpa Documentation on Searpa Docs</description><generator>Hugo</generator><language>en</language><atom:link href="https://docs.searpa.eu/index.xml" rel="self" type="application/rss+xml"/><item><title>Authentication</title><link>https://docs.searpa.eu/api/authentication/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.searpa.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.searpa.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 searpa.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.searpa.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.searpa.eu/user-guide/getting-started/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.searpa.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;Searpa 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.searpa.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 Searpa instance (the hosted service is at
&lt;a href="https://searpa.eu/"&gt;searpa.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.searpa.eu/user-guide/account/"&gt;Your account&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Requirements</title><link>https://docs.searpa.eu/self-hosting/requirements/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.searpa.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.searpa.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.searpa.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.searpa.eu/self-hosting/quick-start/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.searpa.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.searpa.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/searpa &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; searpa&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.searpa.eu/api/rate-limits/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.searpa.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.searpa.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.searpa.eu/user-guide/web-search/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.searpa.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 Searpa&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.searpa.eu/self-hosting/configuration/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.searpa.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;Searpa 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/searpa&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.searpa.eu/self-hosting/search-providers/"&gt;Search providers&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Conventions</title><link>https://docs.searpa.eu/api/conventions/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.searpa.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.searpa.eu/user-guide/search-tabs/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.searpa.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, Searpa 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.searpa.eu/user-guide/instant-answers/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.searpa.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, Searpa 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.searpa.eu/api/search/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.searpa.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.searpa.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 searpa_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.searpa.eu/self-hosting/search-providers/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.searpa.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;Searpa 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.searpa.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.searpa.eu/self-hosting/provider-keys/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.searpa.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
Searpa, 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.searpa.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.searpa.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, Searpa 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.searpa.eu/user-guide/knowledge-cards/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.searpa.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, Searpa 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.searpa.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;Searpa 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.searpa.eu/api/maps/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.searpa.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 searpa_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.searpa.eu/user-guide/bangs/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.searpa.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 Searpa tab. Searpa 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.searpa.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.searpa.eu/api/translate/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.searpa.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 searpa_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 searpa_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.searpa.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.searpa.eu/self-hosting/translation/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.searpa.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. Searpa 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 Searpa 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.searpa.eu/api/instant-cards/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.searpa.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 Searpa answers inline.&lt;/p&gt;</description></item><item><title>Settings</title><link>https://docs.searpa.eu/user-guide/settings/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.searpa.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 Searpa 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 Searpa queries and blends, see
&lt;a href="https://docs.searpa.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.searpa.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.searpa.eu/self-hosting/users/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.searpa.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;Searpa 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.searpa.eu/self-hosting/api-keys/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.searpa.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.searpa.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;searpa_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.searpa.eu/api/meta/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.searpa.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 searpa_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.searpa.eu/user-guide/account/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.searpa.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;Searpa 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.searpa.eu/api/errors/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.searpa.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.searpa.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.searpa.eu/self-hosting/maintenance/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.searpa.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;Searpa 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.searpa.eu/user-guide/privacy/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.searpa.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;Searpa 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-searpa-does-not-do"&gt;What Searpa does not do&lt;a class="anchor" href="#what-searpa-does-not-do"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;No tracking.&lt;/strong&gt; Searpa 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;. Searpa 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 Searpa&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.searpa.eu/user-guide/settings/"&gt;Settings&lt;/a&gt;) routes
thumbnails through the Searpa 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.searpa.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.searpa.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.searpa.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>Production notes</title><link>https://docs.searpa.eu/self-hosting/production/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.searpa.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 Searpa 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>