Repository: CS-SI/eodag

Issue:
USGS Search by ID lists many products instead of just the matching one
When I try to use `eodag.search` method with setting the `id` parameter, it lists many (millions) of products instead of just the product matching the ID, and the only work around I found is to iterate through all the pages and look for the matching product manually, but it takes a lot of time to load all these results.

**Code To Reproduce**
```py
from eodag import EODataAccessGateway
from eodag.utils.logging import setup_logging
setup_logging(verbose=3)
dag = EODataAccessGateway()
dag.search(id="LC09_L2SP_016035_20240605_20240611_02_T1", provider="usgs", productType="LANDSAT_C2L2")
```

**Output**
```
2024-07-08 22:46:20,166 eodag.config                     [DEBUG   ] (tid=140046769037376) Loading configuration from /home/hamed/Desktop/playground/env/lib/python3.11/site-packages/eodag/resources/providers.yml
2024-07-08 22:46:21,432 eodag.config                     [INFO    ] (tid=140046769037376) Loading user configuration from: /home/hamed/.config/eodag/eodag.yml
2024-07-08 22:46:21,452 eodag.core                       [INFO    ] (tid=140046769037376) aws_eos: provider needing auth for search has been pruned because no crendentials could be found
2024-07-08 22:46:21,452 eodag.core                       [INFO    ] (tid=140046769037376) meteoblue: provider needing auth for search has been pruned because no crendentials could be found
2024-07-08 22:46:21,452 eodag.core                       [INFO    ] (tid=140046769037376) hydroweb_next: provider needing auth for search has been pruned because no crendentials could be found
2024-07-08 22:46:21,452 eodag.core                       [INFO    ] (tid=140046769037376) wekeo: provider needing auth for search has been pruned because no crendentials could be found
2024-07-08 22:46:21,452 eodag.core                       [INFO    ] (tid=140046769037376) creodias_s3: provider needing auth for search has been pruned because no crendentials could be found
2024-07-08 22:46:21,460 eodag.core                       [DEBUG   ] (tid=140046769037376) Opening product types index in /home/hamed/.config/eodag/.index
2024-07-08 22:46:21,473 eodag.core                       [INFO    ] (tid=140046769037376) Locations configuration loaded from /home/hamed/.config/eodag/locations.yml
2024-07-08 22:46:21,474 eodag.core                       [INFO    ] (tid=140046769037376) Searching product type 'LANDSAT_C2L2' on provider: usgs
2024-07-08 22:46:21,474 eodag.core                       [INFO    ] (tid=140046769037376) Searching product with id 'LC09_L2SP_016035_20240605_20240611_02_T1' on provider: usgs
2024-07-08 22:46:21,474 eodag.core                       [DEBUG   ] (tid=140046769037376) Using plugin class for search: UsgsApi
2024-07-08 22:46:22,680 eodag.apis.usgs                  [INFO    ] (tid=140046769037376) Sending search request for landsat_ot_c2_l2 with {'start_date': None, 'end_date': None, 'll': None, 'ur': None, 'max_results': 2, 'starting_number': 1}
2024-07-08 22:46:24,927 eodag.apis.usgs                  [DEBUG   ] (tid=140046769037376) Adapting 2 plugin results to eodag product representation
2024-07-08 22:46:27,095 eodag.core                       [INFO    ] (tid=140046769037376) Found 3127730 result(s) on provider 'usgs'
2024-07-08 22:46:27,095 eodag.core                       [INFO    ] (tid=140046769037376) Several products found for this id ([EOProduct(id=LC09_L2SP_016001_20240707_20240708_02_T1, provider=usgs), EOProduct(id=LC09_L2SP_016002_20240707_20240708_02_T1, provider=usgs)]). You may try searching using more selective criteria.
```

**Environment:**
 - Python version: `3.11.2`
 - EODAG version: `2.12.1`

**Additional context**
Here is the actual product that corresponds to the "ID" in the search:
https://earthexplorer.usgs.gov/scene/metadata/full/5e83d14f2fc39685/LC90160352024157LGN00/


Discussion:
github-actions[bot]: ## Test Results
    4 files  ±0      4 suites  ±0   6m 8s :stopwatch: -6s
  552 tests +1    549 :white_check_mark: +1    3 :zzz: ±0  0 :x: ±0 
2 208 runs  +4  2 106 :white_check_mark: +4  102 :zzz: ±0  0 :x: ±0 

Results for commit 250c04bd. ± Comparison against base commit 1e422214.

