<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>article [Python SDK] Release 2.1.0 in SDKs</title>
    <link>https://community.sinch.com/t5/SDKs/Python-SDK-Release-2-1-0/ta-p/19682</link>
    <description>&lt;DIV class="lia-message-template-content-zone"&gt;
&lt;H2&gt;What's Changed&lt;/H2&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3&gt;SDK&lt;/H3&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;[feature]&lt;/STRONG&gt; OAuth token requests are now automatically retried (up to 3 times, with exponential backoff and jitter) when the authentication service is rate-limited (&lt;CODE&gt;HTTP 429&lt;/CODE&gt;).&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;[dependency]&lt;/STRONG&gt; Set up minimum version for &lt;CODE&gt;requests&lt;/CODE&gt; to &lt;CODE&gt;&amp;gt;=2.0.0&lt;/CODE&gt; to prevent pulling in versions with known vulnerabilities.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;[fix]&lt;/STRONG&gt; Fixed a race condition in OAuth token creation and renewal under concurrent requests: &lt;CODE&gt;TokenManagerBase&lt;/CODE&gt; now uses a lock with double-checked locking so the initial token is fetched exactly once, and a new &lt;CODE&gt;refresh_auth_token(used_token)&lt;/CODE&gt; deduplicates concurrent renewals by only fetching when the stale token still matches the cached one.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;[refactor]&lt;/STRONG&gt; &lt;CODE&gt;HTTPTransport&lt;/CODE&gt; now prepares and authenticates requests in &lt;CODE&gt;request()&lt;/CODE&gt;, so the new &lt;CODE&gt;send_request(request_data)&lt;/CODE&gt; receives an already-prepared &lt;CODE&gt;HttpRequest&lt;/CODE&gt; and acts as a pure I/O primitive, simplifying subclassing.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;[deprecation notice]&lt;/STRONG&gt; &lt;CODE&gt;HTTPTransport.send(endpoint)&lt;/CODE&gt; is deprecated in favour of &lt;CODE&gt;send_request(request_data)&lt;/CODE&gt;; the legacy method still works for backward compatibility, but will be removed in 3.0.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;[deprecation notice]&lt;/STRONG&gt; &lt;CODE&gt;TokenManagerBase.invalidate_expired_token()&lt;/CODE&gt; and &lt;CODE&gt;handle_invalid_token()&lt;/CODE&gt; (and the &lt;CODE&gt;TokenState.EXPIRED&lt;/CODE&gt; value) are deprecated and will be removed in 3.0, as token renewal now goes through &lt;CODE&gt;refresh_auth_token()&lt;/CODE&gt;.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;[tech]&lt;/STRONG&gt; Removed unused GitHub environment secrets from CI workflow and simplified test fixtures to use hardcoded test values.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;[refactor]&lt;/STRONG&gt; Consolidated the duplicated per-domain &lt;CODE&gt;BaseModelConfiguration&lt;/CODE&gt; classes into three shared base classes in &lt;CODE&gt;sinch.core.models.internal&lt;/CODE&gt; (&lt;CODE&gt;BaseConfigModel&lt;/CODE&gt;, &lt;CODE&gt;SnakeCaseExtrasModel&lt;/CODE&gt;, &lt;CODE&gt;CamelCaseDumpModel&lt;/CODE&gt;).&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;[doc]&lt;/STRONG&gt; Improve README structure and content.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3&gt;SMS&lt;/H3&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;[feature]&lt;/STRONG&gt; SMS Groups API: &lt;CODE&gt;create&lt;/CODE&gt;, &lt;CODE&gt;list&lt;/CODE&gt;, &lt;CODE&gt;get&lt;/CODE&gt;, &lt;CODE&gt;update&lt;/CODE&gt;, &lt;CODE&gt;replace&lt;/CODE&gt;, &lt;CODE&gt;delete&lt;/CODE&gt;, and &lt;CODE&gt;list_members&lt;/CODE&gt; operations, with full model, endpoint, and unit test coverage (see &lt;A href="https://github.com/sinch/sinch-sdk-python/blob/v2.1.0/MIGRATION_GUIDE.md#groups-api" target="_blank" rel="noopener"&gt;MIGRATION_GUIDE.md&lt;/A&gt;).&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;[feature]&lt;/STRONG&gt; SMS Inbounds API: &lt;CODE&gt;get&lt;/CODE&gt; and &lt;CODE&gt;list&lt;/CODE&gt; operations, with full model, endpoint, and unit test coverage (see &lt;A href="https://github.com/sinch/sinch-sdk-python/blob/v2.1.0/MIGRATION_GUIDE.md#inbounds-api" target="_blank" rel="noopener"&gt;MIGRATION_GUIDE.md&lt;/A&gt;).&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;[design]&lt;/STRONG&gt; SMS Sinch Events inbound payload models unified with the Inbounds API: &lt;CODE&gt;MOTextSinchEvent&lt;/CODE&gt;, &lt;CODE&gt;MOBinarySinchEvent&lt;/CODE&gt;, &lt;CODE&gt;MOMediaSinchEvent&lt;/CODE&gt;, &lt;CODE&gt;MediaBody&lt;/CODE&gt;, and &lt;CODE&gt;MediaItem&lt;/CODE&gt; removed from &lt;CODE&gt;sinch_events&lt;/CODE&gt;; use &lt;CODE&gt;InboundMessage&lt;/CODE&gt; (and its variants) from &lt;CODE&gt;sinch.domains.sms.models.v1.types&lt;/CODE&gt; instead (see &lt;A href="https://github.com/sinch/sinch-sdk-python/blob/v2.1.0/MIGRATION_GUIDE.md#sms-sinch-events" target="_blank" rel="noopener"&gt;MIGRATION_GUIDE.md&lt;/A&gt;).&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3&gt;Numbers&lt;/H3&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;[feature]&lt;/STRONG&gt; &lt;CODE&gt;NumberSinchEvent&lt;/CODE&gt; synchronized with the Numbers OAS spec: new &lt;CODE&gt;internal_failure_code&lt;/CODE&gt; field, additional &lt;CODE&gt;status&lt;/CODE&gt; values (&lt;CODE&gt;IN_REVIEW&lt;/CODE&gt;, &lt;CODE&gt;BLOCKED&lt;/CODE&gt;, &lt;CODE&gt;COMPLETED&lt;/CODE&gt;, &lt;CODE&gt;REJECTED&lt;/CODE&gt;, &lt;CODE&gt;EXPIRED&lt;/CODE&gt;), a new &lt;CODE&gt;NUMBER_ORDER_PROCESSING&lt;/CODE&gt; event type, and corrected event type &lt;CODE&gt;DEPROVISIONING_FROM_VOICE_PLATFORM&lt;/CODE&gt; (previously &lt;CODE&gt;DEPROVISIONING_TO_VOICE_PLATFORM&lt;/CODE&gt;).&lt;/LI&gt;
&lt;/UL&gt;
&lt;/DIV&gt;</description>
    <pubDate>Thu, 02 Jul 2026 08:48:37 GMT</pubDate>
    <dc:creator>SinchSDKTeam</dc:creator>
    <dc:date>2026-07-02T08:48:37Z</dc:date>
    <item>
      <title>[Python SDK] Release 2.1.0</title>
      <link>https://community.sinch.com/t5/SDKs/Python-SDK-Release-2-1-0/ta-p/19682</link>
      <description>&lt;DIV class="lia-message-template-content-zone"&gt;
