{"id":40626469,"url":"https://github.com/abstractapi/python-ip-geolocation","last_synced_at":"2026-01-21T07:23:13.643Z","repository":{"id":57407834,"uuid":"360068664","full_name":"abstractapi/python-ip-geolocation","owner":"abstractapi","description":null,"archived":false,"fork":false,"pushed_at":"2021-04-21T18:10:50.000Z","size":6,"stargazers_count":3,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-12-21T22:48:02.284Z","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":null,"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":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2021-04-21T07:17:04.000Z","updated_at":"2024-07-17T06:29:08.000Z","dependencies_parsed_at":"2022-09-26T17:10:52.030Z","dependency_job_id":null,"html_url":"https://github.com/abstractapi/python-ip-geolocation","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/abstractapi/python-ip-geolocation","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/abstractapi%2Fpython-ip-geolocation","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/abstractapi%2Fpython-ip-geolocation/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/abstractapi%2Fpython-ip-geolocation/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/abstractapi%2Fpython-ip-geolocation/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/abstractapi","download_url":"https://codeload.github.com/abstractapi/python-ip-geolocation/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/abstractapi%2Fpython-ip-geolocation/sbom","scorecard":{"id":161906,"data":{"date":"2025-08-11","repo":{"name":"github.com/abstractapi/python-ip-geolocation","commit":"49136cb35989eb53db97ae4764fee20f5217a3dc"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2.2,"checks":[{"name":"Code-Review","score":0,"reason":"Found 0/4 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":"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":"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":"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":"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":"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":"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-ip-geolocation/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-ip-geolocation/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-ip-geolocation/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":0,"reason":"license file not detected","details":["Warn: project does not have a license file"],"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.844Z","repository_id":57407834,"created_at":"2025-08-16T13:43:04.845Z","updated_at":"2025-08-16T13:43:04.845Z"},"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":[],"created_at":"2026-01-21T07:23:13.578Z","updated_at":"2026-01-21T07:23:13.632Z","avatar_url":"https://github.com/abstractapi.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# AbstractAPI python-ip-geolocation library\r\n\r\nIntegrate the powerful [IP Geolocation API from Abstract](https://www.abstractapi.com/ip-geolocation-api) in your Python project in a few lines of code.\r\n\r\nAbstract's IP Geolocation API is a fast, lightweight, modern, and RESTful JSON API allowing you to look up the location, timezone, country details, and more of an IPv4 or IPv6 address.\r\n\r\nIt's very simple to use: you only need to submit your API key and an IP address, and the API will respond with an assessment of its geographical location, as well as additional details like the timezone, if it's a VPN address, and more.\r\n\r\nValidating and verifying IP addresses is a critical step to reducing the chances of low-quality data and fraudulent or risky users in your website or application.\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-ip-geolocation** via PyPi or by downloading the source.\r\n\r\n### Via Composer:\r\n\r\n**python-ip-geolocation** is available on PyPi as the\r\n[`abstract-python-ip-geolocation`](https://pypi.org/project/abstract-python-ip-geolocation/) package:\r\n\r\n```bash\r\npip install abstract-python-ip-geolocation\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/ip-geolocation/pricing/select).\r\n\r\n## Quickstart\r\n\r\n### Geolocation from an IP Address\r\n\r\n```python\r\n# Get a Geolocation from an IP Address Abstract's IP Geolocation API and Python\r\nfrom python_ip_geolocation import AbstractIpGeolocation\r\n\r\nIP_GEOLOCATION_API_KEY =  \"YYYYYY\"; # Get your API Key from https://app.abstractapi.com/api/ip-geolocation/documentation\r\n\r\nAbstractIpGeolocation.configure(IP_GEOLOCATION_API_KEY)\r\nAbstractIpGeolocation.look_up(\"108.177.16.0\")\r\n```\r\n\r\n## API response\r\n\r\nThe API response is returned in a `IpGeolocationData` object.\r\n\r\n| PARAMETER | TYPE | DETAILS |\r\n| - | - | - |\r\n| Parameter | Type | Details |\r\n| ip_address | String | The requested IP address |\r\n| city | String | City's name. |\r\n| city_geoname_id | String | City's geoname ID. |\r\n| region | String | State or province in which the the city is located. |\r\n| region_iso_code | Char[2] | State or province's ISO 3166-2 code. |\r\n| region_geoname_id | String | State or province's geoname ID. |\r\n| postal_code | String | ZIP or postal code. |\r\n| country | String | Country's name. |\r\n| country_code | Char[2] | Country's ISO 3166-1 alpha-2 code. |\r\n| country_geoname_id | String | Country's geoname ID. |\r\n| country_is_eu | Boolean | True if the country is in the EU, false if it is not. |\r\n| continent | String | Continent's name. |\r\n| continent_code | Char[2] | 2 letter continent code: AF, AS, EU, NA, OC, SA, AN |\r\n| continent_geoname_id | String | Continent's geoname ID. |\r\n| longitude | Float | Decimal of the longitude. |\r\n| latitude | Float | Decimal of the latitude. |\r\n| security \u003e is_vpn | Boolean | Whether the IP address is using from a VPN or using a proxy |\r\n| timezone \u003e name | String | Timezone's name from the IANA Time Zone Database. |\r\n| timezone \u003e abbreviation | String | Timezone's abbreviation, also from the IANA Time Zone Database. |\r\n| timezone \u003e gmt_offset | String | Timezone's offset from Greenwich Mean Time (GMT). |\r\n| timezone \u003e current_time | String | Current time in the local time zone. |\r\n| timezone \u003e is_dst | Boolean | True if the location is currently in Daylight Savings Time (DST). |\r\n| flag \u003e svg | String | Link to a hosted version of the country's flag in SVG format. |\r\n| flag \u003e png | String | Link to a hosted version of the country's flag in PNG format. |\r\n| flag \u003e emoji | String | Country's flag as an emoji. |\r\n| flag \u003e unicode | String | Country's flag in unicode. |\r\n| currency \u003e currency_name | String | The currency's name. |\r\n| currency \u003e currency_code | String | The currency's code in ISO 4217 format. |\r\n| connection \u003e connection_type | String | Type of network connection: Dialup, Cable/DSL, Cellular, Corporate |\r\n| connection \u003e autonomous_system_number | Uint32 | Autonomous System number |\r\n| connection \u003e autonomous_system_organization | String | Autonomous System Organization name. |\r\n| connection \u003e isp_name | String | Internet Service Provider (ISP) name. |\r\n| connection \u003e organization_name | String | Organization name. |\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/ip-geolocation/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/ip-geolocation/support).\r\n\r\nFor bug report and feature suggestion, please use [this repository issues page](https://github.com/abstractapi/python-ip-geolocation/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-ip-geolocation/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\nIP_GEOLOCATION_API_KEY=YYYYYY python3 tests/test_python_ip_geolocation.py\r\n```\r\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fabstractapi%2Fpython-ip-geolocation","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fabstractapi%2Fpython-ip-geolocation","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fabstractapi%2Fpython-ip-geolocation/lists"}