{"id":221,"library":"messagebird","title":"MessageBird (now Bird)","description":"MessageBird rebranded as Bird in February 2024. The old messagebird PyPI package (last version 2.2.0, released 2022) is no longer maintained and targets the legacy API. The new Python SDK is bird-python on PyPI, targeting the Bird API at docs.bird.com. LLMs almost universally generate the old package name.","status":"deprecated","version":"2.2.0","language":"python","source_language":"en","source_url":"https://github.com/GearPlug/bird_python","tags":["sms","whatsapp","messaging","communications","bird","cpaas"],"install":[{"cmd":"pip install messagebird","lang":"bash","label":"DEPRECATED — legacy package, unmaintained since 2022"},{"cmd":"pip install bird-python","lang":"bash","label":"Current — new Bird SDK (post-rebrand)"}],"dependencies":[{"reason":"Required by both packages.","package":"requests","optional":false}],"imports":[{"note":"The import name messagebird is used in BOTH the old and new SDKs. The difference is which PyPI package you install: messagebird (old, dead) vs bird-python (new, active). The new Bird API has a completely different structure with workspaces and channels.","wrong":"# pip install messagebird pulls the unmaintained 2.2.0 package\n# targeting the old API — new Bird features (workspaces, channels, WhatsApp)\n# are not available","symbol":"messagebird.Client","correct":"# New Bird SDK (post-rebrand 2024):\nimport messagebird  # import name still messagebird inside bird-python\nclient = messagebird.Client('YOUR_ACCESS_KEY')\n\n# Legacy API (still works against old rest.messagebird.com):\nimport messagebird\nclient = messagebird.Client('YOUR_ACCESS_KEY')\nmsg = client.message_create('+31612345678', ['+14155551234'], 'Hello!')"}],"quickstart":{"code":"# Install: pip install bird-python\nimport messagebird  # import name unchanged in bird-python\n\nclient = messagebird.Client('YOUR_ACCESS_KEY')\n\ntry:\n    # New Bird API — workspace + channel based\n    client.workspaces = client.workspace_list()['results'][0]['id']\n    channel_id = client.channel_list()['results'][0]['id']\n\n    response = client.send_message(\n        channels_id=channel_id,\n        body={\n            'receiver': {\n                'contacts': [{'identifierValue': '+14155551234'}]\n            },\n            'body': {\n                'type': 'text',\n                'text': {'text': 'Hello from Bird!'}\n            }\n        }\n    )\nexcept messagebird.client.ErrorException as e:\n    for error in e.errors:\n        print(error.description)","lang":"python","description":"New Bird SDK pattern. Requires workspace and channel selection before sending."},"warnings":[{"fix":"pip uninstall messagebird && pip install bird-python. Update API documentation reference from developers.messagebird.com to docs.bird.com.","message":"MessageBird rebranded as Bird in February 2024. The messagebird PyPI package (2.2.0) is unmaintained and targets the legacy API. New features (workspaces, channels, WhatsApp via Bird API) are only available in the bird-python package.","severity":"breaking","affected_versions":"all"},{"fix":"Set workspace: client.workspaces = client.workspace_list()['results'][0]['id']. Get channel ID: client.channel_list(). Then send with the new body format.","message":"The new Bird API has a completely different message-sending model. Instead of client.message_create(src, dst, text), it uses workspace + channel selection followed by client.send_message(channels_id, body). All old code patterns break.","severity":"breaking","affected_versions":"bird-python (new API)"},{"fix":"Check which PyPI package is installed (pip show messagebird vs pip show bird-python). The new Bird API requires workspace/channel setup before sending.","message":"Both the old messagebird package and the new bird-python package use import messagebird as the import statement. This makes it impossible to tell from the import line alone which API version the code targets.","severity":"gotcha","affected_versions":"all"},{"fix":"Generate new API keys at manage.bird.com. Old keys from manage.messagebird.com may be valid during transition but should be rotated.","message":"Access keys from the old MessageBird dashboard may not work with the new Bird API. The Bird platform uses a new authentication system via manage.bird.com.","severity":"gotcha","affected_versions":"bird-python"}],"env_vars":null,"last_verified":"2026-05-12T11:57:43.945Z","next_check":"2026-06-27T00:00:00.000Z","problems":[{"fix":"Install the correct package. If you intend to use the legacy MessageBird API, install the old package: `pip install messagebird`. If you intend to use the current Bird API, install the new SDK: `pip install bird-python` and update your import statements (e.g., `from bird import Client`).","cause":"The `messagebird` package is not installed in your Python environment, or there's a typo in the import statement, or the environment where the code is run does not have access to the installed package.","error":"ModuleNotFoundError: No module named 'messagebird'"},{"fix":"Verify that your API access key is correct, active, and has the appropriate permissions. Ensure you are using a live API key for sending actual messages and not a test key, which only validates API requests. Check your MessageBird (now Bird) dashboard under 'Developers' -> 'API access' for the correct keys.","cause":"This error indicates that the API key provided is invalid, expired, or does not have the necessary permissions for the requested operation. It's often caused by typos, using a test key for live operations, or an API key for a different MessageBird product.","error":"messagebird.client.ErrorException: {'code': 2, 'description': 'Request not allowed (incorrect access_key)', 'parameter': 'access_key'}"},{"fix":"Ensure that the data structure passed for recipients (or other parameters expecting an iterable or dictionary) is correct according to the `messagebird` SDK's expectations (e.g., a list of Recipient objects or a dictionary structure with an 'items' key). Review the specific API method's documentation for the expected input format. If using an old SDK, consider updating to `bird-python` and adapting your code to the new API specifications.","cause":"This error typically occurs when the `messagebird` client library expects a dictionary or an object with an `items()` method for recipient data, but receives a string instead, often due to an incompatibility between the client library version and the API response or incorrect data formatting.","error":"AttributeError: 'str' object has no attribute 'items'"},{"fix":"Switch from a 'test API key' to a 'live API key' in your MessageBird (Bird) account credentials. Ensure the recipient phone number is correctly formatted (E.164 format) and is a valid, reachable number capable of receiving the message type (SMS/voice). Check your MessageBird dashboard's API logs for specific delivery failure codes if the issue persists.","cause":"This is a common observation, not a Python traceback, where the code executes without error but SMS or voice messages are not actually received. A frequent cause is using a 'test API key' which only validates the request format without sending actual messages, or issues with recipient number formatting/validity.","error":"messagebird messages are not being delivered"},{"fix":"Uninstall the legacy 'messagebird' package with 'pip uninstall messagebird' and install the correct SDK with 'pip install bird-python'.","cause":"You have installed the legacy 'messagebird' package, but the current Bird API SDK (installed as 'bird-python') imports under the module name 'bird'.","error":"ModuleNotFoundError: No module named 'bird'"}],"ecosystem":"pypi","meta_description":null,"install_score":80,"install_tag":"verified","quickstart_score":0,"quickstart_tag":"stale","pypi_latest":null,"install_checks":{"last_tested":"2026-05-12","tag":"verified","tag_description":"installs cleanly on critical runtimes, fast import, recently tested","results":[{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":"70.0M"},{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":"22.9M"},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":"141M"},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":"23M"},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":"76.7M"},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":"24.9M"},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":"148M"},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":"25M"},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":"67.2M"},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":"16.6M"},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":"138M"},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":"17M"},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":"63.7M"},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":"16.3M"},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":"137M"},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":"17M"},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":"69.0M"},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":"22.2M"},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":"141M"},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":"23M"}]},"quickstart_checks":{"last_tested":"2026-04-23","tag":"stale","tag_description":"widespread failures or data too old to trust","results":[{"runtime":"python:3.10-alpine","exit_code":1},{"runtime":"python:3.10-slim","exit_code":1},{"runtime":"python:3.11-alpine","exit_code":1},{"runtime":"python:3.11-slim","exit_code":1},{"runtime":"python:3.12-alpine","exit_code":1},{"runtime":"python:3.12-slim","exit_code":1},{"runtime":"python:3.13-alpine","exit_code":1},{"runtime":"python:3.13-slim","exit_code":1},{"runtime":"python:3.9-alpine","exit_code":1},{"runtime":"python:3.9-slim","exit_code":1}]}}