diff --git a/shopping_client/shopping_client.py b/shopping_client/shopping_client.py
index c62a46eb29b34e0f7b8a898849870c8d054707d4..3e53f38c1597f301bb0fbd8fd4b48dd2edc11fb7 100644
--- a/shopping_client/shopping_client.py
+++ b/shopping_client/shopping_client.py
@@ -1,9 +1,11 @@
+import base64
 import getpass
 import json
+import time
 import urllib.parse
+from os import getenv
 from typing import Optional, Union
 from warnings import warn
-from os import getenv
 
 import pandas as pd
 import requests
@@ -15,7 +17,7 @@ class shopping_client:
 
     def __init__(
         self,
-        token: str = None,
+        token: Optional[str] = None,
         host: str = "http://localhost:5555/",
         connectors: list = [],
     ):
@@ -88,8 +90,20 @@ class shopping_client:
 
         return self.basket
 
+    def _is_valid_token(token: Optional[str]) -> bool:
+        """ Checks expiry of the token """
+
+        if token is None:
+            return False
+
+        try:
+            payload = json.loads(base64.b64decode(token.split(".")[1]))
+            return payload["exp"] > int(time.time()) + 10
+        except KeyError:
+            raise RuntimeError("Invalid JWT format")
+
     def _request_header(self):
-        while self.token is None:
+        while not self._is_valid_token(self.token):
             self._get_token()
 
         return dict(Accept="application/json", Authorization=f"Bearer {self.token}")
@@ -139,3 +153,6 @@ class shopping_client:
                 self.token = token_file.readline()
         else:
             self.token = getpass.getpass("Enter your ESAP access token:")
+
+        if self.token is None:
+            raise RuntimeError("No token found!")