{"id":219,"library":"mailchimp-transactional","title":"Mailchimp Transactional","description":"Official Python client for Mailchimp Transactional Email API (formerly Mandrill). Current version is 1.3.3 (Feb 2026). Install name is mailchimp-transactional (hyphen), import name is mailchimp_transactional (underscore). Requires a paid Mailchimp Standard plan or higher — not available on free accounts.","status":"active","version":"1.3.3","language":"python","source_language":"en","source_url":"https://github.com/mailchimp/mailchimp-transactional-python","tags":["email","transactional-email","mandrill","mailchimp","smtp","notifications"],"install":[{"cmd":"pip install mailchimp-transactional","lang":"bash","label":"Standard (hyphen in install name)"}],"dependencies":[{"reason":"Required. Installed automatically.","package":"python-dateutil","optional":false},{"reason":"Required. Installed automatically.","package":"six","optional":false},{"reason":"Required. Installed automatically.","package":"urllib3","optional":false}],"imports":[{"note":"Install with pip install mailchimp-transactional (hyphen). Import as import mailchimp_transactional (underscore). These are different strings — a consistent LLM confusion source.","wrong":"import mailchimp-transactional  # SyntaxError — use underscore\nimport mailchimp               # wrong package entirely","symbol":"mailchimp_transactional","correct":"import mailchimp_transactional as MailchimpTransactional\nfrom mailchimp_transactional.api_client import ApiClientError\n\ntry:\n    client = MailchimpTransactional.Client('YOUR_MANDRILL_API_KEY')\n    response = client.users.ping()\n    print('API called successfully: {}'.format(response))\nexcept ApiClientError as error:\n    print('An exception occurred: {}'.format(error.text))"},{"note":"The Transactional API uses a Mandrill API key, NOT the Mailchimp Marketing API key. They are separate credentials generated at mandrillapp.com settings, not mailchimp.com.","wrong":"# Wrong: using Mailchimp Marketing API key instead of Mandrill/Transactional key\nclient = MailchimpTransactional.Client('YOUR_MAILCHIMP_MARKETING_API_KEY')\n# Returns 401 Invalid API Key — these are separate keys","symbol":"messages.send","correct":"response = client.messages.send({\n    'message': {\n        'from_email': 'hello@yourdomain.com',\n        'subject': 'Hello',\n        'text': 'Welcome!',\n        'to': [{\n            'email': 'recipient@example.com',\n            'type': 'to'\n        }]\n    }\n})"}],"quickstart":{"code":"import mailchimp_transactional as MailchimpTransactional\nfrom mailchimp_transactional.api_client import ApiClientError\n\nclient = MailchimpTransactional.Client('YOUR_MANDRILL_API_KEY')\n\n# Verify API key works\ntry:\n    response = client.users.ping()\n    print('Ping:', response)  # 'PONG!'\nexcept ApiClientError as e:\n    print('Error:', e.text)\n\n# Send a transactional email\ntry:\n    response = client.messages.send({\n        'message': {\n            'from_email': 'noreply@yourdomain.com',\n            'from_name': 'Your App',\n            'subject': 'Password Reset',\n            'html': '<p>Click <a href=\"{reset_url}\">here</a> to reset your password.</p>',\n            'to': [{'email': 'user@example.com', 'type': 'to'}],\n            'track_opens': True,\n            'track_clicks': True\n        }\n    })\n    print('Sent:', response)\nexcept ApiClientError as e:\n    print('Send failed:', e.text)","lang":"python","description":"Basic send pattern. Always catch ApiClientError. Verify with users.ping() first."},"warnings":[{"fix":"pip install mailchimp-transactional then import mailchimp_transactional as MailchimpTransactional","message":"Install name and import name differ. pip install mailchimp-transactional (hyphen), then import mailchimp_transactional (underscore). LLMs frequently generate import mailchimp-transactional which is a SyntaxError.","severity":"breaking","affected_versions":"all"},{"fix":"Upgrade to Mailchimp Standard or Premium plan to enable Transactional. Enable it in Mailchimp account Billing settings.","message":"Requires paid Mailchimp Standard plan or higher. The Transactional API (formerly Mandrill) is NOT available on free Mailchimp accounts. Attempting to use a free account API key returns: 'This account does not have access to the Transactional API.'","severity":"breaking","affected_versions":"all"},{"fix":"Get your Mandrill API key from: mandrillapp.com → Settings → SMTP & API Info → Add API Key. This is a different key from mailchimp.com API keys.","message":"Mandrill/Transactional API key is SEPARATE from the Mailchimp Marketing API key. Using the wrong key returns 401 Invalid API Key errors. Transactional keys are generated at mandrillapp.com settings.","severity":"breaking","affected_versions":"all"},{"fix":"All endpoint calls via the Python client use POST automatically. If calling the API directly: all requests go to https://mandrillapp.com/api/1.0/ENDPOINT.json via POST with JSON body.","message":"All API requests are HTTP POST, not RESTful GET/PUT/DELETE. The entire API surface (including read operations like messages.search) uses POST. The Python client handles this transparently but raw HTTP implementations must use POST.","severity":"gotcha","affected_versions":"all"},{"fix":"Use the Python client which handles the base URL. If calling raw: https://mandrillapp.com/api/1.0/ is the correct base.","message":"The API base URL is still mandrillapp.com (not mailchimp.com), a legacy artifact of the Mandrill → Mailchimp Transactional rebrand. Documentation still references both names interchangeably.","severity":"gotcha","affected_versions":"all"},{"fix":"Verify your sending domain at mandrillapp.com → Sending Domains. Set up DKIM (TXT record mandrill._domainkey.yourdomain.com) and a DMARC policy (p=none minimum).","message":"Sending from an unverified domain silently soft-fails or degrades deliverability. DKIM and DMARC must be configured for the sending domain before production use.","severity":"gotcha","affected_versions":"all"}],"env_vars":null,"last_verified":"2026-05-12T11:56:36.729Z","next_check":"2026-06-27T00:00:00.000Z","problems":[{"fix":"Change the import statement to `import mailchimp_transactional` or `from mailchimp_transactional import Client`.","cause":"The package was installed using 'mailchimp-transactional' (hyphen) but is imported using 'mailchimp_transactional' (underscore).","error":"ModuleNotFoundError: No module named 'mailchimp-transactional'"},{"fix":"Access the `messages` sub-client first: `client.messages.send(message=...)`.","cause":"You are attempting to call an email-related method (like `send`) directly on the client object, rather than through its `messages` sub-client.","error":"AttributeError: 'MailchimpTransactionalClient' object has no attribute 'messages'"},{"fix":"Verify your Mailchimp Transactional API key in your Mailchimp account and ensure your account is on a Standard plan or higher.","cause":"The provided API key is incorrect, expired, or the Mailchimp account associated with the key does not have an active Standard plan or higher, which is required for Mailchimp Transactional Email.","error":"MailchimpTransactionalError: Invalid API Key"},{"fix":"Provide a dictionary as the `message` argument: `client.messages.send(message={'to': [{'email': 'recipient@example.com'}], 'from_email': 'sender@example.com', 'subject': 'Test Subject', 'html': '<p>Test content</p>'})`.","cause":"The `client.messages.send()` method requires a dictionary named `message` containing all the email's details (e.g., recipients, subject, body).","error":"TypeError: send() missing 1 required positional argument: 'message'"}],"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.64,"mem_mb":10,"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.48,"mem_mb":10,"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.82,"mem_mb":11.2,"disk_size":"24.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.69,"mem_mb":11.2,"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.82,"mem_mb":11.6,"disk_size":"16.3M"},{"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.78,"mem_mb":11.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.73,"mem_mb":12,"disk_size":"16.0M"},{"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.74,"mem_mb":12,"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.58,"mem_mb":9.8,"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.56,"mem_mb":9.8,"disk_size":"22M"}]},"quickstart_checks":{"last_tested":"2026-04-23","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}]}}