diff --git a/geomagio/api/db/metadata_table.py b/geomagio/api/db/metadata_table.py
index 211a18044c4f675c3f659cad71ae6c2204bfbf33..69f2eb173e308324b8119534ca9d50e37009d286 100644
--- a/geomagio/api/db/metadata_table.py
+++ b/geomagio/api/db/metadata_table.py
@@ -24,9 +24,9 @@ metadata = Table(
         default=sqlalchemy_utc.utcnow(),
         index=True,
     ),
-    # reviewer
-    Column("reviewed_by", String(length=255), index=True, nullable=True),
-    Column("reviewed_time", sqlalchemy_utc.UtcDateTime, index=True, nullable=True),
+    # editor
+    Column("updated_by", String(length=255), index=True, nullable=True),
+    Column("updated_time", sqlalchemy_utc.UtcDateTime, index=True, nullable=True),
     # time range
     Column("starttime", sqlalchemy_utc.UtcDateTime, index=True, nullable=True),
     Column("endtime", sqlalchemy_utc.UtcDateTime, index=True, nullable=True),
@@ -43,6 +43,8 @@ metadata = Table(
     Column("data_valid", Boolean, default=True, index=True),
     # whether metadata is valid (based on review)
     Column("metadata_valid", Boolean, default=True, index=True),
+    # whether metadata has been reviewed
+    Column("reviewed", Boolean, default=True, index=True),
     # metadata json blob
     Column("metadata", JSON, nullable=True),
     # general comment
@@ -65,6 +67,7 @@ metadata = Table(
         # valid
         "metadata_valid",
         "data_valid",
+        "reviewed",
     ),
     Index(
         "index_category_time",
@@ -104,6 +107,7 @@ async def get_metadata(
     created_before: datetime = None,
     data_valid: bool = None,
     metadata_valid: bool = None,
+    reviewed: bool = None,
 ):
     query = metadata.select()
     if id:
@@ -134,12 +138,14 @@ async def get_metadata(
         query = query.where(metadata.c.data_valid == data_valid)
     if metadata_valid is not None:
         query = query.where(metadata.c.metadata_valid == metadata_valid)
+    if reviewed is not None:
+        query = query.where(metadata.c.reviewed == reviewed)
     rows = await database.fetch_all(query)
     return [Metadata(**row) for row in rows]
 
 
 async def update_metadata(meta: Metadata) -> None:
     query = metadata.update().where(metadata.c.id == meta.id)
-    values = meta.datetime_dict(exclude={"id"})
+    values = meta.datetime_dict(exclude={"id", "metadata_id"})
     query = query.values(**values)
     await database.execute(query)
diff --git a/geomagio/api/secure/metadata.py b/geomagio/api/secure/metadata.py
index e619c66362b8b4e960dd92cba5b5d88ff493b6b2..86fad54558903b4fb786e7f92416110ecb3e1530 100644
--- a/geomagio/api/secure/metadata.py
+++ b/geomagio/api/secure/metadata.py
@@ -58,6 +58,7 @@ async def get_metadata(
     location: str = None,
     data_valid: bool = None,
     metadata_valid: bool = True,
+    reviewed: bool = None,
 ):
     query = MetadataQuery(
         category=category,
@@ -71,6 +72,7 @@ async def get_metadata(
         location=location,
         data_valid=data_valid,
         metadata_valid=metadata_valid,
+        reviewed=reviewed,
     )
     metas = await metadata_table.get_metadata(**query.datetime_dict(exclude={"id"}))
     return metas
diff --git a/geomagio/api/ws/metadata.py b/geomagio/api/ws/metadata.py
index 655c33e59f0ec84b4329e5e3c6642c6dbe24882c..730c9a13afe19e8d3782a0736adf1767049b6237 100644
--- a/geomagio/api/ws/metadata.py
+++ b/geomagio/api/ws/metadata.py
@@ -20,6 +20,7 @@ async def get_metadata(
     location: str = None,
     data_valid: bool = None,
     metadata_valid: bool = True,
+    reviewed: bool = None,
 ):
     query = MetadataQuery(
         category=category,
@@ -31,6 +32,7 @@ async def get_metadata(
         location=location,
         data_valid=data_valid,
         metadata_valid=metadata_valid,
+        reviewed=reviewed,
     )
     metas = await metadata_table.get_metadata(**query.datetime_dict(exclude={"id"}))
     return metas
diff --git a/geomagio/metadata/Metadata.py b/geomagio/metadata/Metadata.py
index ce2ad5211ac07c5023c4821396a8abe1ed1fd4f5..4dede4eeec2778f67a03b740bc465c7fb0325aad 100644
--- a/geomagio/metadata/Metadata.py
+++ b/geomagio/metadata/Metadata.py
@@ -48,12 +48,14 @@ class Metadata(BaseModel):
 
     # database id
     id: int = None
+    # metadata history id referencing database id
+    metadata_id: int = None
     # author
     created_by: str = None
     created_time: UTCDateTime = None
-    # reviewer
-    reviewed_by: str = None
-    reviewed_time: UTCDateTime = None
+    # editor
+    updated_by: str = None
+    updated_time: UTCDateTime = None
     # time range
     starttime: UTCDateTime = None
     endtime: UTCDateTime = None
@@ -70,6 +72,8 @@ class Metadata(BaseModel):
     data_valid: bool = True
     # whether metadata is valid (based on review)
     metadata_valid: bool = True
+    # whether metadata has been reviewed
+    reviewed: bool = False
     # metadata json blob
     metadata: Dict = None
     # general comment
@@ -79,7 +83,7 @@ class Metadata(BaseModel):
 
     def datetime_dict(self, **kwargs):
         values = self.dict(**kwargs)
-        for key in ["created_time", "reviewed_time", "starttime", "endtime"]:
+        for key in ["created_time", "updated_time", "starttime", "endtime"]:
             if key in values and values[key] is not None:
                 values[key] = values[key].datetime.replace(tzinfo=timezone.utc)
         return values
diff --git a/geomagio/metadata/MetadataQuery.py b/geomagio/metadata/MetadataQuery.py
index 36e6c3ebe3cd20d880c25ff0d683757c84a2d833..dd80ae06729915a6a04a2531bd7eb3d548180fd0 100644
--- a/geomagio/metadata/MetadataQuery.py
+++ b/geomagio/metadata/MetadataQuery.py
@@ -21,6 +21,7 @@ class MetadataQuery(BaseModel):
     location: str = None
     data_valid: Optional[bool] = None
     metadata_valid: Optional[bool] = None
+    reviewed: Optional[bool] = None
 
     def datetime_dict(self, **kwargs):
         values = self.dict(**kwargs)
diff --git a/geomagio/metadata/main.py b/geomagio/metadata/main.py
index 79cf886baa37a048046498d67b2bb785a9d21473..fee2df7f3a64f56b5bd642dd4a6c4ea40c9b4182 100644
--- a/geomagio/metadata/main.py
+++ b/geomagio/metadata/main.py
@@ -148,6 +148,7 @@ def get(
     location: Optional[str] = None,
     metadata_valid: Optional[bool] = None,
     network: Optional[str] = None,
+    reviewed: Optional[bool] = None,
     starttime: Optional[str] = None,
     station: Optional[str] = None,
     url: str = GEOMAG_API_URL,
@@ -163,6 +164,7 @@ def get(
         location=location,
         metadata_valid=metadata_valid,
         network=network,
+        reviewed=reviewed,
         starttime=UTCDateTime(starttime) if starttime else None,
         station=station,
     )
diff --git a/test_metadata.py b/test_metadata.py
index 6f4eab2e8b8277a42774e2bc417c92a1fdaa7170..3f4f6c1bcab0b68a6bcd1fa1ab37ddc60010a5ee 100644
--- a/test_metadata.py
+++ b/test_metadata.py
@@ -137,7 +137,7 @@ for reading in readings:
             category=MetadataCategory.READING,
             created_by="test_metadata.py",
             network="NT",
-            reviewed_by=reviewer,
+            updated_by=reviewer,
             starttime=reading.time,
             endtime=reading.time,
             station=reading.metadata["station"],
@@ -164,7 +164,12 @@ adjusted_matrix = AdjustedMatrix(
 )
 
 test_metadata.append(
-    Metadata(station="FRD", network="NT", metadata=adjusted_matrix.dict())
+    Metadata(
+        category="adjusted-matrix",
+        station="FRD",
+        network="NT",
+        metadata=adjusted_matrix.dict(),
+    )
 )