diff --git a/README.md b/README.md
index cc0b04c..2b7b764 100644
--- a/README.md
+++ b/README.md
@@ -23,6 +23,30 @@ token = encode('secret', {'my_payload': 'some_data'}, 'HS256')
 | `payload` | `dict` | *N/A* | The payload data contained within the token. |
 | `alg` | `int` | `HS256` | The algorithm to use to create the token. |
 
+## Make
+Returns a new token. This function has arguments for registered claims as specified in [rfc7519](https://tools.ietf.org/html/rfc7519#section-4.1).
+
+Any registered claims provided in the payload will take precedence over any provided as arguments. 
+
+```
+from simplejwt import make
+token = make('secret', {'my_payload': 'some_data'}, 'HS256', issuer='acme', valid_to=1234567)
+# eyJ0eXBlIjogIkpXVCIsICJhbGciOiAiSFMyNTYifQ.eyJteV9wYXlsb2FkIjogInNvbWVfZGF0YSIsICJpc3MiOiAiYWNtZSIsICJleHAiOiAxMjM0NTY3fQ.Nr5IADzsOhlzjxnghquBrRwewg10srDHu__-HN7GGGA
+```
+
+| Name | Type | Default | Description |
+| --- | --- | --- | --- |
+| `secret` | `str` | *N/A* | The secret used to create the token. |
+| `payload` | `dict` | *N/A* | The payload data contained within the token. |
+| `alg` | `int` | `HS256` | The algorithm to use to create the token. |
+| `issuer` | `str` | `None` | The issuer of the token. |
+| `subject` | `str` | `None` | The subject of the token. |
+| `audience` | `str` | `None` | The audience of the token. |
+| `valid_to` | `int` | `None` | The expiry date of the token as a timestamp. |
+| `valid_from` | `int` | `None` | The date the token is valid from as a timestamp. |
+| `issued_at` | `int` | `None` | The date the token was issued as a timestamp. |
+| `id` | `str` | `None` | The id of the token. |
+
 ## Decode
 Returns the payload from a token.
 
diff --git a/simplejwt/__init__.py b/simplejwt/__init__.py
index 774ddc8..1fa6839 100644
--- a/simplejwt/__init__.py
+++ b/simplejwt/__init__.py
@@ -1,1 +1,1 @@
-from simplejwt.jwt import encode, decode
+from simplejwt.jwt import encode, make, decode
diff --git a/simplejwt/jwt.py b/simplejwt/jwt.py
index 5645302..c776ec4 100644
--- a/simplejwt/jwt.py
+++ b/simplejwt/jwt.py
@@ -26,6 +26,28 @@ def _hash(secret: bytes, data: bytes, alg: str) -> bytes:
         .digest()
 
 
+def make(secret: Union[str, bytes], payload: dict, alg='HS256',
+         issuer: str = None, subject: str = None, audience: str = None,
+         valid_to: int = None, valid_from: int = None, issued_at: int = None,
+         id: str = None):
+    new_payload = payload.copy()
+    if issuer and 'iss' not in new_payload:
+        new_payload['iss'] = issuer
+    if subject and 'sub' not in new_payload:
+        new_payload['sub'] = subject
+    if audience and 'aud' not in new_payload:
+        new_payload['aud'] = audience
+    if valid_to and 'exp' not in new_payload:
+        new_payload['exp'] = valid_to
+    if valid_from and 'nbf' not in new_payload:
+        new_payload['nbf'] = valid_from
+    if issued_at and 'iat' not in new_payload:
+        new_payload['iat'] = issued_at
+    if id and 'jti' not in new_payload:
+        new_payload['jti'] = id
+    return encode(secret, new_payload, alg)
+
+
 def encode(secret: Union[str, bytes], payload: dict, alg='HS256'):
     secret = util.to_bytes(secret)
 

Add support for registered claims
There are a list of registered claims in [rfc7519](https://tools.ietf.org/html/rfc7519#section-4.1).

Simplejwt should support these out of the box.
diff --git a/tests/test_jwt.py b/tests/test_jwt.py
index ebb62f9..cacda88 100644
--- a/tests/test_jwt.py
+++ b/tests/test_jwt.py
@@ -25,6 +25,26 @@ test_token_data = {
     }
 }
 
+registered_claims = {
+    'issuer': 'iss',
+    'subject': 'sub',
+    'audience': 'aud',
+    'valid_to': 'exp',
+    'valid_from': 'nbf',
+    'issued_at': 'iat',
+    'id': 'jti',
+}
+
+test_registered_claims = {
+    'issuer': 'test_issuer',
+    'subject': 'test_subject',
+    'audience': 'test_audience',
+    'valid_to': 789,
+    'valid_from': 456,
+    'issued_at': 123,
+    'id': 'test_id',
+}
+
 
 def test_get_algorithm_hs256():
     assert jwt.get_algorithm('HS256') is hashlib.sha256
@@ -63,6 +83,31 @@ def test_encode():
         ) == token
 
 
