diff --git a/README.rst b/README.rst
index 5a0e177..91f2785 100644
--- a/README.rst
+++ b/README.rst
@@ -140,3 +140,31 @@ To inspect and retreive results from the API, the following methods are availabl
 
     # retrieve all the granules possible for the query
     >>> granules = api.get_all()  # this is a shortcut for api.get(api.hits())
+
+
+By default the responses will return as json and be accessible as a list of python dictionaries.
+Other formats can be specified before making the request:
+
+::
+
+    >>> granules = api.format("echo10").get(100)
+
+The following formats are supported for both granule and collection queries:
+
+* json (default)
+* xml
+* echo10
+* iso
+* iso19115
+* csv
+* atom
+* kml
+* native
+
+Collection queries also support the following formats:
+
+* dif
+* dif10
+* opendata
+* umm_json
+* umm_json_vX_Y (ex: umm_json_v1_9)
diff --git a/cmr/queries.py b/cmr/queries.py
index ca2a024..bfc187c 100644
--- a/cmr/queries.py
+++ b/cmr/queries.py
@@ -8,6 +8,7 @@ except ImportError:
     from urllib import pathname2url as quote
 
 from datetime import datetime
+from re import search
 from requests import get, exceptions
 
 CMR_OPS = "https://cmr.earthdata.nasa.gov/search/"
@@ -21,6 +22,11 @@ class Query(object):
 
     _base_url = ""
     _route = ""
+    _format = "json"
+    _valid_formats_regex = [
+        "json", "xml", "echo10", "iso", "iso19115",
+        "csv", "atom", "kml", "native"
+    ]
 
     def __init__(self, route, mode=CMR_OPS):
         self.params = {}
@@ -50,11 +56,15 @@ class Query(object):
             except exceptions.HTTPError as ex:
                 raise RuntimeError(ex.response.text)
 
-            latest = response.json()['feed']['entry']
+            if self._format == "json":
+                latest = response.json()['feed']['entry']
+            else:
+                latest = response.text
+
             if len(latest) == 0:
                 break
 
-            results = results + latest
+            results.append(latest)
             page += 1
 
         return results
@@ -89,6 +99,26 @@ class Query(object):
 
         return self.get(self.hits())
 
+    def format(self, output_format="json"):
+        """
+        Sets the format for the returned results.
+
+        :param output_format: Preferred output format
+        :returns: Query instance
+        """
+
+        if not output_format:
+            output_format = "json"
+
+        # check requested format against the valid format regex's
+        for _format in self._valid_formats_regex:
+            if search(_format, output_format):
+                self._format = output_format
+                return self
+
+        # if we got here, we didn't find a matching format
+        raise ValueError("Unsupported format '{}'".format(output_format))
+
     def online_only(self, online_only):
         """
         Only match granules that are listed online and not available for download.
@@ -367,7 +397,12 @@ class Query(object):
 
         options_as_string = "&".join(formatted_options)
 
-        return "{}?{}&{}".format(self._base_url, params_as_string, options_as_string)
+        return "{}.{}?{}&{}".format(
+            self._base_url,
+            self._format,
+            params_as_string,
+            options_as_string
+        )
 
     def _valid_state(self):
         """
@@ -398,7 +433,7 @@ class GranuleQuery(Query):
     """
 
     def __init__(self, mode=CMR_OPS):
-        Query.__init__(self, "granules.json", mode)
+        Query.__init__(self, "granules", mode)
 
     def orbit_number(self, orbit1, orbit2=None):
         """"
@@ -524,7 +559,11 @@ class CollectionQuery(Query):
     """
 
     def __init__(self, mode=CMR_OPS):
-        Query.__init__(self, "collections.json", mode)
+        Query.__init__(self, "collections", mode)
+
+        self._valid_formats_regex.extend([
+            "dif", "dif10", "opendata", "umm_json", "umm_json_v[0-9]_[0-9]"
+        ])
 
     def archive_center(self, center):
         """

Support more result formats
Adding in support for the other MIME Types wouldn't be a bad idea or difficult. Both granule and collection queries support the following:
- json (default)
- xml
- echo10
- iso
- iso19115
- dif
- dif10
- csv
- atom
- kml
- native

Collection queries also support these formats:
- opendata
- umm_json
- umm_json_vX_Y (X/Y are numbers the user provides in the string)
diff --git a/tests/test_collection.py b/tests/test_collection.py
index 1272c24..3241e79 100644
--- a/tests/test_collection.py
+++ b/tests/test_collection.py
@@ -17,3 +17,22 @@ class TestCollectionClass(unittest.TestCase):
 
         self.assertIn("keyword", query.params)
         self.assertEqual(query.params["keyword"], "AST_*")
+    
+    def test_valid_formats(self):
+        query = CollectionQuery()
+        formats = [
+            "json", "xml", "echo10", "iso", "iso19115",
+            "csv", "atom", "kml", "native", "dif", "dif10",
+            "opendata", "umm_json", "umm_json_v1_1" "umm_json_v1_9"]
+
+        for _format in formats:
+            query.format(_format)
+            self.assertEqual(query._format, _format)
+    
+    def test_invalid_format(self):
+        query = CollectionQuery()
+
+        with self.assertRaises(ValueError):
+            query.format("invalid")
+            query.format("jsonn")
+            query.format("iso19116")
diff --git a/tests/test_granule.py b/tests/test_granule.py
index 6c31372..11b481b 100644
--- a/tests/test_granule.py
+++ b/tests/test_granule.py
@@ -349,3 +349,19 @@ class TestGranuleClass(unittest.TestCase):
     def test_invalid_mode_constructor(self):
         with self.assertRaises(ValueError):
             query = GranuleQuery(None)
