diff --git a/examples/flask/airbrake_middleware.py b/examples/flask/airbrake_middleware.py
index e53d8d2..24e3ea1 100755
--- a/examples/flask/airbrake_middleware.py
+++ b/examples/flask/airbrake_middleware.py
@@ -24,7 +24,7 @@ def after_request(notifier):
       logger.error("processing time is not valid")
       return response
 
-    notifier.inc_request(
+    notifier.notify_request(
       method=request.method, route=str(request.endpoint),
       status_code=response.status_code, time=now, ms=dur.millisecond,
     )
diff --git a/pybrake/notifier.py b/pybrake/notifier.py
index 4881a73..0c75eb7 100644
--- a/pybrake/notifier.py
+++ b/pybrake/notifier.py
@@ -331,6 +331,5 @@ class Notifier:
       self._thread_pool = futures.ThreadPoolExecutor(max_workers=max_workers)
     return self._thread_pool
 
-  def inc_request(self, method='', route='', status_code=0, time=None, ms=0):
-    self._routes.inc_request(
-      method=method, route=route, status_code=status_code, time=time, ms=ms)
+  def notify_request(self, **kwargs):
+    self._routes.notify_request(**kwargs)
diff --git a/pybrake/routes.py b/pybrake/routes.py
index 02b4def..21a14da 100755
--- a/pybrake/routes.py
+++ b/pybrake/routes.py
@@ -10,7 +10,7 @@ class RouteStat():
   __slots__ = [
     'method',
     'route',
-    'statusCode',
+    'status_code',
     'count',
     'sum',
     'sumsq',
@@ -29,7 +29,7 @@ class RouteStat():
   def __init__(self, method='', route='', status_code=0, time=None):
     self.method = method
     self.route = route
-    self.statusCode = status_code
+    self.status_code = status_code
     self.count = 0
     self.sum = 0
     self.sumsq = 0
@@ -50,7 +50,7 @@ class RouteStats():
       'Content-Type': 'application/json',
       'Authorization': 'Bearer ' + project_key,
     }
-    self._api_url = "{}/api/v4/projects/{}/routes-stats".format(host, project_id)
+    self._api_url = "{}/api/v5/projects/{}/routes-stats".format(host, project_id)
 
     self._thread = None
     self._lock = Lock()
@@ -75,7 +75,7 @@ class RouteStats():
     stats_json = json.dumps({"routes": [stat.__dict__ for _, stat in stats.items()]})
     requests.post(self._api_url, data=stats_json, headers=self._airbrake_headers)
 
-  def inc_request(self, method='', route='', status_code=0, time=None, ms=0):
+  def notify_request(self, method='', route='', status_code=0, time=None, ms=0):
     self._init()
 
     statKey = route_stat_key(method, route, status_code, time)

Update routes API
- incRequest -> notifyRequest
- statusCode -> status_code
- /api/v4/projects/{}/routes-stats -> /api/v5/projects/{}/routes-stats
diff --git a/pybrake/test_routes.py b/pybrake/test_routes.py
index 4709e84..c54c3c0 100644
--- a/pybrake/test_routes.py
+++ b/pybrake/test_routes.py
@@ -13,13 +13,13 @@ def test_route_stat():
   route_stats._flush_period = 1
 
   with requests_mock.mock() as m:
-    url = "http://test.com/api/v4/projects/1/routes-stats"
+    url = "http://test.com/api/v5/projects/1/routes-stats"
     m.post(url, json=_request_callback)
 
     tm = datetime(2000, 1, 1, 0, 0)
-    route_stats.inc_request("GET", "ping", 200, tm, 123)
-    route_stats.inc_request("GET", "pong", 200, tm, 123)
-    route_stats.inc_request("GET", "pong", 200, tm, 123)
+    route_stats.notify_request("GET", "ping", 200, tm, 123)
+    route_stats.notify_request("GET", "pong", 200, tm, 123)
+    route_stats.notify_request("GET", "pong", 200, tm, 123)
 
     route_stats._thread.join()
     assert m.call_count == 1
@@ -34,7 +34,7 @@ def test_route_stat():
     assert route_stats == [{
       'method': 'GET',
       'route': 'ping',
-      'statusCode': 200,
+      'status_code': 200,
       'count': 1,
       'sum': 123,
       'sumsq': 15129,
@@ -43,7 +43,7 @@ def test_route_stat():
     }, {
       'method': 'GET',
       'route': 'pong',
-      'statusCode': 200,
+      'status_code': 200,
       'count': 2,
       'sum': 246,
       'sumsq': 30258,

pip install -e .[dev]
parse_log_pytest
pytest
pytest pytest-benchmark pylint django flask tdigest requests requests_mock
3.7
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
accumulation-tree==0.6.4
asgiref==3.7.2
astroid==2.15.8
attrs @ file:///croot/attrs_1668696182826/work
certifi @ file:///croot/certifi_1671487769961/work/certifi
charset-normalizer==3.4.1
click==8.1.8
dill==0.3.7
Django==3.2.25
Flask==2.2.5
flit_core @ file:///opt/conda/conda-bld/flit-core_1644941570762/work/source/flit_core
idna==3.10
importlib-metadata @ file:///tmp/build/80754af9/importlib-metadata_1648562407465/work
iniconfig @ file:///home/linux1/recipes/ci/iniconfig_1610983019677/work
isort==5.11.5
itsdangerous==2.1.2
Jinja2==3.1.6
lazy-object-proxy==1.9.0
MarkupSafe==2.1.5
mccabe==0.7.0
packaging @ file:///croot/packaging_1671697413597/work
platformdirs==4.0.0
pluggy @ file:///tmp/build/80754af9/pluggy_1648042572264/work
py @ file:///opt/conda/conda-bld/py_1644396412707/work
py-cpuinfo==9.0.0
-e git+https://github.com/airbrake/pybrake.git@feab6e6687282726b354387b8951d5493a3dadbc#egg=pybrake
pylint==2.17.7
pytest==7.1.2
pytest-benchmark==4.0.0
pytz==2025.2
pyudorandom==1.0.0
requests==2.31.0
requests-mock==1.12.1
sqlparse==0.4.4
tdigest==0.5.2.2
tomli @ file:///opt/conda/conda-bld/tomli_1657175507142/work
tomlkit==0.12.5
typed-ast==1.5.5
typing_extensions==4.7.1
urllib3==2.0.7
Werkzeug==2.2.3
wrapt==1.16.0
zipp @ file:///croot/zipp_1672387121353/work

name: pybrake
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
  - attrs=22.1.0=py37h06a4308_0
  - ca-certificates=2025.2.25=h06a4308_0
  - certifi=2022.12.7=py37h06a4308_0
  - flit-core=3.6.0=pyhd3eb1b0_0
  - importlib-metadata=4.11.3=py37h06a4308_0
  - importlib_metadata=4.11.3=hd3eb1b0_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=1.1.1w=h7f8727e_0
  - packaging=22.0=py37h06a4308_0
  - pip=22.3.1=py37h06a4308_0
  - pluggy=1.0.0=py37h06a4308_1
  - py=1.11.0=pyhd3eb1b0_0
  - pytest=7.1.2=py37h06a4308_0
  - python=3.7.16=h7a1cb2a_0
  - readline=8.2=h5eee18b_0
  - setuptools=65.6.3=py37h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - tomli=2.0.1=py37h06a4308_0
  - wheel=0.38.4=py37h06a4308_0
  - xz=5.6.4=h5eee18b_1
  - zipp=3.11.0=py37h06a4308_0
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - accumulation-tree==0.6.4
      - asgiref==3.7.2
      - astroid==2.15.8
      - charset-normalizer==3.4.1
      - click==8.1.8
      - dill==0.3.7
      - django==3.2.25
      - flask==2.2.5
      - idna==3.10
      - isort==5.11.5
      - itsdangerous==2.1.2
      - jinja2==3.1.6
      - lazy-object-proxy==1.9.0
      - markupsafe==2.1.5
      - mccabe==0.7.0
      - platformdirs==4.0.0
      - py-cpuinfo==9.0.0
      - pylint==2.17.7
      - pytest-benchmark==4.0.0
      - pytz==2025.2
      - pyudorandom==1.0.0
      - requests==2.31.0
      - requests-mock==1.12.1
      - sqlparse==0.4.4
      - tdigest==0.5.2.2
      - tomlkit==0.12.5
      - typed-ast==1.5.5
      - typing-extensions==4.7.1
      - urllib3==2.0.7
      - werkzeug==2.2.3
      - wrapt==1.16.0
prefix: /opt/conda/envs/pybrake

pybrake/test_routes.py::test_route_stat
examples/flask/airbrake_middleware.py pybrake/routes.py pybrake/notifier.py
examples/flask/airbrake_middleware.py pybrake/routes.py pybrake/notifier.py