diff --git a/Pipfile.lock b/Pipfile.lock
index c91debcbc9a19b055515563ea50d802f293a4e37..c93459f431ad3df1384ac9fa0487a5db35a2a651 100644
--- a/Pipfile.lock
+++ b/Pipfile.lock
@@ -934,4 +934,5 @@
             "version": "==3.1.0"
         }
     }
+  }
 }
diff --git a/geomagio/residual/measurement.py b/geomagio/residual/measurement.py
new file mode 100644
index 0000000000000000000000000000000000000000..03d968261b321b7a6953b689b74ab12153970d6b
--- /dev/null
+++ b/geomagio/residual/measurement.py
@@ -0,0 +1,24 @@
+from typing import Optional
+
+from obspy.core import UTCDateTime
+from pydantic import BaseModel
+
+from .. import pydantic_utcdatetime
+from .MeasurementType import MeasurementType
+
+
+class Measurement(BaseModel):
+    """One angle and time measurement with optional residual.
+
+    Attributes
+    ----------
+    measurement_type: type of measurement.
+    angle: measured angle, decimal degrees.
+    residual: residual at time of measurement.
+    time: when measurement was taken.
+    """
+
+    measurement_type: MeasurementType
+    angle: float = 0
+    residual: float = 0
+    time: Optional[UTCDateTime] = None