diff --git a/opentok/opentok.py b/opentok/opentok.py
index d3f855f..61899fd 100644
--- a/opentok/opentok.py
+++ b/opentok/opentok.py
@@ -275,7 +275,7 @@ class OpenTok(object):
         """For internal use."""
         return {
             'User-Agent': 'OpenTok-Python-SDK/' + __version__ + ' ' + platform.python_version(),
-            'X-TB-OPENTOK-AUTH': self._create_jwt_auth_header()
+            'X-OPENTOK-AUTH': self._create_jwt_auth_header()
         }
 
     def archive_headers(self):
@@ -451,7 +451,8 @@ class OpenTok(object):
         payload = {
                       'ist': 'project',
                       'iss': self.api_key,
-                      'exp': int(time.time()) + (60*5), # 5 minutes
+                      'iat': int(time.time()), # current time in unix time (seconds)
+                      'exp': int(time.time()) + (60*3), # 3 minutes in the future (seconds)
                       'jti': '{:f}'.format(random.random())
                   }
 

add an "iat" claim to opentok-auth tokens
something we overlooked before, but we're now trying to add into the OpenTok-Auth JWTs: https://tools.ietf.org/html/rfc7519#section-4.1.6.
diff --git a/tests/test_archive.py b/tests/test_archive.py
index b4a5995..7307f62 100644
--- a/tests/test_archive.py
+++ b/tests/test_archive.py
@@ -57,7 +57,7 @@ class OpenTokArchiveTest(unittest.TestCase):
 
         archive.stop()
 
-        validate_jwt_header(self, httpretty.last_request().headers[u('x-tb-opentok-auth')])
+        validate_jwt_header(self, httpretty.last_request().headers[u('x-opentok-auth')])
         expect(httpretty.last_request().headers[u('user-agent')]).to.contain(u('OpenTok-Python-SDK/')+__version__)
         expect(httpretty.last_request().headers[u('content-type')]).to.equal(u('application/json'))
         expect(archive).to.be.an(Archive)
@@ -102,7 +102,7 @@ class OpenTokArchiveTest(unittest.TestCase):
 
         archive.delete()
 
-        validate_jwt_header(self, httpretty.last_request().headers[u('x-tb-opentok-auth')])
+        validate_jwt_header(self, httpretty.last_request().headers[u('x-opentok-auth')])
         expect(httpretty.last_request().headers[u('user-agent')]).to.contain(u('OpenTok-Python-SDK/')+__version__)
         expect(httpretty.last_request().headers[u('content-type')]).to.equal(u('application/json'))
         # TODO: test that the object is invalidated
diff --git a/tests/test_archive_api.py b/tests/test_archive_api.py
index f8f7ba9..e4aed1d 100644
--- a/tests/test_archive_api.py
+++ b/tests/test_archive_api.py
@@ -42,7 +42,7 @@ class OpenTokArchiveApiTest(unittest.TestCase):
 
         archive = self.opentok.start_archive(self.session_id)
 
-        validate_jwt_header(self, httpretty.last_request().headers[u('x-tb-opentok-auth')])
+        validate_jwt_header(self, httpretty.last_request().headers[u('x-opentok-auth')])
         expect(httpretty.last_request().headers[u('user-agent')]).to.contain(u('OpenTok-Python-SDK/')+__version__)
         expect(httpretty.last_request().headers[u('content-type')]).to.equal(u('application/json'))
         # non-deterministic json encoding. have to decode to test it properly
@@ -93,7 +93,7 @@ class OpenTokArchiveApiTest(unittest.TestCase):
 
         archive = self.opentok.start_archive(self.session_id, name=u('ARCHIVE NAME'))
 