[test-results]:data:application/gzip;base64,H4sIADXzlGYC/03MSQ7DIAyF4atErLswDlN6mSphkFAzVARWUe9eaAPN8v8sv4M4P9ud3Dt268iefGxhUhij39acvVAZ8imWI+dY67EnrQux4U9P/yo/Ddzo5wzQwIawhVNCWssmIqiz6iZSEI1+mxSwymX029dNvS2LjzkIctDAJqORSSvRyZ4aZ6fRMjn0CM4IpFZNSN4fNEhkxwkBAAA=

github-actions[bot]: ![badge](https://raw.githubusercontent.com/CS-SI/eodag/_xml_coverage_reports/data/usgs_search_id/./badge.svg)


## Code Coverage (Ubuntu)

<details>


```
Filename                                     Stmts    Miss  Cover    Missing
-----------------------------------------  -------  ------  -------  -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
__init__.py                                      8       0  100.00%
cli.py                                         305      51  83.28%   60, 654-700, 802-853, 857
config.py                                      351      27  92.31%   81-83, 92, 100, 104-106, 183, 195, 460-462, 526-529, 576-577, 586-587, 666, 735-740, 742
crunch.py                                        5       5  0.00%    20-24
api/__init__.py                                  0       0  100.00%
api/core.py                                    762      84  88.98%   91-100, 373, 598, 642-645, 683, 720, 750, 798, 802-807, 833, 929, 1012, 1149, 1239-1251, 1291, 1293, 1321, 1325-1336, 1349-1355, 1445-1448, 1481-1501, 1557, 1574-1577, 1589-1592, 1614-1621, 1947, 1980-1986, 2253, 2257-2260, 2274-2276, 2311
api/search_result.py                            54       6  88.89%   33-35, 75, 84, 91, 105
api/product/__init__.py                          6       0  100.00%
api/product/_assets.py                          52       8  84.62%   28-30, 80, 157, 167, 170-174
api/product/_product.py                        195      27  86.15%   59-66, 70-72, 242-243, 325, 354, 415, 429-432, 445, 469-472, 515-521
api/product/metadata_mapping.py                678      83  87.76%   67-69, 131-133, 234, 266-267, 313-314, 324-336, 338, 349, 355-367, 412-413, 450, 471-474, 497, 505-506, 582-583, 607-608, 614-617, 632-633, 782, 828, 1002-1007, 1138, 1152-1172, 1192, 1197, 1307, 1329, 1343, 1356-1375, 1414, 1466, 1504-1508, 1527
api/product/drivers/__init__.py                  6       0  100.00%
api/product/drivers/base.py                      8       2  75.00%   23, 41
plugins/__init__.py                              0       0  100.00%
plugins/base.py                                 23       3  86.96%   25, 48, 55
plugins/manager.py                             134      15  88.81%   49-51, 105-110, 156, 197, 219, 223, 249, 288-289
plugins/apis/__init__.py                         0       0  100.00%
plugins/apis/base.py                             4       0  100.00%
plugins/apis/ecmwf.py                           99      15  84.85%   46-54, 150-152, 199-200, 226-228
plugins/apis/usgs.py                           186      36  80.65%   60-65, 132, 233, 267, 302-304, 309, 335-336, 341, 371-378, 389-394, 416-422, 424-430, 453
plugins/authentication/__init__.py               6       1  83.33%   31
plugins/authentication/aws_auth.py              20       2  90.00%   25-27
plugins/authentication/base.py                  19       3  84.21%   26, 34, 47
plugins/authentication/generic.py               16       3  81.25%   28, 40, 50
plugins/authentication/header.py                21       1  95.24%   28
plugins/authentication/keycloak.py              49       6  87.76%   33-35, 132, 156-161
plugins/authentication/oauth.py                 15       8  46.67%   25, 32-34, 38-41
plugins/authentication/openid_connect.py       185      19  89.73%   41-43, 119, 133-158, 166, 320-323, 347
plugins/authentication/qsauth.py                36       2  94.44%   32, 83
plugins/authentication/sas_auth.py              49       2  95.92%   32, 76
plugins/authentication/token.py                 90      17  81.11%   35-37, 79, 107, 109, 131-143, 198-201
plugins/authentication/token_exchange.py        35      19  45.71%   74-80, 92-120
plugins/crunch/__init__.py                       0       0  100.00%
plugins/crunch/base.py                          12       2  83.33%   26, 40
plugins/crunch/filter_date.py                   61      15  75.41%   30, 51-56, 70, 79, 88, 91, 103-105, 114-116, 123
plugins/crunch/filter_latest_intersect.py       50      10  80.00%   32-34, 51-52, 71, 80-83, 85, 92-95
plugins/crunch/filter_latest_tpl_name.py        33       2  93.94%   28, 87
plugins/crunch/filter_overlap.py                68      19  72.06%   28-30, 33, 72-75, 82-85, 91, 99, 110-126
plugins/crunch/filter_property.py               32       8  75.00%   29, 58-63, 66-67, 83-87
plugins/download/__init__.py                     0       0  100.00%
plugins/download/aws.py                        492     165  66.46%   77-83, 272, 285, 352-355, 369-373, 419-421, 425, 459-460, 466-470, 503, 538, 542, 549, 579-587, 591, 629-637, 644-646, 687-761, 779-840, 851-856, 872-885, 914, 929-931, 934, 944-952, 960-973, 983-1002, 1009-1021, 1062, 1088, 1133-1135, 1355
plugins/download/base.py                       260      57  78.08%   58-64, 145, 180, 319-320, 340-346, 377-381, 387-388, 432, 435-449, 461, 465, 538-542, 572-573, 581-598, 605-613, 615-619, 666, 688, 710, 718
plugins/download/creodias_s3.py                 17       9  47.06%   44-58
plugins/download/http.py                       535     132  75.33%   86-92, 203-215, 217-218, 253-256, 320-323, 325-326, 333-338, 356-371, 388-390, 402, 450, 457-463, 481, 495, 509, 517-519, 535-540, 551, 569, 611-615, 637, 677, 722, 736-742, 778-842, 860, 893-902, 928-929, 956-961, 967, 970, 986, 1003-1004, 1031-1032, 1039, 1101-1107, 1162-1163, 1169, 1179, 1213, 1249, 1267-1283
plugins/download/s3rest.py                     119      27  77.31%   55-58, 121, 162, 197, 227-234, 237-239, 243, 256-262, 270-271, 274-278, 301, 322-325
plugins/search/__init__.py                      26       3  88.46%   27-31
plugins/search/base.py                         133      13  90.23%   48-53, 104, 108, 121, 271, 291, 350-351, 371, 380
plugins/search/build_search_result.py          183      24  86.89%   62, 97, 141-142, 148, 159, 295-298, 327, 384-401, 463, 466, 476, 493, 521, 523
plugins/search/cop_marine.py                   200      49  75.50%   43-44, 55, 63-65, 71-72, 88, 90, 93, 128-130, 142-143, 183-192, 196, 199, 203, 221, 251, 255, 270, 274, 278, 282, 286-290, 296-299, 302-316, 333, 356, 359, 365
plugins/search/creodias_s3.py                   55       3  94.55%   56, 74, 108
plugins/search/csw.py                          108      83  23.15%   44-46, 58-59, 63-64, 72-120, 126-139, 147-179, 197-238
plugins/search/data_request_search.py          202      68  66.34%   53, 90-93, 109, 121, 125-126, 137, 142, 147, 154, 167-170, 224-225, 229, 239-245, 250, 276-279, 287-298, 315, 317, 324-325, 327-328, 346-350, 383, 393, 404, 417, 423-438, 443
plugins/search/qssearch.py                     655      77  88.24%   103, 387, 391-397, 405-406, 512-518, 568, 584, 594, 621, 623, 666-669, 743-744, 792, 811, 826, 884, 905, 908-909, 918-919, 928-929, 938-939, 966, 1037-1042, 1046-1055, 1090, 1164, 1213, 1287-1291, 1357-1358, 1379, 1406-1418, 1425, 1457-1459, 1469-1475, 1519, 1534, 1556, 1665-1675
plugins/search/static_stac_search.py            75      12  84.00%   37-38, 101-128, 144, 157
rest/__init__.py                                 4       2  50.00%   21-22
rest/cache.py                                   33       7  78.79%   35-37, 53-55, 59, 68
rest/config.py                                  26       0  100.00%
rest/constants.py                                7       0  100.00%
rest/core.py                                   238      30  87.39%   83-87, 281, 365, 475, 702, 709-757
rest/server.py                                 286      55  80.77%   81-82, 108, 131-133, 246-248, 304-305, 317-333, 425-430, 458, 626-633, 662, 706-707, 730, 803-805, 822-827, 856, 858, 862-863, 867-868
rest/stac.py                                   466     123  73.61%   65-67, 320, 342, 390-393, 417-443, 448-454, 477-479, 502, 537-538, 566, 579, 624-664, 692-708, 787-800, 807, 863-864, 931, 999-1001, 1220, 1230-1242, 1255-1277, 1291-1336, 1498-1499
rest/types/__init__.py                           0       0  100.00%
rest/types/collections_search.py                13      13  0.00%    18-44
rest/types/eodag_search.py                     184       9  95.11%   52-55, 235-239, 292, 295, 363
rest/types/queryables.py                        58       2  96.55%   38, 172
rest/types/stac_search.py                      131      11  91.60%   51-54, 133, 179, 194-196, 204, 208
rest/utils/__init__.py                          95      13  86.32%   51, 108-109, 128-130, 182, 192-206
rest/utils/cql_evaluate.py                      48       5  89.58%   69, 76, 90, 97, 105
rest/utils/rfc3339.py                           23       3  86.96%   49, 61, 63
types/__init__.py                              110      11  90.00%   53, 70, 129-132, 199, 214-218, 245, 258
types/bbox.py                                   43      19  55.81%   46-61, 72-74, 85-87, 99-101, 113-115, 123
types/download_args.py                           9       0  100.00%
types/queryables.py                             81       0  100.00%
types/search_args.py                            70      18  74.29%   60-64, 71-88, 104
types/whoosh.py                                 15       0  100.00%
utils/__init__.py                              503      39  92.25%   84, 89, 110-112, 193-194, 203-230, 233, 247, 329-333, 409-413, 434-436, 518, 533, 571-572, 968-971, 979-980, 1021-1022, 1204
utils/constraints.py                           119      37  68.91%   94-103, 144, 149, 153, 164, 190-192, 202, 216-232, 241-252
utils/exceptions.py                             37       2  94.59%   23, 93
utils/import_system.py                          30      20  33.33%   27, 67-81, 93-103
utils/logging.py                                29       1  96.55%   123
utils/notebook.py                               44      23  47.73%   25-29, 36-41, 58-62, 72-78, 83-87
utils/repr.py                                   30       8  73.33%   36, 38, 42, 76, 94-101
utils/requests.py                               55      11  80.00%   69, 96, 98, 100, 102, 104, 123, 128-130, 138
utils/rest.py                                   36       1  97.22%   57
utils/stac_reader.py                           111      45  59.46%   56-57, 63-85, 95-97, 101, 143, 159-162, 215-224, 234-264
TOTAL                                         9667    1731  82.09%
```

</details>


### Diff against develop

```
Filename                Stmts    Miss  Cover
--------------------  -------  ------  -------
plugins/apis/usgs.py      +11       0  +1.22%
TOTAL                     +11       0  +0.02%
```


Results for commit: 250c04bdc247e72f731dfebae479320fd621e8b2


_Minimum allowed coverage is `70%`_


:recycle: This comment has been updated with latest results


<!-- Sticky Pull Request Commentartifacts/unit-test-results-python3.12-ubuntu-latest/coverage.xml -->
github-actions[bot]: ![badge](https://raw.githubusercontent.com/CS-SI/eodag/_xml_coverage_reports_win/data/usgs_search_id/./badge.svg)


## Code Coverage (Windows)

<details>


```
Filename                                     Stmts    Miss  Cover    Missing
-----------------------------------------  -------  ------  -------  ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
__init__.py                                      8       0  100.00%
cli.py                                         305      51  83.28%   60, 654-700, 802-853, 857
config.py                                      351      28  92.02%   81-83, 92, 100, 104-106, 183, 195, 460-462, 526-529, 576-577, 586-587, 666, 700, 735-740, 742
crunch.py                                        5       5  0.00%    20-24
api/__init__.py                                  0       0  100.00%
api/core.py                                    762      84  88.98%   91-100, 373, 598, 642-645, 683, 720, 750, 798, 802-807, 833, 929, 1012, 1149, 1239-1251, 1291, 1293, 1321, 1325-1336, 1349-1355, 1445-1448, 1481-1501, 1557, 1574-1577, 1589-1592, 1614-1621, 1947, 1980-1986, 2253, 2257-2260, 2274-2276, 2311
api/search_result.py                            54       6  88.89%   33-35, 75, 84, 91, 105
api/product/__init__.py                          6       0  100.00%
api/product/_assets.py                          52       8  84.62%   28-30, 80, 157, 167, 170-174
api/product/_product.py                        195      27  86.15%   59-66, 70-72, 242-243, 325, 354, 415, 429-432, 445, 469-472, 515-521
api/product/metadata_mapping.py                678      83  87.76%   67-69, 131-133, 234, 266-267, 313-314, 324-336, 338, 349, 355-367, 412-413, 450, 471-474, 497, 505-506, 582-583, 607-608, 614-617, 632-633, 782, 828, 1002-1007, 1138, 1152-1172, 1192, 1197, 1307, 1329, 1343, 1356-1375, 1414, 1466, 1504-1508, 1527
api/product/drivers/__init__.py                  6       0  100.00%
api/product/drivers/base.py                      8       2  75.00%   23, 41
plugins/__init__.py                              0       0  100.00%
plugins/base.py                                 23       4  82.61%   25, 48, 55, 68
plugins/manager.py                             134      15  88.81%   49-51, 105-110, 156, 197, 219, 223, 249, 288-289
plugins/apis/__init__.py                         0       0  100.00%
plugins/apis/base.py                             4       0  100.00%
plugins/apis/ecmwf.py                           99      15  84.85%   46-54, 150-152, 199-200, 226-228
plugins/apis/usgs.py                           186      36  80.65%   60-65, 132, 233, 267, 302-304, 309, 335-336, 341, 371-378, 389-394, 416-422, 424-430, 453
plugins/authentication/__init__.py               6       1  83.33%   31
plugins/authentication/aws_auth.py              20       2  90.00%   25-27
plugins/authentication/base.py                  19       3  84.21%   26, 34, 47
plugins/authentication/generic.py               16       3  81.25%   28, 40, 50
plugins/authentication/header.py                21       1  95.24%   28
plugins/authentication/keycloak.py              49       6  87.76%   33-35, 132, 156-161
plugins/authentication/oauth.py                 15       8  46.67%   25, 32-34, 38-41
plugins/authentication/openid_connect.py       185      19  89.73%   41-43, 119, 133-158, 166, 320-323, 347
plugins/authentication/qsauth.py                36       2  94.44%   32, 83
plugins/authentication/sas_auth.py              49       2  95.92%   32, 76
plugins/authentication/token.py                 90      17  81.11%   35-37, 79, 107, 109, 131-143, 198-201
plugins/authentication/token_exchange.py        35      19  45.71%   74-80, 92-120
plugins/crunch/__init__.py                       0       0  100.00%
plugins/crunch/base.py                          12       2  83.33%   26, 40
plugins/crunch/filter_date.py                   61      15  75.41%   30, 51-56, 70, 79, 88, 91, 103-105, 114-116, 123
plugins/crunch/filter_latest_intersect.py       50      35  30.00%   32-34, 48-53, 69-114
plugins/crunch/filter_latest_tpl_name.py        33       2  93.94%   28, 87
plugins/crunch/filter_overlap.py                68      19  72.06%   28-30, 33, 72-75, 82-85, 91, 99, 110-126
plugins/crunch/filter_property.py               32       8  75.00%   29, 58-63, 66-67, 83-87
plugins/download/__init__.py                     0       0  100.00%
plugins/download/aws.py                        492     165  66.46%   77-83, 272, 285, 352-355, 369-373, 419-421, 425, 459-460, 466-470, 503, 538, 542, 549, 579-587, 591, 629-637, 644-646, 687-761, 779-840, 851-856, 872-885, 914, 929-931, 934, 944-952, 960-973, 983-1002, 1009-1021, 1062, 1088, 1133-1135, 1355
plugins/download/base.py                       260      59  77.31%   58-64, 145, 180, 250-252, 319-320, 340-346, 377-381, 387-388, 432, 435-449, 461, 465, 538-542, 572-573, 581-598, 605-613, 615-619, 666, 688, 710, 718
plugins/download/creodias_s3.py                 17       9  47.06%   44-58
plugins/download/http.py                       535     132  75.33%   86-92, 203-215, 217-218, 253-256, 320-323, 325-326, 333-338, 356-371, 388-390, 402, 450, 457-463, 481, 495, 509, 517-519, 535-540, 551, 569, 611-615, 637, 677, 722, 736-742, 778-842, 860, 893-902, 928-929, 956-961, 967, 970, 986, 1003-1004, 1031-1032, 1039, 1101-1107, 1162-1163, 1169, 1179, 1213, 1249, 1267-1283
plugins/download/s3rest.py                     119      27  77.31%   55-58, 121, 162, 197, 227-234, 237-239, 243, 256-262, 270-271, 274-278, 301, 322-325
plugins/search/__init__.py                      26       3  88.46%   27-31
plugins/search/base.py                         133      18  86.47%   48-53, 104, 108, 121, 271, 291, 350-351, 371, 374-382, 384
plugins/search/build_search_result.py          183      31  83.06%   62, 97, 141-142, 148, 159, 295-298, 327, 384-401, 463, 466, 476, 493, 513-528
plugins/search/cop_marine.py                   200      49  75.50%   43-44, 55, 63-65, 71-72, 88, 90, 93, 128-130, 142-143, 183-192, 196, 199, 203, 221, 251, 255, 270, 274, 278, 282, 286-290, 296-299, 302-316, 333, 356, 359, 365
plugins/search/creodias_s3.py                   55       3  94.55%   56, 74, 108
plugins/search/csw.py                          108      83  23.15%   44-46, 58-59, 63-64, 72-120, 126-139, 147-179, 197-238
plugins/search/data_request_search.py          202      68  66.34%   53, 90-93, 109, 121, 125-126, 137, 142, 147, 154, 167-170, 224-225, 229, 239-245, 250, 276-279, 287-298, 315, 317, 324-325, 327-328, 346-350, 383, 393, 404, 417, 423-438, 443
plugins/search/qssearch.py                     655     105  83.97%   103, 387, 391-397, 405-406, 512-518, 568, 571, 584, 594, 613-628, 666-669, 743-744, 792, 811, 826, 884, 905, 908-909, 918-919, 928-929, 938-939, 966, 1037-1042, 1046-1055, 1090, 1164, 1213, 1287-1291, 1357-1358, 1379, 1406-1418, 1425, 1457-1459, 1469-1475, 1519, 1534, 1556, 1624-1695
plugins/search/static_stac_search.py            75      12  84.00%   37-38, 101-128, 144, 157
rest/__init__.py                                 4       2  50.00%   21-22
rest/cache.py                                   33      22  33.33%   35-37, 44-70
rest/config.py                                  26       4  84.62%   34-36, 68
rest/constants.py                                7       0  100.00%
rest/core.py                                   238     153  35.71%   83-87, 167-248, 272-326, 339-375, 412-444, 464-480, 503-514, 523-559, 578, 624-663, 702, 709-757
rest/server.py                                 286     286  0.00%    18-879
rest/stac.py                                   466     394  15.45%   65-67, 128-134, 142-165, 196-201, 233, 253-376, 386-455, 473-512, 528-581, 591-614, 624-664, 692-708, 718, 734-737, 756-826, 844-880, 909-934, 942-958, 966-971, 981-1008, 1018-1020, 1028-1030, 1043-1045, 1059-1076, 1086-1107, 1117-1139, 1147-1164, 1187-1210, 1220, 1230-1242, 1255-1277, 1291-1336, 1344-1361, 1371-1529
rest/types/__init__.py                           0       0  100.00%
rest/types/collections_search.py                13      13  0.00%    18-44
rest/types/eodag_search.py                     184      19  89.67%   52-55, 125, 235-239, 272-274, 292, 295, 301, 305, 363, 375-378
rest/types/queryables.py                        58      14  75.86%   38, 51-52, 58-59, 65-66, 95-100, 109-110, 172
rest/types/stac_search.py                      131      22  83.21%   51-54, 131-133, 157-158, 163-164, 179, 194-196, 204, 208, 255-260
rest/utils/__init__.py                          95      31  67.37%   51, 79-85, 105, 108-109, 128-130, 143, 150, 175-183, 190-211
rest/utils/cql_evaluate.py                      48       5  89.58%   69, 76, 90, 97, 105
rest/utils/rfc3339.py                           23       6  73.91%   41, 44-45, 49, 61, 63
types/__init__.py                              110      36  67.27%   53, 66-70, 81-93, 120-122, 129-132, 172, 199, 209-221, 226, 245, 250, 258, 268
types/bbox.py                                   43      19  55.81%   46-61, 72-74, 85-87, 99-101, 113-115, 123
types/download_args.py                           9       0  100.00%
types/queryables.py                             81       0  100.00%
types/search_args.py                            70      18  74.29%   60-64, 71-88, 104
types/whoosh.py                                 15       0  100.00%
utils/__init__.py                              503      41  91.85%   84, 89, 110-112, 193-194, 203-230, 233, 247, 329-333, 409-413, 434-436, 518, 533, 571-572, 968-971, 979-980, 1021-1022, 1055, 1204, 1380
utils/constraints.py                           119      37  68.91%   94-103, 144, 149, 153, 164, 190-192, 202, 216-232, 241-252
utils/exceptions.py                             37       2  94.59%   23, 93
utils/import_system.py                          30      20  33.33%   27, 67-81, 93-103
utils/logging.py                                29       1  96.55%   123
utils/notebook.py                               44      23  47.73%   25-29, 36-41, 58-62, 72-78, 83-87
utils/repr.py                                   30       8  73.33%   36, 38, 42, 76, 94-101
utils/requests.py                               55      11  80.00%   69, 96, 98, 100, 102, 104, 123, 128-130, 138
utils/rest.py                                   36       1  97.22%   57
utils/stac_reader.py                           111      45  59.46%   56-57, 63-85, 95-97, 101, 143, 159-162, 215-224, 234-264
TOTAL                                         9667    2525  73.88%
```

</details>


### Diff against develop

```
Filename                Stmts    Miss  Cover
--------------------  -------  ------  -------
plugins/apis/usgs.py      +11       0  +1.22%
TOTAL                     +11       0  +0.03%
```


Results for commit: 250c04bdc247e72f731dfebae479320fd621e8b2


_Minimum allowed coverage is `70%`_


:recycle: This comment has been updated with latest results


<!-- Sticky Pull Request Commentartifacts/unit-test-results-python3.12-windows-latest/coverage.xml -->

Patch:
diff --git a/eodag/plugins/apis/usgs.py b/eodag/plugins/apis/usgs.py
index 2e552f0b..d4ecf61f 100644
--- a/eodag/plugins/apis/usgs.py
+++ b/eodag/plugins/apis/usgs.py
@@ -172,11 +172,39 @@ class UsgsApi(Api):
                 max_results=items_per_page,
                 starting_number=(1 + (page - 1) * items_per_page),
             )
-            logger.info(
-                f"Sending search request for {usgs_dataset} with {api_search_kwargs}"
-            )
 
-            results = api.scene_search(usgs_dataset, **api_search_kwargs)
+            # search by id
+            if searched_id := kwargs.get("id"):
+                dataset_filters = api.dataset_filters(usgs_dataset)
+                # ip pattern set as parameter queryable (first element of param conf list)
+                id_pattern = self.config.metadata_mapping["id"][0]
+                # loop on matching dataset_filters until one returns expected results
+                for dataset_filter in dataset_filters["data"]:
+                    if id_pattern in dataset_filter["searchSql"]:
+                        logger.debug(
+                            f"Try using {dataset_filter['searchSql']} dataset filter to search by id on {usgs_dataset}"
+                        )
+                        full_api_search_kwargs = {
+                            "where": {
+                                "filter_id": dataset_filter["id"],
+                                "value": searched_id,
+                            },
+                            **api_search_kwargs,
+                        }
+                        logger.info(
+                            f"Sending search request for {usgs_dataset} with {full_api_search_kwargs}"
+                        )
+                        results = api.scene_search(
+                            usgs_dataset, **full_api_search_kwargs
+                        )
+                        if len(results["data"]["results"]) == 1:
+                            # search by id using this dataset_filter succeeded
+                            break
+            else:
+                logger.info(
+                    f"Sending search request for {usgs_dataset} with {api_search_kwargs}"
+                )
+                results = api.scene_search(usgs_dataset, **api_search_kwargs)
 
             # update results with storage info from download_options()
             results_by_entity_id = {
diff --git a/eodag/resources/providers.yml b/eodag/resources/providers.yml
index 51fc63f2..b2013f83 100644
--- a/eodag/resources/providers.yml
+++ b/eodag/resources/providers.yml
@@ -31,7 +31,9 @@
       max_items_per_page: 5000
       total_items_nb_key_path: '$.totalHits'
     metadata_mapping:
-      id: '$.displayId'
+      id:
+        - '_ID'
+        - '$.displayId'
       geometry: '$.spatialBounds'
       productType: '$.productType'
       title: '$.displayId'


Test patch:
diff --git a/tests/units/test_apis_plugins.py b/tests/units/test_apis_plugins.py
index 30cfbb41..7f3d184a 100644
--- a/tests/units/test_apis_plugins.py
+++ b/tests/units/test_apis_plugins.py
@@ -392,6 +392,65 @@ class TestApisPluginEcmwfApi(BaseApisPluginTest):
 
 
 class TestApisPluginUsgsApi(BaseApisPluginTest):
+    SCENE_SEARCH_RETURN = {
+        "data": {
+            "results": [
+                {
+                    "browse": [
+                        {
+                            "browsePath": "https://path/to/quicklook.jpg",
+                            "thumbnailPath": "https://path/to/thumbnail.jpg",
+                        },
+                        {},
+                        {},
+                    ],
+                    "cloudCover": "77.46",
+                    "entityId": "LC81780382020041LGN00",
+                    "displayId": "LC08_L1GT_178038_20200210_20200224_01_T2",
+                    "spatialBounds": {
+                        "type": "Polygon",
+                        "coordinates": [
+                            [
+                                [28.03905, 30.68073],
+                                [28.03905, 32.79057],
+                                [30.46294, 32.79057],
+                                [30.46294, 30.68073],
+                                [28.03905, 30.68073],
+                            ]
+                        ],
+                    },
+                    "temporalCoverage": {
+                        "endDate": "2020-02-10 00:00:00",
+                        "startDate": "2020-02-10 00:00:00",
+                    },
+                    "publishDate": "2020-02-10 08:24:46",
+                },
+            ],
+            "recordsReturned": 5,
+            "totalHits": 139,
+            "startingNumber": 6,
+            "nextRecord": 11,
+        }
+    }
+
+    DOWNLOAD_OPTION_RETURN = {
+        "data": [
+            {
+                "id": "5e83d0b8e7f6734c",
+                "entityId": "LC81780382020041LGN00",
+                "available": True,
+                "filesize": 9186067,
+                "productName": "LandsatLook Natural Color Image",
+                "downloadSystem": "dds",
+            },
+            {
+                "entityId": "LC81780382020041LGN00",
+                "available": False,
+                "downloadSystem": "wms",
+            },
+        ]
+    }
+
     def setUp(self):
         self.provider = "usgs"
         self.api_plugin = self.get_search_plugin(provider=self.provider)
@@ -450,67 +509,12 @@ class TestApisPluginUsgsApi(BaseApisPluginTest):
     @mock.patch(
         "usgs.api.scene_search",
         autospec=True,
-        return_value={
-            "data": {
-                "results": [
-                    {
-                        "browse": [
-                            {
-                                "browsePath": "https://path/to/quicklook.jpg",
-                                "thumbnailPath": "https://path/to/thumbnail.jpg",
-                            },
-                            {},
-                            {},
-                        ],
-                        "cloudCover": "77.46",
-                        "entityId": "LC81780382020041LGN00",
-                        "displayId": "LC08_L1GT_178038_20200210_20200224_01_T2",
-                        "spatialBounds": {
-                            "type": "Polygon",
-                            "coordinates": [
-                                [
-                                    [28.03905, 30.68073],
-                                    [28.03905, 32.79057],
-                                    [30.46294, 32.79057],
-                                    [30.46294, 30.68073],
-                                    [28.03905, 30.68073],
-                                ]
-                            ],
-                        },
-                        "temporalCoverage": {
-                            "endDate": "2020-02-10 00:00:00",
-                            "startDate": "2020-02-10 00:00:00",
-                        },
-                        "publishDate": "2020-02-10 08:24:46",
-                    },
-                ],
-                "recordsReturned": 5,
-                "totalHits": 139,
-                "startingNumber": 6,
-                "nextRecord": 11,
-            }
-        },
+        return_value=SCENE_SEARCH_RETURN,
     )
     @mock.patch(
         "usgs.api.download_options",
         autospec=True,
-        return_value={
-            "data": [
-                {
-                    "id": "5e83d0b8e7f6734c",
-                    "entityId": "LC81780382020041LGN00",
-                    "available": True,
-                    "filesize": 9186067,
-                    "productName": "LandsatLook Natural Color Image",
-                    "downloadSystem": "dds",
-                },
-                {
-                    "entityId": "LC81780382020041LGN00",
-                    "available": False,
-                    "downloadSystem": "wms",
-                },
-            ]
-        },
+        return_value=DOWNLOAD_OPTION_RETURN,
     )
     def test_plugins_apis_usgs_query(
         self,
@@ -566,6 +570,61 @@ class TestApisPluginUsgsApi(BaseApisPluginTest):
             total_count, mock_api_scene_search.return_value["data"]["totalHits"]
         )
 
+    @mock.patch("usgs.api.login", autospec=True)
+    @mock.patch("usgs.api.logout", autospec=True)
+    @mock.patch(
+        "usgs.api.scene_search",
+        autospec=True,
+        return_value=SCENE_SEARCH_RETURN,
+    )
+    @mock.patch(
+        "usgs.api.download_options",
+        autospec=True,
+        return_value=DOWNLOAD_OPTION_RETURN,
+    )
+    @mock.patch(
+        "usgs.api.dataset_filters",
+        autospec=True,
+        return_value={
+            "data": [
+                {"id": "foo_id", "searchSql": "DONT_USE_THIS !"},
+                {"id": "bar_id", "searchSql": "USE_THIS_ID !"},
+            ]
+        },
+    )
+    def test_plugins_apis_usgs_query_by_id(
+        self,
+        mock_dataset_filters,
+        mock_api_download_options,
+        mock_api_scene_search,
+        mock_api_logout,
+        mock_api_login,
+    ):
+        """UsgsApi.query by id must search using usgs api"""
+
+        search_kwargs = {
+            "productType": "LANDSAT_C2L1",
+            "id": "SOME_PRODUCT_ID",
+            "prep": PreparedSearch(
+                items_per_page=500,
+                page=1,
+            ),
+        }
+        search_results, total_count = self.api_plugin.query(**search_kwargs)
+        mock_api_scene_search.assert_called_once_with(
+            "landsat_ot_c2_l1",
+            where={"filter_id": "bar_id", "value": "SOME_PRODUCT_ID"},
+            start_date=None,
+            end_date=None,
+            ll=None,
+            ur=None,
+            max_results=500,
+            starting_number=1,
+        )
+        self.assertEqual(search_results[0].provider, "usgs")
+        self.assertEqual(search_results[0].product_type, "LANDSAT_C2L1")
+        self.assertEqual(len(search_results), 1)
+
     @mock.patch("usgs.api.login", autospec=True)
     @mock.patch("usgs.api.logout", autospec=True)
     @mock.patch("usgs.api.download_request", autospec=True)