All notable changes to this project are documented here.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- The PyPI distribution name is now
postify-sdk(waspostify), matching the fleet-wide<app>-sdkconvention. The import package is unchanged:postify.
0.1.0 - 2026-08-05
Initial release. Full coverage of the Postify /v1 public API — all 17
authenticated operations, sync and async.
PostifyandAsyncPostifyclients, both context managers, with configurablebase_url,timeout,max_retries,auth_styleand an injectablehttpx.Client/httpx.AsyncClient.- Bearer (default) and
x-api-keyauthentication; the key is read from$POSTIFY_API_KEYwhen not passed, and is redacted in everyreprand log line. - Resources:
channels,posts,media,analytics,usageandwebhook_endpoints. - RFC 9457 problem documents mapped to a typed exception hierarchy
(
BadRequestError,AuthenticationError,PermissionDeniedError,NotFoundError,ConflictError,UnprocessableEntityError,RateLimitError,InternalServerError, plusAPIConnectionError/APITimeoutError/APIUserAbortError), with the fullPROBLEM_CODESregistry exported. - Auto-paginating keyset cursors for
posts.listandmedia.listthat carry the caller's filters forward verbatim (SyncPager/AsyncPager,Page/AsyncPage). - Automatic
Idempotency-Keygeneration onposts.create, with explicit-key andidempotency_key=Falseopt-out, andIdempotency-Replayedsurfaced on the returned model. - Retry policy honoring
Retry-After(delta-seconds and HTTP-date), draft-11 rate-limit hints and full-jitter backoff — and never retrying a mutation that carries no idempotency key. RateLimitStateparsed from both the IETF draft-11 structured fields and the legacyX-RateLimit-*trio, exposed onclient.last_rate_limit, on models and onAPIError.rate_limit. Unobservable values stayNone.media.upload()convenience that chains create-ticket → presigned PUT → complete, issuing the PUT with no Postify credential.verify_webhook()for Standard Webhooks deliveries, with raw-bytes verification, secret-rotation support and typed.reasonfailures.py.typedmarker; the package ships full type information.