-        validate_jwt_header(self, httpretty.last_request().headers[u('x-tb-opentok-auth')])
+        validate_jwt_header(self, httpretty.last_request().headers[u('x-opentok-auth')])
         expect(httpretty.last_request().headers[u('user-agent')]).to.contain(u('OpenTok-Python-SDK/')+__version__)
         expect(httpretty.last_request().headers[u('content-type')]).to.equal(u('application/json'))
         # non-deterministic json encoding. have to decode to test it properly
@@ -142,7 +142,7 @@ class OpenTokArchiveApiTest(unittest.TestCase):
 
         archive = self.opentok.start_archive(self.session_id, name=u('ARCHIVE NAME'), has_video=False)
 
-        validate_jwt_header(self, httpretty.last_request().headers[u('x-tb-opentok-auth')])
+        validate_jwt_header(self, httpretty.last_request().headers[u('x-opentok-auth')])
         expect(httpretty.last_request().headers[u('user-agent')]).to.contain(u('OpenTok-Python-SDK/')+__version__)
         expect(httpretty.last_request().headers[u('content-type')]).to.equal(u('application/json'))
         # non-deterministic json encoding. have to decode to test it properly
@@ -193,7 +193,7 @@ class OpenTokArchiveApiTest(unittest.TestCase):
 
         archive = self.opentok.start_archive(self.session_id, name=u('ARCHIVE NAME'), output_mode=OutputModes.individual)
 
-        validate_jwt_header(self, httpretty.last_request().headers[u('x-tb-opentok-auth')])
+        validate_jwt_header(self, httpretty.last_request().headers[u('x-opentok-auth')])
         expect(httpretty.last_request().headers[u('user-agent')]).to.contain(u('OpenTok-Python-SDK/')+__version__)
         expect(httpretty.last_request().headers[u('content-type')]).to.equal(u('application/json'))
         # non-deterministic json encoding. have to decode to test it properly
@@ -245,7 +245,7 @@ class OpenTokArchiveApiTest(unittest.TestCase):
 
         archive = self.opentok.start_archive(self.session_id, name=u('ARCHIVE NAME'), output_mode=OutputModes.composed)
 
-        validate_jwt_header(self, httpretty.last_request().headers[u('x-tb-opentok-auth')])
+        validate_jwt_header(self, httpretty.last_request().headers[u('x-opentok-auth')])
         expect(httpretty.last_request().headers[u('user-agent')]).to.contain(u('OpenTok-Python-SDK/')+__version__)
         expect(httpretty.last_request().headers[u('content-type')]).to.equal(u('application/json'))
         # non-deterministic json encoding. have to decode to test it properly
@@ -298,7 +298,7 @@ class OpenTokArchiveApiTest(unittest.TestCase):
 
         archive = self.opentok.stop_archive(archive_id)
 
-        validate_jwt_header(self, httpretty.last_request().headers[u('x-tb-opentok-auth')])
+        validate_jwt_header(self, httpretty.last_request().headers[u('x-opentok-auth')])
         expect(httpretty.last_request().headers[u('user-agent')]).to.contain(u('OpenTok-Python-SDK/')+__version__)
         expect(httpretty.last_request().headers[u('content-type')]).to.equal(u('application/json'))
         expect(archive).to.be.an(Archive)
@@ -325,7 +325,7 @@ class OpenTokArchiveApiTest(unittest.TestCase):
 
         self.opentok.delete_archive(archive_id)
 
-        validate_jwt_header(self, httpretty.last_request().headers[u('x-tb-opentok-auth')])
+        validate_jwt_header(self, httpretty.last_request().headers[u('x-opentok-auth')])
         expect(httpretty.last_request().headers[u('user-agent')]).to.contain(u('OpenTok-Python-SDK/')+__version__)
         expect(httpretty.last_request().headers[u('content-type')]).to.equal(u('application/json'))
 
@@ -354,7 +354,7 @@ class OpenTokArchiveApiTest(unittest.TestCase):
 
         archive = self.opentok.get_archive(archive_id)
 