&lt;H2&gt;What's Changed&lt;/H2&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3&gt;SDK&lt;/H3&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;[feature]&lt;/STRONG&gt; OAuth token requests are now automatically retried (up to 3 times, with exponential backoff and jitter) when the authentication service is rate-limited (&lt;CODE&gt;HTTP 429&lt;/CODE&gt;).&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;[dependency]&lt;/STRONG&gt; Set up minimum version for &lt;CODE&gt;requests&lt;/CODE&gt; to &lt;CODE&gt;&amp;gt;=2.0.0&lt;/CODE&gt; to prevent pulling in versions with known vulnerabilities.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;[fix]&lt;/STRONG&gt; Fixed a race condition in OAuth token creation and renewal under concurrent requests: &lt;CODE&gt;TokenManagerBase&lt;/CODE&gt; now uses a lock with double-checked locking so the initial token is fetched exactly once, and a new &lt;CODE&gt;refresh_auth_token(used_token)&lt;/CODE&gt; deduplicates concurrent renewals by only fetching when the stale token still matches the cached one.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;[refactor]&lt;/STRONG&gt; &lt;CODE&gt;HTTPTransport&lt;/CODE&gt; now prepares and authenticates requests in &lt;CODE&gt;request()&lt;/CODE&gt;, so the new &lt;CODE&gt;send_request(request_data)&lt;/CODE&gt; receives an already-prepared &lt;CODE&gt;HttpRequest&lt;/CODE&gt; and acts as a pure I/O primitive, simplifying subclassing.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;[deprecation notice]&lt;/STRONG&gt; &lt;CODE&gt;HTTPTransport.send(endpoint)&lt;/CODE&gt; is deprecated in favour of &lt;CODE&gt;send_request(request_data)&lt;/CODE&gt;; the legacy method still works for backward compatibility, but will be removed in 3.0.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;[deprecation notice]&lt;/STRONG&gt; &lt;CODE&gt;TokenManagerBase.invalidate_expired_token()&lt;/CODE&gt; and &lt;CODE&gt;handle_invalid_token()&lt;/CODE&gt; (and the &lt;CODE&gt;TokenState.EXPIRED&lt;/CODE&gt; value) are deprecated and will be removed in 3.0, as token renewal now goes through &lt;CODE&gt;refresh_auth_token()&lt;/CODE&gt;.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;[tech]&lt;/STRONG&gt; Removed unused GitHub environment secrets from CI workflow and simplified test fixtures to use hardcoded test values.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;[refactor]&lt;/STRONG&gt; Consolidated the duplicated per-domain &lt;CODE&gt;BaseModelConfiguration&lt;/CODE&gt; classes into three shared base classes in &lt;CODE&gt;sinch.core.models.internal&lt;/CODE&gt; (&lt;CODE&gt;BaseConfigModel&lt;/CODE&gt;, &lt;CODE&gt;SnakeCaseExtrasModel&lt;/CODE&gt;, &lt;CODE&gt;CamelCaseDumpModel&lt;/CODE&gt;).&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;[doc]&lt;/STRONG&gt; Improve README structure and content.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3&gt;SMS&lt;/H3&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;[feature]&lt;/STRONG&gt; SMS Groups API: &lt;CODE&gt;create&lt;/CODE&gt;, &lt;CODE&gt;list&lt;/CODE&gt;, &lt;CODE&gt;get&lt;/CODE&gt;, &lt;CODE&gt;update&lt;/CODE&gt;, &lt;CODE&gt;replace&lt;/CODE&gt;, &lt;CODE&gt;delete&lt;/CODE&gt;, and &lt;CODE&gt;list_members&lt;/CODE&gt; operations, with full model, endpoint, and unit test coverage (see &lt;A href="https://github.com/sinch/sinch-sdk-python/blob/v2.1.0/MIGRATION_GUIDE.md#groups-api" target="_blank" rel="noopener"&gt;MIGRATION_GUIDE.md&lt;/A&gt;).&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;[feature]&lt;/STRONG&gt; SMS Inbounds API: &lt;CODE&gt;get&lt;/CODE&gt; and &lt;CODE&gt;list&lt;/CODE&gt; operations, with full model, endpoint, and unit test coverage (see &lt;A href="https://github.com/sinch/sinch-sdk-python/blob/v2.1.0/MIGRATION_GUIDE.md#inbounds-api" target="_blank" rel="noopener"&gt;MIGRATION_GUIDE.md&lt;/A&gt;).&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;[design]&lt;/STRONG&gt; SMS Sinch Events inbound payload models unified with the Inbounds API: &lt;CODE&gt;MOTextSinchEvent&lt;/CODE&gt;, &lt;CODE&gt;MOBinarySinchEvent&lt;/CODE&gt;, &lt;CODE&gt;MOMediaSinchEvent&lt;/CODE&gt;, &lt;CODE&gt;MediaBody&lt;/CODE&gt;, and &lt;CODE&gt;MediaItem&lt;/CODE&gt; removed from &lt;CODE&gt;sinch_events&lt;/CODE&gt;; use &lt;CODE&gt;InboundMessage&lt;/CODE&gt; (and its variants) from &lt;CODE&gt;sinch.domains.sms.models.v1.types&lt;/CODE&gt; instead (see &lt;A href="https://github.com/sinch/sinch-sdk-python/blob/v2.1.0/MIGRATION_GUIDE.md#sms-sinch-events" target="_blank" rel="noopener"&gt;MIGRATION_GUIDE.md&lt;/A&gt;).&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3&gt;Numbers&lt;/H3&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;[feature]&lt;/STRONG&gt; &lt;CODE&gt;NumberSinchEvent&lt;/CODE&gt; synchronized with the Numbers OAS spec: new &lt;CODE&gt;internal_failure_code&lt;/CODE&gt; field, additional &lt;CODE&gt;status&lt;/CODE&gt; values (&lt;CODE&gt;IN_REVIEW&lt;/CODE&gt;, &lt;CODE&gt;BLOCKED&lt;/CODE&gt;, &lt;CODE&gt;COMPLETED&lt;/CODE&gt;, &lt;CODE&gt;REJECTED&lt;/CODE&gt;, &lt;CODE&gt;EXPIRED&lt;/CODE&gt;), a new &lt;CODE&gt;NUMBER_ORDER_PROCESSING&lt;/CODE&gt; event type, and corrected event type &lt;CODE&gt;DEPROVISIONING_FROM_VOICE_PLATFORM&lt;/CODE&gt; (previously &lt;CODE&gt;DEPROVISIONING_TO_VOICE_PLATFORM&lt;/CODE&gt;).&lt;/LI&gt;
&lt;/UL&gt;
&lt;/DIV&gt;</description>
      <pubDate>Thu, 02 Jul 2026 08:48:37 GMT</pubDate>
      <guid>https://community.sinch.com/t5/SDKs/Python-SDK-Release-2-1-0/ta-p/19682</guid>
      <dc:creator>SinchSDKTeam</dc:creator>
      <dc:date>2026-07-02T08:48:37Z</dc:date>
    </item>
  </channel>
</rss>

