diff --git a/geomagio/api/ws/data.py b/geomagio/api/ws/data.py
index 24f16b226acc8aa1e44913c622a202cf63b8c55b..db204eee3f5243986e7e2dce7eb8ed271005b80d 100644
--- a/geomagio/api/ws/data.py
+++ b/geomagio/api/ws/data.py
@@ -1,7 +1,7 @@
 import os
 from typing import List, Union
 
-from fastapi import APIRouter, Depends, Query
+from fastapi import APIRouter, Depends, Query, Request
 from obspy import UTCDateTime, Stream
 from starlette.responses import Response
 
@@ -48,6 +48,7 @@ def get_data_factory(
 
 
 def get_data_query(
+    request: Request,
     id: str = Query(..., title="Observatory code"),
     starttime: UTCDateTime = Query(
         None,
@@ -102,6 +103,22 @@ def get_data_query(
     format
         output format
     """
+    default_params = [
+        "id",
+        "starttime",
+        "endtime",
+        "elements",
+        "sampling_period",
+        "type",
+        "format",
+    ]
+    invalid_params = []
+    for param in request.query_params.keys():
+        if param not in default_params:
+            invalid_params.append(param)
+    if len(invalid_params) > 0:
+        msg = ", ".join(invalid_params)
+        raise ValueError(f"Invalid query parameter(s): {msg}")
     # parse query
     query = DataApiQuery(
         id=id,
diff --git a/test/api_test/ws_test/data_test.py b/test/api_test/ws_test/data_test.py
index 800b0cd783e46078dd0f757cffaec8bd1793bc13..967757b40ae41bd6c503c7f871789a551a5dfc6b 100644
--- a/test/api_test/ws_test/data_test.py
+++ b/test/api_test/ws_test/data_test.py
@@ -1,20 +1,30 @@
+from fastapi import Depends
+from fastapi.testclient import TestClient
 from numpy.testing import assert_equal
 from obspy import UTCDateTime
+import pytest
 
+from geomagio.api.ws import app
 from geomagio.api.ws.data import get_data_query
-from geomagio.api.ws.DataApiQuery import OutputFormat, SamplingPeriod
-
-
-def test_get_data_query():
-    query = get_data_query(
-        id="BOU",
-        starttime="2020-09-01T00:00:01",
-        endtime=None,
-        elements=["X,Y,Z,F"],
-        data_type="R1",
-        sampling_period=60,
-        format="iaga2002",
+from geomagio.api.ws.DataApiQuery import DataApiQuery, OutputFormat, SamplingPeriod
+
+
+@pytest.fixture(scope="module")
+def test_client():
+    @app.get("/query/", response_model=DataApiQuery)
+    def get_query(query: DataApiQuery = Depends(get_data_query)):
+        return query
+
+    client = TestClient(app)
+    yield client
+
+
+def test_get_data_query(test_client):
+    """test.api_test.ws_test.data_test.test_get_data_query()"""
+    response = test_client.get(
+        "/query/?id=BOU&starttime=2020-09-01T00:00:01&elements=X,Y,Z,F&type=R1&sampling_period=60&format=iaga2002"
     )
+    query = DataApiQuery(**response.json())
     assert_equal(query.id, "BOU")
     assert_equal(query.starttime, UTCDateTime("2020-09-01T00:00:01"))
     assert_equal(query.endtime, UTCDateTime("2020-09-02T00:00:00.999"))
@@ -22,3 +32,21 @@ def test_get_data_query():
     assert_equal(query.sampling_period, SamplingPeriod.MINUTE)
     assert_equal(query.format, OutputFormat.IAGA2002)
     assert_equal(query.data_type, "R1")
+
+
+def test_get_data_query_extra_params(test_client):
+    """test.api_test.ws_test.data_test.test_get_data_query_extra_params()"""
+    with pytest.raises(ValueError) as error:
+        test_client.get(
+            "/query/?id=BOU&starttime=2020-09-01T00:00:01&elements=X,Y,Z,F&type=variation&sampling_period=60&format=iaga2002&location=R1&network=NT"
+        )
+        assert error.message == "Invalid query parameter(s): location, network"
+
+
+def test_get_data_query_bad_params(test_client):
+    """test.api_test.ws_test.data_test.test_get_data_query_bad_params()"""
+    with pytest.raises(ValueError) as error:
+        test_client.get(
+            "/query/?id=BOU&startime=2020-09-01T00:00:01&elements=X,Y,Z,F&data_type=variation&sampling_period=60&format=iaga2002"
+        )
+        assert error.message == "Invalid query parameter(s): startime, data_type"