+def test_make_claims():
+    for name, abb in registered_claims.items():
+        args = {
+            'secret': test_token_data['secret'],
+            'payload': test_token_data['payload'],
+            name: test_registered_claims[name]
+        }
+        token = jwt.make(**args)
+        payload = jwt.decode(test_token_data['secret'], token)
+        assert payload[abb] == test_registered_claims[name]
+
+
+def test_make_precedence():
+    token = jwt.make(test_token_data['secret'], {'iss': 'usr_defined_iss'},
+                     issuer='my_iss')
+    payload = jwt.decode(test_token_data['secret'], token)
+    assert payload['iss'] == 'usr_defined_iss'
+
+
+def test_make_leaves_payload_unmodified():
+    payload = {'my': 'payload'}
+    jwt.make(test_token_data['secret'], payload, issuer='my_iss')
+    assert payload == {'my': 'payload'}
+
+
 def test_decode():
     for alg, token in test_tokens.items():
         assert jwt.decode(

pip install -e .[test]
parse_log_pytest
pytest
pytest
3.9
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
cachetools==5.5.2
chardet==5.2.0
colorama==0.4.6
coverage==7.8.0
distlib==0.3.9
exceptiongroup @ file:///croot/exceptiongroup_1706031385326/work
filelock==3.18.0
iniconfig @ file:///home/linux1/recipes/ci/iniconfig_1610983019677/work
packaging @ file:///croot/packaging_1734472117206/work
platformdirs==4.3.7
pluggy @ file:///croot/pluggy_1733169602837/work
pyproject-api==1.9.0
pytest @ file:///croot/pytest_1738938843180/work
-e git+https://github.com/jmwri/simplejwt.git@e3edef90eda15e3f4c23bce0465b2def14868d30#egg=simplejwt
tomli==2.2.1
tox==4.25.0
typing==3.7.4.3
typing_extensions==4.13.0
virtualenv==20.29.3

name: simplejwt
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
  - exceptiongroup=1.2.0=py39h06a4308_0
  - iniconfig=1.1.1=pyhd3eb1b0_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.4.4=h6a678d5_1
  - 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=3.0.16=h5eee18b_0
  - packaging=24.2=py39h06a4308_0
  - pip=25.0=py39h06a4308_0
  - pluggy=1.5.0=py39h06a4308_0
  - pytest=8.3.4=py39h06a4308_0
  - python=3.9.21=he870216_1
  - readline=8.2=h5eee18b_0
  - setuptools=75.8.0=py39h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - tzdata=2025a=h04d1e81_0
  - wheel=0.45.1=py39h06a4308_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - cachetools==5.5.2
      - chardet==5.2.0
      - colorama==0.4.6
      - coverage==7.8.0
      - distlib==0.3.9
      - filelock==3.18.0
      - platformdirs==4.3.7
      - pyproject-api==1.9.0
      - tomli==2.2.1
      - tox==4.25.0
      - typing==3.7.4.3
      - typing-extensions==4.13.0
      - virtualenv==20.29.3
prefix: /opt/conda/envs/simplejwt

tests/test_jwt.py::test_make_claims tests/test_jwt.py::test_make_precedence tests/test_jwt.py::test_make_leaves_payload_unmodified
tests/test_jwt.py::test_get_algorithm_hs256 tests/test_jwt.py::test_get_algorithm_hs384 tests/test_jwt.py::test_get_algorithm_hs512 tests/test_jwt.py::test_get_algorithm_incorrect tests/test_jwt.py::test_cover_all_algorithms tests/test_jwt.py::test_encode tests/test_jwt.py::test_decode tests/test_jwt.py::test_decode_invalid_signature tests/test_jwt.py::test_decode_invalid_payload
simplejwt/__init__.py README.md simplejwt/jwt.py
simplejwt/__init__.py README.md simplejwt/jwt.py