diff --git a/mlrun/db/httpd.py b/mlrun/db/httpd.py
index e9c533546..1ed01fcd5 100644
--- a/mlrun/db/httpd.py
+++ b/mlrun/db/httpd.py
@@ -20,7 +20,6 @@ from http import HTTPStatus
 
 from flask import Flask, jsonify, request
 
-from mlrun.artifacts import Artifact
 from mlrun.db import RunDBError
 from mlrun.db.filedb import FileRunDB
 from mlrun.utils import logger
@@ -218,15 +217,10 @@ def store_artifact(project, uid):
     _file_db.store_artifact(key, data, uid, tag, project)
     return jsonify(ok=True)
 
-# curl http://localhost:8080/artifact/p1&key=k&tag=t
-@app.route('/artifact/<project>/<uid>', methods=['GET'])
+# curl http://localhost:8080/artifact/p1/tag/key
+@app.route('/artifact/<project>/<tag>/<path:key>', methods=['GET'])
 @catch_err
-def read_artifact(project, uid):
-    key = request.args.get('key')
-    if not key:
-        return json_error(HTTPStatus.BAD_REQUEST, reason='missing data')
-
-    tag = request.args.get('tag', '')
+def read_artifact(project, tag, key):
     data = _file_db.read_artifact(key, tag, project)
     return data
 
diff --git a/mlrun/db/httpdb.py b/mlrun/db/httpdb.py
index cf516fffe..6080a32cd 100644
--- a/mlrun/db/httpdb.py
+++ b/mlrun/db/httpdb.py
@@ -93,13 +93,13 @@ class HTTPRunDB(RunDBInterface):
         path = self._path_of('run', project, uid)
         error = f'store run {project}/{uid}'
         params = {'commit': bool2str(commit)}
-        body = dict_to_json(struct)
+        body = _as_json(struct)
         self._api_call('POST', path, error, params, body=body)
 
     def update_run(self, updates: dict, uid, project=''):
         path = self._path_of('run', project, uid)
         error = f'update run {project}/{uid}'
-        body = dict_to_json(updates)
+        body = _as_json(updates)
         self._api_call('PATCH', path, error, body=body)
 
     def read_run(self, uid, project=''):
@@ -149,17 +149,17 @@ class HTTPRunDB(RunDBInterface):
         }
 
         error = f'store artifact {project}/{uid}'
+
+        body = _as_json(artifact)
         self._api_call(
-            'POST', path, error, params=params, body=dict_to_json(artifact))
+            'POST', path, error, params=params, body=body)
 
     def read_artifact(self, key, tag='', project=''):
-        path = self._path_of('artifact', project, key)  # TODO: uid?
-        params = {
-            'key': key,
-            'tag': tag,
-        }
+        project = project or default_project
+        tag = tag or 'latest'
+        path = self._path_of('artifact', project, tag, key)
         error = f'read artifact {project}/{key}'
-        resp = self._api_call('GET', path, error, params=params)
+        resp = self._api_call('GET', path, error)
         return resp.content
 
     def del_artifact(self, key, tag='', project=''):
@@ -197,3 +197,10 @@ class HTTPRunDB(RunDBInterface):
         }
         error = 'del artifacts'
         self._api_call('DELETE', 'artifacts', error, params=params)
+
+
+def _as_json(obj):
+    fn = getattr(obj, 'to_json', None)
+    if fn:
+        return fn()
+    return dict_to_json(obj)

httpd/db artifacts broken
@tebeka the artifacts get/store etc is broken 

a. you must use the `artifact.to_json()` vs dumps like in filedb, since `to_json()` accounts for model details, also `body` is not stored in the DB