-        validate_jwt_header(self, httpretty.last_request().headers[u('x-tb-opentok-auth')])
+        validate_jwt_header(self, httpretty.last_request().headers[u('x-opentok-auth')])
         expect(httpretty.last_request().headers[u('user-agent')]).to.contain(u('OpenTok-Python-SDK/')+__version__)
         expect(httpretty.last_request().headers[u('content-type')]).to.equal(u('application/json'))
         expect(archive).to.be.an(Archive)
@@ -469,7 +469,7 @@ class OpenTokArchiveApiTest(unittest.TestCase):
 
         archive_list = self.opentok.get_archives()
 
-        validate_jwt_header(self, httpretty.last_request().headers[u('x-tb-opentok-auth')])
+        validate_jwt_header(self, httpretty.last_request().headers[u('x-opentok-auth')])
         expect(httpretty.last_request().headers[u('user-agent')]).to.contain(u('OpenTok-Python-SDK/')+__version__)
         expect(httpretty.last_request().headers[u('content-type')]).to.equal(u('application/json'))
         expect(archive_list).to.be.an(ArchiveList)
@@ -529,7 +529,7 @@ class OpenTokArchiveApiTest(unittest.TestCase):
 
         archive_list = self.opentok.get_archives(offset=3)
 
-        validate_jwt_header(self, httpretty.last_request().headers[u('x-tb-opentok-auth')])
+        validate_jwt_header(self, httpretty.last_request().headers[u('x-opentok-auth')])
         expect(httpretty.last_request().headers[u('user-agent')]).to.contain(u('OpenTok-Python-SDK/')+__version__)
         expect(httpretty.last_request().headers[u('content-type')]).to.equal(u('application/json'))
         expect(httpretty.last_request()).to.have.property("querystring").being.equal({
@@ -579,7 +579,7 @@ class OpenTokArchiveApiTest(unittest.TestCase):
 
         archive_list = self.opentok.get_archives(count=2)
 
-        validate_jwt_header(self, httpretty.last_request().headers[u('x-tb-opentok-auth')])
+        validate_jwt_header(self, httpretty.last_request().headers[u('x-opentok-auth')])
         expect(httpretty.last_request().headers[u('user-agent')]).to.contain(u('OpenTok-Python-SDK/')+__version__)
         expect(httpretty.last_request().headers[u('content-type')]).to.equal(u('application/json'))
         expect(httpretty.last_request()).to.have.property("querystring").being.equal({
@@ -655,7 +655,7 @@ class OpenTokArchiveApiTest(unittest.TestCase):
 
         archive_list = self.opentok.get_archives(count=4, offset=2)
 
-        validate_jwt_header(self, httpretty.last_request().headers[u('x-tb-opentok-auth')])
+        validate_jwt_header(self, httpretty.last_request().headers[u('x-opentok-auth')])
         expect(httpretty.last_request().headers[u('user-agent')]).to.contain(u('OpenTok-Python-SDK/')+__version__)
         expect(httpretty.last_request().headers[u('content-type')]).to.equal(u('application/json'))
         expect(httpretty.last_request()).to.have.property("querystring").being.equal({
diff --git a/tests/test_session_creation.py b/tests/test_session_creation.py
index 804e348..e25c717 100644
--- a/tests/test_session_creation.py
+++ b/tests/test_session_creation.py
@@ -23,7 +23,7 @@ class OpenTokSessionCreationTest(unittest.TestCase):
 
         session = self.opentok.create_session()
 
-        validate_jwt_header(self, httpretty.last_request().headers[u('x-tb-opentok-auth')])
+        validate_jwt_header(self, httpretty.last_request().headers[u('x-opentok-auth')])
         expect(httpretty.last_request().headers[u('user-agent')]).to.contain(u('OpenTok-Python-SDK/')+__version__)
         body = parse_qs(httpretty.last_request().body)
         expect(body).to.have.key(b('p2p.preference')).being.equal([b('enabled')])
@@ -42,7 +42,7 @@ class OpenTokSessionCreationTest(unittest.TestCase):
 
         session = self.opentok.create_session(media_mode=MediaModes.routed)
 
-        validate_jwt_header(self, httpretty.last_request().headers[u('x-tb-opentok-auth')])
+        validate_jwt_header(self, httpretty.last_request().headers[u('x-opentok-auth')])
         expect(httpretty.last_request().headers[u('user-agent')]).to.contain(u('OpenTok-Python-SDK/')+__version__)
         body = parse_qs(httpretty.last_request().body)
         expect(body).to.have.key(b('p2p.preference')).being.equal([b('disabled')])
@@ -61,7 +61,7 @@ class OpenTokSessionCreationTest(unittest.TestCase):
 
         session = self.opentok.create_session(location='12.34.56.78')
 
-        validate_jwt_header(self, httpretty.last_request().headers[u('x-tb-opentok-auth')])
+        validate_jwt_header(self, httpretty.last_request().headers[u('x-opentok-auth')])
         expect(httpretty.last_request().headers[u('user-agent')]).to.contain(u('OpenTok-Python-SDK/')+__version__)
         # ordering of keys is non-deterministic, must parse the body to see if it is correct
         body = parse_qs(httpretty.last_request().body)
@@ -81,7 +81,7 @@ class OpenTokSessionCreationTest(unittest.TestCase):
 
         session = self.opentok.create_session(location='12.34.56.78', media_mode=MediaModes.routed)
 
-        validate_jwt_header(self, httpretty.last_request().headers[u('x-tb-opentok-auth')])
+        validate_jwt_header(self, httpretty.last_request().headers[u('x-opentok-auth')])
         expect(httpretty.last_request().headers[u('user-agent')]).to.contain(u('OpenTok-Python-SDK/')+__version__)
         # ordering of keys is non-deterministic, must parse the body to see if it is correct
         body = parse_qs(httpretty.last_request().body)
@@ -101,7 +101,7 @@ class OpenTokSessionCreationTest(unittest.TestCase):
 
         session = self.opentok.create_session(media_mode=MediaModes.routed, archive_mode=ArchiveModes.manual)
 
-        validate_jwt_header(self, httpretty.last_request().headers[u('x-tb-opentok-auth')])
+        validate_jwt_header(self, httpretty.last_request().headers[u('x-opentok-auth')])
         expect(httpretty.last_request().headers[u('user-agent')]).to.contain(u('OpenTok-Python-SDK/')+__version__)
         body = parse_qs(httpretty.last_request().body)
         expect(body).to.have.key(b('p2p.preference')).being.equal([b('disabled')])
@@ -120,7 +120,7 @@ class OpenTokSessionCreationTest(unittest.TestCase):
 
         session = self.opentok.create_session(media_mode=MediaModes.routed, archive_mode=ArchiveModes.always)
 
-        validate_jwt_header(self, httpretty.last_request().headers[u('x-tb-opentok-auth')])
+        validate_jwt_header(self, httpretty.last_request().headers[u('x-opentok-auth')])
         expect(httpretty.last_request().headers[u('user-agent')]).to.contain(u('OpenTok-Python-SDK/')+__version__)
         body = parse_qs(httpretty.last_request().body)
         expect(body).to.have.key(b('p2p.preference')).being.equal([b('disabled')])

pip install -e .[dev]
parse_log_pytest
requirements.txt
nose httpretty sure wheel pytest
3.4
requirements.txt
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
attrs==22.2.0
certifi==2021.5.30
charset-normalizer==2.0.12
ecdsa==0.19.1
httpretty==1.1.4
idna==3.10
importlib-metadata==4.8.3
iniconfig==1.1.1
mock==5.2.0
nose==1.3.7
-e git+https://github.com/opentok/Opentok-Python-SDK.git@613e5368748ec31a18c4f47c26683bb3bcdbbcf1#egg=opentok
packaging==21.3
pluggy==1.0.0
py==1.11.0
pyasn1==0.4.8
pyparsing==3.1.4
pytest==7.0.1
python-jose==3.4.0
pytz==2025.2
requests==2.27.1
rsa==4.9
six==1.17.0
sure==2.0.1
tomli==1.2.3
typing_extensions==4.1.1
urllib3==1.26.20
zipp==3.6.0

name: Opentok-Python-SDK
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - ca-certificates=2025.2.25=h06a4308_0
  - certifi=2021.5.30=py36h06a4308_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.3=he6710b0_2
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=1.1.1w=h7f8727e_0
  - pip=21.2.2=py36h06a4308_0
  - python=3.6.13=h12debd9_1
  - readline=8.2=h5eee18b_0
  - setuptools=58.0.4=py36h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - wheel=0.37.1=pyhd3eb1b0_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - attrs==22.2.0
      - charset-normalizer==2.0.12
      - ecdsa==0.19.1
      - httpretty==1.1.4
      - idna==3.10
      - importlib-metadata==4.8.3
      - iniconfig==1.1.1
      - mock==5.2.0
      - nose==1.3.7
      - packaging==21.3
      - pluggy==1.0.0
      - py==1.11.0
      - pyasn1==0.4.8
      - pyparsing==3.1.4
      - pytest==7.0.1
      - python-jose==3.4.0
      - pytz==2025.2
      - requests==2.27.1
      - rsa==4.9
      - six==1.17.0
      - sure==2.0.1
      - tomli==1.2.3
      - typing-extensions==4.1.1
      - urllib3==1.26.20
      - zipp==3.6.0
prefix: /opt/conda/envs/Opentok-Python-SDK

tests/test_archive.py::OpenTokArchiveTest::test_delete_archive tests/test_archive.py::OpenTokArchiveTest::test_stop_archive tests/test_archive_api.py::OpenTokArchiveApiTest::test_delete_archive tests/test_archive_api.py::OpenTokArchiveApiTest::test_find_archive tests/test_archive_api.py::OpenTokArchiveApiTest::test_find_archives tests/test_archive_api.py::OpenTokArchiveApiTest::test_find_archives_with_count tests/test_archive_api.py::OpenTokArchiveApiTest::test_find_archives_with_offset tests/test_archive_api.py::OpenTokArchiveApiTest::test_find_archives_with_offset_and_count tests/test_archive_api.py::OpenTokArchiveApiTest::test_start_archive tests/test_archive_api.py::OpenTokArchiveApiTest::test_start_archive_with_name tests/test_archive_api.py::OpenTokArchiveApiTest::test_start_composed_archive tests/test_archive_api.py::OpenTokArchiveApiTest::test_start_individual_archive tests/test_archive_api.py::OpenTokArchiveApiTest::test_start_voice_archive tests/test_archive_api.py::OpenTokArchiveApiTest::test_stop_archive tests/test_session_creation.py::OpenTokSessionCreationTest::test_create_always_archive_mode_session tests/test_session_creation.py::OpenTokSessionCreationTest::test_create_default_session tests/test_session_creation.py::OpenTokSessionCreationTest::test_create_manual_archive_mode_session tests/test_session_creation.py::OpenTokSessionCreationTest::test_create_routed_session tests/test_session_creation.py::OpenTokSessionCreationTest::test_create_routed_session_with_location_hint tests/test_session_creation.py::OpenTokSessionCreationTest::test_create_session_with_location_hint
tests/test_archive_api.py::OpenTokArchiveApiTest::test_find_archive_with_unknown_properties tests/test_archive_api.py::OpenTokArchiveApiTest::test_find_expired_archive tests/test_archive_api.py::OpenTokArchiveApiTest::test_find_paused_archive tests/test_session_creation.py::OpenTokSessionCreationTest::test_complains_about_always_archive_mode_and_relayed_session
opentok/opentok.py
opentok/opentok.py