diff --git a/geo/migration_of_opensearch_to_stac_guide.ipynb b/geo/migration_of_opensearch_to_stac_guide.ipynb index 22ea68a..58b4494 100644 --- a/geo/migration_of_opensearch_to_stac_guide.ipynb +++ b/geo/migration_of_opensearch_to_stac_guide.ipynb @@ -22,7 +22,7 @@ "id": "7ade6582-c6a6-43e1-ac26-d17159d50ecf", "metadata": {}, "source": [ - "Due to the planned **[decommissioning of the OpenSearch Catalogue API](https://dataspace.copernicus.eu/news/2025-10-16-opensearch-catalogue-api-decommissioning-notice)** (hereafter referred to as Resto) scheduled for **2 February 2026**, users are encouraged to prepare their services and integrations for a transition to the STAC Catalogue API. This Jupyter notebook has been created as a practical migration guide to support that process and to facilitate a smooth and informed transition." + "Due to the planned **[decommissioning of the OpenSearch Catalogue API](https://dataspace.copernicus.eu/news/2025-10-16-opensearch-catalogue-api-decommissioning-notice)** (hereafter referred to as Resto) rescheduled for **2 March 2026**, users are encouraged to prepare their services and integrations for a transition to the STAC Catalogue API. This Jupyter notebook has been created as a practical migration guide to support that process and to facilitate a smooth and informed transition." ] }, { @@ -124,9 +124,7 @@ "metadata": {}, "outputs": [], "source": [ - "resto_url = (\n", - " \"https://catalogue.dataspace.copernicus.eu/resto/api/collections/search.json?\"\n", - ")" + "resto_url = \"https://catalogue.dataspace.copernicus.eu/resto/api/collections/search.json?\"" ] }, { @@ -253,7 +251,7 @@ "\n", "print(f\"HTTPS Request: {resto_url}\")\n", "\n", - "pd.DataFrame(json[\"features\"]).head()" + "pd.DataFrame(json['features']).head() " ] }, { @@ -271,7 +269,13 @@ "metadata": {}, "outputs": [], "source": [ - "resto_collections = [\"Sentinel1\", \"Sentinel2\", \"Sentinel3\", \"Sentinel5P\", \"CLMS\"]" + "resto_collections = [\n", + " \"Sentinel1\",\n", + " \"Sentinel2\",\n", + " \"Sentinel3\",\n", + " \"Sentinel5P\",\n", + " \"CLMS\"\n", + "]" ] }, { @@ -312,7 +316,7 @@ "\n", " ns = {\n", " \"os\": \"http://a9.com/-/spec/opensearch/1.1/\",\n", - " \"param\": \"http://a9.com/-/spec/opensearch/extensions/parameters/1.0/\",\n", + " \"param\": \"http://a9.com/-/spec/opensearch/extensions/parameters/1.0/\"\n", " }\n", "\n", " return {\n", @@ -320,7 +324,8 @@ " \"short_name\": root.findtext(\"os:ShortName\", namespaces=ns),\n", " \"description\": root.findtext(\"os:Description\", namespaces=ns),\n", " \"parameters\": [\n", - " p.attrib.get(\"name\") for p in root.findall(\".//param:Parameter\", ns)\n", + " p.attrib.get(\"name\")\n", + " for p in root.findall(\".//param:Parameter\", ns)\n", " ],\n", " }" ] @@ -2616,9 +2621,7 @@ "source": [ "collection_id = \"sentinel-2-l2a\"\n", "\n", - "stac_url = (\n", - " f\"https://stac.dataspace.copernicus.eu/v1/collections/{collection_id}/queryables\"\n", - ")\n", + "stac_url = f\"https://stac.dataspace.copernicus.eu/v1/collections/{collection_id}/queryables\"\n", "\n", "json = requests.get(stac_url).json()\n", "\n", @@ -3295,7 +3298,7 @@ } ], "source": [ - "df_features = pd.DataFrame([json[\"properties\"]])\n", + "df_features = pd.DataFrame([json['properties']])\n", "df_features.transpose()" ] }, @@ -3407,7 +3410,7 @@ } ], "source": [ - "df_stats = pd.json_normalize(json[\"properties\"][\"statistics\"])\n", + "df_stats = pd.json_normalize(json['properties']['statistics'])\n", "df_stats.transpose()" ] }, @@ -3495,7 +3498,7 @@ } ], "source": [ - "df_geometry = pd.DataFrame(json[\"geometry\"][\"coordinates\"][0], columns=[\"lon\", \"lat\"])\n", + "df_geometry = pd.DataFrame(json['geometry']['coordinates'][0], columns=['lon', 'lat'])\n", "df_geometry" ] }, @@ -3767,7 +3770,7 @@ } ], "source": [ - "df_assets = pd.DataFrame([json[\"assets\"]])\n", + "df_assets = pd.DataFrame([json['assets']])\n", "df_assets.transpose()" ] }, @@ -3915,7 +3918,7 @@ "\n", "print(f\"HTTPS Request: {resto_url}\")\n", "\n", - "df = pd.DataFrame.from_dict(json[\"features\"])\n", + "df = pd.DataFrame.from_dict(json['features'])\n", "df.head()" ] }, @@ -3954,19 +3957,19 @@ "\n", " Returns:\n", " pd.DataFrame: A DataFrame containing all the fields returned for each feature\n", - " in the collection, including `type`, `id`, `geometry`, and `properties`.\n", + " in the collection, including `type`, `id`, `geometry`, and `properties`. \n", " If no items are found, returns an empty DataFrame.\n", " \"\"\"\n", " base_url = f\"https://catalogue.dataspace.copernicus.eu/resto/api/collections/{collection}/search.json\"\n", - "\n", + " \n", " filters = filters or {}\n", - "\n", + " \n", " response = requests.get(base_url, params=filters)\n", " json = response.json()\n", " features = json.get(\"features\", [])\n", "\n", - " df = pd.DataFrame.from_dict(json[\"features\"])\n", - "\n", + " df = pd.DataFrame.from_dict(json['features'])\n", + " \n", " return df, response.url" ] }, @@ -4241,7 +4244,7 @@ " \"startDate\": \"2025-01-01T00:00:00Z\",\n", " \"completionDate\": \"2025-01-31T23:59:59Z\",\n", " \"sortParam\": \"startDate\",\n", - " \"maxRecords\": \"20\",\n", + " \"maxRecords\": \"20\"\n", "}\n", "\n", "df, resto_url = resto_search(\"Sentinel2\", filters)\n", @@ -4523,7 +4526,7 @@ " \"completionDate\": \"2025-01-31T23:59:59Z\",\n", " \"sortParam\": \"startDate\",\n", " \"maxRecords\": \"20\",\n", - " \"page\": \"2\",\n", + " \"page\": \"2\"\n", "}\n", "\n", "df, resto_url = resto_search(\"Sentinel2\", filters)\n", @@ -4805,7 +4808,7 @@ " \"startDate\": \"2021-06-21T00:00:00Z\",\n", " \"completionDate\": \"2021-09-22T23:59:59Z\",\n", " \"lon\": 21.01,\n", - " \"lat\": 52.22,\n", + " \"lat\": 52.22\n", "}\n", "\n", "df, resto_url = resto_search(\"Sentinel2\", filters)\n", @@ -4938,7 +4941,7 @@ " \"startDate\": \"2022-06-11T00:00:00Z\",\n", " \"completionDate\": \"2022-06-22T23:59:59Z\",\n", " \"maxRecords\": 10,\n", - " \"box\": \"4,51,4.5,52\",\n", + " \"box\": \"4,51,4.5,52\"\n", "}\n", "\n", "df, resto_url = resto_search(\"Sentinel2\", filters)\n", @@ -5215,7 +5218,10 @@ } ], "source": [ - "filters = {\"polarisationChannels\": \"VV&VH\", \"productType\": \"IW_GRDH_1S\"}\n", + "filters = {\n", + " \"polarisationChannels\": \"VV&VH\",\n", + " \"productType\": \"IW_GRDH_1S\"\n", + "}\n", "\n", "df, resto_url = resto_search(\"Sentinel1\", filters)\n", "\n", @@ -5452,40 +5458,95 @@ " \"filter\": {\n", " \"op\": \"and\",\n", " \"args\": [\n", - " {\"op\": \"=\", \"args\": [{\"property\": \"collection\"}, \"sentinel-2-l2a\"]},\n", - " {\"op\": \"<=\", \"args\": [{\"property\": \"eo:cloud_cover\"}, 10]},\n", + " {\n", + " \"op\": \"=\",\n", + " \"args\": [\n", + " {\n", + " \"property\": \"collection\"\n", + " },\n", + " \"sentinel-2-l2a\"\n", + " ]\n", + " },\n", + " {\n", + " \"op\": \"<=\",\n", + " \"args\": [\n", + " {\n", + " \"property\": \"eo:cloud_cover\"\n", + " },\n", + " 10\n", + " ]\n", + " },\n", " {\n", " \"op\": \">=\",\n", " \"args\": [\n", - " {\"property\": \"datetime\"},\n", - " {\"timestamp\": \"2025-04-08T04:39:23Z\"},\n", - " ],\n", + " {\n", + " \"property\": \"datetime\"\n", + " },\n", + " {\n", + " \"timestamp\": \"2025-04-08T04:39:23Z\"\n", + " }\n", + " ]\n", " },\n", " {\n", " \"op\": \"s_intersects\",\n", " \"args\": [\n", - " {\"property\": \"geometry\"},\n", + " {\n", + " \"property\": \"geometry\"\n", + " },\n", " {\n", " \"type\": \"Polygon\",\n", " \"coordinates\": [\n", " [\n", - " [43.5845, -79.5442],\n", - " [43.6079, -79.4893],\n", - " [43.5677, -79.4632],\n", - " [43.6129, -79.3925],\n", - " [43.6223, -79.3238],\n", - " [43.6576, -79.3163],\n", - " [43.7945, -79.1178],\n", - " [43.8144, -79.1542],\n", - " [43.8555, -79.1714],\n", - " [43.7509, -79.6390],\n", - " [43.5845, -79.5442],\n", + " [\n", + " 43.5845,\n", + " -79.5442\n", + " ],\n", + " [\n", + " 43.6079,\n", + " -79.4893\n", + " ],\n", + " [\n", + " 43.5677,\n", + " -79.4632\n", + " ],\n", + " [\n", + " 43.6129,\n", + " -79.3925\n", + " ],\n", + " [\n", + " 43.6223,\n", + " -79.3238\n", + " ],\n", + " [\n", + " 43.6576,\n", + " -79.3163\n", + " ],\n", + " [\n", + " 43.7945,\n", + " -79.1178\n", + " ],\n", + " [\n", + " 43.8144,\n", + " -79.1542\n", + " ],\n", + " [\n", + " 43.8555,\n", + " -79.1714\n", + " ],\n", + " [\n", + " 43.7509,\n", + " -79.6390\n", + " ],\n", + " [\n", + " 43.5845,\n", + " -79.5442\n", + " ]\n", " ]\n", - " ],\n", - " },\n", - " ],\n", - " },\n", - " ],\n", + " ]\n", + " }\n", + " ]\n", + " }\n", + " ]\n", " }\n", "}\n", "\n", @@ -5493,11 +5554,9 @@ "\n", "json = response.json()\n", "\n", - "print(\n", - " f\"HTTPS GET Request: https://stac.dataspace.copernicus.eu/v1/search?collections=sentinel-2-l2a&filter=eo:cloud_cover <= 10&datetime >= TIMESTAMP('2025-04-08T04:39:23Z')&S_INTERSECTS(geometry, POLYGON((43.5845 -79.5442, 43.6079 -79.4893, 43.5677 -79.4632, 43.6129 -79.3925, 43.6223 -79.3238, 43.6576 -79.3163, 43.7945 -79.1178, 43.8144 -79.1542, 43.8555 -79.1714, 43.7509 -79.6390, 43.5845 -79.5442)))\"\n", - ")\n", + "print(f\"HTTPS GET Request: https://stac.dataspace.copernicus.eu/v1/search?collections=sentinel-2-l2a&filter=eo:cloud_cover <= 10&datetime >= TIMESTAMP('2025-04-08T04:39:23Z')&S_INTERSECTS(geometry, POLYGON((43.5845 -79.5442, 43.6079 -79.4893, 43.5677 -79.4632, 43.6129 -79.3925, 43.6223 -79.3238, 43.6576 -79.3163, 43.7945 -79.1178, 43.8144 -79.1542, 43.8555 -79.1714, 43.7509 -79.6390, 43.5845 -79.5442)))\")\n", "\n", - "df = pd.DataFrame.from_dict(json[\"features\"])\n", + "df = pd.DataFrame.from_dict(json['features'])\n", "df.head()" ] }, @@ -5695,16 +5754,23 @@ } ], "source": [ - "params = {\"collections\": [\"sentinel-2-l2a\"], \"query\": {\"eo:cloud_cover\": {\"lt\": 15}}}\n", + "params = {\n", + " \"collections\": [\n", + " \"sentinel-2-l2a\"\n", + " ],\n", + " \"query\": {\n", + " \"eo:cloud_cover\": {\n", + " \"lt\": 15\n", + " }\n", + " }\n", + "}\n", "\n", "response = requests.post(stac_url, json=params)\n", "json = response.json()\n", "\n", - "print(\n", - " f\"HTTPS GET Request: https://stac.dataspace.copernicus.eu/v1/search?collections=sentinel-2-l2a&eo:cloud_cover%3C15\"\n", - ")\n", + "print(f\"HTTPS GET Request: https://stac.dataspace.copernicus.eu/v1/search?collections=sentinel-2-l2a&eo:cloud_cover%3C15\")\n", "\n", - "df = pd.DataFrame.from_dict(json[\"features\"])\n", + "df = pd.DataFrame.from_dict(json['features'])\n", "df.head()" ] }, @@ -5883,20 +5949,32 @@ ], "source": [ "params = {\n", - " \"collections\": [\"sentinel-2-l2a\"],\n", - " \"filter\": {\"op\": \"lt\", \"args\": [{\"property\": \"eo:cloud_cover\"}, 15]},\n", - " \"fields\": {\"exclude\": [\"geometry\"]},\n", + " \"collections\": [\n", + " \"sentinel-2-l2a\"\n", + " ],\n", + " \"filter\": {\n", + " \"op\": \"lt\",\n", + " \"args\": [\n", + " {\n", + " \"property\": \"eo:cloud_cover\"\n", + " },\n", + " 15\n", + " ]\n", + " },\n", + " \"fields\": {\n", + " \"exclude\": [\n", + " \"geometry\"\n", + " ]\n", + " }\n", "}\n", "\n", "response = requests.post(stac_url, json=params)\n", "\n", "json = response.json()\n", "\n", - "print(\n", - " f\"HTTPS GET Request: https://stac.dataspace.copernicus.eu/v1/search?collections=sentinel-2-l2a&filter=eo:cloud_cover%3C15&fields=-geometry\"\n", - ")\n", + "print(f\"HTTPS GET Request: https://stac.dataspace.copernicus.eu/v1/search?collections=sentinel-2-l2a&filter=eo:cloud_cover%3C15&fields=-geometry\")\n", "\n", - "df = pd.DataFrame.from_dict(json[\"features\"])\n", + "df = pd.DataFrame.from_dict(json['features'])\n", "df.head()" ] }, @@ -6036,19 +6114,31 @@ ], "source": [ "params = {\n", - " \"collections\": [\"sentinel-2-l2a\"],\n", - " \"filter\": {\"op\": \"lt\", \"args\": [{\"property\": \"eo:cloud_cover\"}, 15]},\n", - " \"fields\": {\"include\": [\"assets\"]},\n", + " \"collections\": [\n", + " \"sentinel-2-l2a\"\n", + " ],\n", + " \"filter\": {\n", + " \"op\": \"lt\",\n", + " \"args\": [\n", + " {\n", + " \"property\": \"eo:cloud_cover\"\n", + " },\n", + " 15\n", + " ]\n", + " },\n", + " \"fields\": {\n", + " \"include\": [\n", + " \"assets\"\n", + " ]\n", + " }\n", "}\n", "\n", "response = requests.post(stac_url, json=params)\n", "json = response.json()\n", "\n", - "print(\n", - " f\"HTTPS GET Request: https://stac.dataspace.copernicus.eu/v1/search?collections=sentinel-2-l2a&filter=eo:cloud_cover%3C15&fields=assets\"\n", - ")\n", + "print(f\"HTTPS GET Request: https://stac.dataspace.copernicus.eu/v1/search?collections=sentinel-2-l2a&filter=eo:cloud_cover%3C15&fields=assets\")\n", "\n", - "df = pd.DataFrame.from_dict(json[\"features\"])\n", + "df = pd.DataFrame.from_dict(json['features'])\n", "df" ] }, @@ -6355,21 +6445,28 @@ "source": [ "params = {\n", " \"collections\": [\"sentinel-2-l2a\"],\n", - " \"query\": {\"eo:cloud_cover\": {\"gt\": 10}},\n", + " \"query\": {\n", + " \"eo:cloud_cover\": {\n", + " \"gt\": 10\n", + " }\n", + " },\n", " \"datetime\": \"2025-01-01T00:00:00Z/2025-01-15T23:59:59Z\",\n", - " \"sortby\": [{\"field\": \"eo:cloud_cover\", \"direction\": \"asc\"}],\n", - " \"limit\": 10,\n", + " \"sortby\": [\n", + " {\n", + " \"field\": \"eo:cloud_cover\",\n", + " \"direction\": \"asc\"\n", + " }\n", + " ],\n", + " \"limit\": 10\n", "}\n", "\n", "response = requests.post(stac_url, json=params)\n", "\n", "json = response.json()\n", "\n", - "print(\n", - " f\"HTTPS GET Request: https://stac.dataspace.copernicus.eu/v1/collections/sentinel-2-l2a/items?filter=eo:cloud_cover%3C15&datetime=2025-01-01T00:00:00Z/2025-01-15T23:59:59Z&sortby=+properties.eo:cloud_cover&limit=10\"\n", - ")\n", + "print(f\"HTTPS GET Request: https://stac.dataspace.copernicus.eu/v1/collections/sentinel-2-l2a/items?filter=eo:cloud_cover%3C15&datetime=2025-01-01T00:00:00Z/2025-01-15T23:59:59Z&sortby=+properties.eo:cloud_cover&limit=10\")\n", "\n", - "df = pd.DataFrame.from_dict(json[\"features\"])\n", + "df = pd.DataFrame.from_dict(json['features'])\n", "df" ] }, @@ -7008,16 +7105,17 @@ " \"collections\": [\"sentinel-2-l2a\"],\n", " \"datetime\": \"2025-01-01T00:00:00Z/2025-01-31T23:59:59Z\",\n", " \"limit\": 20,\n", - " \"sortby\": [{\"field\": \"datetime\", \"direction\": \"asc\"}],\n", + " \"sortby\": [\n", + " {\"field\": \"datetime\", \n", + " \"direction\": \"asc\"}\n", + " ]\n", "}\n", "\n", "response = requests.post(stac_url, json=params)\n", "\n", "json = response.json()\n", "\n", - "print(\n", - " f\"HTTPS GET Request: https://stac.dataspace.copernicus.eu/v1/search?collections=sentinel-2-l2a&datetime=2025-01-01T00:00:00Z/2025-01-31T23:59:59Z&limit=20&sortby=+datetime\"\n", - ")\n", + "print(f\"HTTPS GET Request: https://stac.dataspace.copernicus.eu/v1/search?collections=sentinel-2-l2a&datetime=2025-01-01T00:00:00Z/2025-01-31T23:59:59Z&limit=20&sortby=+datetime\")\n", "\n", "df_features = pd.DataFrame(json[\"features\"])\n", "df_features" @@ -7267,18 +7365,24 @@ "params = {\n", " \"collections\": [\"sentinel-2-l2a\"],\n", " \"datetime\": \"2021-06-21T00:00:00Z/2021-09-22T23:59:59Z\",\n", - " \"intersects\": {\"type\": \"Point\", \"coordinates\": [21.01, 52.22]},\n", - " \"query\": {\"eo:cloud_cover\": {\"gte\": 0, \"lte\": 10}},\n", + " \"intersects\": {\n", + " \"type\": \"Point\",\n", + " \"coordinates\": [21.01, 52.22]\n", + " },\n", + " \"query\": {\n", + " \"eo:cloud_cover\": {\n", + " \"gte\": 0,\n", + " \"lte\": 10\n", + " }\n", + " }\n", "}\n", "\n", "response = requests.post(stac_url, json=params)\n", "\n", "json = response.json()\n", "\n", - "print(\n", - " f\"HTTPS GET Request: https://stac.dataspace.copernicus.eu/v1/search?collections=sentinel-2-l2a&datetime=2021-06-21T00%3A00%3A00Z%2F2021-09-22T23%3A59%3A59Z&intersects=%7B%22type%22%3A%22Point%22%2C%22coordinates%22%3A%5B21.01%2C52.22%5D%7D&filter=eo%3Acloud_cover%20%3C%3D%2010\"\n", - ")\n", - "\n", + "print(f\"HTTPS GET Request: https://stac.dataspace.copernicus.eu/v1/search?collections=sentinel-2-l2a&datetime=2021-06-21T00%3A00%3A00Z%2F2021-09-22T23%3A59%3A59Z&intersects=%7B%22type%22%3A%22Point%22%2C%22coordinates%22%3A%5B21.01%2C52.22%5D%7D&filter=eo%3Acloud_cover%20%3C%3D%2010\")\n", + " \n", "df_features = pd.DataFrame(json[\"features\"])\n", "df_features" ] @@ -7469,16 +7573,19 @@ " \"datetime\": \"2022-06-11T00:00:00Z/2022-06-22T23:59:59Z\",\n", " \"bbox\": [4, 51, 4.5, 52],\n", " \"limit\": 10,\n", - " \"query\": {\"eo:cloud_cover\": {\"gte\": 0, \"lte\": 10}},\n", + " \"query\": {\n", + " \"eo:cloud_cover\": {\n", + " \"gte\": 0,\n", + " \"lte\": 10\n", + " }\n", + " }\n", "}\n", "\n", "response = requests.post(stac_url, json=params)\n", "\n", "json = response.json()\n", "\n", - "print(\n", - " f\"HTTPS GET Request: https://stac.dataspace.copernicus.eu/v1/search?collections=sentinel-2-l2a&datetime=2022-06-11T00%3A00%3A00Z%2F2022-06-22T23%3A59%3A59Z&bbox=4,51,4.5,52&filter=eo%3Acloud_cover%20%3E%3D%200%20AND%20eo%3Acloud_cover%20%3C%3D%2010&limit=10\"\n", - ")\n", + "print(f\"HTTPS GET Request: https://stac.dataspace.copernicus.eu/v1/search?collections=sentinel-2-l2a&datetime=2022-06-11T00%3A00%3A00Z%2F2022-06-22T23%3A59%3A59Z&bbox=4,51,4.5,52&filter=eo%3Acloud_cover%20%3E%3D%200%20AND%20eo%3Acloud_cover%20%3C%3D%2010&limit=10\")\n", "\n", "df_features = pd.DataFrame(json[\"features\"])\n", "df_features" @@ -7762,9 +7869,9 @@ " \"collections\": [\"sentinel-1-grd\"],\n", " \"query\": {\n", " \"product:type\": {\"eq\": \"IW_GRDH_1S\"},\n", - " \"sar:polarizations\": {\"eq\": [\"VV\", \"VH\"]},\n", + " \"sar:polarizations\": {\"eq\": [\"VV\", \"VH\"]}\n", " },\n", - " \"limit\": 10,\n", + " \"limit\": 10\n", "}\n", "\n", "response = requests.post(stac_url, json=params)\n", @@ -8055,13 +8162,31 @@ " \"filter\": {\n", " \"op\": \"and\",\n", " \"args\": [\n", - " {\"op\": \"=\", \"args\": [{\"property\": \"product:type\"}, \"IW_GRDH_1S\"]},\n", - " {\"op\": \"a_contains\", \"args\": [{\"property\": \"sar:polarizations\"}, \"VV\"]},\n", - " {\"op\": \"a_contains\", \"args\": [{\"property\": \"sar:polarizations\"}, \"VH\"]},\n", - " ],\n", + " {\n", + " \"op\": \"=\",\n", + " \"args\": [\n", + " { \"property\": \"product:type\" },\n", + " \"IW_GRDH_1S\"\n", + " ]\n", + " },\n", + " {\n", + " \"op\": \"a_contains\",\n", + " \"args\": [\n", + " { \"property\": \"sar:polarizations\" },\n", + " \"VV\"\n", + " ]\n", + " },\n", + " {\n", + " \"op\": \"a_contains\",\n", + " \"args\": [\n", + " { \"property\": \"sar:polarizations\" },\n", + " \"VH\"\n", + " ]\n", + " }\n", + " ]\n", " },\n", " \"collections\": [\"sentinel-1-grd\"],\n", - " \"limit\": 10,\n", + " \"limit\": 10\n", "}\n", "\n", "response = requests.post(stac_url, json=params)\n",