+    
+    def test_valid_formats(self):
+        query = GranuleQuery()
+        formats = ["json", "xml", "echo10", "iso", "iso19115", "csv", "atom", "kml", "native"]
+
+        for _format in formats:
+            query.format(_format)
+            self.assertEqual(query._format, _format)
+    
+    def test_invalid_format(self):
+        query = GranuleQuery()
+
+        with self.assertRaises(ValueError):
+            query.format("invalid")
+            query.format("jsonn")
+            query.format("iso19116")

pip install -e .
parse_log_pytest
requirements.txt
pytest
3.6
requirements.txt
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
appdirs==1.4.0
astroid==1.4.9
attrs==22.2.0
certifi==2021.5.30
importlib-metadata==4.8.3
iniconfig==1.1.1
isort==4.2.5
lazy-object-proxy==1.2.2
mccabe==0.5.3
packaging==16.8
pluggy==1.0.0
py==1.11.0
pylint==1.6.4
pyparsing==2.1.10
pytest==7.0.1
-e git+https://github.com/jddeal/python-cmr.git@089b0d6c3c6f002ef9fb412e7dc44c9053ae5351#egg=python_cmr
requests==2.12.4
six==1.10.0
tomli==1.2.3
typing_extensions==4.1.1
wrapt==1.10.8
zipp==3.6.0

name: python-cmr
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - ca-certificates=2025.2.25=h06a4308_0
  - certifi=2021.5.30=py36h06a4308_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.3=he6710b0_2
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=1.1.1w=h7f8727e_0
  - pip=21.2.2=py36h06a4308_0
  - python=3.6.13=h12debd9_1
  - readline=8.2=h5eee18b_0
  - setuptools=58.0.4=py36h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - wheel=0.37.1=pyhd3eb1b0_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - appdirs==1.4.0
      - astroid==1.4.9
      - attrs==22.2.0
      - importlib-metadata==4.8.3
      - iniconfig==1.1.1
      - isort==4.2.5
      - lazy-object-proxy==1.2.2
      - mccabe==0.5.3
      - packaging==16.8
      - pluggy==1.0.0
      - py==1.11.0
      - pylint==1.6.4
      - pyparsing==2.1.10
      - pytest==7.0.1
      - requests==2.12.4
      - six==1.10.0
      - tomli==1.2.3
      - typing-extensions==4.1.1
      - wrapt==1.10.8
      - zipp==3.6.0
prefix: /opt/conda/envs/python-cmr

tests/test_collection.py::TestCollectionClass::test_invalid_format tests/test_collection.py::TestCollectionClass::test_valid_formats tests/test_granule.py::TestGranuleClass::test_invalid_format tests/test_granule.py::TestGranuleClass::test_valid_formats
tests/test_collection.py::TestCollectionClass::test_archive_center tests/test_collection.py::TestCollectionClass::test_keyword tests/test_granule.py::TestGranuleClass::test_bounding_box_invalid_set tests/test_granule.py::TestGranuleClass::test_bounding_box_set tests/test_granule.py::TestGranuleClass::test_cloud_cover_all tests/test_granule.py::TestGranuleClass::test_cloud_cover_max_only tests/test_granule.py::TestGranuleClass::test_cloud_cover_min_only tests/test_granule.py::TestGranuleClass::test_cloud_cover_none tests/test_granule.py::TestGranuleClass::test_day_night_flag_day_set tests/test_granule.py::TestGranuleClass::test_day_night_flag_invalid_set tests/test_granule.py::TestGranuleClass::test_day_night_flag_invalid_type_set tests/test_granule.py::TestGranuleClass::test_day_night_flag_night_set tests/test_granule.py::TestGranuleClass::test_day_night_flag_unspecified_set tests/test_granule.py::TestGranuleClass::test_downloadable_invalid tests/test_granule.py::TestGranuleClass::test_downloadable_set tests/test_granule.py::TestGranuleClass::test_empty_granule_ur tests/test_granule.py::TestGranuleClass::test_empty_instrument tests/test_granule.py::TestGranuleClass::test_empty_platform tests/test_granule.py::TestGranuleClass::test_entry_title_set tests/test_granule.py::TestGranuleClass::test_granule_ur tests/test_granule.py::TestGranuleClass::test_instrument tests/test_granule.py::TestGranuleClass::test_invalid_mode tests/test_granule.py::TestGranuleClass::test_invalid_mode_constructor tests/test_granule.py::TestGranuleClass::test_invalid_spatial_state tests/test_granule.py::TestGranuleClass::test_line_invalid_set tests/test_granule.py::TestGranuleClass::test_line_set tests/test_granule.py::TestGranuleClass::test_online_only_invalid tests/test_granule.py::TestGranuleClass::test_online_only_set tests/test_granule.py::TestGranuleClass::test_orbit_number_encode tests/test_granule.py::TestGranuleClass::test_orbit_number_set tests/test_granule.py::TestGranuleClass::test_platform tests/test_granule.py::TestGranuleClass::test_point_invalid_set tests/test_granule.py::TestGranuleClass::test_point_set tests/test_granule.py::TestGranuleClass::test_polygon_invalid_set tests/test_granule.py::TestGranuleClass::test_polygon_set tests/test_granule.py::TestGranuleClass::test_short_name tests/test_granule.py::TestGranuleClass::test_temporal_invalid_date_order tests/test_granule.py::TestGranuleClass::test_temporal_invalid_strings tests/test_granule.py::TestGranuleClass::test_temporal_invalid_types tests/test_granule.py::TestGranuleClass::test_temporal_option_set tests/test_granule.py::TestGranuleClass::test_temporal_set tests/test_granule.py::TestGranuleClass::test_valid_spatial_state tests/test_granule.py::TestGranuleClass::test_version
README.rst cmr/queries.py
README.rst cmr/queries.py