Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
e0e590a
codegen metadata
stainless-app[bot] Jun 30, 2026
009eca0
codegen metadata
stainless-app[bot] Jun 30, 2026
8bfe53e
codegen metadata
stainless-app[bot] Jun 30, 2026
6f3fb6b
codegen metadata
stainless-app[bot] Jun 30, 2026
3debb44
codegen metadata
stainless-app[bot] Jun 30, 2026
7893ee1
codegen metadata
stainless-app[bot] Jun 30, 2026
b94bb31
codegen metadata
stainless-app[bot] Jun 30, 2026
84bec9f
codegen metadata
stainless-app[bot] Jun 30, 2026
8db286a
codegen metadata
stainless-app[bot] Jun 30, 2026
808190f
codegen metadata
stainless-app[bot] Jun 30, 2026
38fa53e
codegen metadata
stainless-app[bot] Jun 30, 2026
18cb799
codegen metadata
stainless-app[bot] Jun 30, 2026
95f5c77
codegen metadata
stainless-app[bot] Jun 30, 2026
7dea1a8
codegen metadata
stainless-app[bot] Jul 1, 2026
8892e7d
codegen metadata
stainless-app[bot] Jul 1, 2026
62491d9
codegen metadata
stainless-app[bot] Jul 1, 2026
0d3cf62
codegen metadata
stainless-app[bot] Jul 1, 2026
8abff1c
codegen metadata
stainless-app[bot] Jul 1, 2026
5eca541
codegen metadata
stainless-app[bot] Jul 1, 2026
e16e72b
codegen metadata
stainless-app[bot] Jul 1, 2026
b8f0859
codegen metadata
stainless-app[bot] Jul 1, 2026
e8cf6e9
codegen metadata
stainless-app[bot] Jul 1, 2026
fffcd80
codegen metadata
stainless-app[bot] Jul 1, 2026
7f73983
codegen metadata
stainless-app[bot] Jul 1, 2026
50185e2
codegen metadata
stainless-app[bot] Jul 1, 2026
c015d2b
codegen metadata
stainless-app[bot] Jul 1, 2026
edcb495
codegen metadata
stainless-app[bot] Jul 1, 2026
90d5448
codegen metadata
stainless-app[bot] Jul 1, 2026
dadbee0
codegen metadata
stainless-app[bot] Jul 1, 2026
b5fbf8b
codegen metadata
stainless-app[bot] Jul 1, 2026
0a5d602
codegen metadata
stainless-app[bot] Jul 1, 2026
48e2c84
codegen metadata
stainless-app[bot] Jul 2, 2026
3678087
codegen metadata
stainless-app[bot] Jul 2, 2026
faac6dd
codegen metadata
stainless-app[bot] Jul 2, 2026
953764b
codegen metadata
stainless-app[bot] Jul 2, 2026
35c5b28
codegen metadata
stainless-app[bot] Jul 2, 2026
d261fb8
codegen metadata
stainless-app[bot] Jul 2, 2026
f35ac56
feat(api): api update
stainless-app[bot] Jul 2, 2026
eff86c8
release: 0.31.0
stainless-app[bot] Jul 2, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .release-please-manifest.json
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
{
".": "0.30.0"
".": "0.31.0"
}
4 changes: 2 additions & 2 deletions .stats.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
configured_endpoints: 40
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-aaa1e926cc5197acf2f9ea1d957bf3d3eae95dbeffda2968d9bcb55a56b65332.yml
openapi_spec_hash: 950356265774a5813826bd518d469da3
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-8d00ff0519a68a95267b0ccf4c42daace58b4ae8a4fd190dbed0d5857b10f59d.yml
openapi_spec_hash: 0f6039cb9fa846fcb023468b6a61b042
config_hash: 32929c7d4b1344f5bbf67df044a518af
8 changes: 8 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,13 @@
# Changelog

## 0.31.0 (2026-07-02)

