{"id":40626616,"url":"https://github.com/abstractapi/python-exchange-rates","last_synced_at":"2026-01-21T07:23:26.828Z","repository":{"id":57407852,"uuid":"371905809","full_name":"abstractapi/python-exchange-rates","owner":"abstractapi","description":"Python library for Abstract's Exchange Rates API (free)","archived":false,"fork":false,"pushed_at":"2021-06-01T13:26:25.000Z","size":6,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-12-21T22:47:52.594Z","etag":null,"topics":["currency-api","currency-conversion","currency-converter","currency-exchange","currency-exchange-rates","exchange-api","exchange-rate","exchange-rates","exchange-rates-api","python-exchange-rates"],"latest_commit_sha":null,"homepage":"https://www.abstractapi.com/exchange-rate-api","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/abstractapi.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}},"created_at":"2021-05-29T07:12:07.000Z","updated_at":"2021-08-08T04:42:51.000Z","dependencies_parsed_at":"2022-09-26T17:10:52.284Z","dependency_job_id":null,"html_url":"https://github.com/abstractapi/python-exchange-rates","commit_stats":null,"previous_names":[],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/abstractapi/python-exchange-rates","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/abstractapi%2Fpython-exchange-rates","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/abstractapi%2Fpython-exchange-rates/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/abstractapi%2Fpython-exchange-rates/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/abstractapi%2Fpython-exchange-rates/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/abstractapi","download_url":"https://codeload.github.com/abstractapi/python-exchange-rates/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/abstractapi%2Fpython-exchange-rates/sbom","scorecard":{"id":161905,"data":{"date":"2025-08-11","repo":{"name":"github.com/abstractapi/python-exchange-rates","commit":"9bfa2085331c01f3a6f7b234af81296e92f9b01a"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2.5,"checks":[{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Code-Review","score":0,"reason":"Found 0/3 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/pypi-publish.yml:1","Warn: no topLevel permission defined: .github/workflows/unittest.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"SAST","score":0,"reason":"no SAST tool detected","details":["Warn: no pull requests merged into dev branch"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/pypi-publish.yml:13: update your workflow using https://app.stepsecurity.io/secureworkflow/abstractapi/python-exchange-rates/pypi-publish.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/pypi-publish.yml:15: update your workflow using https://app.stepsecurity.io/secureworkflow/abstractapi/python-exchange-rates/pypi-publish.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/unittest.yml:17: update your workflow using https://app.stepsecurity.io/secureworkflow/abstractapi/python-exchange-rates/unittest.yml/master?enable=pin","Warn: pipCommand not pinned by hash: .github/workflows/pypi-publish.yml:21","Warn: pipCommand not pinned by hash: .github/workflows/pypi-publish.yml:22","Warn: pipCommand not pinned by hash: .github/workflows/pypi-publish.yml:23","Warn: pipCommand not pinned by hash: .github/workflows/unittest.yml:21","Info:   0 out of   3 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   4 pipCommand dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Vulnerabilities","score":0,"reason":"11 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: PYSEC-2022-42986 / GHSA-43fp-rhv2-5gv8","Warn: Project is vulnerable to: PYSEC-2023-135 / GHSA-xqr8-7jwr-rhp7","Warn: Project is vulnerable to: PYSEC-2024-60 / GHSA-jjg7-2v4v-x38h","Warn: Project is vulnerable to: GHSA-9hjg-9r4m-mvj7","Warn: Project is vulnerable to: GHSA-9wx4-h78v-vm56","Warn: Project is vulnerable to: PYSEC-2023-74 / GHSA-j8r2-6x86-q33q","Warn: Project is vulnerable to: GHSA-34jh-p97f-mpxf","Warn: Project is vulnerable to: PYSEC-2023-212 / GHSA-g4mx-q9vg-27p4","Warn: Project is vulnerable to: GHSA-pq67-6m6q-mj2v","Warn: Project is vulnerable to: PYSEC-2021-108 / GHSA-q2q7-5pp4-w6pg","Warn: Project is vulnerable to: PYSEC-2023-192 / GHSA-v845-jxx5-vc9f"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-16T13:43:04.463Z","repository_id":57407852,"created_at":"2025-08-16T13:43:04.463Z","updated_at":"2025-08-16T13:43:04.463Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28629915,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-21T04:47:28.174Z","status":"ssl_error","status_checked_at":"2026-01-21T04:47:22.943Z","response_time":86,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["currency-api","currency-conversion","currency-converter","currency-exchange","currency-exchange-rates","exchange-api","exchange-rate","exchange-rates","exchange-rates-api","python-exchange-rates"],"created_at":"2026-01-21T07:23:26.294Z","updated_at":"2026-01-21T07:23:26.823Z","avatar_url":"https://github.com/abstractapi.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# AbstractAPI python-exchange-rates library\r\n\r\nIntegrate the powerful [Exchange Rates API from Abstract](https://www.abstractapi.com/exchange-rate-api) in your Python project in a few lines of code.\r\n\r\nThe Exchange Rate API is an REST API that allows you to:\r\n\r\n- look up the latest exchange rates for 80+ currencies via the *live* endpoint\r\n- get historical exchange rates using the *historical* endpoint\r\n- convert an arbitrary amount from one currency to another using the *convert* endpoint\r\n\r\nIt's very simple to use: you only need to submit your API key and a currency symbol (such as \"USD\"), and the API will respond with current exchange rate, historical data, or convertion rates.\r\n\r\n\r\n# Documentation\r\n\r\n## Supported Python Versions\r\n\r\nThis library supports the **Python version 3.6** and higher.\r\n\r\n## Installation\r\n\r\nYou can install **python-exchange-rates** via PyPi or by downloading the source.\r\n\r\n### Via PyPi:\r\n\r\n**python-exchange-rates** is available on PyPi as the\r\n[`abstract-python-exchange-rates`](https://pypi.org/project/abstract-python-exchange-rates/) package:\r\n\r\n```bash\r\npip install abstract-python-exchange-rates\r\n```\r\n\r\n## API key\r\n\r\nGet your API key for free and without hassle from the [Abstact website](https://app.abstractapi.com/users/signup?target=/api/exchange-rates/pricing/select).\r\n\r\n## Quickstart\r\n\r\n### Get exchange rates\r\n\r\n```python\r\nimport pprint\r\nfrom python_exchange_rates import AbstractExchangeRates\r\n\r\nEXCHANGE_RATES_API_KEY =  \"YYYYYY\"; # Get your API Key from https://app.abstractapi.com/api/exchange-rates/documentation\r\n\r\nAbstractExchangeRates.configure(EXCHANGE_RATES_API_KEY)\r\n\r\n# Get live exchange rates using Abstract's Exchange Rates API and Python\r\nresponse = AbstractExchangeRates.live(\"EUR\")\r\npprint(response)\r\n\r\n# Get historical exchange rates using Abstract's Exchange Rates API and Python\r\nresponse = AbstractExchangeRates.historical('EUR', '2021-05-01');\r\npprint(response)\r\n\r\n# Convert currency using Abstract's Exchange Rates API and Python\r\nresponse = AbstractExchangeRates.convert('EUR', 'USD');\r\npprint(response)\r\n```\r\n\r\n## API response\r\n\r\nThe API response contains the following fields:\r\n\r\n### `live` response parameters\r\n| Parameter| Type| Details |\r\n| - | - | - |\r\n| base | String | The base currency used to get the exchange rates. |\r\n| last_updated | String | The Unix timestamp of when the returned data was last updated. |\r\n| exchange_rates | Object | A JSON Object containing each of the target currency as the key and its exchange rate versus the base currency as that key's value. |\r\n\r\n### `historical` response parameters\r\n\r\n| Parameter | Type | Details |\r\n| - | - | - |\r\n| base | String | The base currency used to get the exchange rates. |\r\n| date | String | The date the currencies were pulled from, per the successful request. |\r\n| exchange_rates | Object | A JSON Object containing each of the target currency as the key and its exchange rate versus the base currency as that key's value. |\r\n\r\n### `convert` response parameters\r\n\r\n| Parameter | Type | Details |\r\n| - | - | - |\r\n| base | String | The base currency used to get the exchange rates. |\r\n| target | String | The target currency that the base_amount was converted into. |\r\n| date | String | The date the currencies were pulled from, per the successful request. |\r\n| base_amount | Float | The amount of the base currency from the request. |\r\n| converted_amount | Float | The amount of the target currency that the base_amount has been converted into |\r\n| exchange_rate | Float | The exchange rate used to convert the base_amount from the base currency to the target currency |\r\n\r\n## Detailed documentation\r\n\r\nYou will find additional information and request examples in the [Abstract help page](https://app.abstractapi.com/api/exchange-rates/documentation).\r\n\r\n## Getting help\r\n\r\nIf you need help installing or using the library, please contact [Abstract's Support](https://app.abstractapi.com/api/exchange-rates/support).\r\n\r\nFor bug report and feature suggestion, please use [this repository issues page](https://github.com/abstractapi/python-exchange-rates/issues).\r\n\r\n# Contribution\r\n\r\nContributions are always welcome, as they improve the quality of the libraries we provide to the community.\r\n\r\nPlease provide your changes covered by the appropriate unit tests, and post them in the [pull requests page](https://github.com/abstractapi/python-exchange-rates/pulls).\r\n\r\n## Setup\r\n\r\nTo install the requirements, run:\r\n\r\n```bash\r\npython3 setup.py install --user\r\n```\r\n\r\nOnce you implementer all your changes and the unit tests, run the following command to run the tests:\r\n\r\n```bash\r\nEXCHANGE_RATES_API_KEY=YYYYYY python3 tests/test_python_exchange_rates.py\r\n```\r\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fabstractapi%2Fpython-exchange-rates","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fabstractapi%2Fpython-exchange-rates","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fabstractapi%2Fpython-exchange-rates/lists"}