diff --git a/swh/storage/cassandra/storage.py b/swh/storage/cassandra/storage.py
--- a/swh/storage/cassandra/storage.py
+++ b/swh/storage/cassandra/storage.py
@@ -581,12 +581,12 @@
         return self.snapshot_get_branches(snapshot_id)
 
     def snapshot_get_by_origin_visit(self, origin, visit):
-        try:
-            visit = self.origin_visit_get_by(origin, visit)
-        except IndexError:
+        visit_status = self.origin_visit_status_get_latest(
+            origin, visit, require_snapshot=True
+        )
+        if not visit_status:
             return None
-
-        return self.snapshot_get(visit["snapshot"])
+        return self.snapshot_get(visit_status.snapshot)
 
     def snapshot_count_branches(self, snapshot_id):
         if self._cql_runner.snapshot_missing([snapshot_id]):
@@ -870,11 +870,10 @@
             return converters.row_to_visit(min(rows, key=key))
         return None
 
-    def origin_visit_get_by(self, origin: str, visit: int) -> Optional[Dict[str, Any]]:
+    def origin_visit_get_by(self, origin: str, visit: int) -> Optional[OriginVisit]:
         row = self._cql_runner.origin_visit_get_one(origin, visit)
         if row:
-            visit_ = self._format_origin_visit_row(row)
-            return self._origin_visit_apply_last_status(visit_)
+            return converters.row_to_visit(row)
         return None
 
     def origin_visit_get_latest(
diff --git a/swh/storage/in_memory.py b/swh/storage/in_memory.py
--- a/swh/storage/in_memory.py
+++ b/swh/storage/in_memory.py
@@ -898,14 +898,13 @@
             return visit
         return None
 
-    def origin_visit_get_by(self, origin: str, visit: int) -> Optional[Dict[str, Any]]:
+    def origin_visit_get_by(self, origin: str, visit: int) -> Optional[OriginVisit]:
         origin_url = self._get_origin_url(origin)
         if origin_url in self._origin_visits and visit <= len(
             self._origin_visits[origin_url]
         ):
-            visit_update = self._origin_visit_get_updated(origin_url, visit)
-            assert visit_update is not None
-            return visit_update
+            found_visit, _ = self._origin_visit_status_get_latest(origin, visit)
+            return found_visit
         return None
 
     def origin_visit_get_latest(
diff --git a/swh/storage/interface.py b/swh/storage/interface.py
--- a/swh/storage/interface.py
+++ b/swh/storage/interface.py
@@ -832,7 +832,7 @@
         ...
 
     @remote_api_endpoint("origin/visit/getby")
-    def origin_visit_get_by(self, origin: str, visit: int) -> Optional[Dict[str, Any]]:
+    def origin_visit_get_by(self, origin: str, visit: int) -> Optional[OriginVisit]:
         """Retrieve origin visit's information.
 
         Args:
@@ -840,7 +840,7 @@
             visit: visit id
 
         Returns:
-            The information on that particular (origin, visit) or None if
+            The information on that particular OriginVisit or None if
             it does not exist
 
         """
diff --git a/swh/storage/storage.py b/swh/storage/storage.py
--- a/swh/storage/storage.py
+++ b/swh/storage/storage.py
@@ -913,10 +913,16 @@
     @db_transaction(statement_timeout=500)
     def origin_visit_get_by(
         self, origin: str, visit: int, db=None, cur=None
-    ) -> Optional[Dict[str, Any]]:
+    ) -> Optional[OriginVisit]:
         row = db.origin_visit_get(origin, visit, cur)
         if row:
-            return dict(zip(db.origin_visit_get_cols, row))
+            row_d = dict(zip(db.origin_visit_get_cols, row))
+            return OriginVisit(
+                origin=row_d["origin"],
+                visit=row_d["visit"],
+                date=row_d["date"],
+                type=row_d["type"],
+            )
         return None
 
     @timed
diff --git a/swh/storage/tests/test_storage.py b/swh/storage/tests/test_storage.py
--- a/swh/storage/tests/test_storage.py
+++ b/swh/storage/tests/test_storage.py
@@ -1875,35 +1875,17 @@
             ]
         )
 
-        expected_origin_visit = origin_visit1.to_dict()
-        expected_origin_visit.update(
-            {
-                "origin": origin_url,
-                "visit": origin_visit1.visit,
-                "date": sample_data.date_visit2,
-                "type": sample_data.type_visit2,
-                "metadata": visit1_metadata,
-                "status": "full",
-                "snapshot": snapshot.id,
-            }
-        )
+        actual_visit = swh_storage.origin_visit_get_by(origin_url, origin_visit1.visit)
+        assert actual_visit == origin_visit1
 
-        # when
-        actual_origin_visit1 = swh_storage.origin_visit_get_by(
-            origin_url, origin_visit1.visit
-        )
-
-        # then
-        assert actual_origin_visit1 == expected_origin_visit
-
-    def test_origin_visit_get_by__unknown_origin(self, swh_storage):
-        assert swh_storage.origin_visit_get_by("foo", 10) is None
+    def test_origin_visit_get_by__no_result(self, swh_storage, sample_data):
+        actual_visit = swh_storage.origin_visit_get_by("unknown", 10)  # unknown origin
+        assert actual_visit is None
 
-    def test_origin_visit_get_by_no_result(self, swh_storage, sample_data):
         origin = sample_data.origin
         swh_storage.origin_add([origin])
-        actual_origin_visit = swh_storage.origin_visit_get_by(origin.url, 999)
-        assert actual_origin_visit is None
+        actual_visit = swh_storage.origin_visit_get_by(origin.url, 999)  # unknown visit
+        assert actual_visit is None
 
     def test_origin_visit_get_latest_none(self, swh_storage, sample_data):
         """Origin visit get latest on unknown objects should return nothing
@@ -2662,15 +2644,14 @@
             date=sample_data.date_visit1,
             type=sample_data.type_visit1,
         )
-        origin_visit1 = swh_storage.origin_visit_add([visit])[0]
-        visit_id = origin_visit1.visit
+        ov1 = swh_storage.origin_visit_add([visit])[0]
 
         swh_storage.snapshot_add([snapshot])
         swh_storage.origin_visit_status_add(
             [
                 OriginVisitStatus(
                     origin=origin.url,
-                    visit=origin_visit1.visit,
+                    visit=ov1.visit,
                     date=now(),
                     status="ongoing",
                     snapshot=snapshot.id,
@@ -2683,11 +2664,16 @@
         by_id = swh_storage.snapshot_get(snapshot.id)
         assert by_id == expected_snapshot
 
-        by_ov = swh_storage.snapshot_get_by_origin_visit(origin.url, visit_id)
+        by_ov = swh_storage.snapshot_get_by_origin_visit(origin.url, ov1.visit)
         assert by_ov == expected_snapshot
 
-        origin_visit_info = swh_storage.origin_visit_get_by(origin.url, visit_id)
-        assert origin_visit_info["snapshot"] == snapshot.id
+        actual_visit = swh_storage.origin_visit_get_by(origin.url, ov1.visit)
+        assert actual_visit == ov1
+
+        visit_status = swh_storage.origin_visit_status_get_latest(
+            origin.url, ov1.visit, require_snapshot=True
+        )
+        assert visit_status.snapshot == snapshot.id
 
     def test_snapshot_add_twice__by_origin_visit(self, swh_storage, sample_data):
         snapshot = sample_data.snapshot