{"id":79,"library":"twilio","title":"Twilio","description":"Official Python helper library for the Twilio REST API (SMS, voice, WhatsApp, email, video). v9.0 (2024) was a full OpenAPI-generated rewrite. v6.0 removed TwilioRestClient. All pre-v6 import patterns are broken. Actively maintained.","status":"active","version":"9.10.2","language":"python","source_language":"en","source_url":"https://github.com/twilio/twilio-python","tags":["sms","voice","communications","twilio","whatsapp","python","api"],"install":[{"cmd":"pip install twilio","lang":"bash","label":"Python"}],"dependencies":[{"reason":"HTTP client used internally.","package":"requests","optional":false},{"reason":"Required for Access Token generation (Twilio Video, Chat, etc.).","package":"PyJWT","optional":true}],"imports":[{"note":"TwilioRestClient was removed in v6.0.0. ImportError on all current versions. Use Client.","wrong":"from twilio.rest import TwilioRestClient\nclient = TwilioRestClient('ACXXXXXXXXX', 'auth_token')","symbol":"Client","correct":"from twilio.rest import Client\n\nclient = Client('ACXXXXXXXXX', 'auth_token')"},{"note":"Exception class import path changed in v6. Old import path raises ImportError.","wrong":"from twilio.rest import TwilioRestException","symbol":"TwilioRestException","correct":"from twilio.base.exceptions import TwilioRestException"},{"note":"ssml_emphasis() was renamed to emphasis() in v9.0. Old method raises AttributeError.","wrong":"resp.say('Hello').ssml_emphasis('you')","symbol":"VoiceResponse (TwiML)","correct":"from twilio.twiml.voice_response import VoiceResponse\nresp = VoiceResponse()\nresp.say('Hello').emphasis('you')"}],"quickstart":{"code":"import os\nfrom twilio.rest import Client\nfrom twilio.base.exceptions import TwilioRestException\n\nclient = Client(\n    os.environ['TWILIO_ACCOUNT_SID'],\n    os.environ['TWILIO_AUTH_TOKEN']\n)\n\n# Send SMS\ntry:\n    message = client.messages.create(\n        to='+15558675309',\n        from_='+15017250604',\n        body='Hello from Python!'\n    )\n    print(message.sid)\nexcept TwilioRestException as e:\n    print(e)\n\n# Generate TwiML\nfrom twilio.twiml.voice_response import VoiceResponse\nresp = VoiceResponse()\nresp.say('Welcome to Twilio!')\nprint(str(resp))","lang":"python","description":"Note from_= (with trailing underscore) — 'from' is a Python reserved word."},"warnings":[{"fix":"from twilio.rest import Client (not TwilioRestClient). Client constructor is the same.","message":"TwilioRestClient removed in v6.0.0. All pre-v6 tutorials and LLM-generated code using 'from twilio.rest import TwilioRestClient' fail with ImportError.","severity":"breaking","affected_versions":"< 6.0.0"},{"fix":"Replace .ssml_emphasis() with .emphasis() on TwiML Say objects.","message":"v9.0 (2024) was a full OpenAPI rewrite. ssml_emphasis() method on TwiML Say renamed to emphasis(). Code using say.ssml_emphasis() raises AttributeError.","severity":"breaking","affected_versions":"< 9.0.0"},{"fix":"Change client.chat.v2.services('IS...').channels('CH...').messages.create('body') to .messages.create(body='body')","message":"v9.0: Chat API message.create() and similar methods now require body as a keyword argument, not positional. Positional args in these calls raise TypeError.","severity":"breaking","affected_versions":"< 9.0.0"},{"fix":"Update any direct module path imports to use available_phone_number_country.","message":"twilio.rest.api.v2010.account.available_phone_number renamed to available_phone_number_country in v9.0. Code importing the old module path fails.","severity":"breaking","affected_versions":"< 9.0.0"},{"fix":"client.messages.create(to='+1...', from_='+1...', body='...')","message":"The 'from' keyword is a Python reserved word. Twilio SMS create() uses from_= (with trailing underscore) as the parameter name. Passing from= causes SyntaxError.","severity":"gotcha","affected_versions":"all"},{"fix":"Auth token: Client(account_sid, auth_token). API key: Client(api_key, api_secret, account_sid).","message":"Client() with no arguments reads TWILIO_ACCOUNT_SID and TWILIO_AUTH_TOKEN from environment. If using API key auth instead, pass Client(api_key, api_secret, account_sid) — 3-argument form. Mixing up 2-arg and 3-arg forms causes authentication failures.","severity":"gotcha","affected_versions":"all"}],"env_vars":{"optional":[{"name":"TWILIO_API_KEY","note":"API key SID for API key auth (more secure than auth token). Use with TWILIO_API_SECRET."},{"name":"TWILIO_API_SECRET","note":"API key secret. When using API key auth: Client(api_key, api_secret, account_sid)."}],"required":[{"name":"TWILIO_ACCOUNT_SID","note":"Account SID from console.twilio.com. Starts with 'AC'."},{"name":"TWILIO_AUTH_TOKEN","note":"Auth token from console.twilio.com. Client() reads these automatically if not passed as args."}]},"last_verified":"2026-05-12T07:49:37.764Z","next_check":"2026-06-01T00:00:00.000Z","problems":[{"fix":"Run `pip install twilio` in your terminal to install the library.","cause":"The 'twilio' library is not installed in the active Python environment where your script is being executed.","error":"ModuleNotFoundError: No module named 'twilio'"},{"fix":"Update your import statement to `from twilio.rest import Client` and instantiate it with `client = Client(account_sid, auth_token)`.","cause":"The `TwilioRestClient` class was removed in `twilio-python` version 6.0.0. The new client class is simply `Client`.","error":"AttributeError: module 'twilio.rest' has no attribute 'TwilioRestClient'"},{"fix":"Double-check your `account_sid` and `auth_token` for correctness and ensure they are loaded securely, ideally from environment variables.","cause":"The Account SID or Auth Token provided in your client initialization are incorrect, missing, or do not match your Twilio account credentials, preventing authentication with the Twilio API.","error":"Error 20003: Authenticate"},{"fix":"Provide all required arguments to the `create()` method. Example: `client.messages.create(to='+1234567890', from_='+1123456789', body='Hello from Twilio!')`","cause":"The `client.messages.create()` method requires the `to`, `from_` (or `messaging_service_sid`), and `body` arguments, but one or more were omitted.","error":"TypeError: create() missing 1 required positional argument: 'to'"}],"ecosystem":"pypi","meta_description":null,"install_score":100,"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":0.6,"mem_mb":10,"disk_size":"70.5M"},{"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":0.43,"mem_mb":10,"disk_size":"73M"},{"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":0.78,"mem_mb":11,"disk_size":"79.6M"},{"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":0.67,"mem_mb":11,"disk_size":"82M"},{"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":0.69,"mem_mb":11.5,"disk_size":"70.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":0.69,"mem_mb":11.5,"disk_size":"73M"},{"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":0.69,"mem_mb":11.9,"disk_size":"69.1M"},{"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":0.69,"mem_mb":11.9,"disk_size":"71M"},{"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":0.59,"mem_mb":9.8,"disk_size":"70.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":0.5,"mem_mb":9.8,"disk_size":"73M"}]},"quickstart_checks":{"last_tested":"2026-05-12","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}]}}