{"id":19227478,"url":"https://github.com/datastreamapp/datastream-py","last_synced_at":"2026-06-19T17:32:13.598Z","repository":{"id":201592129,"uuid":"706854377","full_name":"datastreamapp/datastream-py","owner":"datastreamapp","description":"DataSteam API helper in Python ","archived":false,"fork":false,"pushed_at":"2025-07-10T16:25:09.000Z","size":11,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-07-10T22:54:39.753Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/datastreamapp.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-10-18T18:40:44.000Z","updated_at":"2025-07-10T16:25:13.000Z","dependencies_parsed_at":"2025-01-03T23:30:21.823Z","dependency_job_id":null,"html_url":"https://github.com/datastreamapp/datastream-py","commit_stats":null,"previous_names":["datastreamapp/datastream-py"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/datastreamapp/datastream-py","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/datastreamapp%2Fdatastream-py","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/datastreamapp%2Fdatastream-py/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/datastreamapp%2Fdatastream-py/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/datastreamapp%2Fdatastream-py/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/datastreamapp","download_url":"https://codeload.github.com/datastreamapp/datastream-py/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/datastreamapp%2Fdatastream-py/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34541851,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-19T02:00:06.005Z","response_time":61,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-09T15:23:32.280Z","updated_at":"2026-06-19T17:32:13.581Z","avatar_url":"https://github.com/datastreamapp.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003ch1 align=\"center\"\u003e\n  \u003cimg src=\"https://raw.githubusercontent.com/datastreamapp/api-docs/main/docs/images/datastream.svg?sanitize=true\" alt=\"DataStream Logo\" width=\"400\"\u003e\n  \u003cbr/\u003e\n  DataStream API Python Wrapper\n  \u003cbr/\u003e\n  \u003cbr/\u003e\n\u003c/h1\u003e\n\nThis package is useful for those who want to extract large volumes of data from\nDataStream's [Public API](https://github.com/datastreamapp/api-docs/tree/main/docs).\n\nSee [Usage](#usage) to learn how to use this package.\n\n\u003e Note: DataStream's Custom Download tool is another option that allows users to download csv data from across datasets\n\u003e in a particular DataStream hub using basic filters. This tool has fewer filtering options than the API, but works well\n\u003e for basic searches. You can find it via 'Explore Data' in the header menu from any DataStream regional hub.\n\n## Requirements\n\n- Python 3.9+\n\n## Install\n\n### Using CLI\n\n```sh\npip install git+https://github.com/datastreamapp/datastream-py\n```\n\n### Using requirements.txt\n\nAdd the following to your `requirements.txt` file:\n\n```\ndatastream-py @ git+https://github.com/datastreamapp/datastream-py@main\n```\n\nThen, run `pip install -r requirements.txt`\n\n## Usage\n\nAvailable methods:\n\n- `set_api_key`\n- `metadata`\n- `locations`\n- `observations`\n- `records`\n\nSee [API documentation](https://github.com/datastreamapp/api-docs/tree/main/docs) for query string values and structure.\n\n### Locations\n\nReturns a [generator object that is iterable](https://docs.python.org/3/glossary.html#term-generator-iterator).\n\n#### Get Locations from a dataset\n\n```python\nfrom datastream_py import set_api_key, locations\n\nset_api_key('xxxxxxxxxx')\n\nresults = locations({\n    '$select': 'Id,DOI,Name,Latitude,Longitude',\n    '$filter': \"DOI eq '10.25976/xxxx-xx00'\",\n    '$top': 10000\n})\n\nfor location in results:\n    print(location)\n```\n\n#### Get Locations from multiple datasets\n\n```python\nfrom datastream_py import set_api_key, locations\n\nset_api_key('xxxxxxxxxx')\n\nresults = locations({\n    '$select': 'Id,DOI,Name,Latitude,Longitude',\n    '$filter': \"DOI in ('10.25976/xxxx-xx00', '10.25976/xxxx-xx11', '10.25976/xxxx-xx22')\",\n    '$top': 10000\n})\n\nfor location in results:\n    print(location)\n```\n\n### Observations\n\nReturns a [generator object that is iterable](https://docs.python.org/3/glossary.html#term-generator-iterator).\n\n#### Get `Temperature` and `pH` observations from multiple datasets\n\n```python\nfrom datastream_py import set_api_key, observations\n\nset_api_key('xxxxxxxxxx')\n\nresults = observations({\n    '$select': 'DOI,ActivityType,ActivityMediaName,ActivityStartDate,ActivityStartTime,SampleCollectionEquipmentName,CharacteristicName,MethodSpeciation,ResultSampleFraction,ResultValue,ResultUnit,ResultValueType',\n    '$filter': \"DOI in ('10.25976/xxxx-xx00', '10.25976/xxxx-xx11', '10.25976/xxxx-xx22') and CharacteristicName in ('Temperature, water', 'pH')\",\n    '$top': 10000\n})\n\nfor observation in results:\n    print(observation)\n```\n\n### Records\n\nReturns a [generator object that is iterable](https://docs.python.org/3/glossary.html#term-generator-iterator).\n\n```python\nfrom datastream_py import set_api_key, records\n\nset_api_key('xxxxxxxxxx')\n\nresults = records({\n    '$select': 'DOI,ActivityType,ActivityMediaName,ActivityStartDate,ActivityStartTime,SampleCollectionEquipmentName,CharacteristicName,MethodSpeciation,ResultSampleFraction,ResultValue,ResultUnit,ResultValueType',\n    '$filter': \"DOI eq '10.25976/xxxx-xx00'\",\n    '$top': 10000\n})\n\nfor record in results:\n    print(record)\n```\n\n### Metadata\n\nReturns a [generator object that is iterable](https://docs.python.org/3/glossary.html#term-generator-iterator).\n\n```python\nfrom datastream_py import set_api_key, metadata\n\nset_api_key('xxxxxxxxxx')\n\nresults = list(metadata({\n    '$select': 'DOI,Version,DatasetName',\n    '$filter': \"DOI eq '10.25976/xxxx-xx00'\"\n}))\n\nprint(results)\n```\n\n### Get Result Count\n\nPass `$count` as `true` to get the count of results.\nSee [URL parameters](https://github.com/datastreamapp/api-docs#url-parameters) for more details.\n\n```python\nfrom datastream_py import set_api_key, observations\n\nset_api_key('xxxxxxxxxx')\n\ncount = observations({\n    '$filter': \"DOI eq '10.25976/xxxx-xx00'\",\n    '$count': 'true'\n})\n\nprint(count)\n```\n\n## Debugging\n\n### 400 Bad Request\n\n```python\nfrom requests import exceptions\n\nfrom datastream_py import set_api_key, observations\n\nset_api_key('xxxxxxxxxx')\n\ntry:\n    count = observations({\n        '$filter': \"DOI eq '10.25976/xxxx-xx00'\",\n        '$count': 'true'\n    })\n    print(count)\nexcept exceptions.HTTPError as e:  # From requests package\n    print(e)\n\n    if e.response.status_code == 400:\n        print(e.response.json())\n```","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdatastreamapp%2Fdatastream-py","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdatastreamapp%2Fdatastream-py","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdatastreamapp%2Fdatastream-py/lists"}