diff --git a/geomagio/TimeseriesFactory.py b/geomagio/TimeseriesFactory.py
index 7446f81ee6cc4877dde540044c53c742e9a3564f..064b868d6618b2d8cfedf2a8b12df342169cfe88 100644
--- a/geomagio/TimeseriesFactory.py
+++ b/geomagio/TimeseriesFactory.py
@@ -67,6 +67,7 @@ class TimeseriesFactory(object):
         channels=None,
         type=None,
         interval=None,
+        add_empty_channels: bool = True,
     ):
         """Get timeseries data.
 
@@ -93,6 +94,8 @@ class TimeseriesFactory(object):
         interval : {'day', 'hour', 'minute', 'month', 'second'}
             data interval, optional.
             uses default if unspecified.
+        add_empty_channels
+            if True, returns channels without data as empty traces
 
         Returns
         -------
diff --git a/geomagio/edge/EdgeFactory.py b/geomagio/edge/EdgeFactory.py
index 682d03f733ed2b24fa04269925859f3279f179ed..5dbde248fe229a42b9b68072c97337bdeb62ba94 100644
--- a/geomagio/edge/EdgeFactory.py
+++ b/geomagio/edge/EdgeFactory.py
@@ -91,7 +91,6 @@ class EdgeFactory(TimeseriesFactory):
     ):
         TimeseriesFactory.__init__(self, observatory, channels, type, interval)
         self.client = earthworm.Client(host, port)
-
         self.observatoryMetadata = observatoryMetadata or ObservatoryMetadata()
         self.tag = tag
         self.locationCode = locationCode
@@ -111,6 +110,7 @@ class EdgeFactory(TimeseriesFactory):
         channels=None,
         type=None,
         interval=None,
+        add_empty_channels: bool = True,
     ):
         """Get timeseries data
 
@@ -128,6 +128,8 @@ class EdgeFactory(TimeseriesFactory):
             data type.
         interval: {'day', 'hour', 'minute', 'second', 'tenhertz'}
             data interval.
+        add_empty_channels
+            if True, returns channels without data as empty traces
 
         Returns
         -------
@@ -159,8 +161,16 @@ class EdgeFactory(TimeseriesFactory):
             timeseries = obspy.core.Stream()
             for channel in channels:
                 data = self._get_timeseries(
-                    starttime, endtime, observatory, channel, type, interval
+                    starttime,
+                    endtime,
+                    observatory,
+                    channel,
+                    type,
+                    interval,
+                    add_empty_channels,
                 )
+                if len(data) == 0:
+                    continue
                 timeseries += data
         finally:
             # restore stdout
@@ -278,7 +288,16 @@ class EdgeFactory(TimeseriesFactory):
             trace.data = numpy.ma.masked_invalid(trace.data)
         return stream
 
-    def _get_timeseries(self, starttime, endtime, observatory, channel, type, interval):
+    def _get_timeseries(
+        self,
+        starttime,
+        endtime,
+        observatory,
+        channel,
+        type,
+        interval,
+        add_empty_channels: bool = True,
+    ):
         """get timeseries data for a single channel.
 
         Parameters
@@ -295,6 +314,8 @@ class EdgeFactory(TimeseriesFactory):
             data type {definitive, quasi-definitive, variation}
         interval : str
             interval length {minute, second}
+        add_empty_channels
+            if True, returns channels without data as empty traces
 
         Returns
         -------
@@ -325,7 +346,7 @@ class EdgeFactory(TimeseriesFactory):
         for trace in data:
             trace.data = trace.data.astype("i4")
         data.merge()
-        if data.count() == 0:
+        if data.count() == 0 and add_empty_channels:
             data += TimeseriesUtility.create_empty_trace(
                 starttime,
                 endtime,
diff --git a/geomagio/edge/MiniSeedFactory.py b/geomagio/edge/MiniSeedFactory.py
index abcf8b261a501132f9e210a76c2efb670287eaaf..d708b30f47b7c21907b415b6e817c0e2b15f5024 100644
--- a/geomagio/edge/MiniSeedFactory.py
+++ b/geomagio/edge/MiniSeedFactory.py
@@ -97,6 +97,7 @@ class MiniSeedFactory(TimeseriesFactory):
         channels=None,
         type=None,
         interval=None,
+        add_empty_channels: bool = True,
     ):
         """Get timeseries data
 
@@ -114,6 +115,8 @@ class MiniSeedFactory(TimeseriesFactory):
             data type.
         interval: {'day', 'hour', 'minute', 'second', 'tenhertz'}
             data interval.
+        add_empty_channels
+            if True, returns channels without data as empty traces
 
         Returns
         -------
@@ -150,8 +153,16 @@ class MiniSeedFactory(TimeseriesFactory):
                     )
                 else:
                     data = self._get_timeseries(
-                        starttime, endtime, observatory, channel, type, interval
+                        starttime,
+                        endtime,
+                        observatory,
+                        channel,
+                        type,
+                        interval,
+                        add_empty_channels,
                     )
+                    if len(data) == 0:
+                        continue
                 timeseries += data
         finally:
             # restore stdout
@@ -296,7 +307,16 @@ class MiniSeedFactory(TimeseriesFactory):
             trace.data = numpy.ma.masked_invalid(trace.data)
         return stream
 
