{"id":69,"library":"resend","title":"Resend","description":"Official Python SDK for the Resend transactional email API. Active, frequently updated. v2.0 (May 2024) added TypedDict-based type hinting. Module-level api_key pattern is the primary auth method. No class instantiation — all methods are called as class methods on resend.Emails, resend.Contacts, etc.","status":"active","version":"2.23.0","language":"python","source_language":"en","source_url":"https://github.com/resend/resend-python","tags":["email","resend","transactional-email","python","api"],"install":[{"cmd":"pip install resend","lang":"bash","label":"Python"}],"dependencies":[],"imports":[{"note":"No class instantiation — set resend.api_key globally, then call class methods directly. There is no Resend() client object.","wrong":"from resend import Resend\nclient = Resend(api_key='...')","symbol":"resend","correct":"import resend\nimport os\n\nresend.api_key = os.environ['RESEND_API_KEY']\n\nparams: resend.Emails.SendParams = {\n    'from': 'Acme <onboarding@resend.dev>',\n    'to': ['user@example.com'],\n    'subject': 'Hello',\n    'html': '<strong>Hello!</strong>'\n}\nemail = resend.Emails.send(params)\nprint(email['id'])"}],"quickstart":{"code":"import os\nimport resend\n\nresend.api_key = os.environ['RESEND_API_KEY']\n\nparams: resend.Emails.SendParams = {\n    'from': 'Acme <onboarding@resend.dev>',\n    'to': ['delivered@resend.dev'],\n    'subject': 'Hello from Resend',\n    'html': '<strong>It works!</strong>'\n}\n\nemail = resend.Emails.send(params)\nprint(email['id'])  # e.g. '49a3999c-0ce1-4ea6-ab68-b08b6e9a5fe2'","lang":"python","description":"'from' field must use a verified domain. Use 'onboarding@resend.dev' only for testing. The 'to' field must be a list even for single recipients."},"warnings":[{"fix":"import resend; resend.api_key = 'YOUR_KEY'; resend.Emails.send(params)","message":"No client class to instantiate — resend.api_key is set at the module level, then all API calls are made as class methods (resend.Emails.send(), resend.Contacts.list(), etc.). Code from other SDKs that tries to instantiate a client object fails.","severity":"gotcha","affected_versions":"all"},{"fix":"'to': ['user@example.com']  # not 'to': 'user@example.com'","message":"The 'to' field must always be a list, even for a single recipient. Passing a string raises a validation error.","severity":"gotcha","affected_versions":"all"},{"fix":"Verify your domain at resend.com/domains before sending. Format: 'Name <email@yourdomain.com>'","message":"The 'from' field must use a domain verified in the Resend dashboard. Using unverified domains or personal email addresses returns 403. The address 'onboarding@resend.dev' works only in testing with the test API key.","severity":"gotcha","affected_versions":"all"},{"fix":"For multi-key scenarios, serialize key setting + API call, or use separate processes/containers per API key.","message":"Module-level api_key is global state — in multi-tenant or async applications with different API keys, setting resend.api_key is not thread-safe. Concurrent requests may use the wrong key.","severity":"gotcha","affected_versions":"all"},{"fix":"It is recommended to use a virtual environment for pip operations (e.g., `python -m venv .venv && source .venv/bin/activate`) and to keep pip updated (`pip install --upgrade pip`).","message":"Pip warnings detected in the test output, indicating 'Running pip as root' which can cause permission issues, and an 'outdated pip version'. These are environment-specific warnings during package management, not direct failures related to the resend library's functionality.","severity":"gotcha","affected_versions":"all"}],"env_vars":{"required":[{"name":"RESEND_API_KEY","note":"API key from resend.com dashboard. Set as resend.api_key = os.environ['RESEND_API_KEY'] before any API calls."}]},"last_verified":"2026-05-12T06:35:56.146Z","next_check":"2026-06-01T00:00:00.000Z","problems":[{"fix":"pip install resend","cause":"The 'resend' package is not installed in your current Python environment.","error":"ModuleNotFoundError: No module named 'resend'"},{"fix":"Set `resend.api_key` with a valid API key, preferably from an environment variable: `import os; resend.api_key = os.environ.get(\"RESEND_API_KEY\")`","cause":"The Resend API key is either missing, incorrect, or not properly set before making an API call.","error":"resend.exceptions.ResendError: {'name': 'unauthorized', 'message': 'Unauthorized'}"},{"fix":"Call the method on the correct class: `resend.Emails.send(...)`","cause":"The `send` method is not directly available on the top-level `resend` module; it must be called via the `resend.Emails` class.","error":"AttributeError: module 'resend' has no attribute 'send'"},{"fix":"Ensure all mandatory fields (`from`, `to`, `subject`, `html` or `text`) are present and correctly populated in the email payload dictionary.","cause":"A required field (like `from`, `to`, or `subject`) is missing or empty in the dictionary payload for the email.","error":"resend.exceptions.ResendError: {'message': 'The `from` field is required.', 'name': 'missing_required_field', 'statusCode': 422}"}],"ecosystem":"pypi","meta_description":null,"install_score":100,"install_tag":"verified","quickstart_score":80,"quickstart_tag":"verified","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.65,"mem_mb":11.5,"disk_size":"22.3M"},{"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.46,"mem_mb":11.5,"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":0.87,"mem_mb":12.9,"disk_size":"24.5M"},{"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.72,"mem_mb":12.9,"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":0.73,"mem_mb":12.6,"disk_size":"16.2M"},{"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.73,"mem_mb":12.6,"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":0.72,"mem_mb":12.9,"disk_size":"15.9M"},{"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.71,"mem_mb":12.9,"disk_size":"16M"},{"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.64,"mem_mb":11.3,"disk_size":"21.6M"},{"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.51,"mem_mb":11.3,"disk_size":"22M"}]},"quickstart_checks":{"last_tested":"2026-05-12","tag":"verified","tag_description":"quickstart runs on critical runtimes, recently tested","results":[{"runtime":"python:3.10-alpine","exit_code":0},{"runtime":"python:3.10-slim","exit_code":0},{"runtime":"python:3.11-alpine","exit_code":0},{"runtime":"python:3.11-slim","exit_code":0},{"runtime":"python:3.12-alpine","exit_code":0},{"runtime":"python:3.12-slim","exit_code":0},{"runtime":"python:3.13-alpine","exit_code":0},{"runtime":"python:3.13-slim","exit_code":0},{"runtime":"python:3.9-alpine","exit_code":0},{"runtime":"python:3.9-slim","exit_code":0}]}}