diff --git a/patientMatcher/server/controllers.py b/patientMatcher/server/controllers.py
index ac9ff04..30bb61a 100644
--- a/patientMatcher/server/controllers.py
+++ b/patientMatcher/server/controllers.py
@@ -9,9 +9,24 @@ from patientMatcher.utils.patient import patients
 from patientMatcher.parse.patient import json_patient, validate_api, mme_patient
 from patientMatcher.auth.auth import authorize
 from patientMatcher.match.handler import external_matcher
+from patientMatcher.__version__ import __version__
 
 LOG = logging.getLogger(__name__)
 
+def heartbeat(disclaimer):
+    """Return a heartbeat as defined here:https://github.com/ga4gh/mme-apis/blob/master/heartbeat-api.md"""
+
+    hbeat = {
+        "heartbeat": {
+            "production": True,
+            "version": __version__,
+            "accept": ["application/vnd.ga4gh.matchmaker.v1.0+json", "application/vnd.ga4gh.matchmaker.v1.1+json"]
+        },
+        "disclaimer": disclaimer,
+    }
+    return hbeat
+
+
 def metrics(database):
     """return database metrics"""
     db_metrics = general_metrics(database)
diff --git a/patientMatcher/server/views.py b/patientMatcher/server/views.py
index a14b73a..b5e96a1 100644
--- a/patientMatcher/server/views.py
+++ b/patientMatcher/server/views.py
@@ -69,6 +69,24 @@ def delete(patient_id):
     return resp
 
 
+@blueprint.route('/heartbeat', methods=['GET'])
+def heartbeat():
+    """Get the server specs"""
+    resp = None
+    if authorize(current_app.db, request):
+        LOG.info('Authorized client requests heartbeat..')
+        LOG.info('current_app is {}'.format(current_app))
+        disclaimer = current_app.config.get('DISCLAIMER')
+        result = controllers.heartbeat(disclaimer)
+        resp = jsonify(result)
+        resp.status_code = 200
+
+    else: # not authorized, return a 401 status code
+        return controllers.bad_request(401)
+
+    return resp
+
+
 @blueprint.route('/metrics', methods=['GET'])
 def metrics():
     """Get database metrics"""

patientMatcher MUST have a heartbeat
I completely missed this: https://github.com/ga4gh/mme-apis/blob/master/heartbeat-api.md

Good thing it's easy to implement!
diff --git a/tests/server/test_server_responses.py b/tests/server/test_server_responses.py
index bd25bbb..c11a16a 100644
--- a/tests/server/test_server_responses.py
+++ b/tests/server/test_server_responses.py
@@ -9,9 +9,34 @@ from patientMatcher.auth.auth import authorize
 from patientMatcher.server.controllers import validate_response
 from patientMatcher.parse.patient import mme_patient
 from patientMatcher.match.handler import patient_matches
+from patientMatcher.__version__ import __version__
 
 app = create_app()
 
+def test_heartbeat(database, test_client):
+    # Test sending a GET request to see if app has a heartbeat
+    app.db = database
+    # send a get request without being authorized
+    response = app.test_client().get('heartbeat')
+    assert response.status_code == 401
+
+    # add an authorized client to database
+    ok_token = test_client['auth_token']
+    add_node(mongo_db=app.db, obj=test_client, is_client=True)
+
+    # make sure that the request using its token is valid
+    response = app.test_client().get('heartbeat', headers = auth_headers(ok_token))
+    assert response.status_code == 200
+
+    # Make sure that all important info is returned
+    data = json.loads(response.data)
+    assert data['disclaimer'] == app.config.get('DISCLAIMER')
+    assert data['heartbeat']['version'] == __version__
+    assert isinstance(data['heartbeat']['production'], bool)
+    assert isinstance(data['heartbeat']['accept'], list)
+    assert len(data['heartbeat']['accept']) > 0
+
+
 def test_add_patient(database, json_patients, test_client, test_node):
     #Test sending a POST request to server to add a patient
     app.db = database

pip install -e .[dev]
parse_log_pytest
requirements.txt
pytest pytest-cov
3.9
requirements.txt requirements-dev.txt
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
attrs==25.3.0
blessed==1.20.0
blinker==1.9.0
certifi==2025.1.31
charset-normalizer==3.4.1
click==8.1.8
coverage==7.8.0
enlighten==1.14.1
exceptiongroup==1.2.2
Flask==3.1.0
Flask-Mail==0.10.0
Flask-Negotiate==0.1.0
idna==3.10
importlib_metadata==8.6.1
iniconfig==2.1.0
itsdangerous==2.2.0
Jinja2==3.1.6
jsonschema==4.23.0
jsonschema-specifications==2024.10.1
MarkupSafe==3.0.2
mock==5.2.0
mongomock==3.12.0
packaging==24.2
-e git+https://github.com/Clinical-Genomics/patientMatcher.git@af9e9601516fb1f638ec6dc15a521a9bb5870e4e#egg=patientMatcher
pluggy==1.5.0
prefixed==0.9.0
pymongo==3.6.1
pytest==8.3.5
pytest-cov==6.0.0
referencing==0.36.2
requests==2.32.3
rpds-py==0.24.0
sentinels==1.0.0
six==1.17.0
tomli==2.2.1
typing_extensions==4.13.0
urllib3==2.3.0
wcwidth==0.2.13
Werkzeug==3.1.3
zipp==3.21.0

name: patientMatcher
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
  - 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
  - pip=25.0=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:
      - attrs==25.3.0
      - blessed==1.20.0
      - blinker==1.9.0
      - certifi==2025.1.31
      - charset-normalizer==3.4.1
      - click==8.1.8
      - coverage==7.8.0
      - enlighten==1.14.1
      - exceptiongroup==1.2.2
      - flask==3.1.0
      - flask-mail==0.10.0
      - flask-negotiate==0.1.0
      - idna==3.10
      - importlib-metadata==8.6.1
      - iniconfig==2.1.0
      - itsdangerous==2.2.0
      - jinja2==3.1.6
      - jsonschema==4.23.0
      - jsonschema-specifications==2024.10.1
      - markupsafe==3.0.2
      - mock==5.2.0
      - mongomock==3.12.0
      - packaging==24.2
      - pluggy==1.5.0
      - prefixed==0.9.0
      - pymongo==3.6.1
      - pytest==8.3.5
      - pytest-cov==6.0.0
      - referencing==0.36.2
      - requests==2.32.3
      - rpds-py==0.24.0
      - sentinels==1.0.0
      - six==1.17.0
      - tomli==2.2.1
      - typing-extensions==4.13.0
      - urllib3==2.3.0
      - wcwidth==0.2.13
      - werkzeug==3.1.3
      - zipp==3.21.0
prefix: /opt/conda/envs/patientMatcher

tests/server/test_server_responses.py::test_heartbeat
tests/server/test_server_responses.py::test_add_patient tests/server/test_server_responses.py::test_metrics tests/server/test_server_responses.py::test_nodes_view tests/server/test_server_responses.py::test_delete_patient tests/server/test_server_responses.py::test_patient_matches tests/server/test_server_responses.py::test_match tests/server/test_server_responses.py::test_match_external
patientMatcher/server/views.py patientMatcher/server/controllers.py
patientMatcher/server/views.py patientMatcher/server/controllers.py