-    def _get_timeseries(self, starttime, endtime, observatory, channel, type, interval):
+    def _get_timeseries(
+        self,
+        starttime,
+        endtime,
+        observatory,
+        channel,
+        type,
+        interval,
+        add_empty_channels: bool = True,
+    ):
         """get timeseries data for a single channel.
 
         Parameters
@@ -313,6 +333,8 @@ class MiniSeedFactory(TimeseriesFactory):
             data type {definitive, quasi-definitive, variation}
         interval : str
             interval length {'day', 'hour', 'minute', 'second', 'tenhertz'}
+        add_empty_channels
+            if True, returns channels without data as empty traces
 
         Returns
         -------
@@ -330,7 +352,7 @@ class MiniSeedFactory(TimeseriesFactory):
             sncl.network, sncl.station, sncl.location, sncl.channel, starttime, endtime
         )
         data.merge()
-        if data.count() == 0:
+        if data.count() == 0 and add_empty_channels:
             data += TimeseriesUtility.create_empty_trace(
                 starttime,
                 endtime,
diff --git a/geomagio/iaga2002/StreamIAGA2002Factory.py b/geomagio/iaga2002/StreamIAGA2002Factory.py
index 62f6f871c99b61aad9a4ce903f63a99cdbce0d66..eb1625f62c57b309c0f5063e520cb09a437b44d6 100644
--- a/geomagio/iaga2002/StreamIAGA2002Factory.py
+++ b/geomagio/iaga2002/StreamIAGA2002Factory.py
@@ -31,6 +31,7 @@ class StreamIAGA2002Factory(IAGA2002Factory):
         channels=None,
         type=None,
         interval=None,
+        add_empty_channels: bool = True,
     ):
         """Implements get_timeseries
 
diff --git a/geomagio/imfv122/StreamIMFV122Factory.py b/geomagio/imfv122/StreamIMFV122Factory.py
index b868d8dd20318e1587403dda00b6f751876ad1cd..4a9575fc9dba04c986b54e76014477c0e6a0c7ad 100644
--- a/geomagio/imfv122/StreamIMFV122Factory.py
+++ b/geomagio/imfv122/StreamIMFV122Factory.py
@@ -31,6 +31,7 @@ class StreamIMFV122Factory(IMFV122Factory):
         channels=None,
         type=None,
         interval=None,
+        add_empty_channels: bool = True,
     ):
         """Implements get_timeseries
 
diff --git a/geomagio/imfv283/GOESIMFV283Factory.py b/geomagio/imfv283/GOESIMFV283Factory.py
index 29bda1d9b9f912b481ba3b0f8ad9cc0bc5569d4f..195e8710505ea21bd631ec8fdacbb252dfd63947 100644
--- a/geomagio/imfv283/GOESIMFV283Factory.py
+++ b/geomagio/imfv283/GOESIMFV283Factory.py
@@ -67,6 +67,7 @@ class GOESIMFV283Factory(IMFV283Factory):
         channels=None,
         type=None,
         interval=None,
+        add_empty_channels: bool = True,
     ):
         """Implements get_timeseries
 
diff --git a/geomagio/imfv283/StreamIMFV283Factory.py b/geomagio/imfv283/StreamIMFV283Factory.py
index aff52877f6bbe3948acb82fddd31326148fb6854..402f0e2c3199ceb58ddcb9223815e045f582edf8 100644
--- a/geomagio/imfv283/StreamIMFV283Factory.py
+++ b/geomagio/imfv283/StreamIMFV283Factory.py
@@ -31,6 +31,7 @@ class StreamIMFV283Factory(IMFV283Factory):
         channels=None,
         type=None,
         interval=None,
+        add_empty_channels: bool = True,
     ):
         """Implements get_timeseries
 
diff --git a/test/edge_test/EdgeFactory_test.py b/test/edge_test/EdgeFactory_test.py
index 6b524fb318b3fad25afdee0613255d4551ff8aba..55e94f1266fef85c9f6b0cdafa15b781420d656e 100644
--- a/test/edge_test/EdgeFactory_test.py
+++ b/test/edge_test/EdgeFactory_test.py
@@ -29,3 +29,28 @@ def dont_get_timeseries():
         "H",
         "Expect timeseries stats channel to be equal to H",
     )
+
+
+def test_add_empty_channels():
+    """edge_test.EdgeFactory_test.test_add_empty_channels()"""
+    edge_factory = EdgeFactory(host="TODO", port="TODO")
+    timeseries = edge_factory.get_timeseries(
+        UTCDateTime(2015, 3, 1, 0, 0, 0),
+        UTCDateTime(2015, 3, 1, 1, 0, 0),
+        "BOU",
+        ("H"),
+        "variation",
+        "minute",
+        add_empty_channels=False,
+    )
+    assert len(timeseries) == 0
+    timeseries = edge_factory.get_timeseries(
+        UTCDateTime(2015, 3, 1, 0, 0, 0),
+        UTCDateTime(2015, 3, 1, 1, 0, 0),
+        "BOU",
+        ("H"),
+        "variation",
+        "minute",
+        add_empty_channels=True,  # default
+    )
+    assert len(timeseries) == 1