diff --git a/geomagio/api/db/metadata_table.py b/geomagio/api/db/metadata_table.py
index 367e59368f83b3c353f72e9d7095e2610a81f7e1..211a18044c4f675c3f659cad71ae6c2204bfbf33 100644
--- a/geomagio/api/db/metadata_table.py
+++ b/geomagio/api/db/metadata_table.py
@@ -1,7 +1,5 @@
 from datetime import datetime
-import enum
 
-from obspy import UTCDateTime
 from sqlalchemy import or_, Boolean, Column, Index, Integer, JSON, String, Table, Text
 import sqlalchemy_utc
 
diff --git a/geomagio/api/db/session_table.py b/geomagio/api/db/session_table.py
index a62ebb78247a0303a146c3d12cfdd4e31051522d..49a62fecfb774c3a96dfb233be7db30097f46a98 100644
--- a/geomagio/api/db/session_table.py
+++ b/geomagio/api/db/session_table.py
@@ -1,6 +1,4 @@
 from datetime import datetime, timedelta, timezone
-import json
-from typing import Dict, Optional
 
 import sqlalchemy
 import sqlalchemy_utc
diff --git a/geomagio/api/secure/MetadataQuery.py b/geomagio/api/secure/MetadataQuery.py
index 1d92c67d86e11deba40b19a6185c69df45a3c389..6b30699d9ef1371019a6b89aaa0244b5b0c30111 100644
--- a/geomagio/api/secure/MetadataQuery.py
+++ b/geomagio/api/secure/MetadataQuery.py
@@ -1,7 +1,7 @@
 from datetime import timezone
 
 from obspy import UTCDateTime
-from pydantic import BaseModel, validator
+from pydantic import BaseModel
 
 from ...metadata import MetadataCategory
 from ... import pydantic_utcdatetime
diff --git a/geomagio/api/secure/SessionMiddleware.py b/geomagio/api/secure/SessionMiddleware.py
index 04c621c18d6058340ca6aaa40f0334e883d10aaf..3bf0ea8e07cf2f5fe89a434b2a12615e84ad60a4 100644
--- a/geomagio/api/secure/SessionMiddleware.py
+++ b/geomagio/api/secure/SessionMiddleware.py
@@ -1,10 +1,9 @@
-import base64
 import json
 from typing import Callable, Dict, Mapping
 import uuid
 
 from cryptography.fernet import Fernet
-from starlette.datastructures import MutableHeaders, Secret
+from starlette.datastructures import MutableHeaders
 from starlette.requests import HTTPConnection
 from starlette.types import ASGIApp, Message, Receive, Scope, Send
 
diff --git a/geomagio/api/ws/DataApiQuery.py b/geomagio/api/ws/DataApiQuery.py
index f52217eacb80ae5bf7de631346ec3f3c12b1e1b7..8202c6b6e5b0b7ada151adb91602aacfb62e57c1 100644
--- a/geomagio/api/ws/DataApiQuery.py
+++ b/geomagio/api/ws/DataApiQuery.py
@@ -1,12 +1,13 @@
 import datetime
 import enum
-from typing import Any, Dict, List, Optional, Union
+import os
+from typing import Dict, List, Optional, Union
 
 from obspy import UTCDateTime
 from pydantic import BaseModel, root_validator, validator
 
 from ... import pydantic_utcdatetime
-from .Element import ELEMENTS, ELEMENT_INDEX
+from .Element import ELEMENTS
 from .Observatory import OBSERVATORY_INDEX
 
 
@@ -38,6 +39,13 @@ class SamplingPeriod(float, enum.Enum):
     HOUR = 3600.0
     DAY = 86400.0
 
+    @property
+    def input_factory(self):
+        if self in [SamplingPeriod.TEN_HERTZ, SamplingPeriod.HOUR, SamplingPeriod.DAY]:
+            return "miniseed"
+        else:
+            return "edge"
+
 
 class DataApiQuery(BaseModel):
     id: str
