{"id":22437048,"url":"https://github.com/blockfrost/blockfrost-python","last_synced_at":"2025-04-07T12:06:45.075Z","repository":{"id":37796633,"uuid":"390634132","full_name":"blockfrost/blockfrost-python","owner":"blockfrost","description":"Python 3 SDK for the Blockfrost.io API.","archived":false,"fork":false,"pushed_at":"2024-09-24T07:43:17.000Z","size":186,"stargazers_count":71,"open_issues_count":6,"forks_count":17,"subscribers_count":6,"default_branch":"master","last_synced_at":"2025-03-28T03:08:47.795Z","etag":null,"topics":["api","blockchain","blockfrost","cardano","ipfs","python","sdk"],"latest_commit_sha":null,"homepage":"https://blockfrost.io/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/blockfrost.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":"2021-07-29T07:08:23.000Z","updated_at":"2025-03-10T13:38:17.000Z","dependencies_parsed_at":"2024-06-18T21:19:05.074Z","dependency_job_id":"dbaf9ad3-2cf2-4e3f-bead-24ef3b757bdc","html_url":"https://github.com/blockfrost/blockfrost-python","commit_stats":{"total_commits":79,"total_committers":9,"mean_commits":8.777777777777779,"dds":"0.17721518987341767","last_synced_commit":"6403bbfc6af7236d550f85db9d1ab1bfb814964e"},"previous_names":[],"tags_count":18,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/blockfrost%2Fblockfrost-python","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/blockfrost%2Fblockfrost-python/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/blockfrost%2Fblockfrost-python/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/blockfrost%2Fblockfrost-python/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/blockfrost","download_url":"https://codeload.github.com/blockfrost/blockfrost-python/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247648977,"owners_count":20972945,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":["api","blockchain","blockfrost","cardano","ipfs","python","sdk"],"created_at":"2024-12-06T00:11:27.118Z","updated_at":"2025-04-07T12:06:45.035Z","avatar_url":"https://github.com/blockfrost.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![Package Test](https://img.shields.io/github/actions/workflow/status/blockfrost/blockfrost-python/package-test.yml?logo=GitHub\u0026label=package%20test)](https://github.com/blockfrost/blockfrost-python/actions/workflows/package-test.yml)\n[![PyPI Latest Release](https://img.shields.io/pypi/v/blockfrost-python.svg?logo=pypi\u0026label=pypi%20latest)](https://pypi.org/project/blockfrost-python/)\n[![PyPI - Downloads](https://img.shields.io/pypi/dm/blockfrost-python?logo=pypi\u0026label=pypi%20downloads)](https://pypistats.org/packages/blockfrost-python)\n[![Package Status](https://img.shields.io/pypi/status/blockfrost-python.svg)](https://pypi.org/project/blockfrost-python/)\n[![License](https://img.shields.io/pypi/l/blockfrost-python.svg)](https://github.com/blockfrost/blockfrost-python/blob/master/LICENSE)\n[![Made by Five Binaries](https://img.shields.io/badge/made%20by-Five%20Binaries-darkviolet.svg)](https://fivebinaries.com/)\n[![Maintained by Mathias Frohlich](https://img.shields.io/badge/maintained%20by-Mathias%20Frohlich-blue.svg)](https://github.com/mathiasfrohlich)\n\n\u003cimg src=\"https://blockfrost.io/images/logo.svg\" width=\"250\" align=\"right\" height=\"90\"\u003e\n\n# blockfrost-python\n\n\u003cbr/\u003e\n\n\u003cp align=\"center\"\u003eA Python SDK for Blockfrost.io API\u003c/p\u003e\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"#getting-started\"\u003eGetting started\u003c/a\u003e •\n  \u003ca href=\"#installation\"\u003eInstallation\u003c/a\u003e •\n  \u003ca href=\"#usage\"\u003eUsage\u003c/a\u003e\n\u003c/p\u003e\n\u003cbr\u003e\n\n## Getting started\n\nTo use this SDK, you first need login into [blockfrost.io](https://blockfrost.io) and create your project to retrieve\nyour API key.\n\n\u003cimg src=\"https://i.imgur.com/smY12ro.png\"\u003e\n\n\u003cbr/\u003e\n\n## Installation\n\n[![PyPI Latest Release](https://img.shields.io/pypi/v/blockfrost-python.svg)](https://pypi.org/project/blockfrost-python/)\n\n```console\npip install blockfrost-python\n```\n\n\u003cbr/\u003e\n\n## Usage\n\nUsing the SDK is pretty straight-forward as you can see from the following examples.\n\n### Cardano\n\n```python\nfrom blockfrost import BlockFrostApi, ApiError, ApiUrls\n\napi = BlockFrostApi(\n    project_id='YOUR API KEY HERE',  # or export environment variable BLOCKFROST_PROJECT_ID\n    # optional: pass base_url or export BLOCKFROST_API_URL to use testnet, defaults to ApiUrls.mainnet.value\n    base_url=ApiUrls.testnet.value,\n)\ntry:\n    health = api.health()\n    print(health)   # prints object:    HealthResponse(is_healthy=True)\n    health = api.health(return_type='json') # Can be useful if python wrapper is behind api version\n    print(health)   # prints json:      {\"is_healthy\":True}\n    health = api.health(return_type='pandas')\n    print(health)   # prints Dataframe:         is_healthy\n                    #                       0         True\n\n\n    account_rewards = api.account_rewards(\n        stake_address='stake1ux3g2c9dx2nhhehyrezyxpkstartcqmu9hk63qgfkccw5rqttygt7',\n        count=20,\n    )\n    print(account_rewards[0].epoch)  # prints 221\n    print(len(account_rewards))  # prints 20\n\n    account_rewards = api.account_rewards(\n        stake_address='stake1ux3g2c9dx2nhhehyrezyxpkstartcqmu9hk63qgfkccw5rqttygt7',\n        count=20,\n        gather_pages=True, # will collect all pages\n    )\n    print(account_rewards[0].epoch)  # prints 221\n    print(len(account_rewards))  # prints 57\n\n    address = api.address(\n        address='addr1qxqs59lphg8g6qndelq8xwqn60ag3aeyfcp33c2kdp46a09re5df3pzwwmyq946axfcejy5n4x0y99wqpgtp2gd0k09qsgy6pz')\n    print(address.type)  # prints 'shelley'\n    for amount in address.amount:\n        print(amount.unit)  # prints 'lovelace'\n\nexcept ApiError as e:\n    print(e)\n```\n\n### IPFS\n\n```python\nfrom blockfrost import BlockFrostIPFS, ApiError\n\nipfs = BlockFrostIPFS(\n    project_id='YOUR API KEY HERE'  # or export environment variable BLOCKFROST_PROJECT_ID\n)\nfile_hash = None\ntry:\n    ipfs_object = ipfs.add('./README.md')\n    file_hash = ipfs_object.ipfs_hash\n    print(file_hash)\nexcept ApiError as e:\n    print(e)\n\ntry:\n    with open('./README_downloaded.md', 'w') as file:\n        file_data = ipfs.gateway(IPFS_path=file_hash).text\n        file.write(file_data)\nexcept ApiError as e:\n    print(e)\n```\n\n### Verifying Secure Webhook signature\n\nWebhooks enable Blockfrost to push real-time notifications to your application. In order to prevent malicious actor from pretending to be Blockfrost every webhook request is signed. The signature is included in a request's `Blockfrost-Signature` header. This allows you to verify that the events were sent by Blockfrost, not by a third party.\nTo learn more about Secure Webhooks, see [Secure Webhooks Docs](https://blockfrost.dev/docs/start-building/webhooks/).\n\nYou can verify the signature using `verifyWebhookSignature` function.\n\nExample:\n\n```python\n# Example of Python Flask app with /webhook endpoint\n# for processing events sent by Blockfrost Secure Webhooks\nfrom flask import Flask, request, json\nfrom blockfrost import verify_webhook_signature, SignatureVerificationError\n\nSECRET_AUTH_TOKEN = \"SECRET-WEBHOOK-AUTH-TOKEN\"\n\napp = Flask(__name__)\n\n@app.route('/webhook', methods=['POST'])\ndef webhook():\n    if request.method == 'POST':\n        # Validate webhook signature\n        request_bytes = request.get_data()\n        try:\n            verify_webhook_signature(\n                request_bytes, request.headers['Blockfrost-Signature'], SECRET_AUTH_TOKEN)\n        except SignatureVerificationError as e:\n            # for easier debugging you can access passed header and request_body values (e.header, e.request_body)\n            print('Webhook signature is invalid.', e)\n            return 'Invalid signature', 403\n\n        # Get the payload as JSON\n        event = request.json\n\n        print('Received request id {}, webhook_id: {}'.format(\n            event['id'], event['webhook_id']))\n\n        if event['type'] == \"block\":\n            # process Block event\n            print('Received block hash {}'.format(event['payload']['hash']))\n        elif event['type'] == \"...\":\n            # truncated\n        else:\n            # Unexpected event type\n            print('Unexpected event type {}'.format(event['type']))\n\n        return 'Webhook received', 200\n    else:\n        return 'POST Method not supported', 405\n\n\n\nif __name__ == \"__main__\":\n    app.run(host='0.0.0.0', port=6666)\n```\n\n## Development\n\nInstall dependencies\n\n```\npip install -r requirements.txt\npip install -r rest-requirements.txt\n```\n\nInstall package\n\n```\n pip install .\n```\n\nRun integration and unit tests:\n\n```\npytest\n```\n\n_For integration tests you need to set env variable `BLOCKFROST_PROJECT_ID_MAINNET`_\n\n### Release workflow\n\nTo release the package create a new release via GitHub releases.\nThis action triggers the automated release workflow that packages and uploads the distribution to PyPI.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fblockfrost%2Fblockfrost-python","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fblockfrost%2Fblockfrost-python","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fblockfrost%2Fblockfrost-python/lists"}