b. artifacts object path should be `/artifact/<project>/<uid/tag>/<key>'  (key not as arg)
, (uid/tag is like a git tree and can also list all keys in a tree)

https://github.com/mlrun/mlrun/blob/0935dda40fb3a5db551a4b4e269adbac4813a792/mlrun/db/httpdb.py#L142
diff --git a/tests/test_httpdb.py b/tests/test_httpdb.py
index e432064e9..88b04ccd7 100644
--- a/tests/test_httpdb.py
+++ b/tests/test_httpdb.py
@@ -157,7 +157,7 @@ def test_artifact(create_server):
     db = server.conn
 
     prj, uid, key, body = 'p7', 'u199', 'k800', 'cucumber'
-    artifact = Artifact(key, body).to_dict()
+    artifact = Artifact(key, body)
 
     db.store_artifact(key, artifact, uid, project=prj)
     # TODO: Need a run file
@@ -168,7 +168,7 @@ def test_artifacts(create_server):
     server: Server = create_server()
     db = server.conn
     prj, uid, key, body = 'p9', 'u19', 'k802', 'tomato'
-    artifact = Artifact(key, body).to_dict()
+    artifact = Artifact(key, body)
 
     db.store_artifact(key, artifact, uid, project=prj)
     artifacts = db.list_artifacts(project=prj)

pip install -e .[dev]
parse_log_pytest
requirements.txt
pytest
apt-get update apt-get install -y gcc
3.9
requirements/base.txt
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
aiohappyeyeballs==2.6.1
aiohttp==3.11.14
aiosignal==1.3.2
anyio==4.9.0
argon2-cffi==23.1.0
argon2-cffi-bindings==21.2.0
arrow==1.3.0
asttokens==3.0.0
async-timeout==5.0.1
attrs==25.3.0
beautifulsoup4==4.13.3
bleach==6.2.0
blinker==1.9.0
boto3==1.37.23
botocore==1.37.23
cachetools==5.5.2
certifi==2025.1.31
cffi==1.17.1
charset-normalizer==3.4.1
click==8.1.8
comm==0.2.2
debugpy==1.8.13
decorator==5.2.1
defusedxml==0.7.1
durationpy==0.9
exceptiongroup==1.2.2
executing==2.2.0
fastjsonschema==2.21.1
Flask==3.1.0
fqdn==1.5.1
frozenlist==1.5.0
gitdb==4.0.12
GitPython==3.1.44
google-auth==2.38.0
idna==3.10
importlib_metadata==7.2.1
iniconfig==2.1.0
ipykernel==6.29.5
ipython==8.18.1
isoduration==20.11.0
itsdangerous==2.2.0
jedi==0.19.2
Jinja2==3.1.6
jmespath==1.0.1
jsonpointer==3.0.0
jsonschema==4.23.0
jsonschema-specifications==2024.10.1
jupyter-events==0.12.0
jupyter_client==8.6.3
jupyter_core==5.7.2
jupyter_server==2.15.0
jupyter_server_terminals==0.5.3
jupyterlab_pygments==0.3.0
kubernetes==32.0.1
MarkupSafe==3.0.2
matplotlib-inline==0.1.7
mistune==3.1.3
-e git+https://github.com/mlrun/mlrun.git@bb4b1fd00e08134004e8723ec32af9f52c06eb63#egg=mlrun
multidict==6.2.0
nbclient==0.10.2
nbconvert==7.16.6
nbformat==5.10.4
nest-asyncio==1.6.0
nuclio-jupyter==0.11.1
nuclio_sdk==0.5.15
numpy==2.0.2
oauthlib==3.2.2
overrides==7.7.0
packaging==24.2
pandas==2.2.3
pandocfilters==1.5.1
parso==0.8.4
pexpect==4.9.0
platformdirs==4.3.7
pluggy==1.5.0
prometheus_client==0.21.1
prompt_toolkit==3.0.50
propcache==0.3.1
psutil==7.0.0
ptyprocess==0.7.0
pure_eval==0.2.3
pyasn1==0.6.1
pyasn1_modules==0.4.2
pycparser==2.22
Pygments==2.19.1
pytest==8.3.5
python-dateutil==2.9.0.post0
python-json-logger==3.3.0
pytz==2025.2
PyYAML==6.0.2
pyzmq==26.3.0
referencing==0.36.2
requests==2.32.3
requests-oauthlib==2.0.0
rfc3339-validator==0.1.4
rfc3986-validator==0.1.1
rpds-py==0.24.0
rsa==4.9
s3transfer==0.11.4
Send2Trash==1.8.3
six==1.17.0
smmap==5.0.2
sniffio==1.3.1
soupsieve==2.6
stack-data==0.6.3
tabulate==0.9.0
terminado==0.18.1
tinycss2==1.4.0
tomli==2.2.1
tornado==6.4.2
traitlets==5.14.3
types-python-dateutil==2.9.0.20241206
typing_extensions==4.13.0
tzdata==2025.2
uri-template==1.3.0
urllib3==1.26.20
wcwidth==0.2.13
webcolors==24.11.1
webencodings==0.5.1
websocket-client==1.8.0
Werkzeug==3.1.3
yarl==1.18.3
zipp==3.21.0

name: mlrun
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
  - wheel=0.45.1=py39h06a4308_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - aiohappyeyeballs==2.6.1
      - aiohttp==3.11.14
      - aiosignal==1.3.2
      - anyio==4.9.0
      - argon2-cffi==23.1.0
      - argon2-cffi-bindings==21.2.0
      - arrow==1.3.0
      - asttokens==3.0.0
      - async-timeout==5.0.1
      - attrs==25.3.0
      - beautifulsoup4==4.13.3
      - bleach==6.2.0
      - blinker==1.9.0
      - boto3==1.37.23
      - botocore==1.37.23
      - cachetools==5.5.2
      - certifi==2025.1.31
      - cffi==1.17.1
      - charset-normalizer==3.4.1
      - click==8.1.8
      - comm==0.2.2
      - debugpy==1.8.13
      - decorator==5.2.1
      - defusedxml==0.7.1
      - durationpy==0.9
      - exceptiongroup==1.2.2
      - executing==2.2.0
      - fastjsonschema==2.21.1
      - flask==3.1.0
      - fqdn==1.5.1
      - frozenlist==1.5.0
      - gitdb==4.0.12
      - gitpython==3.1.44
      - google-auth==2.38.0
      - idna==3.10
      - importlib-metadata==7.2.1
      - iniconfig==2.1.0
      - ipykernel==6.29.5
      - ipython==8.18.1
      - isoduration==20.11.0
      - itsdangerous==2.2.0
      - jedi==0.19.2
      - jinja2==3.1.6
      - jmespath==1.0.1
      - jsonpointer==3.0.0
      - jsonschema==4.23.0
      - jsonschema-specifications==2024.10.1
      - jupyter-client==8.6.3
      - jupyter-core==5.7.2
      - jupyter-events==0.12.0
      - jupyter-server==2.15.0
      - jupyter-server-terminals==0.5.3
      - jupyterlab-pygments==0.3.0
      - kubernetes==32.0.1
      - markupsafe==3.0.2
      - matplotlib-inline==0.1.7
      - mistune==3.1.3
      - multidict==6.2.0
      - nbclient==0.10.2
      - nbconvert==7.16.6
      - nbformat==5.10.4
      - nest-asyncio==1.6.0
      - nuclio-jupyter==0.11.1
      - nuclio-sdk==0.5.15
      - numpy==2.0.2
      - oauthlib==3.2.2
      - overrides==7.7.0
      - packaging==24.2
      - pandas==2.2.3
      - pandocfilters==1.5.1
      - parso==0.8.4
      - pexpect==4.9.0
      - platformdirs==4.3.7
      - pluggy==1.5.0
      - prometheus-client==0.21.1
      - prompt-toolkit==3.0.50
      - propcache==0.3.1
      - psutil==7.0.0
      - ptyprocess==0.7.0
      - pure-eval==0.2.3
      - pyasn1==0.6.1
      - pyasn1-modules==0.4.2
      - pycparser==2.22
      - pygments==2.19.1
      - pytest==8.3.5
      - python-dateutil==2.9.0.post0
      - python-json-logger==3.3.0
      - pytz==2025.2
      - pyyaml==6.0.2
      - pyzmq==26.3.0
      - referencing==0.36.2
      - requests==2.32.3
      - requests-oauthlib==2.0.0
      - rfc3339-validator==0.1.4
      - rfc3986-validator==0.1.1
      - rpds-py==0.24.0
      - rsa==4.9
      - s3transfer==0.11.4
      - send2trash==1.8.3
      - six==1.17.0
      - smmap==5.0.2
      - sniffio==1.3.1
      - soupsieve==2.6
      - stack-data==0.6.3
      - tabulate==0.9.0
      - terminado==0.18.1
      - tinycss2==1.4.0
      - tomli==2.2.1
      - tornado==6.4.2
      - traitlets==5.14.3
      - types-python-dateutil==2.9.0.20241206
      - typing-extensions==4.13.0
      - tzdata==2025.2
      - uri-template==1.3.0
      - urllib3==1.26.20
      - wcwidth==0.2.13
      - webcolors==24.11.1
      - webencodings==0.5.1
      - websocket-client==1.8.0
      - werkzeug==3.1.3
      - yarl==1.18.3
      - zipp==3.21.0
prefix: /opt/conda/envs/mlrun

tests/test_httpdb.py::test_artifact tests/test_httpdb.py::test_artifacts
tests/test_httpdb.py::test_log tests/test_httpdb.py::test_run tests/test_httpdb.py::test_runs tests/test_httpdb.py::test_basic_auth tests/test_httpdb.py::test_bearer_auth
mlrun/db/httpdb.py mlrun/db/httpd.py
mlrun/db/httpdb.py mlrun/db/httpd.py