diff --git a/geomagio/api/ws/Element.py b/geomagio/api/ws/Element.py
index 952feae9024d7fb3f42d00e5a5fa01166018773d..b0df40d1da3f54d4c7d5d3d734bde9a18e6e80d4 100644
--- a/geomagio/api/ws/Element.py
+++ b/geomagio/api/ws/Element.py
@@ -10,6 +10,9 @@ class Element(BaseModel):
 
 
 ELEMENTS = [
+    Element(id="U", name="North Component(miniseed)", units="nT"),
+    Element(id="V", name="East Component(miniseed)", units="nT"),
+    Element(id="W", name="Vertical Component(miniseed)", units="nT"),
     Element(id="H", name="North Component", units="nT"),
     Element(id="E", name="East Component", units="nT"),
     Element(id="X", name="Geographic North Magnitude", units="nT"),
diff --git a/geomagio/api/ws/algorithms.py b/geomagio/api/ws/algorithms.py
index 0e2d51cb9fe9bb1546fc7bbea2cb77d09472d09a..572045ba88518c980e39cda8b444e83d8254e52c 100644
--- a/geomagio/api/ws/algorithms.py
+++ b/geomagio/api/ws/algorithms.py
@@ -15,7 +15,7 @@ def get_dbdt(
     query: DataApiQuery = Depends(get_data_query),
     data_factory: TimeseriesFactory = Depends(get_data_factory),
 ) -> Response:
-    dbdt = DbDtAlgorithm()
+    dbdt = DbDtAlgorithm(period=query.sampling_period)
     # read data
     raw = get_timeseries(data_factory, query)
     # run dbdt
diff --git a/geomagio/api/ws/data.py b/geomagio/api/ws/data.py
index 053474c1d3834931d81d5d1e18dee1041575cbf5..797e382cd4d75c26d3ce3763659a25c3adbd7eaa 100644
--- a/geomagio/api/ws/data.py
+++ b/geomagio/api/ws/data.py
@@ -1,12 +1,12 @@
 import os
-from typing import Any, Dict, List, Union
+from typing import List, Union
 
 from fastapi import APIRouter, Depends, Query
 from obspy import UTCDateTime, Stream
 from starlette.responses import Response
 
 from ... import TimeseriesFactory, TimeseriesUtility
-from ...edge import EdgeFactory
+from ...edge import EdgeFactory, MiniSeedFactory
 from ...iaga2002 import IAGA2002Writer
 from ...imfjson import IMFJSONWriter
 from .DataApiQuery import (
@@ -18,7 +18,9 @@ from .DataApiQuery import (
 )
 
 
-def get_data_factory() -> TimeseriesFactory:
+def get_data_factory(
+    query: DataApiQuery,
+) -> TimeseriesFactory:
     """Reads environment variable to determine the factory to be used
 
     Returns
@@ -26,11 +28,12 @@ def get_data_factory() -> TimeseriesFactory:
     data_factory
         Edge or miniseed factory object
     """
-    data_type = os.getenv("DATA_TYPE", "edge")
-    data_host = os.getenv("DATA_HOST", "cwbpub.cr.usgs.gov")
-    data_port = int(os.getenv("DATA_PORT", "2060"))
-    if data_type == "edge":
-        return EdgeFactory(host=data_host, port=data_port)
+    host = os.getenv("DATA_HOST", "cwbpub.cr.usgs.gov")
+    factory = query.sampling_period.input_factory
+    if factory == "edge":
+        return EdgeFactory(host=host, port=os.getenv("DATA_EARTHWORM_PORT", "2060"))
+    elif factory == "miniseed":
+        return MiniSeedFactory(host=host, port=os.getenv("DATA_MINISEED_PORT", "2061"))
     else:
         return None
 
@@ -150,8 +153,8 @@ router = APIRouter()
 @router.get("/data/")
 def get_data(
     query: DataApiQuery = Depends(get_data_query),
-    data_factory: TimeseriesFactory = Depends(get_data_factory),
 ) -> Response:
+    data_factory = get_data_factory(query=query)
     # read data
     timeseries = get_timeseries(data_factory, query)
     # output response
diff --git a/geomagio/api/ws/metadata.py b/geomagio/api/ws/metadata.py
index 7c95aaa3669afcfe27b9e984b945f7c0dc067243..9f4febeb93bc0a3b89541697df2bc405a5f9881d 100644
--- a/geomagio/api/ws/metadata.py
+++ b/geomagio/api/ws/metadata.py
@@ -1,6 +1,6 @@
 from typing import List
 
-from fastapi import APIRouter, Body, Response
+from fastapi import APIRouter
 from obspy import UTCDateTime
 
 from ...metadata import Metadata, MetadataCategory
diff --git a/geomagio/processing/factory.py b/geomagio/processing/factory.py
index 47576109e968ba65757a5f9427fe4972c12a902c..d9a065497d9cf6b0a38c391355e11a9d698795d2 100644
--- a/geomagio/processing/factory.py
+++ b/geomagio/processing/factory.py
@@ -1,5 +1,4 @@
 import os
-from typing import Callable
 
 from ..TimeseriesFactory import TimeseriesFactory
 from ..edge import EdgeFactory, MiniSeedFactory
diff --git a/geomagio/processing/magproc.py b/geomagio/processing/magproc.py
index 428d9288a7d851d47eabb4ff52cd987303738c4f..748dc91a5cd6ccebca8355972850e5f1d1f4a78e 100644
--- a/geomagio/processing/magproc.py
+++ b/geomagio/processing/magproc.py
@@ -1,7 +1,7 @@
 from datetime import datetime
 import os
 import sys
-from typing import List, Tuple
+from typing import List
 
 from dateutil.relativedelta import relativedelta
 from obspy.core import UTCDateTime, Stream
diff --git a/geomagio/processing/observatory.py b/geomagio/processing/observatory.py
index 14f74453815b7f957a4f5a0a47c44361c1f358a7..85a9cfd7f033c4e72bb3401456f939c4e154a8c1 100644
--- a/geomagio/processing/observatory.py
+++ b/geomagio/processing/observatory.py
@@ -1,17 +1,14 @@
-import os
 from typing import List, Optional
 
 import numpy
 
 from ..algorithm import (
-    Algorithm,
     AdjustedAlgorithm,
     AverageAlgorithm,
     DeltaFAlgorithm,
     SqDistAlgorithm,
     XYZAlgorithm,
 )
-from ..edge import EdgeFactory, MiniSeedFactory
 from ..Controller import Controller, get_realtime_interval
 from ..TimeseriesFactory import TimeseriesFactory
 from .factory import get_edge_factory
diff --git a/geomagio/processing/obsrio.py b/geomagio/processing/obsrio.py
index 6c6d435d3ce8eed4db942f37dadedb061ca79f7d..5c37614721f2fcc94621fe46bc51c19116531bdc 100644
--- a/geomagio/processing/obsrio.py
+++ b/geomagio/processing/obsrio.py
@@ -1,4 +1,3 @@
-import os
 from typing import Optional
 
 import typer
@@ -14,7 +13,60 @@ from .factory import get_edge_factory, get_miniseed_factory
 
 
 def main():
-    typer.run(filter_realtime)
+    typer.run(obsrio_filter)
+
+
+def obsrio_filter(
+    interval: str,
+    observatory: str,
+    input_factory: Optional[str] = None,
+    host: str = "127.0.0.1",
+    port: str = 2061,
+    output_factory: Optional[str] = None,
+    output_port: int = typer.Option(
+        2061, help="Port where output factory writes data."
+    ),
+    output_read_port: int = typer.Option(
+        2061, help="Port where output factory reads data"
+    ),
+    realtime_interval: int = 600,
+    update_limit: int = 10,
+):
+    if interval == "realtime":
+        filter_realtime(
+            observatory=observatory,
+            input_factory=input_factory,
+            host=host,
+            port=port,
+            output_factory=output_factory,
+            output_port=output_port,
+            output_read_port=output_read_port,
+            realtime_interval=realtime_interval,
+            update_limit=update_limit,
+        )
+    elif interval in ["hour", "day"]:
+        input_factory = EdgeFactory(host=host, port=port)
+        output_factory = MiniSeedFactory(
+            host=host, port=output_read_port, write_port=output_port
+        )
+        if interval == "hour":
+            obsrio_hour(
+                observatory=observatory,
+                input_factory=input_factory,
+                output_factory=output_factory,
+                realtime_interval=realtime_interval,
+                update_limit=update_limit,
+            )
+        elif interval == "days":
+            obsrio_day(
+                observatory=observatory,
+                input_factory=input_factory,
+                output_factory=output_factory,
+                realtime_interval=realtime_interval,
+                update_limit=update_limit,
+            )
+    else:
+        raise ValueError("Invalid interval")
 
 
 def filter_realtime(
@@ -34,12 +86,10 @@ def filter_realtime(
 ):
     """Filter 10Hz miniseed, 1 second, one minute, and temperature data.
     Defaults set for realtime processing; can also be implemented to update legacy data"""
-
     if input_factory == "miniseed":
         input_factory = MiniSeedFactory(host=host, port=port)
     elif input_factory == "edge":
         input_factory = EdgeFactory(host=host, port=port)
-
     if output_factory == "miniseed":
         output_factory = MiniSeedFactory(
             host=host, port=output_read_port, write_port=output_port
diff --git a/setup.py b/setup.py
index 8f1ff47f4d8290489c96edf7283b8e9c5dc3f873..6216d647e18bb973c54c54a4011d9db32115d710 100644
--- a/setup.py
+++ b/setup.py
@@ -26,8 +26,8 @@ setuptools.setup(
     entry_points={
         "console_scripts": [
             "magproc-prepfiles=geomagio.processing.magproc:main",
-            "filter-realtime=geomagio.processing.obsrio:main",
             "generate-matrix=geomagio.processing.adjusted:main",
+            "obsrio-filter=geomagio.processing.obsrio:main",
         ],
     },
 )