diff --git a/bridges/GettrBridge.php b/bridges/GettrBridge.php
index 74804043..d3b9b899 100644
--- a/bridges/GettrBridge.php
+++ b/bridges/GettrBridge.php
@@ -33,7 +33,15 @@ class GettrBridge extends BridgeAbstract
             $user,
             min($this->getInput('limit'), 20)
         );
-        $data = json_decode(getContents($api), false);
+        try {
+            $json = getContents($api);
+        } catch (HttpException $e) {
+            if ($e->getCode() === 400 && str_contains($e->response->getBody(), 'E_USER_NOTFOUND')) {
+                throw new \Exception('User not found: ' . $user);
+            }
+            throw $e;
+        }
+        $data = json_decode($json, false);
 
         foreach ($data->result->aux->post as $post) {
             $this->items[] = [
diff --git a/config.default.ini.php b/config.default.ini.php
index 52786aef..201b1414 100644
--- a/config.default.ini.php
+++ b/config.default.ini.php
@@ -47,7 +47,8 @@ enable_debug_mode = false
 enable_maintenance_mode = false
 
 [http]
-timeout = 60
+; Operation timeout in seconds
+timeout = 30
 useragent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:102.0) Gecko/20100101 Firefox/102.0"
 
 ; Max http response size in MB
diff --git a/lib/contents.php b/lib/contents.php
index a4def21a..8676a2a8 100644
--- a/lib/contents.php
+++ b/lib/contents.php
@@ -101,19 +101,8 @@ function getContents(
             $response = $response->withBody($cachedResponse->getBody());
             break;
         default:
-            $exceptionMessage = sprintf(
-                '%s resulted in %s %s %s',
-                $url,
-                $response->getCode(),
-                $response->getStatusLine(),
-                // If debug, include a part of the response body in the exception message
-                Debug::isEnabled() ? mb_substr($response->getBody(), 0, 500) : '',
-            );
-
-            if (CloudFlareException::isCloudFlareResponse($response)) {
-                throw new CloudFlareException($exceptionMessage, $response->getCode());
-            }
-            throw new HttpException(trim($exceptionMessage), $response->getCode());
+            $e = HttpException::fromResponse($response, $url);
+            throw $e;
     }
     if ($returnFull === true) {
         // todo: return the actual response object
diff --git a/lib/http.php b/lib/http.php
index eb70705f..bfa6b6bf 100644
--- a/lib/http.php
+++ b/lib/http.php
@@ -2,7 +2,29 @@
 
 class HttpException extends \Exception
 {
-    // todo: should include the failing http response (if present)
+    public ?Response $response;
+
+    public function __construct(string $message = '', int $statusCode = 0, ?Response $response = null)
+    {
+        parent::__construct($message, $statusCode);
+        $this->response = $response ?? new Response('', 0);
+    }
+
+    public static function fromResponse(Response $response, string $url): HttpException
+    {
+        $message = sprintf(
+            '%s resulted in %s %s %s',
+            $url,
+            $response->getCode(),
+            $response->getStatusLine(),
+            // If debug, include a part of the response body in the exception message
+            Debug::isEnabled() ? mb_substr($response->getBody(), 0, 500) : '',
+        );
+        if (CloudFlareException::isCloudFlareResponse($response)) {
+            return new CloudFlareException($message, $response->getCode(), $response);
+        }
+        return new HttpException(trim($message), $response->getCode(), $response);
+    }
 }
 
 final class CloudFlareException extends HttpException
diff --git a/templates/exception.html.php b/templates/exception.html.php
index dac0ad26..e1dd97c1 100644
--- a/templates/exception.html.php
+++ b/templates/exception.html.php
@@ -16,6 +16,13 @@
             </p>
         <?php endif; ?>
 
+        <?php if ($e->getCode() === 400): ?>
+            <h2>400 Bad Request</h2>
+            <p>
+                This is usually caused by an incorrectly constructed http request.
+            </p>
+        <?php endif; ?>
+
         <?php if ($e->getCode() === 404): ?>
             <h2>404 Page Not Found</h2>
             <p>
@@ -40,6 +47,22 @@
             </p>
         <?php endif; ?>
 
+        <?php if ($e->getCode() === 0): ?>
+            <p>
+                See
+                <a href="https://curl.haxx.se/libcurl/c/libcurl-errors.html">
+                    https://curl.haxx.se/libcurl/c/libcurl-errors.html
+                </a>
+                for description of the curl error code.
+            </p>
+        <?php else: ?>
+            <p>
+                <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/<?= raw($e->getCode()) ?>">
+                    https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/<?= raw($e->getCode()) ?>
+                </a>
+            </p>
+        <?php endif; ?>
+
     <?php else: ?>
         <?php if ($e->getCode() === 10): ?>
             <h2>The rss feed is completely empty</h2>