NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
PyPI · #4042 most downloaded on PyPI
Mailjet V3 API wrapper
Last release 20 days ago
14 Sep 2026
Ships unpredictably
gaps range from 4 weeks to 4.5 years
Most releases are documented
notes for 12 of 20 stable releases
Nothing withdrawn
no release was ever pulled
11 years old
32 releases · first in 2015
Deprecate endpoints by @skupriienko in #149
Full Changelog: v1.8.0...v1.9.0
One column per quarter.
ROUTE_MAP for contactslist_csvdata and batchjob_csverror.Endpoint.__init__ (e.g., statistics_linkClick $\rightarrow$ statistics/link-click).Endpoint._cast_query_param and _normalize_stream_filters to automatically parse and cast multidict query filter values (such as those from urllib.parse.parse_qs) to int, float, bool, list, tuple, or set.headers parameter to Endpoint.__call__, create(), and update().tests/fuzz/fuzzer.dict.Endpoint.stream() to check Total from response bodies, automatically halting iteration when current_offset + len(data) >= total.RedactingFilter to recursively sanitize typing.NamedTuple instances (preserving structure), objects with model_dump() (e.g., Pydantic models), __dict__-based instances, and set/frozenset collections.SecurityGuard.sanitize_log_trace now cleans unprintable ASCII control characters ([\x00-\x1f\x7f]) before whitespace normalization.SecurityGuard.normalize_domain to rpartition("@") and scoped exception interception directly to UnicodeError.samples/segments_sample.py to use campaigndraft and updated samples/smoke_readme_runner.py health checks to use canonical endpoints eventcallbackurl and template_contents.DEPRECATION_ADVISORY in routes.py to emit non-breaking DeprecationWarning notices pointing to recommended replacements:
newsletter and sub-resources (newsletter_*) $\rightarrow$ campaigndraft / campaigndraft_*apikeytotals, campaignstatistics, liststatistics, domainstatistics, etc.) $\rightarrow$ statcounters and statistics_recipientEspwebhook $\rightarrow$ official REST resource eventcallbackurltemplate_update, templates_contents) $\rightarrow$ template.update(id=...) or template_detailcontent (v3) / template_contents (v1)True/False) in SecurityGuard.validate_timeout to prevent coercion to numeric 1.0/0.0 seconds.Path.is_file() verification in SecurityGuard.check_file_size before evaluating file stats.Client.api_call to accept Mapping[str, str | None] and screen non-None values against CRLF injection patterns..github/workflows/cflite_build.yml and .github/workflows/cflite_cron.yml CI tasks.Nothing published for this version
build(deps): bump actions/checkout from 6 to 7 by @dependabot [bot] in #133
Full Changelog: v1.7.0...v1.8.0
SecretAuth transport adapter and recursive RedactingFilter to strictly prevent API credentials and sensitive payload data from leaking in memory dumps, tracebacks, or system logs._SpamGuardParser) to preemptively intercept and block known XSS vectors (e.g., <script>, onerror=) before network dispatch.Idempotency-Key header for state-mutating requests (POST, PUT, DELETE) to prevent duplicate mutations during network retries.SecurityGuard.normalize_domain to prevent Unicode Homograph attacks.SecurityGuard.sanitize_headers, SecurityGuard.sanitize_segment).mailjet.com or local test loopbacks) during Config initialization; enforces minimum TLS 1.2+ via SecureHTTPAdapter. Disabling TLS verification now strictly raises ValueError.HTMLPart and TextPart inputs at 5MB safe limits, validated numeric scalar/tuple timeouts (rejecting NaN, Infinity, and non-positive values), and enforced chunk_size > 0 in generators.ChunkedStreamer to iteratively read and base64-encode large file attachments in 512KB chunks, preventing Out-Of-Memory (OOM) allocation spikes.JitterRetry connection pooling policy utilizing exponential backoff and randomized full jitter for transient 429/5xx status codes to mitigate the "Thundering Herd" effect.SendPayloadBuilder to construct root Send API v3.1 payload wrappers (supporting SandboxMode and Globals) and TemplateContentBuilder for Content API payloads..attach_inline() support to MessageBuilder for embedding inline images directly from disk.ROUTE_MAP for Messages, Bulk Contact Management, Campaigns, Newsletters, Template Content, DNS verifications, and Analytics endpoints.seed_harvester.py) for automated security testing and schema discovery.__getattr__ and procedural if/elif string concatenation chains with an immutable routing table (ROUTE_MAP) and dedicated fallback resolvers (_resolve_registry_route, _resolve_dynamic_route).Client._execute_request now maps HTTP errors to specific domain exceptions (MailjetAuthError, ApiRateLimitError, DoesNotExistError, ValidationError, ApiError) with extracted response messages instead of returning raw error responses.Endpoint.stream() default chunk_size increased from 100 to 1000, and now respects user-supplied Offset parameters for stream resumption.__slots__): Standardized __slots__ across Endpoint, _BaseContentBuilder, MessageBuilder, SendPayloadBuilder, and TemplateContentBuilder to reduce RAM footprint and accelerate attribute access.TemplateContentBuilder now generates standard kebab-case keys (Text-part, Html-part) matching the legacy v3 template endpoint expectations.MessageBuilder.build() and TemplateContentBuilder.build() return deep/shallow dictionary copies (.copy()) to prevent downstream payload mutation.PayloadType type alias in mailjet_rest.types to support bytes and list[Any] batch payloads.ensure_ascii and data_encoding arguments in Endpoint.__call__, create(), and update() emit DeprecationWarning; underlying requests handles JSON serialization natively.mailjet_rest.client.parse_response and mailjet_rest.client.logging_handler emit DeprecationWarning in favor of standard requests.Response methods and standard logging.timeout=None emits a deprecation warning due to unbounded socket blocking risks (CWE-400).Config.__getitem__ Routing Helper: Removed undocumented dictionary-style routing accessor (config[key]) from Config; route resolution is fully managed by ROUTE_MAP and Endpoint._route_send, _route_csv, _route_data, _route_rest) and Endpoint._build_csv_url in favor of centralized _resolve_registry_route and _resolve_dynamic_route.auth Attribute Reflection: Removed raw credentials exposure on Client instances to prevent accidental credential leakage in memory inspectors and debug traces.action_id and dynamic path segments in legacy routing fallbacks (_resolve_dynamic_route) to prevent unescaped directory traversal execution.ensure_ascii and data_encoding fallbacks in Endpoint.__call__ to correctly serialize list batch payloads.TypeError in Endpoint.stream() when evaluating empty or None offsets.datetime and UUID) in MessageBuilder.build() via default=str during variable length verification.Nothing published for this version
Nothing published for this version
refactor: Modernize SDK architecture, harden security, and enable O(1) routing by @skupriienko in #130
Full Changelog: v1.6.0...v1.7.0
sys.addaudithook) via Config.enable_security_audit to track runtime network events.urllib.parse.quote(safe="") across endpoints to block directory traversal attacks.SecurityGuard.sanitize_segment to stop CRLF injection and traversal attempts across all requests.osv-scanner and turned pip-audit into a strict, standalone task inside the GitHub Actions pipeline.Atheris coverage-guided fuzzing tool into development routines via a unified manage.sh fuzz_all script.ROUTE_MAP registry to process endpoints instantly and remove lookup overhead.dry_run=True client initialization parameter to safely mock mutations locally without sending real network traffic..stream() generator method on endpoints to handle records automatically without manual pagination loops.MessageBuilder and TemplateContentBuilder to easily construct and validate complex API requests.ValidationError and MailjetAuthError to eliminate broad exception silencing.types.py definition layer to remove MyPy type blindness across internal utilities.__slots__ across core objects to optimize the overall memory footprint.Nothing published for this version
Nothing published for this version
Refactor client by @skupriienko in #125
Full Changelog: v1.5.1...v1.6.0
urllib.parse.quote) on all dynamically injected path parameters (id and action_id).__repr__ and __str__ to prevent sensitive data from appearing in stack traces.api_url scheme validation (https) and hostname presence during Config initialization.allow_redirects=False) for all API calls.bandit, semgrep, gitleaks, detect-secrets).SECURITY.md policy to clarify supported active branches.typing-extensions>=4.7.1 for Python versions <3.11 to support modern type hinting.Client now supports the with statement (__enter__ / __exit__) for automatic TCP connection pooling and socket cleanup, preventing resource leaks.mailjet_rest.utils.guardrails module for centralized security and routing validation.sanitize_log_trace utility to protect against Log Forging attacks.UserWarning for insecure TLS configurations and unencrypted HTTP proxies.CustomID, Campaign, TemplateID) from payloads and headers, injecting them into debug logs for easier correlation with the Mailjet Dashboard.samples/smoke_readme_runner.py as a dynamic test suite to guarantee all README.md examples are continuously validated and functional against the live API.template resource on Content API v1, or attempting to route the Send API outside of v3/v3.1).multipart/form-data upload support using the requests files kwarg for the data_images endpoint.mailjet_rest exceptions (TimeoutError, CriticalApiError, ApiError).api_call using standard Python logging.__dir__ in the core Client to expose high-traffic dynamic endpoints (e.g., .contact, .send, .campaigndraft) directly to IDE autocompletion engines (VS Code, PyCharm).TemplateLanguage and Variables are correctly serialized by the SDK._endpoint_cache, resulting in a ~47x speedup for endpoint resolution.__slots__ across core Client, Config, and Endpoint classes.types.MappingProxyType (_JSON_HEADERS, _TEXT_HEADERS) and moving the retry configuration to a ClassVar.re.match) with native string manipulation (.split()) in mailjet_rest/utils/version.py.unittest monolith to pytest, segregated into tests/unit/ (offline) and tests/integration/ (live network), adhering to the AAA (Arrange, Act, Assert) pattern.cache: 'pip') and isolated wheel installation tests.Client and Config using @dataclass and requests.Session for robust connection pooling on multiple sequential requests.Endpoint._build_url cyclomatic complexity by extracting pure @staticmethod helpers (_build_csv_url, _check_dx_guardrails) to satisfy strict static analysis.pre-commit hooks for robust security and formatting (ruff, mypy, pyright, typos, bandit, semgrep).__all__ to prevent namespace pollution.environment-dev.yaml) and pinned sub-dependencies for stable CI pipelines.pyproject.toml and Conda environments.README.md to highlight modern DX configurations, including Context Managers, robust Error Handling, and Smart Telemetry.timeout=None to allow infinite socket blocking is deprecated to mitigate CWE-400. Explicit timeouts will be strictly enforced in v2.0.AuthorizationError, ApiRateLimitError, DoesNotExistError, ValidationError, ActionDeniedError). The SDK natively returns the requests.Response object for standard HTTP status codes.ensure_ascii and data_encoding arguments in the create and update method signatures. The underlying requests library handles UTF-8 serialization natively.parse_response and logging_handler utility functions. Logging is now integrated cleanly and automatically via Python's standard logging library. See the README for the new 2-line setup.test.py monolith (replaced by a modular test/ directory structure).API_REF, DEFAULT_API_URL).statcounters required filters (explicitly added the CounterTiming parameter).Nothing published for this version
Nothing published for this version
Release 1.5.1 by @skupriienko in #124
*/_version.py from .gitignoreFix a csvimport error 'List index (0) out of bounds' by @skupriienko in https://github.com/mailjet/mailjet-apiv3-python/pull/120
Full Changelog: https://github.com/mailjet/mailjet-apiv3-python/compare/v1.4.0...v1.5.0
TestCsvImpor with a test suite for testing CSV import functionality to test.pytypes-requests to mypy's additional_dependencies in pre-commit hookspydocstyle pre-commit's hook*/_version.py to .gitignorejson_data back to data. Corrected behavior broken since v1.4.0README.mdSECURITY.mdpermissions: contents: read in all CI workflow files explicitlyrequests >=2.32.4Full Changelog: https://github.com/mailjet/mailjet-apiv3-python/compare/v1.5.0rc1...v1.5.0rc2
Full Changelog: https://github.com/mailjet/mailjet-apiv3-python/compare/v1.5.0rc1...v1.5.0rc2
Full Changelog: https://github.com/mailjet/mailjet-apiv3-python/compare/v1.4.0...v1.5.0rc1
Full Changelog: https://github.com/mailjet/mailjet-apiv3-python/compare/v1.4.0...v1.5.0rc1
Dnefodov: Add code samples by @DanyilNefodov in https://github.com/mailjet/mailjet-apiv3-python/pull/84
Full Changelog: https://github.com/mailjet/mailjet-apiv3-python/compare/1.3.5...v1.4.0
Nothing published for this version
Full Changelog: https://github.com/mailjet/mailjet-apiv3-python/compare/1.3.5...v1.4.0rc2
Full Changelog: https://github.com/mailjet/mailjet-apiv3-python/compare/1.3.5...v1.4.0rc2
Nothing published for this version
Lib expected to work on py3.7? #48
Closed issues:
Merged pull requests:
Nothing published for this version
Add support for Mailjet API version 3.1
Closed issues:
Merged pull requests:
Nothing published for this version
- Version alignment - Indentation issue fixed
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Full Changelog
\* *This Changelog was automatically generated by github_changelog_generator*
* This Changelog was automatically generated by github_changelog_generator
Nothing published for this version
Your coding agent can read these notes before it upgrades. Set up the MCP server →