Full Changelog: [v0.30.0...v0.31.0](https://github.com/sentdm/sent-dm-python/compare/v0.30.0...v0.31.0)

### Features

* **api:** api update ([f35ac56](https://github.com/sentdm/sent-dm-python/commit/f35ac56eda99fd8d4624db0962e33776c35719ed))

## 0.30.0 (2026-06-30)

Full Changelog: [v0.29.1...v0.30.0](https://github.com/sentdm/sent-dm-python/compare/v0.29.1...v0.30.0)
Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[project]
name = "sentdm"
version = "0.30.0"
version = "0.31.0"
description = "The official Python library for the Sent API"
dynamic = ["readme"]
license = "Apache-2.0"
Expand Down
2 changes: 1 addition & 1 deletion src/sent_dm/_version.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.

__title__ = "sent_dm"
__version__ = "0.30.0" # x-release-please-version
__version__ = "0.31.0" # x-release-please-version
4 changes: 2 additions & 2 deletions src/sent_dm/resources/contacts.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ def with_streaming_response(self) -> ContactsResourceWithStreamingResponse:
def create(
self,
*,
phone_number: str | Omit = omit,
phone_number: str,
sandbox: bool | Omit = omit,
idempotency_key: str | Omit = omit,
x_profile_id: str | Omit = omit,
Expand Down Expand Up @@ -336,7 +336,7 @@ def with_streaming_response(self) -> AsyncContactsResourceWithStreamingResponse:
async def create(
self,
*,
phone_number: str | Omit = omit,
phone_number: str,
sandbox: bool | Omit = omit,
idempotency_key: str | Omit = omit,
x_profile_id: str | Omit = omit,
Expand Down
4 changes: 2 additions & 2 deletions src/sent_dm/types/contact_create_params.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,15 @@

from __future__ import annotations

from typing_extensions import Annotated, TypedDict
from typing_extensions import Required, Annotated, TypedDict

from .._utils import PropertyInfo

__all__ = ["ContactCreateParams"]


class ContactCreateParams(TypedDict, total=False):
phone_number: str
phone_number: Required[str]
"""Phone number of the contact to create"""

sandbox: bool
Expand Down
6 changes: 3 additions & 3 deletions src/sent_dm/types/message_retrieve_status_response.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,11 @@
class DataEvent(BaseModel):
"""Represents a status change event in a message's lifecycle (v3)"""

description: Optional[str] = None
status: str

status: Optional[str] = None
timestamp: datetime

timestamp: Optional[datetime] = None
description: Optional[str] = None


class DataMessageBodyButton(BaseModel):
Expand Down
16 changes: 8 additions & 8 deletions src/sent_dm/types/profiles/tcr_campaign_with_use_cases.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,16 +13,22 @@


class TcrCampaignWithUseCasesUseCase(BaseDto):
sample_messages: List[str] = FieldInfo(alias="sampleMessages")

campaign_id: Optional[str] = FieldInfo(alias="campaignId", default=None)

customer_id: Optional[str] = FieldInfo(alias="customerId", default=None)

messaging_use_case_us: Optional[MessagingUseCaseUs] = FieldInfo(alias="messagingUseCaseUs", default=None)

sample_messages: Optional[List[str]] = FieldInfo(alias="sampleMessages", default=None)


class TcrCampaignWithUseCases(BaseDto):
description: str

name: str

type: str

billed_date: Optional[datetime] = FieldInfo(alias="billedDate", default=None)

brand_id: Optional[str] = FieldInfo(alias="brandId", default=None)
Expand All @@ -37,8 +43,6 @@ class TcrCampaignWithUseCases(BaseDto):

dca_elections_completed_at: Optional[datetime] = FieldInfo(alias="dcaElectionsCompletedAt", default=None)

description: Optional[str] = None

has_submission_transaction: Optional[bool] = FieldInfo(alias="hasSubmissionTransaction", default=None)
"""
True when this campaign already has a billing transaction of reference type
Expand All @@ -54,8 +58,6 @@ class TcrCampaignWithUseCases(BaseDto):

message_flow: Optional[str] = FieldInfo(alias="messageFlow", default=None)

name: Optional[str] = None

optin_keywords: Optional[str] = FieldInfo(alias="optinKeywords", default=None)

optin_message: Optional[str] = FieldInfo(alias="optinMessage", default=None)
Expand Down Expand Up @@ -86,8 +88,6 @@ class TcrCampaignWithUseCases(BaseDto):

terms_and_conditions_link: Optional[str] = FieldInfo(alias="termsAndConditionsLink", default=None)

type: Optional[str] = None

upstream_cnp_id: Optional[str] = FieldInfo(alias="upstreamCnpId", default=None)

use_cases: Optional[List[TcrCampaignWithUseCasesUseCase]] = FieldInfo(alias="useCases", default=None)
24 changes: 18 additions & 6 deletions tests/api_resources/test_contacts.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,9 @@ class TestContacts:
@pytest.mark.skip(reason="Mock server tests are disabled")
@parametrize
def test_method_create(self, client: Sent) -> None:
contact = client.contacts.create()
contact = client.contacts.create(
phone_number="+1234567890",
)
assert_matches_type(APIResponseOfContact, contact, path=["response"])

@pytest.mark.skip(reason="Mock server tests are disabled")
Expand All @@ -40,7 +42,9 @@ def test_method_create_with_all_params(self, client: Sent) -> None:
@pytest.mark.skip(reason="Mock server tests are disabled")
@parametrize
def test_raw_response_create(self, client: Sent) -> None:
response = client.contacts.with_raw_response.create()
response = client.contacts.with_raw_response.create(
phone_number="+1234567890",
)

assert response.is_closed is True
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
Expand All @@ -50,7 +54,9 @@ def test_raw_response_create(self, client: Sent) -> None:
@pytest.mark.skip(reason="Mock server tests are disabled")
@parametrize
def test_streaming_response_create(self, client: Sent) -> None:
with client.contacts.with_streaming_response.create() as response:
with client.contacts.with_streaming_response.create(
phone_number="+1234567890",
) as response:
assert not response.is_closed
assert response.http_request.headers.get("X-Stainless-Lang") == "python"

Expand Down Expand Up @@ -276,7 +282,9 @@ class TestAsyncContacts:
@pytest.mark.skip(reason="Mock server tests are disabled")
@parametrize
async def test_method_create(self, async_client: AsyncSent) -> None:
contact = await async_client.contacts.create()
contact = await async_client.contacts.create(
phone_number="+1234567890",
)
assert_matches_type(APIResponseOfContact, contact, path=["response"])

@pytest.mark.skip(reason="Mock server tests are disabled")
Expand All @@ -293,7 +301,9 @@ async def test_method_create_with_all_params(self, async_client: AsyncSent) -> N
@pytest.mark.skip(reason="Mock server tests are disabled")
@parametrize
async def test_raw_response_create(self, async_client: AsyncSent) -> None:
response = await async_client.contacts.with_raw_response.create()
response = await async_client.contacts.with_raw_response.create(
phone_number="+1234567890",
)

assert response.is_closed is True
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
Expand All @@ -303,7 +313,9 @@ async def test_raw_response_create(self, async_client: AsyncSent) -> None:
@pytest.mark.skip(reason="Mock server tests are disabled")
@parametrize
async def test_streaming_response_create(self, async_client: AsyncSent) -> None:
async with async_client.contacts.with_streaming_response.create() as response:
async with async_client.contacts.with_streaming_response.create(
phone_number="+1234567890",
) as response:
assert not response.is_closed
assert response.http_request.headers.get("X-Stainless-Lang") == "python"

Expand Down
Loading