From 316dc946032fb0ceb64ae03a9ca03b00b687a92f Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Wed, 11 Mar 2026 23:32:22 +0000
Subject: [PATCH 01/15] codegen metadata
---
.stats.yml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/.stats.yml b/.stats.yml
index e284c0a..d06e1ef 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
configured_endpoints: 40
-openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent%2Fsent-dm-38aaadafbb2bf0c5d5bb9330a0a5e7a89052fe3e791569c8a12051e040193edf.yml
-openapi_spec_hash: 2d35c1223beebaf2c1b8d8a474cbf7c2
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent%2Fsent-dm-7d07f940431b5639f643a4f1b35fddb31c382750eee128f26d3117a7b2715be3.yml
+openapi_spec_hash: e16dd2048bf6170fab4a79fa447fafe1
config_hash: ad652575976c2c8db09e4575778f0e77
From ecd1295489e7c0a437906671fad77570caa3a352 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Thu, 12 Mar 2026 00:32:25 +0000
Subject: [PATCH 02/15] codegen metadata
---
.stats.yml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/.stats.yml b/.stats.yml
index d06e1ef..310eea2 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
configured_endpoints: 40
-openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent%2Fsent-dm-7d07f940431b5639f643a4f1b35fddb31c382750eee128f26d3117a7b2715be3.yml
-openapi_spec_hash: e16dd2048bf6170fab4a79fa447fafe1
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent%2Fsent-dm-1e9847292c05c78c15f923c8dda758bcb758c8c52d89dd26802b9e49da3c1320.yml
+openapi_spec_hash: 26169c0fff4b02a0199d1976bac7180d
config_hash: ad652575976c2c8db09e4575778f0e77
From d07b1bde47ec3f4e8ddb5ec2f170875d0180efba Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Thu, 12 Mar 2026 01:32:18 +0000
Subject: [PATCH 03/15] codegen metadata
---
.stats.yml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/.stats.yml b/.stats.yml
index 310eea2..e284c0a 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
configured_endpoints: 40
-openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent%2Fsent-dm-1e9847292c05c78c15f923c8dda758bcb758c8c52d89dd26802b9e49da3c1320.yml
-openapi_spec_hash: 26169c0fff4b02a0199d1976bac7180d
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent%2Fsent-dm-38aaadafbb2bf0c5d5bb9330a0a5e7a89052fe3e791569c8a12051e040193edf.yml
+openapi_spec_hash: 2d35c1223beebaf2c1b8d8a474cbf7c2
config_hash: ad652575976c2c8db09e4575778f0e77
From dd437220cec290cd480449d572b59d81b8ce4557 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Thu, 12 Mar 2026 02:32:26 +0000
Subject: [PATCH 04/15] codegen metadata
---
.stats.yml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/.stats.yml b/.stats.yml
index e284c0a..a66dcfe 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
configured_endpoints: 40
-openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent%2Fsent-dm-38aaadafbb2bf0c5d5bb9330a0a5e7a89052fe3e791569c8a12051e040193edf.yml
-openapi_spec_hash: 2d35c1223beebaf2c1b8d8a474cbf7c2
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent%2Fsent-dm-aa677fafd7dd18075e76b651884d5bf42b5516b575972e2543ccc5b5e8131789.yml
+openapi_spec_hash: 6d463c2c204428a1b150e7973368038c
config_hash: ad652575976c2c8db09e4575778f0e77
From 7bf80c981b9bce95af0cb0a1eecf2bbda6b9c849 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Thu, 12 Mar 2026 03:32:16 +0000
Subject: [PATCH 05/15] codegen metadata
---
.stats.yml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/.stats.yml b/.stats.yml
index a66dcfe..e284c0a 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
configured_endpoints: 40
-openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent%2Fsent-dm-aa677fafd7dd18075e76b651884d5bf42b5516b575972e2543ccc5b5e8131789.yml
-openapi_spec_hash: 6d463c2c204428a1b150e7973368038c
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent%2Fsent-dm-38aaadafbb2bf0c5d5bb9330a0a5e7a89052fe3e791569c8a12051e040193edf.yml
+openapi_spec_hash: 2d35c1223beebaf2c1b8d8a474cbf7c2
config_hash: ad652575976c2c8db09e4575778f0e77
From cc843dc308cd8b846a759de9c8b670272f9c71e5 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Thu, 12 Mar 2026 04:32:34 +0000
Subject: [PATCH 06/15] codegen metadata
---
.stats.yml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/.stats.yml b/.stats.yml
index e284c0a..4bff6d2 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
configured_endpoints: 40
-openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent%2Fsent-dm-38aaadafbb2bf0c5d5bb9330a0a5e7a89052fe3e791569c8a12051e040193edf.yml
-openapi_spec_hash: 2d35c1223beebaf2c1b8d8a474cbf7c2
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent%2Fsent-dm-be6397edd08ccd034fe9a58e7beab8c4177fa9f33d59e0441892539e85b4318f.yml
+openapi_spec_hash: be62625a49fd6644372264a951b6954a
config_hash: ad652575976c2c8db09e4575778f0e77
From 0cc65746adddf593bf88f17396c1ab127860af0d Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Thu, 12 Mar 2026 05:32:22 +0000
Subject: [PATCH 07/15] codegen metadata
---
.stats.yml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/.stats.yml b/.stats.yml
index 4bff6d2..80c05c7 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
configured_endpoints: 40
-openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent%2Fsent-dm-be6397edd08ccd034fe9a58e7beab8c4177fa9f33d59e0441892539e85b4318f.yml
-openapi_spec_hash: be62625a49fd6644372264a951b6954a
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent%2Fsent-dm-ca19b29d7fe8f8d2eb16138094e66d7a5e785f5b485e0b418ec2a4f5af41fc93.yml
+openapi_spec_hash: 54f92a7d6d717823182c068078cb19ed
config_hash: ad652575976c2c8db09e4575778f0e77
From efeab482b92fc38dc923b14b40c85df3452beb21 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Thu, 12 Mar 2026 06:32:17 +0000
Subject: [PATCH 08/15] codegen metadata
---
.stats.yml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/.stats.yml b/.stats.yml
index 80c05c7..310eea2 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
configured_endpoints: 40
-openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent%2Fsent-dm-ca19b29d7fe8f8d2eb16138094e66d7a5e785f5b485e0b418ec2a4f5af41fc93.yml
-openapi_spec_hash: 54f92a7d6d717823182c068078cb19ed
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent%2Fsent-dm-1e9847292c05c78c15f923c8dda758bcb758c8c52d89dd26802b9e49da3c1320.yml
+openapi_spec_hash: 26169c0fff4b02a0199d1976bac7180d
config_hash: ad652575976c2c8db09e4575778f0e77
From f6ff0f27f492851d9faed4f2d894939ea0cb3277 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Thu, 12 Mar 2026 07:32:17 +0000
Subject: [PATCH 09/15] codegen metadata
---
.stats.yml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/.stats.yml b/.stats.yml
index 310eea2..e284c0a 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
configured_endpoints: 40
-openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent%2Fsent-dm-1e9847292c05c78c15f923c8dda758bcb758c8c52d89dd26802b9e49da3c1320.yml
-openapi_spec_hash: 26169c0fff4b02a0199d1976bac7180d
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent%2Fsent-dm-38aaadafbb2bf0c5d5bb9330a0a5e7a89052fe3e791569c8a12051e040193edf.yml
+openapi_spec_hash: 2d35c1223beebaf2c1b8d8a474cbf7c2
config_hash: ad652575976c2c8db09e4575778f0e77
From 42a3b0ed01ad9db6bf7d0a899d71831fbfbcd861 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Thu, 12 Mar 2026 10:48:31 +0000
Subject: [PATCH 10/15] feat(api): api update
---
.stats.yml | 4 +-
src/sent_dm/resources/messages.py | 6 +-
src/sent_dm/resources/profiles/campaigns.py | 8 +-
src/sent_dm/resources/profiles/profiles.py | 82 ++++++++-----------
src/sent_dm/resources/templates.py | 12 ++-
src/sent_dm/types/api_response_of_contact.py | 6 +-
.../types/api_response_of_profile_detail.py | 6 +-
src/sent_dm/types/api_response_of_user.py | 6 +-
src/sent_dm/types/api_response_template.py | 6 +-
src/sent_dm/types/api_response_webhook.py | 4 +-
src/sent_dm/types/brands_brand_data_param.py | 6 +-
src/sent_dm/types/contact_list_response.py | 10 +--
src/sent_dm/types/me_retrieve_response.py | 49 ++++++++---
.../message_retrieve_activities_response.py | 8 +-
.../types/message_retrieve_status_response.py | 8 +-
src/sent_dm/types/message_send_params.py | 9 +-
src/sent_dm/types/message_send_response.py | 8 +-
src/sent_dm/types/number_lookup_response.py | 4 +-
src/sent_dm/types/pagination_meta.py | 4 +-
src/sent_dm/types/profile_create_params.py | 37 ++++-----
src/sent_dm/types/profile_detail.py | 27 ++----
src/sent_dm/types/profile_list_response.py | 8 +-
src/sent_dm/types/profile_update_params.py | 21 ++---
...response_of_tcr_campaign_with_use_cases.py | 4 +-
.../types/profiles/campaign_create_params.py | 2 +-
.../types/profiles/campaign_list_response.py | 4 +-
.../types/profiles/campaign_update_params.py | 2 +-
..._campaigns_campaign_use_case_data_param.py | 1 -
...quests_brands_brand_business_info_param.py | 1 -
...ests_brands_brand_compliance_info_param.py | 2 -
src/sent_dm/types/template_create_params.py | 5 +-
.../types/template_definition_param.py | 11 +--
src/sent_dm/types/template_list_response.py | 10 +--
src/sent_dm/types/template_update_params.py | 5 +-
src/sent_dm/types/user_list_response.py | 8 +-
.../webhook_list_event_types_response.py | 4 +-
.../types/webhook_list_events_response.py | 4 +-
src/sent_dm/types/webhook_list_response.py | 4 +-
.../types/webhook_rotate_secret_response.py | 4 +-
src/sent_dm/types/webhook_test_response.py | 4 +-
40 files changed, 204 insertions(+), 210 deletions(-)
diff --git a/.stats.yml b/.stats.yml
index e284c0a..3aec758 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
configured_endpoints: 40
-openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent%2Fsent-dm-38aaadafbb2bf0c5d5bb9330a0a5e7a89052fe3e791569c8a12051e040193edf.yml
-openapi_spec_hash: 2d35c1223beebaf2c1b8d8a474cbf7c2
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent%2Fsent-dm-2566cdc5d8e0bffe2a8c442692b0fc1b35d3bfe7e9bf578331fc19d402361c1f.yml
+openapi_spec_hash: 85e1feeb9bbc8d59bb34d6cdd679575a
config_hash: ad652575976c2c8db09e4575778f0e77
diff --git a/src/sent_dm/resources/messages.py b/src/sent_dm/resources/messages.py
index d1395fa..530970a 100644
--- a/src/sent_dm/resources/messages.py
+++ b/src/sent_dm/resources/messages.py
@@ -153,7 +153,8 @@ def send(
sandbox: Sandbox flag - when true, the operation is simulated without side effects Useful
for testing integrations without actual execution
- template: Template reference (by id or name, with optional parameters)
+ template: SDK-style template reference: resolve by ID or by name, with optional
+ parameters.
to: List of recipient phone numbers in E.164 format (multi-recipient fan-out)
@@ -320,7 +321,8 @@ async def send(
sandbox: Sandbox flag - when true, the operation is simulated without side effects Useful
for testing integrations without actual execution
- template: Template reference (by id or name, with optional parameters)
+ template: SDK-style template reference: resolve by ID or by name, with optional
+ parameters.
to: List of recipient phone numbers in E.164 format (multi-recipient fan-out)
diff --git a/src/sent_dm/resources/profiles/campaigns.py b/src/sent_dm/resources/profiles/campaigns.py
index 941865e..84eb013 100644
--- a/src/sent_dm/resources/profiles/campaigns.py
+++ b/src/sent_dm/resources/profiles/campaigns.py
@@ -66,7 +66,7 @@ def create(
campaign must include at least one use case with sample messages.
Args:
- campaign: Campaign data
+ campaign: Campaign data for create or update operation
sandbox: Sandbox flag - when true, the operation is simulated without side effects Useful
for testing integrations without actual execution
@@ -127,7 +127,7 @@ def update(
update campaigns that have already been submitted to TCR.
Args:
- campaign: Campaign data
+ campaign: Campaign data for create or update operation
sandbox: Sandbox flag - when true, the operation is simulated without side effects Useful
for testing integrations without actual execution
@@ -293,7 +293,7 @@ async def create(
campaign must include at least one use case with sample messages.
Args:
- campaign: Campaign data
+ campaign: Campaign data for create or update operation
sandbox: Sandbox flag - when true, the operation is simulated without side effects Useful
for testing integrations without actual execution
@@ -354,7 +354,7 @@ async def update(
update campaigns that have already been submitted to TCR.
Args:
- campaign: Campaign data
+ campaign: Campaign data for create or update operation
sandbox: Sandbox flag - when true, the operation is simulated without side effects Useful
for testing integrations without actual execution
diff --git a/src/sent_dm/resources/profiles/profiles.py b/src/sent_dm/resources/profiles/profiles.py
index ee8a4b7..503c219 100644
--- a/src/sent_dm/resources/profiles/profiles.py
+++ b/src/sent_dm/resources/profiles/profiles.py
@@ -139,9 +139,8 @@ def create(
allow_template_sharing: Whether templates are shared across profiles (default: false)
- billing_contact: Billing contact for this profile. Required when billing_model is "profile" or
- "profile_and_organization". Identifies who receives invoices and who is
- responsible for payment.
+ billing_contact: Billing contact information for a profile. Required when billing_model is
+ "profile" or "profile_and_organization".
billing_model:
Billing model: profile, organization, or profile_and_organization (default:
@@ -153,9 +152,7 @@ def create(
- "profile_and_organization": the profile is billed first with the organization
as fallback; billing_contact is required.
- brand: Brand and KYC information for this profile (optional). When provided, creates
- the brand associated with this profile. Cannot be set when inherit_tcr_brand is
- true.
+ brand: Brand and KYC data grouped into contact, business, and compliance sections
description: Profile description (optional)
@@ -171,9 +168,9 @@ def create(
name: Profile name (required)
- payment_details: Payment card details for this profile (optional). Accepted when billing_model is
- "profile" or "profile_and_organization". Not persisted on our servers —
- forwarded to the payment processor.
+ payment_details: Payment card details for a profile. Accepted when billing_model is "profile" or
+ "profile_and_organization". These details are not stored on our servers and will
+ be forwarded to the payment processor.
sandbox: Sandbox flag - when true, the operation is simulated without side effects Useful
for testing integrations without actual execution
@@ -182,11 +179,11 @@ def create(
only letters, numbers, and spaces, and include at least one letter. Example:
"SALES", "Mkt 2", "Support1".
- whatsapp_business_account: Direct WhatsApp Business Account credentials for this profile. When provided,
- the profile uses its own WhatsApp Business Account instead of inheriting from
- the organization. When omitted, the profile inherits the organization's WhatsApp
- Business Account (requires the organization to have completed WhatsApp Embedded
- Signup).
+ whatsapp_business_account: Direct WhatsApp Business Account credentials for a profile. Use this when the
+ profile should have its own WhatsApp Business Account instead of inheriting from
+ the organization. Credentials must be obtained from Meta Business Manager by
+ creating a System User with whatsapp_business_messaging and
+ whatsapp_business_management scopes.
extra_headers: Send extra headers
@@ -332,9 +329,8 @@ def update(
allow_template_sharing: Whether templates are shared across profiles (optional)
- billing_contact: Billing contact for this profile. Required when billing_model is "profile" or
- "profile_and_organization" and no billing contact has been configured yet.
- Identifies who receives invoices and who is responsible for payment.
+ billing_contact: Billing contact information for a profile. Required when billing_model is
+ "profile" or "profile_and_organization".
billing_model: Billing model: profile, organization, or profile_and_organization (optional).
@@ -344,10 +340,7 @@ def update(
- "profile_and_organization": the profile is billed first with the organization
as fallback; billing_contact is required.
- brand: Brand and KYC information for this profile (optional). When provided, creates or
- updates the brand associated with this profile. Cannot be set when
- inherit_tcr_brand is true. Once a brand has been submitted to TCR it cannot be
- modified.
+ brand: Brand and KYC data grouped into contact, business, and compliance sections
description: Profile description (optional)
@@ -363,9 +356,9 @@ def update(
name: Profile name (optional)
- payment_details: Payment card details for this profile (optional). Accepted when billing_model is
- "profile" or "profile_and_organization". Not persisted on our servers —
- forwarded to the payment processor.
+ payment_details: Payment card details for a profile. Accepted when billing_model is "profile" or
+ "profile_and_organization". These details are not stored on our servers and will
+ be forwarded to the payment processor.
sandbox: Sandbox flag - when true, the operation is simulated without side effects Useful
for testing integrations without actual execution
@@ -687,9 +680,8 @@ async def create(
allow_template_sharing: Whether templates are shared across profiles (default: false)
- billing_contact: Billing contact for this profile. Required when billing_model is "profile" or
- "profile_and_organization". Identifies who receives invoices and who is
- responsible for payment.
+ billing_contact: Billing contact information for a profile. Required when billing_model is
+ "profile" or "profile_and_organization".
billing_model:
Billing model: profile, organization, or profile_and_organization (default:
@@ -701,9 +693,7 @@ async def create(
- "profile_and_organization": the profile is billed first with the organization
as fallback; billing_contact is required.
- brand: Brand and KYC information for this profile (optional). When provided, creates
- the brand associated with this profile. Cannot be set when inherit_tcr_brand is
- true.
+ brand: Brand and KYC data grouped into contact, business, and compliance sections
description: Profile description (optional)
@@ -719,9 +709,9 @@ async def create(
name: Profile name (required)
- payment_details: Payment card details for this profile (optional). Accepted when billing_model is
- "profile" or "profile_and_organization". Not persisted on our servers —
- forwarded to the payment processor.
+ payment_details: Payment card details for a profile. Accepted when billing_model is "profile" or
+ "profile_and_organization". These details are not stored on our servers and will
+ be forwarded to the payment processor.
sandbox: Sandbox flag - when true, the operation is simulated without side effects Useful
for testing integrations without actual execution
@@ -730,11 +720,11 @@ async def create(
only letters, numbers, and spaces, and include at least one letter. Example:
"SALES", "Mkt 2", "Support1".
- whatsapp_business_account: Direct WhatsApp Business Account credentials for this profile. When provided,
- the profile uses its own WhatsApp Business Account instead of inheriting from
- the organization. When omitted, the profile inherits the organization's WhatsApp
- Business Account (requires the organization to have completed WhatsApp Embedded
- Signup).
+ whatsapp_business_account: Direct WhatsApp Business Account credentials for a profile. Use this when the
+ profile should have its own WhatsApp Business Account instead of inheriting from
+ the organization. Credentials must be obtained from Meta Business Manager by
+ creating a System User with whatsapp_business_messaging and
+ whatsapp_business_management scopes.
extra_headers: Send extra headers
@@ -880,9 +870,8 @@ async def update(
allow_template_sharing: Whether templates are shared across profiles (optional)
- billing_contact: Billing contact for this profile. Required when billing_model is "profile" or
- "profile_and_organization" and no billing contact has been configured yet.
- Identifies who receives invoices and who is responsible for payment.
+ billing_contact: Billing contact information for a profile. Required when billing_model is
+ "profile" or "profile_and_organization".
billing_model: Billing model: profile, organization, or profile_and_organization (optional).
@@ -892,10 +881,7 @@ async def update(
- "profile_and_organization": the profile is billed first with the organization
as fallback; billing_contact is required.
- brand: Brand and KYC information for this profile (optional). When provided, creates or
- updates the brand associated with this profile. Cannot be set when
- inherit_tcr_brand is true. Once a brand has been submitted to TCR it cannot be
- modified.
+ brand: Brand and KYC data grouped into contact, business, and compliance sections
description: Profile description (optional)
@@ -911,9 +897,9 @@ async def update(
name: Profile name (optional)
- payment_details: Payment card details for this profile (optional). Accepted when billing_model is
- "profile" or "profile_and_organization". Not persisted on our servers —
- forwarded to the payment processor.
+ payment_details: Payment card details for a profile. Accepted when billing_model is "profile" or
+ "profile_and_organization". These details are not stored on our servers and will
+ be forwarded to the payment processor.
sandbox: Sandbox flag - when true, the operation is simulated without side effects Useful
for testing integrations without actual execution
diff --git a/src/sent_dm/resources/templates.py b/src/sent_dm/resources/templates.py
index 6a1c138..174f768 100644
--- a/src/sent_dm/resources/templates.py
+++ b/src/sent_dm/resources/templates.py
@@ -82,7 +82,8 @@ def create(
creation_source: Source of template creation (default: from-api)
- definition: Template definition including header, body, footer, and buttons
+ definition: Complete definition of a message template including header, body, footer, and
+ buttons
language: Template language code (e.g., en_US) (optional, auto-detected if not provided)
@@ -190,7 +191,8 @@ def update(
Args:
category: Template category: MARKETING, UTILITY, AUTHENTICATION
- definition: Template definition including header, body, footer, and buttons
+ definition: Complete definition of a message template including header, body, footer, and
+ buttons
language: Template language code (e.g., en_US)
@@ -410,7 +412,8 @@ async def create(
creation_source: Source of template creation (default: from-api)
- definition: Template definition including header, body, footer, and buttons
+ definition: Complete definition of a message template including header, body, footer, and
+ buttons
language: Template language code (e.g., en_US) (optional, auto-detected if not provided)
@@ -518,7 +521,8 @@ async def update(
Args:
category: Template category: MARKETING, UTILITY, AUTHENTICATION
- definition: Template definition including header, body, footer, and buttons
+ definition: Complete definition of a message template including header, body, footer, and
+ buttons
language: Template language code (e.g., en_US)
diff --git a/src/sent_dm/types/api_response_of_contact.py b/src/sent_dm/types/api_response_of_contact.py
index 18ddd9d..bdcbe65 100644
--- a/src/sent_dm/types/api_response_of_contact.py
+++ b/src/sent_dm/types/api_response_of_contact.py
@@ -14,13 +14,13 @@ class APIResponseOfContact(BaseModel):
"""Standard API response envelope for all v3 endpoints"""
data: Optional[ContactResponse] = None
- """The response data (null if error)"""
+ """Contact response for v3 API Uses snake_case for JSON property names"""
error: Optional[APIError] = None
- """Error details (null if successful)"""
+ """Error information"""
meta: Optional[APIMeta] = None
- """Metadata about the request and response"""
+ """Request and response metadata"""
success: Optional[bool] = None
"""Indicates whether the request was successful"""
diff --git a/src/sent_dm/types/api_response_of_profile_detail.py b/src/sent_dm/types/api_response_of_profile_detail.py
index df75d04..64335f5 100644
--- a/src/sent_dm/types/api_response_of_profile_detail.py
+++ b/src/sent_dm/types/api_response_of_profile_detail.py
@@ -14,13 +14,13 @@ class APIResponseOfProfileDetail(BaseModel):
"""Standard API response envelope for all v3 endpoints"""
data: Optional[ProfileDetail] = None
- """The response data (null if error)"""
+ """Detailed profile response for v3 API"""
error: Optional[APIError] = None
- """Error details (null if successful)"""
+ """Error information"""
meta: Optional[APIMeta] = None
- """Metadata about the request and response"""
+ """Request and response metadata"""
success: Optional[bool] = None
"""Indicates whether the request was successful"""
diff --git a/src/sent_dm/types/api_response_of_user.py b/src/sent_dm/types/api_response_of_user.py
index 62b90fc..7a21d69 100644
--- a/src/sent_dm/types/api_response_of_user.py
+++ b/src/sent_dm/types/api_response_of_user.py
@@ -14,13 +14,13 @@ class APIResponseOfUser(BaseModel):
"""Standard API response envelope for all v3 endpoints"""
data: Optional[UserResponse] = None
- """The response data (null if error)"""
+ """User response for v3 API"""
error: Optional[APIError] = None
- """Error details (null if successful)"""
+ """Error information"""
meta: Optional[APIMeta] = None
- """Metadata about the request and response"""
+ """Request and response metadata"""
success: Optional[bool] = None
"""Indicates whether the request was successful"""
diff --git a/src/sent_dm/types/api_response_template.py b/src/sent_dm/types/api_response_template.py
index 283b52e..25045be 100644
--- a/src/sent_dm/types/api_response_template.py
+++ b/src/sent_dm/types/api_response_template.py
@@ -14,13 +14,13 @@ class APIResponseTemplate(BaseModel):
"""Standard API response envelope for all v3 endpoints"""
data: Optional[Template] = None
- """The response data (null if error)"""
+ """Template response for v3 API"""
error: Optional[APIError] = None
- """Error details (null if successful)"""
+ """Error information"""
meta: Optional[APIMeta] = None
- """Metadata about the request and response"""
+ """Request and response metadata"""
success: Optional[bool] = None
"""Indicates whether the request was successful"""
diff --git a/src/sent_dm/types/api_response_webhook.py b/src/sent_dm/types/api_response_webhook.py
index 6ec56e6..9f8f594 100644
--- a/src/sent_dm/types/api_response_webhook.py
+++ b/src/sent_dm/types/api_response_webhook.py
@@ -17,10 +17,10 @@ class APIResponseWebhook(BaseModel):
"""The response data (null if error)"""
error: Optional[APIError] = None
- """Error details (null if successful)"""
+ """Error information"""
meta: Optional[APIMeta] = None
- """Metadata about the request and response"""
+ """Request and response metadata"""
success: Optional[bool] = None
"""Indicates whether the request was successful"""
diff --git a/src/sent_dm/types/brands_brand_data_param.py b/src/sent_dm/types/brands_brand_data_param.py
index c0e5db7..02ea9ed 100644
--- a/src/sent_dm/types/brands_brand_data_param.py
+++ b/src/sent_dm/types/brands_brand_data_param.py
@@ -22,10 +22,10 @@ class BrandsBrandDataParam(TypedDict, total=False):
"""Brand and KYC data grouped into contact, business, and compliance sections"""
compliance: Required[SentDmServicesEndpointsCustomerApIv3ContractsRequestsBrandsBrandComplianceInfoParam]
- """Compliance and TCR-related information"""
+ """Compliance and TCR information for brand registration"""
contact: Required[SentDmServicesEndpointsCustomerApIv3ContractsRequestsBrandsBrandContactInfoParam]
- """Contact information for the brand"""
+ """Contact information for brand KYC"""
business: Optional[SentDmServicesEndpointsCustomerApIv3ContractsRequestsBrandsBrandBusinessInfoParam]
- """Business details and address information"""
+ """Business details and address for brand KYC"""
diff --git a/src/sent_dm/types/contact_list_response.py b/src/sent_dm/types/contact_list_response.py
index b10fd39..9727745 100644
--- a/src/sent_dm/types/contact_list_response.py
+++ b/src/sent_dm/types/contact_list_response.py
@@ -12,26 +12,26 @@
class Data(BaseModel):
- """The response data (null if error)"""
+ """Paginated list of contacts response"""
contacts: Optional[List[ContactResponse]] = None
"""List of contacts"""
pagination: Optional[PaginationMeta] = None
- """Pagination metadata"""
+ """Pagination metadata for list responses"""
class ContactListResponse(BaseModel):
"""Standard API response envelope for all v3 endpoints"""
data: Optional[Data] = None
- """The response data (null if error)"""
+ """Paginated list of contacts response"""
error: Optional[APIError] = None
- """Error details (null if successful)"""
+ """Error information"""
meta: Optional[APIMeta] = None
- """Metadata about the request and response"""
+ """Request and response metadata"""
success: Optional[bool] = None
"""Indicates whether the request was successful"""
diff --git a/src/sent_dm/types/me_retrieve_response.py b/src/sent_dm/types/me_retrieve_response.py
index 151f9f3..dd86ed0 100644
--- a/src/sent_dm/types/me_retrieve_response.py
+++ b/src/sent_dm/types/me_retrieve_response.py
@@ -20,7 +20,7 @@
class DataChannelsRcs(BaseModel):
- """RCS channel (provider: vibes)"""
+ """RCS channel configuration. When configured, includes the RCS phone number."""
configured: Optional[bool] = None
"""Whether RCS is configured for this account"""
@@ -30,7 +30,7 @@ class DataChannelsRcs(BaseModel):
class DataChannelsSMS(BaseModel):
- """SMS channel (providers: telnyx, sinch)"""
+ """SMS channel configuration. When configured, includes the sending phone number."""
configured: Optional[bool] = None
"""Whether SMS is configured for this account"""
@@ -40,7 +40,11 @@ class DataChannelsSMS(BaseModel):
class DataChannelsWhatsapp(BaseModel):
- """WhatsApp Business channel (provider: meta)"""
+ """WhatsApp Business channel configuration.
+
+ When configured, includes the WhatsApp phone number
+ and business name.
+ """
business_name: Optional[str] = None
"""WhatsApp Business display name"""
@@ -53,16 +57,23 @@ class DataChannelsWhatsapp(BaseModel):
class DataChannels(BaseModel):
- """Messaging channel configuration"""
+ """Messaging channel configuration.
+
+ All three channels are always present.
+ Each channel has a "configured" flag; configured channels expose additional details.
+ """
rcs: Optional[DataChannelsRcs] = None
- """RCS channel (provider: vibes)"""
+ """RCS channel configuration. When configured, includes the RCS phone number."""
sms: Optional[DataChannelsSMS] = None
- """SMS channel (providers: telnyx, sinch)"""
+ """SMS channel configuration. When configured, includes the sending phone number."""
whatsapp: Optional[DataChannelsWhatsapp] = None
- """WhatsApp Business channel (provider: meta)"""
+ """WhatsApp Business channel configuration.
+
+ When configured, includes the WhatsApp phone number and business name.
+ """
class DataProfile(BaseModel):
@@ -100,13 +111,21 @@ class DataProfile(BaseModel):
class Data(BaseModel):
- """The response data (null if error)"""
+ """
+ Account response for GET /v3/me endpoint.
+ Returns organization (with profiles), user (standalone), or profile (child of an organization)
+ data depending on the API key type. Always includes messaging channel configuration.
+ """
id: Optional[str] = None
"""Customer ID (organization, account, or profile)"""
channels: Optional[DataChannels] = None
- """Messaging channel configuration"""
+ """Messaging channel configuration.
+
+ All three channels are always present. Each channel has a "configured" flag;
+ configured channels expose additional details.
+ """
created_at: Optional[datetime] = None
"""When the account was created"""
@@ -133,7 +152,7 @@ class Data(BaseModel):
"""
settings: Optional[ProfileSettings] = None
- """Profile settings (only for profile type)"""
+ """Profile configuration settings"""
short_name: Optional[str] = None
"""Short name / abbreviation (only for profile type)"""
@@ -155,13 +174,17 @@ class MeRetrieveResponse(BaseModel):
"""Standard API response envelope for all v3 endpoints"""
data: Optional[Data] = None
- """The response data (null if error)"""
+ """
+ Account response for GET /v3/me endpoint. Returns organization (with profiles),
+ user (standalone), or profile (child of an organization) data depending on the
+ API key type. Always includes messaging channel configuration.
+ """
error: Optional[APIError] = None
- """Error details (null if successful)"""
+ """Error information"""
meta: Optional[APIMeta] = None
- """Metadata about the request and response"""
+ """Request and response metadata"""
success: Optional[bool] = None
"""Indicates whether the request was successful"""
diff --git a/src/sent_dm/types/message_retrieve_activities_response.py b/src/sent_dm/types/message_retrieve_activities_response.py
index 1dcf737..986492b 100644
--- a/src/sent_dm/types/message_retrieve_activities_response.py
+++ b/src/sent_dm/types/message_retrieve_activities_response.py
@@ -36,7 +36,7 @@ class DataActivity(BaseModel):
class Data(BaseModel):
- """The response data (null if error)"""
+ """Response for GET /messages/{id}/activities"""
activities: Optional[List[DataActivity]] = None
"""List of activity events ordered by most recent first"""
@@ -49,13 +49,13 @@ class MessageRetrieveActivitiesResponse(BaseModel):
"""Standard API response envelope for all v3 endpoints"""
data: Optional[Data] = None
- """The response data (null if error)"""
+ """Response for GET /messages/{id}/activities"""
error: Optional[APIError] = None
- """Error details (null if successful)"""
+ """Error information"""
meta: Optional[APIMeta] = None
- """Metadata about the request and response"""
+ """Request and response metadata"""
success: Optional[bool] = None
"""Indicates whether the request was successful"""
diff --git a/src/sent_dm/types/message_retrieve_status_response.py b/src/sent_dm/types/message_retrieve_status_response.py
index 4e0c015..20f7bc9 100644
--- a/src/sent_dm/types/message_retrieve_status_response.py
+++ b/src/sent_dm/types/message_retrieve_status_response.py
@@ -42,7 +42,7 @@ class DataMessageBody(BaseModel):
class Data(BaseModel):
- """The response data (null if error)"""
+ """Message response for v3 API — same shape as v2 with snake_case JSON conventions"""
id: Optional[str] = None
@@ -85,13 +85,13 @@ class MessageRetrieveStatusResponse(BaseModel):
"""Standard API response envelope for all v3 endpoints"""
data: Optional[Data] = None
- """The response data (null if error)"""
+ """Message response for v3 API — same shape as v2 with snake_case JSON conventions"""
error: Optional[APIError] = None
- """Error details (null if successful)"""
+ """Error information"""
meta: Optional[APIMeta] = None
- """Metadata about the request and response"""
+ """Request and response metadata"""
success: Optional[bool] = None
"""Indicates whether the request was successful"""
diff --git a/src/sent_dm/types/message_send_params.py b/src/sent_dm/types/message_send_params.py
index 701be84..5645c2f 100644
--- a/src/sent_dm/types/message_send_params.py
+++ b/src/sent_dm/types/message_send_params.py
@@ -27,7 +27,10 @@ class MessageSendParams(TypedDict, total=False):
"""
template: Template
- """Template reference (by id or name, with optional parameters)"""
+ """
+ SDK-style template reference: resolve by ID or by name, with optional
+ parameters.
+ """
to: SequenceNotStr[str]
"""List of recipient phone numbers in E.164 format (multi-recipient fan-out)"""
@@ -38,7 +41,9 @@ class MessageSendParams(TypedDict, total=False):
class Template(TypedDict, total=False):
- """Template reference (by id or name, with optional parameters)"""
+ """
+ SDK-style template reference: resolve by ID or by name, with optional parameters.
+ """
id: Optional[str]
"""Template ID (mutually exclusive with name)"""
diff --git a/src/sent_dm/types/message_send_response.py b/src/sent_dm/types/message_send_response.py
index fade660..44541da 100644
--- a/src/sent_dm/types/message_send_response.py
+++ b/src/sent_dm/types/message_send_response.py
@@ -26,7 +26,7 @@ class DataRecipient(BaseModel):
class Data(BaseModel):
- """The response data (null if error)"""
+ """Response for the multi-recipient send message endpoint"""
body: Optional[str] = None
"""Resolved template body text"""
@@ -48,13 +48,13 @@ class MessageSendResponse(BaseModel):
"""Standard API response envelope for all v3 endpoints"""
data: Optional[Data] = None
- """The response data (null if error)"""
+ """Response for the multi-recipient send message endpoint"""
error: Optional[APIError] = None
- """Error details (null if successful)"""
+ """Error information"""
meta: Optional[APIMeta] = None
- """Metadata about the request and response"""
+ """Request and response metadata"""
success: Optional[bool] = None
"""Indicates whether the request was successful"""
diff --git a/src/sent_dm/types/number_lookup_response.py b/src/sent_dm/types/number_lookup_response.py
index dd07228..ece5b95 100644
--- a/src/sent_dm/types/number_lookup_response.py
+++ b/src/sent_dm/types/number_lookup_response.py
@@ -38,10 +38,10 @@ class NumberLookupResponse(BaseModel):
"""The response data (null if error)"""
error: Optional[APIError] = None
- """Error details (null if successful)"""
+ """Error information"""
meta: Optional[APIMeta] = None
- """Metadata about the request and response"""
+ """Request and response metadata"""
success: Optional[bool] = None
"""Indicates whether the request was successful"""
diff --git a/src/sent_dm/types/pagination_meta.py b/src/sent_dm/types/pagination_meta.py
index e18950d..cbd38f5 100644
--- a/src/sent_dm/types/pagination_meta.py
+++ b/src/sent_dm/types/pagination_meta.py
@@ -8,7 +8,7 @@
class Cursors(BaseModel):
- """Cursor-based pagination (optional)"""
+ """Cursor-based pagination pointers"""
after: Optional[str] = None
"""Cursor to fetch the next page"""
@@ -21,7 +21,7 @@ class PaginationMeta(BaseModel):
"""Pagination metadata for list responses"""
cursors: Optional[Cursors] = None
- """Cursor-based pagination (optional)"""
+ """Cursor-based pagination pointers"""
has_more: Optional[bool] = None
"""Whether there are more pages after this one"""
diff --git a/src/sent_dm/types/profile_create_params.py b/src/sent_dm/types/profile_create_params.py
index 9f8d194..0579b77 100644
--- a/src/sent_dm/types/profile_create_params.py
+++ b/src/sent_dm/types/profile_create_params.py
@@ -21,10 +21,9 @@ class ProfileCreateParams(TypedDict, total=False):
"""Whether templates are shared across profiles (default: false)"""
billing_contact: Optional[BillingContactInfoParam]
- """Billing contact for this profile.
-
- Required when billing_model is "profile" or "profile_and_organization".
- Identifies who receives invoices and who is responsible for payment.
+ """
+ Billing contact information for a profile. Required when billing_model is
+ "profile" or "profile_and_organization".
"""
billing_model: Optional[str]
@@ -40,11 +39,7 @@ class ProfileCreateParams(TypedDict, total=False):
"""
brand: Optional[BrandsBrandDataParam]
- """
- Brand and KYC information for this profile (optional). When provided, creates
- the brand associated with this profile. Cannot be set when inherit_tcr_brand is
- true.
- """
+ """Brand and KYC data grouped into contact, business, and compliance sections"""
description: Optional[str]
"""Profile description (optional)"""
@@ -69,9 +64,9 @@ class ProfileCreateParams(TypedDict, total=False):
payment_details: Optional[PaymentDetailsParam]
"""
- Payment card details for this profile (optional). Accepted when billing_model is
- "profile" or "profile_and_organization". Not persisted on our servers —
- forwarded to the payment processor.
+ Payment card details for a profile. Accepted when billing_model is "profile" or
+ "profile_and_organization". These details are not stored on our servers and will
+ be forwarded to the payment processor.
"""
sandbox: bool
@@ -89,11 +84,11 @@ class ProfileCreateParams(TypedDict, total=False):
whatsapp_business_account: Optional[WhatsappBusinessAccount]
"""
- Direct WhatsApp Business Account credentials for this profile. When provided,
- the profile uses its own WhatsApp Business Account instead of inheriting from
- the organization. When omitted, the profile inherits the organization's WhatsApp
- Business Account (requires the organization to have completed WhatsApp Embedded
- Signup).
+ Direct WhatsApp Business Account credentials for a profile. Use this when the
+ profile should have its own WhatsApp Business Account instead of inheriting from
+ the organization. Credentials must be obtained from Meta Business Manager by
+ creating a System User with whatsapp_business_messaging and
+ whatsapp_business_management scopes.
"""
idempotency_key: Annotated[str, PropertyInfo(alias="Idempotency-Key")]
@@ -103,10 +98,10 @@ class ProfileCreateParams(TypedDict, total=False):
class WhatsappBusinessAccount(TypedDict, total=False):
"""
- Direct WhatsApp Business Account credentials for this profile.
- When provided, the profile uses its own WhatsApp Business Account instead of inheriting from the organization.
- When omitted, the profile inherits the organization's WhatsApp Business Account (requires the organization
- to have completed WhatsApp Embedded Signup).
+ Direct WhatsApp Business Account credentials for a profile.
+ Use this when the profile should have its own WhatsApp Business Account instead of inheriting from the organization.
+ Credentials must be obtained from Meta Business Manager by creating a System User with
+ whatsapp_business_messaging and whatsapp_business_management scopes.
"""
access_token: Required[str]
diff --git a/src/sent_dm/types/profile_detail.py b/src/sent_dm/types/profile_detail.py
index 1bc7437..ef3f734 100644
--- a/src/sent_dm/types/profile_detail.py
+++ b/src/sent_dm/types/profile_detail.py
@@ -13,10 +13,7 @@
class BillingContact(BaseModel):
- """Billing contact for this profile.
-
- Present when billing_model is "profile" or "profile_and_organization".
- """
+ """Billing contact info returned in profile responses"""
address: Optional[str] = None
@@ -68,7 +65,6 @@ class BrandCompliance(BaseModel):
"""Compliance and TCR-related information"""
brand_relationship: Optional[TcrBrandRelationship] = None
- """Brand relationship level with TCR"""
destination_countries: Optional[List[DestinationCountry]] = None
"""List of destination countries for messaging"""
@@ -89,7 +85,6 @@ class BrandCompliance(BaseModel):
"""Primary messaging use case description"""
vertical: Optional[TcrVertical] = None
- """Business vertical/industry category"""
class BrandContact(BaseModel):
@@ -115,10 +110,8 @@ class BrandContact(BaseModel):
class Brand(BaseModel):
- """Brand associated with this profile.
-
- Null if no brand has been configured yet.
- Includes KYC information and TCR registration status.
+ """
+ Brand response with nested contact, business, and compliance sections — mirrors the request structure.
"""
id: Optional[str] = None
@@ -140,13 +133,11 @@ class Brand(BaseModel):
"""CSP (Campaign Service Provider) ID"""
identity_status: Optional[Literal["SELF_DECLARED", "UNVERIFIED", "VERIFIED", "VETTED_VERIFIED"]] = None
- """TCR brand identity verification status"""
is_inherited: Optional[bool] = None
"""Whether this brand is inherited from the parent organization"""
status: Optional[Literal["ACTIVE", "INACTIVE", "SUSPENDED"]] = None
- """TCR brand status"""
submitted_at: Optional[datetime] = None
"""When the brand was submitted to TCR"""
@@ -180,19 +171,15 @@ class ProfileDetail(BaseModel):
"""Whether templates are shared across profiles in the organization"""
billing_contact: Optional[BillingContact] = None
- """Billing contact for this profile.
-
- Present when billing_model is "profile" or "profile_and_organization".
- """
+ """Billing contact info returned in profile responses"""
billing_model: Optional[str] = None
"""Billing model: profile, organization, or profile_and_organization"""
brand: Optional[Brand] = None
- """Brand associated with this profile.
-
- Null if no brand has been configured yet. Includes KYC information and TCR
- registration status.
+ """
+ Brand response with nested contact, business, and compliance sections — mirrors
+ the request structure.
"""
created_at: Optional[datetime] = None
diff --git a/src/sent_dm/types/profile_list_response.py b/src/sent_dm/types/profile_list_response.py
index 01d729f..f54be3d 100644
--- a/src/sent_dm/types/profile_list_response.py
+++ b/src/sent_dm/types/profile_list_response.py
@@ -11,7 +11,7 @@
class Data(BaseModel):
- """The response data (null if error)"""
+ """List of profiles response"""
profiles: Optional[List[ProfileDetail]] = None
"""List of profiles in the organization"""
@@ -21,13 +21,13 @@ class ProfileListResponse(BaseModel):
"""Standard API response envelope for all v3 endpoints"""
data: Optional[Data] = None
- """The response data (null if error)"""
+ """List of profiles response"""
error: Optional[APIError] = None
- """Error details (null if successful)"""
+ """Error information"""
meta: Optional[APIMeta] = None
- """Metadata about the request and response"""
+ """Request and response metadata"""
success: Optional[bool] = None
"""Indicates whether the request was successful"""
diff --git a/src/sent_dm/types/profile_update_params.py b/src/sent_dm/types/profile_update_params.py
index 696f519..da08aac 100644
--- a/src/sent_dm/types/profile_update_params.py
+++ b/src/sent_dm/types/profile_update_params.py
@@ -24,11 +24,9 @@ class ProfileUpdateParams(TypedDict, total=False):
"""Whether templates are shared across profiles (optional)"""
billing_contact: Optional[BillingContactInfoParam]
- """Billing contact for this profile.
-
- Required when billing_model is "profile" or "profile_and_organization" and no
- billing contact has been configured yet. Identifies who receives invoices and
- who is responsible for payment.
+ """
+ Billing contact information for a profile. Required when billing_model is
+ "profile" or "profile_and_organization".
"""
billing_model: Optional[str]
@@ -42,12 +40,7 @@ class ProfileUpdateParams(TypedDict, total=False):
"""
brand: Optional[BrandsBrandDataParam]
- """
- Brand and KYC information for this profile (optional). When provided, creates or
- updates the brand associated with this profile. Cannot be set when
- inherit_tcr_brand is true. Once a brand has been submitted to TCR it cannot be
- modified.
- """
+ """Brand and KYC data grouped into contact, business, and compliance sections"""
description: Optional[str]
"""Profile description (optional)"""
@@ -72,9 +65,9 @@ class ProfileUpdateParams(TypedDict, total=False):
payment_details: Optional[PaymentDetailsParam]
"""
- Payment card details for this profile (optional). Accepted when billing_model is
- "profile" or "profile_and_organization". Not persisted on our servers —
- forwarded to the payment processor.
+ Payment card details for a profile. Accepted when billing_model is "profile" or
+ "profile_and_organization". These details are not stored on our servers and will
+ be forwarded to the payment processor.
"""
sandbox: bool
diff --git a/src/sent_dm/types/profiles/api_response_of_tcr_campaign_with_use_cases.py b/src/sent_dm/types/profiles/api_response_of_tcr_campaign_with_use_cases.py
index 55ede5f..04c6a0b 100644
--- a/src/sent_dm/types/profiles/api_response_of_tcr_campaign_with_use_cases.py
+++ b/src/sent_dm/types/profiles/api_response_of_tcr_campaign_with_use_cases.py
@@ -17,10 +17,10 @@ class APIResponseOfTcrCampaignWithUseCases(BaseModel):
"""The response data (null if error)"""
error: Optional[APIError] = None
- """Error details (null if successful)"""
+ """Error information"""
meta: Optional[APIMeta] = None
- """Metadata about the request and response"""
+ """Request and response metadata"""
success: Optional[bool] = None
"""Indicates whether the request was successful"""
diff --git a/src/sent_dm/types/profiles/campaign_create_params.py b/src/sent_dm/types/profiles/campaign_create_params.py
index 7f497dd..823e3f4 100644
--- a/src/sent_dm/types/profiles/campaign_create_params.py
+++ b/src/sent_dm/types/profiles/campaign_create_params.py
@@ -12,7 +12,7 @@
class CampaignCreateParams(TypedDict, total=False):
campaign: Required[CampaignDataParam]
- """Campaign data"""
+ """Campaign data for create or update operation"""
sandbox: bool
"""
diff --git a/src/sent_dm/types/profiles/campaign_list_response.py b/src/sent_dm/types/profiles/campaign_list_response.py
index 0a389fa..059ec96 100644
--- a/src/sent_dm/types/profiles/campaign_list_response.py
+++ b/src/sent_dm/types/profiles/campaign_list_response.py
@@ -17,10 +17,10 @@ class CampaignListResponse(BaseModel):
"""The response data (null if error)"""
error: Optional[APIError] = None
- """Error details (null if successful)"""
+ """Error information"""
meta: Optional[APIMeta] = None
- """Metadata about the request and response"""
+ """Request and response metadata"""
success: Optional[bool] = None
"""Indicates whether the request was successful"""
diff --git a/src/sent_dm/types/profiles/campaign_update_params.py b/src/sent_dm/types/profiles/campaign_update_params.py
index a27401b..4a6c968 100644
--- a/src/sent_dm/types/profiles/campaign_update_params.py
+++ b/src/sent_dm/types/profiles/campaign_update_params.py
@@ -14,7 +14,7 @@ class CampaignUpdateParams(TypedDict, total=False):
profile_id: Required[Annotated[str, PropertyInfo(alias="profileId")]]
campaign: Required[CampaignDataParam]
- """Campaign data"""
+ """Campaign data for create or update operation"""
sandbox: bool
"""
diff --git a/src/sent_dm/types/profiles/sent_dm_services_endpoints_customer_ap_iv3_contracts_requests_campaigns_campaign_use_case_data_param.py b/src/sent_dm/types/profiles/sent_dm_services_endpoints_customer_ap_iv3_contracts_requests_campaigns_campaign_use_case_data_param.py
index 9915f23..0527f60 100644
--- a/src/sent_dm/types/profiles/sent_dm_services_endpoints_customer_ap_iv3_contracts_requests_campaigns_campaign_use_case_data_param.py
+++ b/src/sent_dm/types/profiles/sent_dm_services_endpoints_customer_ap_iv3_contracts_requests_campaigns_campaign_use_case_data_param.py
@@ -15,7 +15,6 @@ class SentDmServicesEndpointsCustomerApIv3ContractsRequestsCampaignsCampaignUseC
"""Campaign use case with sample messages"""
messaging_use_case_us: Required[Annotated[MessagingUseCaseUs, PropertyInfo(alias="messagingUseCaseUs")]]
- """US messaging use case category"""
sample_messages: Required[Annotated[SequenceNotStr[str], PropertyInfo(alias="sampleMessages")]]
"""Sample messages for this use case (1-5 messages, max 1024 characters each)"""
diff --git a/src/sent_dm/types/sent_dm_services_endpoints_customer_ap_iv3_contracts_requests_brands_brand_business_info_param.py b/src/sent_dm/types/sent_dm_services_endpoints_customer_ap_iv3_contracts_requests_brands_brand_business_info_param.py
index dad5090..dfb0149 100644
--- a/src/sent_dm/types/sent_dm_services_endpoints_customer_ap_iv3_contracts_requests_brands_brand_business_info_param.py
+++ b/src/sent_dm/types/sent_dm_services_endpoints_customer_ap_iv3_contracts_requests_brands_brand_business_info_param.py
@@ -26,7 +26,6 @@ class SentDmServicesEndpointsCustomerApIv3ContractsRequestsBrandsBrandBusinessIn
Optional[Literal["PRIVATE_PROFIT", "PUBLIC_PROFIT", "NON_PROFIT", "SOLE_PROPRIETOR", "GOVERNMENT"]],
PropertyInfo(alias="entityType"),
]
- """Business entity type"""
legal_name: Annotated[Optional[str], PropertyInfo(alias="legalName")]
"""Legal business name"""
diff --git a/src/sent_dm/types/sent_dm_services_endpoints_customer_ap_iv3_contracts_requests_brands_brand_compliance_info_param.py b/src/sent_dm/types/sent_dm_services_endpoints_customer_ap_iv3_contracts_requests_brands_brand_compliance_info_param.py
index 5b787cd..2030a52 100644
--- a/src/sent_dm/types/sent_dm_services_endpoints_customer_ap_iv3_contracts_requests_brands_brand_compliance_info_param.py
+++ b/src/sent_dm/types/sent_dm_services_endpoints_customer_ap_iv3_contracts_requests_brands_brand_compliance_info_param.py
@@ -17,10 +17,8 @@ class SentDmServicesEndpointsCustomerApIv3ContractsRequestsBrandsBrandCompliance
"""Compliance and TCR information for brand registration"""
brand_relationship: Required[Annotated[TcrBrandRelationship, PropertyInfo(alias="brandRelationship")]]
- """Brand relationship level with TCR (required for TCR)"""
vertical: Required[TcrVertical]
- """Business vertical/industry category (required for TCR)"""
destination_countries: Annotated[
Optional[Iterable[DestinationCountryParam]], PropertyInfo(alias="destinationCountries")
diff --git a/src/sent_dm/types/template_create_params.py b/src/sent_dm/types/template_create_params.py
index dce9066..a740609 100644
--- a/src/sent_dm/types/template_create_params.py
+++ b/src/sent_dm/types/template_create_params.py
@@ -22,7 +22,10 @@ class TemplateCreateParams(TypedDict, total=False):
"""Source of template creation (default: from-api)"""
definition: TemplateDefinitionParam
- """Template definition including header, body, footer, and buttons"""
+ """
+ Complete definition of a message template including header, body, footer, and
+ buttons
+ """
language: Optional[str]
"""Template language code (e.g., en_US) (optional, auto-detected if not provided)"""
diff --git a/src/sent_dm/types/template_definition_param.py b/src/sent_dm/types/template_definition_param.py
index e3fa488..055f801 100644
--- a/src/sent_dm/types/template_definition_param.py
+++ b/src/sent_dm/types/template_definition_param.py
@@ -31,16 +31,13 @@ class TemplateDefinitionParam(TypedDict, total=False):
"""
body: Required[SentDmServicesCommonContractsPocOsTemplateBodyParam]
- """
- Required template body with content for different channels (multi-channel,
- SMS-specific, or WhatsApp-specific)
- """
+ """Body section of a message template with channel-specific content"""
authentication_config: Annotated[
Optional[SentDmServicesCommonContractsPocOsAuthenticationConfigParam],
PropertyInfo(alias="authenticationConfig"),
]
- """Configuration specific to AUTHENTICATION category templates (optional)"""
+ """Configuration for AUTHENTICATION category templates"""
buttons: Optional[Iterable[SentDmServicesCommonContractsPocOsTemplateButtonParam]]
"""Optional list of interactive buttons (e.g., quick replies, URLs, phone numbers)"""
@@ -49,7 +46,7 @@ class TemplateDefinitionParam(TypedDict, total=False):
"""The version of the template definition format"""
footer: Optional[SentDmServicesCommonContractsPocOsTemplateFooterParam]
- """Optional template footer with optional variables"""
+ """Footer section of a message template"""
header: Optional[SentDmServicesCommonContractsPocOsTemplateHeaderParam]
- """Optional template header with optional variables"""
+ """Header section of a message template"""
diff --git a/src/sent_dm/types/template_list_response.py b/src/sent_dm/types/template_list_response.py
index b41e9f8..657027e 100644
--- a/src/sent_dm/types/template_list_response.py
+++ b/src/sent_dm/types/template_list_response.py
@@ -12,10 +12,10 @@
class Data(BaseModel):
- """The response data (null if error)"""
+ """Paginated list of templates"""
pagination: Optional[PaginationMeta] = None
- """Pagination metadata"""
+ """Pagination metadata for list responses"""
templates: Optional[List[Template]] = None
"""List of templates"""
@@ -25,13 +25,13 @@ class TemplateListResponse(BaseModel):
"""Standard API response envelope for all v3 endpoints"""
data: Optional[Data] = None
- """The response data (null if error)"""
+ """Paginated list of templates"""
error: Optional[APIError] = None
- """Error details (null if successful)"""
+ """Error information"""
meta: Optional[APIMeta] = None
- """Metadata about the request and response"""
+ """Request and response metadata"""
success: Optional[bool] = None
"""Indicates whether the request was successful"""
diff --git a/src/sent_dm/types/template_update_params.py b/src/sent_dm/types/template_update_params.py
index 54bbd9f..7c6b98d 100644
--- a/src/sent_dm/types/template_update_params.py
+++ b/src/sent_dm/types/template_update_params.py
@@ -16,7 +16,10 @@ class TemplateUpdateParams(TypedDict, total=False):
"""Template category: MARKETING, UTILITY, AUTHENTICATION"""
definition: Optional[TemplateDefinitionParam]
- """Template definition including header, body, footer, and buttons"""
+ """
+ Complete definition of a message template including header, body, footer, and
+ buttons
+ """
language: Optional[str]
"""Template language code (e.g., en_US)"""
diff --git a/src/sent_dm/types/user_list_response.py b/src/sent_dm/types/user_list_response.py
index add6fb1..8878e4d 100644
--- a/src/sent_dm/types/user_list_response.py
+++ b/src/sent_dm/types/user_list_response.py
@@ -11,7 +11,7 @@
class Data(BaseModel):
- """The response data (null if error)"""
+ """List of users response"""
users: Optional[List[UserResponse]] = None
"""List of users in the organization"""
@@ -21,13 +21,13 @@ class UserListResponse(BaseModel):
"""Standard API response envelope for all v3 endpoints"""
data: Optional[Data] = None
- """The response data (null if error)"""
+ """List of users response"""
error: Optional[APIError] = None
- """Error details (null if successful)"""
+ """Error information"""
meta: Optional[APIMeta] = None
- """Metadata about the request and response"""
+ """Request and response metadata"""
success: Optional[bool] = None
"""Indicates whether the request was successful"""
diff --git a/src/sent_dm/types/webhook_list_event_types_response.py b/src/sent_dm/types/webhook_list_event_types_response.py
index fdf011f..3cbcd53 100644
--- a/src/sent_dm/types/webhook_list_event_types_response.py
+++ b/src/sent_dm/types/webhook_list_event_types_response.py
@@ -32,10 +32,10 @@ class WebhookListEventTypesResponse(BaseModel):
"""The response data (null if error)"""
error: Optional[APIError] = None
- """Error details (null if successful)"""
+ """Error information"""
meta: Optional[APIMeta] = None
- """Metadata about the request and response"""
+ """Request and response metadata"""
success: Optional[bool] = None
"""Indicates whether the request was successful"""
diff --git a/src/sent_dm/types/webhook_list_events_response.py b/src/sent_dm/types/webhook_list_events_response.py
index cc89b1c..d1fa58e 100644
--- a/src/sent_dm/types/webhook_list_events_response.py
+++ b/src/sent_dm/types/webhook_list_events_response.py
@@ -51,10 +51,10 @@ class WebhookListEventsResponse(BaseModel):
"""The response data (null if error)"""
error: Optional[APIError] = None
- """Error details (null if successful)"""
+ """Error information"""
meta: Optional[APIMeta] = None
- """Metadata about the request and response"""
+ """Request and response metadata"""
success: Optional[bool] = None
"""Indicates whether the request was successful"""
diff --git a/src/sent_dm/types/webhook_list_response.py b/src/sent_dm/types/webhook_list_response.py
index 5192d5f..61c24aa 100644
--- a/src/sent_dm/types/webhook_list_response.py
+++ b/src/sent_dm/types/webhook_list_response.py
@@ -27,10 +27,10 @@ class WebhookListResponse(BaseModel):
"""The response data (null if error)"""
error: Optional[APIError] = None
- """Error details (null if successful)"""
+ """Error information"""
meta: Optional[APIMeta] = None
- """Metadata about the request and response"""
+ """Request and response metadata"""
success: Optional[bool] = None
"""Indicates whether the request was successful"""
diff --git a/src/sent_dm/types/webhook_rotate_secret_response.py b/src/sent_dm/types/webhook_rotate_secret_response.py
index e7ee6e2..4304204 100644
--- a/src/sent_dm/types/webhook_rotate_secret_response.py
+++ b/src/sent_dm/types/webhook_rotate_secret_response.py
@@ -22,10 +22,10 @@ class WebhookRotateSecretResponse(BaseModel):
"""The response data (null if error)"""
error: Optional[APIError] = None
- """Error details (null if successful)"""
+ """Error information"""
meta: Optional[APIMeta] = None
- """Metadata about the request and response"""
+ """Request and response metadata"""
success: Optional[bool] = None
"""Indicates whether the request was successful"""
diff --git a/src/sent_dm/types/webhook_test_response.py b/src/sent_dm/types/webhook_test_response.py
index 08af11c..9de2e6b 100644
--- a/src/sent_dm/types/webhook_test_response.py
+++ b/src/sent_dm/types/webhook_test_response.py
@@ -24,10 +24,10 @@ class WebhookTestResponse(BaseModel):
"""The response data (null if error)"""
error: Optional[APIError] = None
- """Error details (null if successful)"""
+ """Error information"""
meta: Optional[APIMeta] = None
- """Metadata about the request and response"""
+ """Request and response metadata"""
success: Optional[bool] = None
"""Indicates whether the request was successful"""
From 7c9c66ac0bc7944a91e658a311dfd38f70e9adf8 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Thu, 12 Mar 2026 10:53:32 +0000
Subject: [PATCH 11/15] feat(api): manual updates
---
.stats.yml | 2 +-
api.md | 21 +--
src/sent_dm/resources/profiles/profiles.py | 26 ++--
src/sent_dm/types/__init__.py | 32 +---
src/sent_dm/types/brands_brand_data_param.py | 114 ++++++++++++--
src/sent_dm/types/contact_delete_params.py | 4 +-
...ase_param.py => mutation_request_param.py} | 4 +-
...p_params.py => profile_complete_params.py} | 4 +-
src/sent_dm/types/profile_delete_params.py | 4 +-
src/sent_dm/types/profiles/__init__.py | 4 +-
.../types/{shared => profiles}/base_dto.py | 0
.../types/profiles/campaign_data_param.py | 23 +--
.../types/profiles/campaign_delete_params.py | 4 +-
..._campaigns_campaign_use_case_data_param.py | 20 ---
.../profiles/tcr_campaign_with_use_cases.py | 2 +-
...acts_poc_os_authentication_config_param.py | 26 ----
...on_contracts_poc_os_template_body_param.py | 30 ----
..._contracts_poc_os_template_button_param.py | 26 ----
...acts_poc_os_template_button_props_param.py | 36 -----
..._contracts_poc_os_template_footer_param.py | 23 ---
..._contracts_poc_os_template_header_param.py | 26 ----
...quests_brands_brand_business_info_param.py | 49 ------
...ests_brands_brand_compliance_info_param.py | 41 -----
...equests_brands_brand_contact_info_param.py | 32 ----
src/sent_dm/types/shared/__init__.py | 3 -
.../types/template_definition_param.py | 141 ++++++++++++++----
src/sent_dm/types/user_remove_params.py | 4 +-
.../types/webhook_rotate_secret_params.py | 4 +-
tests/api_resources/test_profiles.py | 40 ++---
29 files changed, 283 insertions(+), 462 deletions(-)
rename src/sent_dm/types/{mutation_request_base_param.py => mutation_request_param.py} (78%)
rename src/sent_dm/types/{profile_complete_setup_params.py => profile_complete_params.py} (87%)
rename src/sent_dm/types/{shared => profiles}/base_dto.py (100%)
delete mode 100644 src/sent_dm/types/profiles/sent_dm_services_endpoints_customer_ap_iv3_contracts_requests_campaigns_campaign_use_case_data_param.py
delete mode 100644 src/sent_dm/types/sent_dm_services_common_contracts_poc_os_authentication_config_param.py
delete mode 100644 src/sent_dm/types/sent_dm_services_common_contracts_poc_os_template_body_param.py
delete mode 100644 src/sent_dm/types/sent_dm_services_common_contracts_poc_os_template_button_param.py
delete mode 100644 src/sent_dm/types/sent_dm_services_common_contracts_poc_os_template_button_props_param.py
delete mode 100644 src/sent_dm/types/sent_dm_services_common_contracts_poc_os_template_footer_param.py
delete mode 100644 src/sent_dm/types/sent_dm_services_common_contracts_poc_os_template_header_param.py
delete mode 100644 src/sent_dm/types/sent_dm_services_endpoints_customer_ap_iv3_contracts_requests_brands_brand_business_info_param.py
delete mode 100644 src/sent_dm/types/sent_dm_services_endpoints_customer_ap_iv3_contracts_requests_brands_brand_compliance_info_param.py
delete mode 100644 src/sent_dm/types/sent_dm_services_endpoints_customer_ap_iv3_contracts_requests_brands_brand_contact_info_param.py
delete mode 100644 src/sent_dm/types/shared/__init__.py
diff --git a/.stats.yml b/.stats.yml
index 3aec758..4792a46 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
configured_endpoints: 40
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent%2Fsent-dm-2566cdc5d8e0bffe2a8c442692b0fc1b35d3bfe7e9bf578331fc19d402361c1f.yml
openapi_spec_hash: 85e1feeb9bbc8d59bb34d6cdd679575a
-config_hash: ad652575976c2c8db09e4575778f0e77
+config_hash: 676ee4f74f5b328b155283c879154b66
diff --git a/api.md b/api.md
index 42fc91e..3f3b667 100644
--- a/api.md
+++ b/api.md
@@ -1,9 +1,3 @@
-# Shared Types
-
-```python
-from sent_dm.types import BaseDto
-```
-
# Webhooks
Types:
@@ -13,7 +7,7 @@ from sent_dm.types import (
APIError,
APIMeta,
APIResponseWebhook,
- MutationRequestBase,
+ MutationRequest,
PaginationMeta,
WebhookResponse,
WebhookListResponse,
@@ -60,12 +54,6 @@ Types:
```python
from sent_dm.types import (
APIResponseTemplate,
- SentDmServicesCommonContractsPocOsAuthenticationConfig,
- SentDmServicesCommonContractsPocOsTemplateBody,
- SentDmServicesCommonContractsPocOsTemplateButton,
- SentDmServicesCommonContractsPocOsTemplateButtonProps,
- SentDmServicesCommonContractsPocOsTemplateFooter,
- SentDmServicesCommonContractsPocOsTemplateHeader,
Template,
TemplateBodyContent,
TemplateDefinition,
@@ -94,9 +82,6 @@ from sent_dm.types import (
DestinationCountry,
PaymentDetails,
ProfileDetail,
- SentDmServicesEndpointsCustomerApIv3ContractsRequestsBrandsBrandBusinessInfo,
- SentDmServicesEndpointsCustomerApIv3ContractsRequestsBrandsBrandComplianceInfo,
- SentDmServicesEndpointsCustomerApIv3ContractsRequestsBrandsBrandContactInfo,
TcrBrandRelationship,
TcrVertical,
ProfileListResponse,
@@ -110,7 +95,7 @@ Methods:
- client.profiles.update(profile_id, \*\*params) -> APIResponseOfProfileDetail
- client.profiles.list() -> ProfileListResponse
- client.profiles.delete(profile_id, \*\*params) -> None
-- client.profiles.complete_setup(profile_id, \*\*params) -> object
+- client.profiles.complete(profile_id, \*\*params) -> object
## Campaigns
@@ -119,9 +104,9 @@ Types:
```python
from sent_dm.types.profiles import (
APIResponseOfTcrCampaignWithUseCases,
+ BaseDto,
CampaignData,
MessagingUseCaseUs,
- SentDmServicesEndpointsCustomerApIv3ContractsRequestsCampaignsCampaignUseCaseData,
TcrCampaignWithUseCases,
CampaignListResponse,
)
diff --git a/src/sent_dm/resources/profiles/profiles.py b/src/sent_dm/resources/profiles/profiles.py
index 503c219..bbfcd9e 100644
--- a/src/sent_dm/resources/profiles/profiles.py
+++ b/src/sent_dm/resources/profiles/profiles.py
@@ -10,7 +10,7 @@
profile_create_params,
profile_delete_params,
profile_update_params,
- profile_complete_setup_params,
+ profile_complete_params,
)
from ..._types import Body, Omit, Query, Headers, NoneType, NotGiven, omit, not_given
from ..._utils import maybe_transform, strip_not_given, async_maybe_transform
@@ -504,7 +504,7 @@ def delete(
cast_to=NoneType,
)
- def complete_setup(
+ def complete(
self,
profile_id: str,
*,
@@ -572,7 +572,7 @@ def complete_setup(
"web_hook_url": web_hook_url,
"sandbox": sandbox,
},
- profile_complete_setup_params.ProfileCompleteSetupParams,
+ profile_complete_params.ProfileCompleteParams,
),
options=make_request_options(
extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
@@ -1045,7 +1045,7 @@ async def delete(
cast_to=NoneType,
)
- async def complete_setup(
+ async def complete(
self,
profile_id: str,
*,
@@ -1113,7 +1113,7 @@ async def complete_setup(
"web_hook_url": web_hook_url,
"sandbox": sandbox,
},
- profile_complete_setup_params.ProfileCompleteSetupParams,
+ profile_complete_params.ProfileCompleteParams,
),
options=make_request_options(
extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
@@ -1141,8 +1141,8 @@ def __init__(self, profiles: ProfilesResource) -> None:
self.delete = to_raw_response_wrapper(
profiles.delete,
)
- self.complete_setup = to_raw_response_wrapper(
- profiles.complete_setup,
+ self.complete = to_raw_response_wrapper(
+ profiles.complete,
)
@cached_property
@@ -1170,8 +1170,8 @@ def __init__(self, profiles: AsyncProfilesResource) -> None:
self.delete = async_to_raw_response_wrapper(
profiles.delete,
)
- self.complete_setup = async_to_raw_response_wrapper(
- profiles.complete_setup,
+ self.complete = async_to_raw_response_wrapper(
+ profiles.complete,
)
@cached_property
@@ -1199,8 +1199,8 @@ def __init__(self, profiles: ProfilesResource) -> None:
self.delete = to_streamed_response_wrapper(
profiles.delete,
)
- self.complete_setup = to_streamed_response_wrapper(
- profiles.complete_setup,
+ self.complete = to_streamed_response_wrapper(
+ profiles.complete,
)
@cached_property
@@ -1228,8 +1228,8 @@ def __init__(self, profiles: AsyncProfilesResource) -> None:
self.delete = async_to_streamed_response_wrapper(
profiles.delete,
)
- self.complete_setup = async_to_streamed_response_wrapper(
- profiles.complete_setup,
+ self.complete = async_to_streamed_response_wrapper(
+ profiles.complete,
)
@cached_property
diff --git a/src/sent_dm/types/__init__.py b/src/sent_dm/types/__init__.py
index 3be54f9..9adbf8a 100644
--- a/src/sent_dm/types/__init__.py
+++ b/src/sent_dm/types/__init__.py
@@ -2,7 +2,6 @@
from __future__ import annotations
-from .shared import BaseDto as BaseDto
from .api_meta import APIMeta as APIMeta
from .template import Template as Template
from .api_error import APIError as APIError
@@ -40,6 +39,7 @@
from .webhook_list_response import WebhookListResponse as WebhookListResponse
from .webhook_test_response import WebhookTestResponse as WebhookTestResponse
from .webhook_update_params import WebhookUpdateParams as WebhookUpdateParams
+from .mutation_request_param import MutationRequestParam as MutationRequestParam
from .number_lookup_response import NumberLookupResponse as NumberLookupResponse
from .tcr_brand_relationship import TcrBrandRelationship as TcrBrandRelationship
from .template_create_params import TemplateCreateParams as TemplateCreateParams
@@ -48,47 +48,19 @@
from .template_update_params import TemplateUpdateParams as TemplateUpdateParams
from .api_response_of_contact import APIResponseOfContact as APIResponseOfContact
from .brands_brand_data_param import BrandsBrandDataParam as BrandsBrandDataParam
+from .profile_complete_params import ProfileCompleteParams as ProfileCompleteParams
from .template_variable_param import TemplateVariableParam as TemplateVariableParam
from .user_update_role_params import UserUpdateRoleParams as UserUpdateRoleParams
from .destination_country_param import DestinationCountryParam as DestinationCountryParam
from .template_definition_param import TemplateDefinitionParam as TemplateDefinitionParam
from .billing_contact_info_param import BillingContactInfoParam as BillingContactInfoParam
from .webhook_list_events_params import WebhookListEventsParams as WebhookListEventsParams
-from .mutation_request_base_param import MutationRequestBaseParam as MutationRequestBaseParam
from .template_body_content_param import TemplateBodyContentParam as TemplateBodyContentParam
from .webhook_list_events_response import WebhookListEventsResponse as WebhookListEventsResponse
from .webhook_rotate_secret_params import WebhookRotateSecretParams as WebhookRotateSecretParams
from .webhook_toggle_status_params import WebhookToggleStatusParams as WebhookToggleStatusParams
-from .profile_complete_setup_params import ProfileCompleteSetupParams as ProfileCompleteSetupParams
from .api_response_of_profile_detail import APIResponseOfProfileDetail as APIResponseOfProfileDetail
from .webhook_rotate_secret_response import WebhookRotateSecretResponse as WebhookRotateSecretResponse
from .message_retrieve_status_response import MessageRetrieveStatusResponse as MessageRetrieveStatusResponse
from .webhook_list_event_types_response import WebhookListEventTypesResponse as WebhookListEventTypesResponse
from .message_retrieve_activities_response import MessageRetrieveActivitiesResponse as MessageRetrieveActivitiesResponse
-from .sent_dm_services_common_contracts_poc_os_template_body_param import (
- SentDmServicesCommonContractsPocOsTemplateBodyParam as SentDmServicesCommonContractsPocOsTemplateBodyParam,
-)
-from .sent_dm_services_common_contracts_poc_os_template_button_param import (
- SentDmServicesCommonContractsPocOsTemplateButtonParam as SentDmServicesCommonContractsPocOsTemplateButtonParam,
-)
-from .sent_dm_services_common_contracts_poc_os_template_footer_param import (
- SentDmServicesCommonContractsPocOsTemplateFooterParam as SentDmServicesCommonContractsPocOsTemplateFooterParam,
-)
-from .sent_dm_services_common_contracts_poc_os_template_header_param import (
- SentDmServicesCommonContractsPocOsTemplateHeaderParam as SentDmServicesCommonContractsPocOsTemplateHeaderParam,
-)
-from .sent_dm_services_common_contracts_poc_os_authentication_config_param import (
- SentDmServicesCommonContractsPocOsAuthenticationConfigParam as SentDmServicesCommonContractsPocOsAuthenticationConfigParam,
-)
-from .sent_dm_services_common_contracts_poc_os_template_button_props_param import (
- SentDmServicesCommonContractsPocOsTemplateButtonPropsParam as SentDmServicesCommonContractsPocOsTemplateButtonPropsParam,
-)
-from .sent_dm_services_endpoints_customer_ap_iv3_contracts_requests_brands_brand_contact_info_param import (
- SentDmServicesEndpointsCustomerApIv3ContractsRequestsBrandsBrandContactInfoParam as SentDmServicesEndpointsCustomerApIv3ContractsRequestsBrandsBrandContactInfoParam,
-)
-from .sent_dm_services_endpoints_customer_ap_iv3_contracts_requests_brands_brand_business_info_param import (
- SentDmServicesEndpointsCustomerApIv3ContractsRequestsBrandsBrandBusinessInfoParam as SentDmServicesEndpointsCustomerApIv3ContractsRequestsBrandsBrandBusinessInfoParam,
-)
-from .sent_dm_services_endpoints_customer_ap_iv3_contracts_requests_brands_brand_compliance_info_param import (
- SentDmServicesEndpointsCustomerApIv3ContractsRequestsBrandsBrandComplianceInfoParam as SentDmServicesEndpointsCustomerApIv3ContractsRequestsBrandsBrandComplianceInfoParam,
-)
diff --git a/src/sent_dm/types/brands_brand_data_param.py b/src/sent_dm/types/brands_brand_data_param.py
index 02ea9ed..26a616e 100644
--- a/src/sent_dm/types/brands_brand_data_param.py
+++ b/src/sent_dm/types/brands_brand_data_param.py
@@ -2,30 +2,114 @@
from __future__ import annotations
-from typing import Optional
-from typing_extensions import Required, TypedDict
+from typing import Iterable, Optional
+from typing_extensions import Literal, Required, Annotated, TypedDict
-from .sent_dm_services_endpoints_customer_ap_iv3_contracts_requests_brands_brand_contact_info_param import (
- SentDmServicesEndpointsCustomerApIv3ContractsRequestsBrandsBrandContactInfoParam,
-)
-from .sent_dm_services_endpoints_customer_ap_iv3_contracts_requests_brands_brand_business_info_param import (
- SentDmServicesEndpointsCustomerApIv3ContractsRequestsBrandsBrandBusinessInfoParam,
-)
-from .sent_dm_services_endpoints_customer_ap_iv3_contracts_requests_brands_brand_compliance_info_param import (
- SentDmServicesEndpointsCustomerApIv3ContractsRequestsBrandsBrandComplianceInfoParam,
-)
+from .._utils import PropertyInfo
+from .tcr_vertical import TcrVertical
+from .tcr_brand_relationship import TcrBrandRelationship
+from .destination_country_param import DestinationCountryParam
-__all__ = ["BrandsBrandDataParam"]
+__all__ = ["BrandsBrandDataParam", "Compliance", "Contact", "Business"]
+
+
+class Compliance(TypedDict, total=False):
+ """Compliance and TCR information for brand registration"""
+
+ brand_relationship: Required[Annotated[TcrBrandRelationship, PropertyInfo(alias="brandRelationship")]]
+
+ vertical: Required[TcrVertical]
+
+ destination_countries: Annotated[
+ Optional[Iterable[DestinationCountryParam]], PropertyInfo(alias="destinationCountries")
+ ]
+ """List of destination countries for messaging"""
+
+ expected_messaging_volume: Annotated[Optional[str], PropertyInfo(alias="expectedMessagingVolume")]
+ """Expected daily messaging volume"""
+
+ is_tcr_application: Annotated[Optional[bool], PropertyInfo(alias="isTcrApplication")]
+ """Whether this is a TCR (Campaign Registry) application"""
+
+ notes: Optional[str]
+ """Additional notes about the business or use case"""
+
+ phone_number_prefix: Annotated[Optional[str], PropertyInfo(alias="phoneNumberPrefix")]
+ """Phone number prefix for messaging (e.g., "+1")"""
+
+ primary_use_case: Annotated[Optional[str], PropertyInfo(alias="primaryUseCase")]
+ """Primary messaging use case description"""
+
+
+class Contact(TypedDict, total=False):
+ """Contact information for brand KYC"""
+
+ name: Required[str]
+ """Primary contact name (required)"""
+
+ business_name: Annotated[Optional[str], PropertyInfo(alias="businessName")]
+ """Business/brand name"""
+
+ email: Optional[str]
+ """Contact email address"""
+
+ phone: Optional[str]
+ """Contact phone number in E.164 format"""
+
+ phone_country_code: Annotated[Optional[str], PropertyInfo(alias="phoneCountryCode")]
+ """Contact phone country code (e.g., "1" for US)"""
+
+ role: Optional[str]
+ """Contact's role in the business"""
+
+
+class Business(TypedDict, total=False):
+ """Business details and address for brand KYC"""
+
+ city: Optional[str]
+ """City"""
+
+ country: Optional[str]
+ """Country code (e.g., US, CA)"""
+
+ country_of_registration: Annotated[Optional[str], PropertyInfo(alias="countryOfRegistration")]
+ """Country where the business is registered"""
+
+ entity_type: Annotated[
+ Optional[Literal["PRIVATE_PROFIT", "PUBLIC_PROFIT", "NON_PROFIT", "SOLE_PROPRIETOR", "GOVERNMENT"]],
+ PropertyInfo(alias="entityType"),
+ ]
+
+ legal_name: Annotated[Optional[str], PropertyInfo(alias="legalName")]
+ """Legal business name"""
+
+ postal_code: Annotated[Optional[str], PropertyInfo(alias="postalCode")]
+ """Postal/ZIP code"""
+
+ state: Optional[str]
+ """State/province code"""
+
+ street: Optional[str]
+ """Street address"""
+
+ tax_id: Annotated[Optional[str], PropertyInfo(alias="taxId")]
+ """Tax ID/EIN number"""
+
+ tax_id_type: Annotated[Optional[str], PropertyInfo(alias="taxIdType")]
+ """Type of tax ID (e.g., us_ein, ca_bn)"""
+
+ url: Optional[str]
+ """Business website URL"""
class BrandsBrandDataParam(TypedDict, total=False):
"""Brand and KYC data grouped into contact, business, and compliance sections"""
- compliance: Required[SentDmServicesEndpointsCustomerApIv3ContractsRequestsBrandsBrandComplianceInfoParam]
+ compliance: Required[Compliance]
"""Compliance and TCR information for brand registration"""
- contact: Required[SentDmServicesEndpointsCustomerApIv3ContractsRequestsBrandsBrandContactInfoParam]
+ contact: Required[Contact]
"""Contact information for brand KYC"""
- business: Optional[SentDmServicesEndpointsCustomerApIv3ContractsRequestsBrandsBrandBusinessInfoParam]
+ business: Optional[Business]
"""Business details and address for brand KYC"""
diff --git a/src/sent_dm/types/contact_delete_params.py b/src/sent_dm/types/contact_delete_params.py
index 1306cfd..9991aeb 100644
--- a/src/sent_dm/types/contact_delete_params.py
+++ b/src/sent_dm/types/contact_delete_params.py
@@ -5,7 +5,7 @@
from typing_extensions import Required, Annotated, TypedDict
from .._utils import PropertyInfo
-from .mutation_request_base_param import MutationRequestBaseParam
+from .mutation_request_param import MutationRequestParam
__all__ = ["ContactDeleteParams", "Body"]
@@ -17,7 +17,7 @@ class ContactDeleteParams(TypedDict, total=False):
x_profile_id: Annotated[str, PropertyInfo(alias="x-profile-id")]
-class Body(MutationRequestBaseParam, total=False):
+class Body(MutationRequestParam, total=False):
"""Request to delete/dissociate a contact"""
pass
diff --git a/src/sent_dm/types/mutation_request_base_param.py b/src/sent_dm/types/mutation_request_param.py
similarity index 78%
rename from src/sent_dm/types/mutation_request_base_param.py
rename to src/sent_dm/types/mutation_request_param.py
index bf4abc5..2487ca2 100644
--- a/src/sent_dm/types/mutation_request_base_param.py
+++ b/src/sent_dm/types/mutation_request_param.py
@@ -4,10 +4,10 @@
from typing_extensions import TypedDict
-__all__ = ["MutationRequestBaseParam"]
+__all__ = ["MutationRequestParam"]
-class MutationRequestBaseParam(TypedDict, total=False):
+class MutationRequestParam(TypedDict, total=False):
sandbox: bool
"""
Sandbox flag - when true, the operation is simulated without side effects Useful
diff --git a/src/sent_dm/types/profile_complete_setup_params.py b/src/sent_dm/types/profile_complete_params.py
similarity index 87%
rename from src/sent_dm/types/profile_complete_setup_params.py
rename to src/sent_dm/types/profile_complete_params.py
index c788b63..a444957 100644
--- a/src/sent_dm/types/profile_complete_setup_params.py
+++ b/src/sent_dm/types/profile_complete_params.py
@@ -6,10 +6,10 @@
from .._utils import PropertyInfo
-__all__ = ["ProfileCompleteSetupParams"]
+__all__ = ["ProfileCompleteParams"]
-class ProfileCompleteSetupParams(TypedDict, total=False):
+class ProfileCompleteParams(TypedDict, total=False):
web_hook_url: Required[Annotated[str, PropertyInfo(alias="webHookUrl")]]
"""Webhook URL to call when profile completion finishes (success or failure)"""
diff --git a/src/sent_dm/types/profile_delete_params.py b/src/sent_dm/types/profile_delete_params.py
index 2b329f3..6b358e5 100644
--- a/src/sent_dm/types/profile_delete_params.py
+++ b/src/sent_dm/types/profile_delete_params.py
@@ -5,7 +5,7 @@
from typing_extensions import Required, Annotated, TypedDict
from .._utils import PropertyInfo
-from .mutation_request_base_param import MutationRequestBaseParam
+from .mutation_request_param import MutationRequestParam
__all__ = ["ProfileDeleteParams", "Body"]
@@ -17,7 +17,7 @@ class ProfileDeleteParams(TypedDict, total=False):
x_profile_id: Annotated[str, PropertyInfo(alias="x-profile-id")]
-class Body(MutationRequestBaseParam, total=False):
+class Body(MutationRequestParam, total=False):
"""Request to delete a profile"""
pass
diff --git a/src/sent_dm/types/profiles/__init__.py b/src/sent_dm/types/profiles/__init__.py
index 55f1405..e5bc778 100644
--- a/src/sent_dm/types/profiles/__init__.py
+++ b/src/sent_dm/types/profiles/__init__.py
@@ -2,6 +2,7 @@
from __future__ import annotations
+from .base_dto import BaseDto as BaseDto
from .campaign_data_param import CampaignDataParam as CampaignDataParam
from .messaging_use_case_us import MessagingUseCaseUs as MessagingUseCaseUs
from .campaign_create_params import CampaignCreateParams as CampaignCreateParams
@@ -12,6 +13,3 @@
from .api_response_of_tcr_campaign_with_use_cases import (
APIResponseOfTcrCampaignWithUseCases as APIResponseOfTcrCampaignWithUseCases,
)
-from .sent_dm_services_endpoints_customer_ap_iv3_contracts_requests_campaigns_campaign_use_case_data_param import (
- SentDmServicesEndpointsCustomerApIv3ContractsRequestsCampaignsCampaignUseCaseDataParam as SentDmServicesEndpointsCustomerApIv3ContractsRequestsCampaignsCampaignUseCaseDataParam,
-)
diff --git a/src/sent_dm/types/shared/base_dto.py b/src/sent_dm/types/profiles/base_dto.py
similarity index 100%
rename from src/sent_dm/types/shared/base_dto.py
rename to src/sent_dm/types/profiles/base_dto.py
diff --git a/src/sent_dm/types/profiles/campaign_data_param.py b/src/sent_dm/types/profiles/campaign_data_param.py
index 422f312..0ad81c6 100644
--- a/src/sent_dm/types/profiles/campaign_data_param.py
+++ b/src/sent_dm/types/profiles/campaign_data_param.py
@@ -5,12 +5,20 @@
from typing import Iterable, Optional
from typing_extensions import Required, Annotated, TypedDict
+from ..._types import SequenceNotStr
from ..._utils import PropertyInfo
-from .sent_dm_services_endpoints_customer_ap_iv3_contracts_requests_campaigns_campaign_use_case_data_param import (
- SentDmServicesEndpointsCustomerApIv3ContractsRequestsCampaignsCampaignUseCaseDataParam,
-)
+from .messaging_use_case_us import MessagingUseCaseUs
-__all__ = ["CampaignDataParam"]
+__all__ = ["CampaignDataParam", "UseCase"]
+
+
+class UseCase(TypedDict, total=False):
+ """Campaign use case with sample messages"""
+
+ messaging_use_case_us: Required[Annotated[MessagingUseCaseUs, PropertyInfo(alias="messagingUseCaseUs")]]
+
+ sample_messages: Required[Annotated[SequenceNotStr[str], PropertyInfo(alias="sampleMessages")]]
+ """Sample messages for this use case (1-5 messages, max 1024 characters each)"""
class CampaignDataParam(TypedDict, total=False):
@@ -25,12 +33,7 @@ class CampaignDataParam(TypedDict, total=False):
type: Required[str]
"""Campaign type (e.g., "KYC", "App")"""
- use_cases: Required[
- Annotated[
- Iterable[SentDmServicesEndpointsCustomerApIv3ContractsRequestsCampaignsCampaignUseCaseDataParam],
- PropertyInfo(alias="useCases"),
- ]
- ]
+ use_cases: Required[Annotated[Iterable[UseCase], PropertyInfo(alias="useCases")]]
"""List of use cases with sample messages"""
help_keywords: Annotated[Optional[str], PropertyInfo(alias="helpKeywords")]
diff --git a/src/sent_dm/types/profiles/campaign_delete_params.py b/src/sent_dm/types/profiles/campaign_delete_params.py
index f01f605..fda8341 100644
--- a/src/sent_dm/types/profiles/campaign_delete_params.py
+++ b/src/sent_dm/types/profiles/campaign_delete_params.py
@@ -5,7 +5,7 @@
from typing_extensions import Required, Annotated, TypedDict
from ..._utils import PropertyInfo
-from ..mutation_request_base_param import MutationRequestBaseParam
+from ..mutation_request_param import MutationRequestParam
__all__ = ["CampaignDeleteParams", "Body"]
@@ -19,7 +19,7 @@ class CampaignDeleteParams(TypedDict, total=False):
x_profile_id: Annotated[str, PropertyInfo(alias="x-profile-id")]
-class Body(MutationRequestBaseParam, total=False):
+class Body(MutationRequestParam, total=False):
"""Request to delete a campaign from a brand"""
pass
diff --git a/src/sent_dm/types/profiles/sent_dm_services_endpoints_customer_ap_iv3_contracts_requests_campaigns_campaign_use_case_data_param.py b/src/sent_dm/types/profiles/sent_dm_services_endpoints_customer_ap_iv3_contracts_requests_campaigns_campaign_use_case_data_param.py
deleted file mode 100644
index 0527f60..0000000
--- a/src/sent_dm/types/profiles/sent_dm_services_endpoints_customer_ap_iv3_contracts_requests_campaigns_campaign_use_case_data_param.py
+++ /dev/null
@@ -1,20 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-from typing_extensions import Required, Annotated, TypedDict
-
-from ..._types import SequenceNotStr
-from ..._utils import PropertyInfo
-from .messaging_use_case_us import MessagingUseCaseUs
-
-__all__ = ["SentDmServicesEndpointsCustomerApIv3ContractsRequestsCampaignsCampaignUseCaseDataParam"]
-
-
-class SentDmServicesEndpointsCustomerApIv3ContractsRequestsCampaignsCampaignUseCaseDataParam(TypedDict, total=False):
- """Campaign use case with sample messages"""
-
- messaging_use_case_us: Required[Annotated[MessagingUseCaseUs, PropertyInfo(alias="messagingUseCaseUs")]]
-
- sample_messages: Required[Annotated[SequenceNotStr[str], PropertyInfo(alias="sampleMessages")]]
- """Sample messages for this use case (1-5 messages, max 1024 characters each)"""
diff --git a/src/sent_dm/types/profiles/tcr_campaign_with_use_cases.py b/src/sent_dm/types/profiles/tcr_campaign_with_use_cases.py
index d3577d3..99bbd10 100644
--- a/src/sent_dm/types/profiles/tcr_campaign_with_use_cases.py
+++ b/src/sent_dm/types/profiles/tcr_campaign_with_use_cases.py
@@ -6,7 +6,7 @@
from pydantic import Field as FieldInfo
-from ..shared.base_dto import BaseDto
+from .base_dto import BaseDto
from .messaging_use_case_us import MessagingUseCaseUs
__all__ = ["TcrCampaignWithUseCases", "TcrCampaignWithUseCasesUseCase"]
diff --git a/src/sent_dm/types/sent_dm_services_common_contracts_poc_os_authentication_config_param.py b/src/sent_dm/types/sent_dm_services_common_contracts_poc_os_authentication_config_param.py
deleted file mode 100644
index 70a0a31..0000000
--- a/src/sent_dm/types/sent_dm_services_common_contracts_poc_os_authentication_config_param.py
+++ /dev/null
@@ -1,26 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-from typing import Optional
-from typing_extensions import Annotated, TypedDict
-
-from .._utils import PropertyInfo
-
-__all__ = ["SentDmServicesCommonContractsPocOsAuthenticationConfigParam"]
-
-
-class SentDmServicesCommonContractsPocOsAuthenticationConfigParam(TypedDict, total=False):
- """Configuration for AUTHENTICATION category templates"""
-
- add_security_recommendation: Annotated[bool, PropertyInfo(alias="addSecurityRecommendation")]
- """
- Whether to add the security recommendation text: "For your security, do not
- share this code."
- """
-
- code_expiration_minutes: Annotated[Optional[int], PropertyInfo(alias="codeExpirationMinutes")]
- """Code expiration time in minutes (1-90).
-
- If set, adds footer: "This code expires in X minutes."
- """
diff --git a/src/sent_dm/types/sent_dm_services_common_contracts_poc_os_template_body_param.py b/src/sent_dm/types/sent_dm_services_common_contracts_poc_os_template_body_param.py
deleted file mode 100644
index 92437e1..0000000
--- a/src/sent_dm/types/sent_dm_services_common_contracts_poc_os_template_body_param.py
+++ /dev/null
@@ -1,30 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-from typing import Optional
-from typing_extensions import Annotated, TypedDict
-
-from .._utils import PropertyInfo
-from .template_body_content_param import TemplateBodyContentParam
-
-__all__ = ["SentDmServicesCommonContractsPocOsTemplateBodyParam"]
-
-
-class SentDmServicesCommonContractsPocOsTemplateBodyParam(TypedDict, total=False):
- """Body section of a message template with channel-specific content"""
-
- multi_channel: Annotated[Optional[TemplateBodyContentParam], PropertyInfo(alias="multiChannel")]
- """
- Content that will be used for all channels (SMS and WhatsApp) unless
- channel-specific content is provided
- """
-
- sms: Optional[TemplateBodyContentParam]
- """SMS-specific content that overrides multi-channel content for SMS messages"""
-
- whatsapp: Optional[TemplateBodyContentParam]
- """
- WhatsApp-specific content that overrides multi-channel content for WhatsApp
- messages
- """
diff --git a/src/sent_dm/types/sent_dm_services_common_contracts_poc_os_template_button_param.py b/src/sent_dm/types/sent_dm_services_common_contracts_poc_os_template_button_param.py
deleted file mode 100644
index 2770c6e..0000000
--- a/src/sent_dm/types/sent_dm_services_common_contracts_poc_os_template_button_param.py
+++ /dev/null
@@ -1,26 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-from typing_extensions import TypedDict
-
-from .sent_dm_services_common_contracts_poc_os_template_button_props_param import (
- SentDmServicesCommonContractsPocOsTemplateButtonPropsParam,
-)
-
-__all__ = ["SentDmServicesCommonContractsPocOsTemplateButtonParam"]
-
-
-class SentDmServicesCommonContractsPocOsTemplateButtonParam(TypedDict, total=False):
- """Interactive button in a message template"""
-
- id: int
- """The unique identifier of the button (1-based index)"""
-
- props: SentDmServicesCommonContractsPocOsTemplateButtonPropsParam
- """Properties specific to the button type"""
-
- type: str
- """
- The type of button (e.g., QUICK_REPLY, URL, PHONE_NUMBER, VOICE_CALL, COPY_CODE)
- """
diff --git a/src/sent_dm/types/sent_dm_services_common_contracts_poc_os_template_button_props_param.py b/src/sent_dm/types/sent_dm_services_common_contracts_poc_os_template_button_props_param.py
deleted file mode 100644
index aa508bc..0000000
--- a/src/sent_dm/types/sent_dm_services_common_contracts_poc_os_template_button_props_param.py
+++ /dev/null
@@ -1,36 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-from typing import Optional
-from typing_extensions import Annotated, TypedDict
-
-from .._utils import PropertyInfo
-
-__all__ = ["SentDmServicesCommonContractsPocOsTemplateButtonPropsParam"]
-
-
-class SentDmServicesCommonContractsPocOsTemplateButtonPropsParam(TypedDict, total=False):
- active_for: Annotated[Optional[int], PropertyInfo(alias="activeFor")]
-
- autofill_text: Annotated[Optional[str], PropertyInfo(alias="autofillText")]
-
- country_code: Annotated[Optional[str], PropertyInfo(alias="countryCode")]
-
- offer_code: Annotated[Optional[str], PropertyInfo(alias="offerCode")]
-
- otp_type: Annotated[Optional[str], PropertyInfo(alias="otpType")]
-
- package_name: Annotated[Optional[str], PropertyInfo(alias="packageName")]
-
- phone_number: Annotated[Optional[str], PropertyInfo(alias="phoneNumber")]
-
- quick_reply_type: Annotated[Optional[str], PropertyInfo(alias="quickReplyType")]
-
- signature_hash: Annotated[Optional[str], PropertyInfo(alias="signatureHash")]
-
- text: Optional[str]
-
- url: Optional[str]
-
- url_type: Annotated[Optional[str], PropertyInfo(alias="urlType")]
diff --git a/src/sent_dm/types/sent_dm_services_common_contracts_poc_os_template_footer_param.py b/src/sent_dm/types/sent_dm_services_common_contracts_poc_os_template_footer_param.py
deleted file mode 100644
index 1431cb1..0000000
--- a/src/sent_dm/types/sent_dm_services_common_contracts_poc_os_template_footer_param.py
+++ /dev/null
@@ -1,23 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-from typing import Iterable, Optional
-from typing_extensions import TypedDict
-
-from .template_variable_param import TemplateVariableParam
-
-__all__ = ["SentDmServicesCommonContractsPocOsTemplateFooterParam"]
-
-
-class SentDmServicesCommonContractsPocOsTemplateFooterParam(TypedDict, total=False):
- """Footer section of a message template"""
-
- template: str
- """The footer template text with optional variable placeholders"""
-
- type: Optional[str]
- """The type of footer (typically "text")"""
-
- variables: Optional[Iterable[TemplateVariableParam]]
- """List of variables used in the footer template"""
diff --git a/src/sent_dm/types/sent_dm_services_common_contracts_poc_os_template_header_param.py b/src/sent_dm/types/sent_dm_services_common_contracts_poc_os_template_header_param.py
deleted file mode 100644
index da6a254..0000000
--- a/src/sent_dm/types/sent_dm_services_common_contracts_poc_os_template_header_param.py
+++ /dev/null
@@ -1,26 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-from typing import Iterable, Optional
-from typing_extensions import TypedDict
-
-from .template_variable_param import TemplateVariableParam
-
-__all__ = ["SentDmServicesCommonContractsPocOsTemplateHeaderParam"]
-
-
-class SentDmServicesCommonContractsPocOsTemplateHeaderParam(TypedDict, total=False):
- """Header section of a message template"""
-
- template: str
- """
- The header template text with optional variable placeholders (e.g., "Welcome to
- {{0:variable}}")
- """
-
- type: Optional[str]
- """The type of header (e.g., "text", "image", "video", "document")"""
-
- variables: Optional[Iterable[TemplateVariableParam]]
- """List of variables used in the header template"""
diff --git a/src/sent_dm/types/sent_dm_services_endpoints_customer_ap_iv3_contracts_requests_brands_brand_business_info_param.py b/src/sent_dm/types/sent_dm_services_endpoints_customer_ap_iv3_contracts_requests_brands_brand_business_info_param.py
deleted file mode 100644
index dfb0149..0000000
--- a/src/sent_dm/types/sent_dm_services_endpoints_customer_ap_iv3_contracts_requests_brands_brand_business_info_param.py
+++ /dev/null
@@ -1,49 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-from typing import Optional
-from typing_extensions import Literal, Annotated, TypedDict
-
-from .._utils import PropertyInfo
-
-__all__ = ["SentDmServicesEndpointsCustomerApIv3ContractsRequestsBrandsBrandBusinessInfoParam"]
-
-
-class SentDmServicesEndpointsCustomerApIv3ContractsRequestsBrandsBrandBusinessInfoParam(TypedDict, total=False):
- """Business details and address for brand KYC"""
-
- city: Optional[str]
- """City"""
-
- country: Optional[str]
- """Country code (e.g., US, CA)"""
-
- country_of_registration: Annotated[Optional[str], PropertyInfo(alias="countryOfRegistration")]
- """Country where the business is registered"""
-
- entity_type: Annotated[
- Optional[Literal["PRIVATE_PROFIT", "PUBLIC_PROFIT", "NON_PROFIT", "SOLE_PROPRIETOR", "GOVERNMENT"]],
- PropertyInfo(alias="entityType"),
- ]
-
- legal_name: Annotated[Optional[str], PropertyInfo(alias="legalName")]
- """Legal business name"""
-
- postal_code: Annotated[Optional[str], PropertyInfo(alias="postalCode")]
- """Postal/ZIP code"""
-
- state: Optional[str]
- """State/province code"""
-
- street: Optional[str]
- """Street address"""
-
- tax_id: Annotated[Optional[str], PropertyInfo(alias="taxId")]
- """Tax ID/EIN number"""
-
- tax_id_type: Annotated[Optional[str], PropertyInfo(alias="taxIdType")]
- """Type of tax ID (e.g., us_ein, ca_bn)"""
-
- url: Optional[str]
- """Business website URL"""
diff --git a/src/sent_dm/types/sent_dm_services_endpoints_customer_ap_iv3_contracts_requests_brands_brand_compliance_info_param.py b/src/sent_dm/types/sent_dm_services_endpoints_customer_ap_iv3_contracts_requests_brands_brand_compliance_info_param.py
deleted file mode 100644
index 2030a52..0000000
--- a/src/sent_dm/types/sent_dm_services_endpoints_customer_ap_iv3_contracts_requests_brands_brand_compliance_info_param.py
+++ /dev/null
@@ -1,41 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-from typing import Iterable, Optional
-from typing_extensions import Required, Annotated, TypedDict
-
-from .._utils import PropertyInfo
-from .tcr_vertical import TcrVertical
-from .tcr_brand_relationship import TcrBrandRelationship
-from .destination_country_param import DestinationCountryParam
-
-__all__ = ["SentDmServicesEndpointsCustomerApIv3ContractsRequestsBrandsBrandComplianceInfoParam"]
-
-
-class SentDmServicesEndpointsCustomerApIv3ContractsRequestsBrandsBrandComplianceInfoParam(TypedDict, total=False):
- """Compliance and TCR information for brand registration"""
-
- brand_relationship: Required[Annotated[TcrBrandRelationship, PropertyInfo(alias="brandRelationship")]]
-
- vertical: Required[TcrVertical]
-
- destination_countries: Annotated[
- Optional[Iterable[DestinationCountryParam]], PropertyInfo(alias="destinationCountries")
- ]
- """List of destination countries for messaging"""
-
- expected_messaging_volume: Annotated[Optional[str], PropertyInfo(alias="expectedMessagingVolume")]
- """Expected daily messaging volume"""
-
- is_tcr_application: Annotated[Optional[bool], PropertyInfo(alias="isTcrApplication")]
- """Whether this is a TCR (Campaign Registry) application"""
-
- notes: Optional[str]
- """Additional notes about the business or use case"""
-
- phone_number_prefix: Annotated[Optional[str], PropertyInfo(alias="phoneNumberPrefix")]
- """Phone number prefix for messaging (e.g., "+1")"""
-
- primary_use_case: Annotated[Optional[str], PropertyInfo(alias="primaryUseCase")]
- """Primary messaging use case description"""
diff --git a/src/sent_dm/types/sent_dm_services_endpoints_customer_ap_iv3_contracts_requests_brands_brand_contact_info_param.py b/src/sent_dm/types/sent_dm_services_endpoints_customer_ap_iv3_contracts_requests_brands_brand_contact_info_param.py
deleted file mode 100644
index e808c53..0000000
--- a/src/sent_dm/types/sent_dm_services_endpoints_customer_ap_iv3_contracts_requests_brands_brand_contact_info_param.py
+++ /dev/null
@@ -1,32 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-from typing import Optional
-from typing_extensions import Required, Annotated, TypedDict
-
-from .._utils import PropertyInfo
-
-__all__ = ["SentDmServicesEndpointsCustomerApIv3ContractsRequestsBrandsBrandContactInfoParam"]
-
-
-class SentDmServicesEndpointsCustomerApIv3ContractsRequestsBrandsBrandContactInfoParam(TypedDict, total=False):
- """Contact information for brand KYC"""
-
- name: Required[str]
- """Primary contact name (required)"""
-
- business_name: Annotated[Optional[str], PropertyInfo(alias="businessName")]
- """Business/brand name"""
-
- email: Optional[str]
- """Contact email address"""
-
- phone: Optional[str]
- """Contact phone number in E.164 format"""
-
- phone_country_code: Annotated[Optional[str], PropertyInfo(alias="phoneCountryCode")]
- """Contact phone country code (e.g., "1" for US)"""
-
- role: Optional[str]
- """Contact's role in the business"""
diff --git a/src/sent_dm/types/shared/__init__.py b/src/sent_dm/types/shared/__init__.py
deleted file mode 100644
index 147f4b4..0000000
--- a/src/sent_dm/types/shared/__init__.py
+++ /dev/null
@@ -1,3 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from .base_dto import BaseDto as BaseDto
diff --git a/src/sent_dm/types/template_definition_param.py b/src/sent_dm/types/template_definition_param.py
index 055f801..fa83bb3 100644
--- a/src/sent_dm/types/template_definition_param.py
+++ b/src/sent_dm/types/template_definition_param.py
@@ -6,23 +6,117 @@
from typing_extensions import Required, Annotated, TypedDict
from .._utils import PropertyInfo
-from .sent_dm_services_common_contracts_poc_os_template_body_param import (
- SentDmServicesCommonContractsPocOsTemplateBodyParam,
-)
-from .sent_dm_services_common_contracts_poc_os_template_button_param import (
- SentDmServicesCommonContractsPocOsTemplateButtonParam,
-)
-from .sent_dm_services_common_contracts_poc_os_template_footer_param import (
- SentDmServicesCommonContractsPocOsTemplateFooterParam,
-)
-from .sent_dm_services_common_contracts_poc_os_template_header_param import (
- SentDmServicesCommonContractsPocOsTemplateHeaderParam,
-)
-from .sent_dm_services_common_contracts_poc_os_authentication_config_param import (
- SentDmServicesCommonContractsPocOsAuthenticationConfigParam,
-)
-
-__all__ = ["TemplateDefinitionParam"]
+from .template_variable_param import TemplateVariableParam
+from .template_body_content_param import TemplateBodyContentParam
+
+__all__ = ["TemplateDefinitionParam", "Body", "AuthenticationConfig", "Button", "ButtonProps", "Footer", "Header"]
+
+
+class Body(TypedDict, total=False):
+ """Body section of a message template with channel-specific content"""
+
+ multi_channel: Annotated[Optional[TemplateBodyContentParam], PropertyInfo(alias="multiChannel")]
+ """
+ Content that will be used for all channels (SMS and WhatsApp) unless
+ channel-specific content is provided
+ """
+
+ sms: Optional[TemplateBodyContentParam]
+ """SMS-specific content that overrides multi-channel content for SMS messages"""
+
+ whatsapp: Optional[TemplateBodyContentParam]
+ """
+ WhatsApp-specific content that overrides multi-channel content for WhatsApp
+ messages
+ """
+
+
+class AuthenticationConfig(TypedDict, total=False):
+ """Configuration for AUTHENTICATION category templates"""
+
+ add_security_recommendation: Annotated[bool, PropertyInfo(alias="addSecurityRecommendation")]
+ """
+ Whether to add the security recommendation text: "For your security, do not
+ share this code."
+ """
+
+ code_expiration_minutes: Annotated[Optional[int], PropertyInfo(alias="codeExpirationMinutes")]
+ """Code expiration time in minutes (1-90).
+
+ If set, adds footer: "This code expires in X minutes."
+ """
+
+
+class ButtonProps(TypedDict, total=False):
+ """Properties specific to the button type"""
+
+ active_for: Annotated[Optional[int], PropertyInfo(alias="activeFor")]
+
+ autofill_text: Annotated[Optional[str], PropertyInfo(alias="autofillText")]
+
+ country_code: Annotated[Optional[str], PropertyInfo(alias="countryCode")]
+
+ offer_code: Annotated[Optional[str], PropertyInfo(alias="offerCode")]
+
+ otp_type: Annotated[Optional[str], PropertyInfo(alias="otpType")]
+
+ package_name: Annotated[Optional[str], PropertyInfo(alias="packageName")]
+
+ phone_number: Annotated[Optional[str], PropertyInfo(alias="phoneNumber")]
+
+ quick_reply_type: Annotated[Optional[str], PropertyInfo(alias="quickReplyType")]
+
+ signature_hash: Annotated[Optional[str], PropertyInfo(alias="signatureHash")]
+
+ text: Optional[str]
+
+ url: Optional[str]
+
+ url_type: Annotated[Optional[str], PropertyInfo(alias="urlType")]
+
+
+class Button(TypedDict, total=False):
+ """Interactive button in a message template"""
+
+ id: int
+ """The unique identifier of the button (1-based index)"""
+
+ props: ButtonProps
+ """Properties specific to the button type"""
+
+ type: str
+ """
+ The type of button (e.g., QUICK_REPLY, URL, PHONE_NUMBER, VOICE_CALL, COPY_CODE)
+ """
+
+
+class Footer(TypedDict, total=False):
+ """Footer section of a message template"""
+
+ template: str
+ """The footer template text with optional variable placeholders"""
+
+ type: Optional[str]
+ """The type of footer (typically "text")"""
+
+ variables: Optional[Iterable[TemplateVariableParam]]
+ """List of variables used in the footer template"""
+
+
+class Header(TypedDict, total=False):
+ """Header section of a message template"""
+
+ template: str
+ """
+ The header template text with optional variable placeholders (e.g., "Welcome to
+ {{0:variable}}")
+ """
+
+ type: Optional[str]
+ """The type of header (e.g., "text", "image", "video", "document")"""
+
+ variables: Optional[Iterable[TemplateVariableParam]]
+ """List of variables used in the header template"""
class TemplateDefinitionParam(TypedDict, total=False):
@@ -30,23 +124,20 @@ class TemplateDefinitionParam(TypedDict, total=False):
Complete definition of a message template including header, body, footer, and buttons
"""
- body: Required[SentDmServicesCommonContractsPocOsTemplateBodyParam]
+ body: Required[Body]
"""Body section of a message template with channel-specific content"""
- authentication_config: Annotated[
- Optional[SentDmServicesCommonContractsPocOsAuthenticationConfigParam],
- PropertyInfo(alias="authenticationConfig"),
- ]
+ authentication_config: Annotated[Optional[AuthenticationConfig], PropertyInfo(alias="authenticationConfig")]
"""Configuration for AUTHENTICATION category templates"""
- buttons: Optional[Iterable[SentDmServicesCommonContractsPocOsTemplateButtonParam]]
+ buttons: Optional[Iterable[Button]]
"""Optional list of interactive buttons (e.g., quick replies, URLs, phone numbers)"""
definition_version: Annotated[Optional[str], PropertyInfo(alias="definitionVersion")]
"""The version of the template definition format"""
- footer: Optional[SentDmServicesCommonContractsPocOsTemplateFooterParam]
+ footer: Optional[Footer]
"""Footer section of a message template"""
- header: Optional[SentDmServicesCommonContractsPocOsTemplateHeaderParam]
+ header: Optional[Header]
"""Header section of a message template"""
diff --git a/src/sent_dm/types/user_remove_params.py b/src/sent_dm/types/user_remove_params.py
index 522f2d0..dd4ed75 100644
--- a/src/sent_dm/types/user_remove_params.py
+++ b/src/sent_dm/types/user_remove_params.py
@@ -5,7 +5,7 @@
from typing_extensions import Required, Annotated, TypedDict
from .._utils import PropertyInfo
-from .mutation_request_base_param import MutationRequestBaseParam
+from .mutation_request_param import MutationRequestParam
__all__ = ["UserRemoveParams", "Body"]
@@ -17,7 +17,7 @@ class UserRemoveParams(TypedDict, total=False):
x_profile_id: Annotated[str, PropertyInfo(alias="x-profile-id")]
-class Body(MutationRequestBaseParam, total=False):
+class Body(MutationRequestParam, total=False):
"""Request to remove a user from an organization"""
pass
diff --git a/src/sent_dm/types/webhook_rotate_secret_params.py b/src/sent_dm/types/webhook_rotate_secret_params.py
index d217cb5..51a4de5 100644
--- a/src/sent_dm/types/webhook_rotate_secret_params.py
+++ b/src/sent_dm/types/webhook_rotate_secret_params.py
@@ -5,7 +5,7 @@
from typing_extensions import Required, Annotated, TypedDict
from .._utils import PropertyInfo
-from .mutation_request_base_param import MutationRequestBaseParam
+from .mutation_request_param import MutationRequestParam
__all__ = ["WebhookRotateSecretParams", "Body"]
@@ -18,5 +18,5 @@ class WebhookRotateSecretParams(TypedDict, total=False):
x_profile_id: Annotated[str, PropertyInfo(alias="x-profile-id")]
-class Body(MutationRequestBaseParam, total=False):
+class Body(MutationRequestParam, total=False):
pass
diff --git a/tests/api_resources/test_profiles.py b/tests/api_resources/test_profiles.py
index be45cde..b6707f7 100644
--- a/tests/api_resources/test_profiles.py
+++ b/tests/api_resources/test_profiles.py
@@ -388,8 +388,8 @@ def test_path_params_delete(self, client: SentDm) -> None:
@pytest.mark.skip(reason="Mock server tests are disabled")
@parametrize
- def test_method_complete_setup(self, client: SentDm) -> None:
- profile = client.profiles.complete_setup(
+ def test_method_complete(self, client: SentDm) -> None:
+ profile = client.profiles.complete(
profile_id="660e8400-e29b-41d4-a716-446655440000",
web_hook_url="https://your-app.com/webhook/profile-complete",
)
@@ -397,8 +397,8 @@ def test_method_complete_setup(self, client: SentDm) -> None:
@pytest.mark.skip(reason="Mock server tests are disabled")
@parametrize
- def test_method_complete_setup_with_all_params(self, client: SentDm) -> None:
- profile = client.profiles.complete_setup(
+ def test_method_complete_with_all_params(self, client: SentDm) -> None:
+ profile = client.profiles.complete(
profile_id="660e8400-e29b-41d4-a716-446655440000",
web_hook_url="https://your-app.com/webhook/profile-complete",
sandbox=False,
@@ -409,8 +409,8 @@ def test_method_complete_setup_with_all_params(self, client: SentDm) -> None:
@pytest.mark.skip(reason="Mock server tests are disabled")
@parametrize
- def test_raw_response_complete_setup(self, client: SentDm) -> None:
- response = client.profiles.with_raw_response.complete_setup(
+ def test_raw_response_complete(self, client: SentDm) -> None:
+ response = client.profiles.with_raw_response.complete(
profile_id="660e8400-e29b-41d4-a716-446655440000",
web_hook_url="https://your-app.com/webhook/profile-complete",
)
@@ -422,8 +422,8 @@ def test_raw_response_complete_setup(self, client: SentDm) -> None:
@pytest.mark.skip(reason="Mock server tests are disabled")
@parametrize
- def test_streaming_response_complete_setup(self, client: SentDm) -> None:
- with client.profiles.with_streaming_response.complete_setup(
+ def test_streaming_response_complete(self, client: SentDm) -> None:
+ with client.profiles.with_streaming_response.complete(
profile_id="660e8400-e29b-41d4-a716-446655440000",
web_hook_url="https://your-app.com/webhook/profile-complete",
) as response:
@@ -437,9 +437,9 @@ def test_streaming_response_complete_setup(self, client: SentDm) -> None:
@pytest.mark.skip(reason="Mock server tests are disabled")
@parametrize
- def test_path_params_complete_setup(self, client: SentDm) -> None:
+ def test_path_params_complete(self, client: SentDm) -> None:
with pytest.raises(ValueError, match=r"Expected a non-empty value for `profile_id` but received ''"):
- client.profiles.with_raw_response.complete_setup(
+ client.profiles.with_raw_response.complete(
profile_id="",
web_hook_url="https://your-app.com/webhook/profile-complete",
)
@@ -818,8 +818,8 @@ async def test_path_params_delete(self, async_client: AsyncSentDm) -> None:
@pytest.mark.skip(reason="Mock server tests are disabled")
@parametrize
- async def test_method_complete_setup(self, async_client: AsyncSentDm) -> None:
- profile = await async_client.profiles.complete_setup(
+ async def test_method_complete(self, async_client: AsyncSentDm) -> None:
+ profile = await async_client.profiles.complete(
profile_id="660e8400-e29b-41d4-a716-446655440000",
web_hook_url="https://your-app.com/webhook/profile-complete",
)
@@ -827,8 +827,8 @@ async def test_method_complete_setup(self, async_client: AsyncSentDm) -> None:
@pytest.mark.skip(reason="Mock server tests are disabled")
@parametrize
- async def test_method_complete_setup_with_all_params(self, async_client: AsyncSentDm) -> None:
- profile = await async_client.profiles.complete_setup(
+ async def test_method_complete_with_all_params(self, async_client: AsyncSentDm) -> None:
+ profile = await async_client.profiles.complete(
profile_id="660e8400-e29b-41d4-a716-446655440000",
web_hook_url="https://your-app.com/webhook/profile-complete",
sandbox=False,
@@ -839,8 +839,8 @@ async def test_method_complete_setup_with_all_params(self, async_client: AsyncSe
@pytest.mark.skip(reason="Mock server tests are disabled")
@parametrize
- async def test_raw_response_complete_setup(self, async_client: AsyncSentDm) -> None:
- response = await async_client.profiles.with_raw_response.complete_setup(
+ async def test_raw_response_complete(self, async_client: AsyncSentDm) -> None:
+ response = await async_client.profiles.with_raw_response.complete(
profile_id="660e8400-e29b-41d4-a716-446655440000",
web_hook_url="https://your-app.com/webhook/profile-complete",
)
@@ -852,8 +852,8 @@ async def test_raw_response_complete_setup(self, async_client: AsyncSentDm) -> N
@pytest.mark.skip(reason="Mock server tests are disabled")
@parametrize
- async def test_streaming_response_complete_setup(self, async_client: AsyncSentDm) -> None:
- async with async_client.profiles.with_streaming_response.complete_setup(
+ async def test_streaming_response_complete(self, async_client: AsyncSentDm) -> None:
+ async with async_client.profiles.with_streaming_response.complete(
profile_id="660e8400-e29b-41d4-a716-446655440000",
web_hook_url="https://your-app.com/webhook/profile-complete",
) as response:
@@ -867,9 +867,9 @@ async def test_streaming_response_complete_setup(self, async_client: AsyncSentDm
@pytest.mark.skip(reason="Mock server tests are disabled")
@parametrize
- async def test_path_params_complete_setup(self, async_client: AsyncSentDm) -> None:
+ async def test_path_params_complete(self, async_client: AsyncSentDm) -> None:
with pytest.raises(ValueError, match=r"Expected a non-empty value for `profile_id` but received ''"):
- await async_client.profiles.with_raw_response.complete_setup(
+ await async_client.profiles.with_raw_response.complete(
profile_id="",
web_hook_url="https://your-app.com/webhook/profile-complete",
)
From e08ed33e783744f84c88826061b47ccd27fc4324 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Thu, 12 Mar 2026 10:56:09 +0000
Subject: [PATCH 12/15] feat(api): manual updates
---
.stats.yml | 2 +-
api.md | 10 ++
src/sent_dm/types/__init__.py | 27 ++++
src/sent_dm/types/brands_brand_data_param.py | 114 ++------------
src/sent_dm/types/profiles/__init__.py | 3 +
.../types/profiles/campaign_data_param.py | 23 ++-
..._campaigns_campaign_use_case_data_param.py | 20 +++
...acts_poc_os_authentication_config_param.py | 26 ++++
...on_contracts_poc_os_template_body_param.py | 30 ++++
..._contracts_poc_os_template_button_param.py | 26 ++++
...acts_poc_os_template_button_props_param.py | 36 +++++
..._contracts_poc_os_template_footer_param.py | 23 +++
..._contracts_poc_os_template_header_param.py | 26 ++++
...quests_brands_brand_business_info_param.py | 49 ++++++
...ests_brands_brand_compliance_info_param.py | 41 +++++
...equests_brands_brand_contact_info_param.py | 32 ++++
.../types/template_definition_param.py | 141 ++++--------------
17 files changed, 400 insertions(+), 229 deletions(-)
create mode 100644 src/sent_dm/types/profiles/sent_dm_services_endpoints_customer_ap_iv3_contracts_requests_campaigns_campaign_use_case_data_param.py
create mode 100644 src/sent_dm/types/sent_dm_services_common_contracts_poc_os_authentication_config_param.py
create mode 100644 src/sent_dm/types/sent_dm_services_common_contracts_poc_os_template_body_param.py
create mode 100644 src/sent_dm/types/sent_dm_services_common_contracts_poc_os_template_button_param.py
create mode 100644 src/sent_dm/types/sent_dm_services_common_contracts_poc_os_template_button_props_param.py
create mode 100644 src/sent_dm/types/sent_dm_services_common_contracts_poc_os_template_footer_param.py
create mode 100644 src/sent_dm/types/sent_dm_services_common_contracts_poc_os_template_header_param.py
create mode 100644 src/sent_dm/types/sent_dm_services_endpoints_customer_ap_iv3_contracts_requests_brands_brand_business_info_param.py
create mode 100644 src/sent_dm/types/sent_dm_services_endpoints_customer_ap_iv3_contracts_requests_brands_brand_compliance_info_param.py
create mode 100644 src/sent_dm/types/sent_dm_services_endpoints_customer_ap_iv3_contracts_requests_brands_brand_contact_info_param.py
diff --git a/.stats.yml b/.stats.yml
index 4792a46..274df57 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
configured_endpoints: 40
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent%2Fsent-dm-2566cdc5d8e0bffe2a8c442692b0fc1b35d3bfe7e9bf578331fc19d402361c1f.yml
openapi_spec_hash: 85e1feeb9bbc8d59bb34d6cdd679575a
-config_hash: 676ee4f74f5b328b155283c879154b66
+config_hash: 497506d9e2e66cd0573bd9c1f1242462
diff --git a/api.md b/api.md
index 3f3b667..5c71f65 100644
--- a/api.md
+++ b/api.md
@@ -54,6 +54,12 @@ Types:
```python
from sent_dm.types import (
APIResponseTemplate,
+ SentDmServicesCommonContractsPocOsAuthenticationConfig,
+ SentDmServicesCommonContractsPocOsTemplateBody,
+ SentDmServicesCommonContractsPocOsTemplateButton,
+ SentDmServicesCommonContractsPocOsTemplateButtonProps,
+ SentDmServicesCommonContractsPocOsTemplateFooter,
+ SentDmServicesCommonContractsPocOsTemplateHeader,
Template,
TemplateBodyContent,
TemplateDefinition,
@@ -82,6 +88,9 @@ from sent_dm.types import (
DestinationCountry,
PaymentDetails,
ProfileDetail,
+ SentDmServicesEndpointsCustomerApIv3ContractsRequestsBrandsBrandBusinessInfo,
+ SentDmServicesEndpointsCustomerApIv3ContractsRequestsBrandsBrandComplianceInfo,
+ SentDmServicesEndpointsCustomerApIv3ContractsRequestsBrandsBrandContactInfo,
TcrBrandRelationship,
TcrVertical,
ProfileListResponse,
@@ -107,6 +116,7 @@ from sent_dm.types.profiles import (
BaseDto,
CampaignData,
MessagingUseCaseUs,
+ SentDmServicesEndpointsCustomerApIv3ContractsRequestsCampaignsCampaignUseCaseData,
TcrCampaignWithUseCases,
CampaignListResponse,
)
diff --git a/src/sent_dm/types/__init__.py b/src/sent_dm/types/__init__.py
index 9adbf8a..b8d439e 100644
--- a/src/sent_dm/types/__init__.py
+++ b/src/sent_dm/types/__init__.py
@@ -64,3 +64,30 @@
from .message_retrieve_status_response import MessageRetrieveStatusResponse as MessageRetrieveStatusResponse
from .webhook_list_event_types_response import WebhookListEventTypesResponse as WebhookListEventTypesResponse
from .message_retrieve_activities_response import MessageRetrieveActivitiesResponse as MessageRetrieveActivitiesResponse
+from .sent_dm_services_common_contracts_poc_os_template_body_param import (
+ SentDmServicesCommonContractsPocOsTemplateBodyParam as SentDmServicesCommonContractsPocOsTemplateBodyParam,
+)
+from .sent_dm_services_common_contracts_poc_os_template_button_param import (
+ SentDmServicesCommonContractsPocOsTemplateButtonParam as SentDmServicesCommonContractsPocOsTemplateButtonParam,
+)
+from .sent_dm_services_common_contracts_poc_os_template_footer_param import (
+ SentDmServicesCommonContractsPocOsTemplateFooterParam as SentDmServicesCommonContractsPocOsTemplateFooterParam,
+)
+from .sent_dm_services_common_contracts_poc_os_template_header_param import (
+ SentDmServicesCommonContractsPocOsTemplateHeaderParam as SentDmServicesCommonContractsPocOsTemplateHeaderParam,
+)
+from .sent_dm_services_common_contracts_poc_os_authentication_config_param import (
+ SentDmServicesCommonContractsPocOsAuthenticationConfigParam as SentDmServicesCommonContractsPocOsAuthenticationConfigParam,
+)
+from .sent_dm_services_common_contracts_poc_os_template_button_props_param import (
+ SentDmServicesCommonContractsPocOsTemplateButtonPropsParam as SentDmServicesCommonContractsPocOsTemplateButtonPropsParam,
+)
+from .sent_dm_services_endpoints_customer_ap_iv3_contracts_requests_brands_brand_contact_info_param import (
+ SentDmServicesEndpointsCustomerApIv3ContractsRequestsBrandsBrandContactInfoParam as SentDmServicesEndpointsCustomerApIv3ContractsRequestsBrandsBrandContactInfoParam,
+)
+from .sent_dm_services_endpoints_customer_ap_iv3_contracts_requests_brands_brand_business_info_param import (
+ SentDmServicesEndpointsCustomerApIv3ContractsRequestsBrandsBrandBusinessInfoParam as SentDmServicesEndpointsCustomerApIv3ContractsRequestsBrandsBrandBusinessInfoParam,
+)
+from .sent_dm_services_endpoints_customer_ap_iv3_contracts_requests_brands_brand_compliance_info_param import (
+ SentDmServicesEndpointsCustomerApIv3ContractsRequestsBrandsBrandComplianceInfoParam as SentDmServicesEndpointsCustomerApIv3ContractsRequestsBrandsBrandComplianceInfoParam,
+)
diff --git a/src/sent_dm/types/brands_brand_data_param.py b/src/sent_dm/types/brands_brand_data_param.py
index 26a616e..02ea9ed 100644
--- a/src/sent_dm/types/brands_brand_data_param.py
+++ b/src/sent_dm/types/brands_brand_data_param.py
@@ -2,114 +2,30 @@
from __future__ import annotations
-from typing import Iterable, Optional
-from typing_extensions import Literal, Required, Annotated, TypedDict
+from typing import Optional
+from typing_extensions import Required, TypedDict
-from .._utils import PropertyInfo
-from .tcr_vertical import TcrVertical
-from .tcr_brand_relationship import TcrBrandRelationship
-from .destination_country_param import DestinationCountryParam
+from .sent_dm_services_endpoints_customer_ap_iv3_contracts_requests_brands_brand_contact_info_param import (
+ SentDmServicesEndpointsCustomerApIv3ContractsRequestsBrandsBrandContactInfoParam,
+)
+from .sent_dm_services_endpoints_customer_ap_iv3_contracts_requests_brands_brand_business_info_param import (
+ SentDmServicesEndpointsCustomerApIv3ContractsRequestsBrandsBrandBusinessInfoParam,
+)
+from .sent_dm_services_endpoints_customer_ap_iv3_contracts_requests_brands_brand_compliance_info_param import (
+ SentDmServicesEndpointsCustomerApIv3ContractsRequestsBrandsBrandComplianceInfoParam,
+)
-__all__ = ["BrandsBrandDataParam", "Compliance", "Contact", "Business"]
-
-
-class Compliance(TypedDict, total=False):
- """Compliance and TCR information for brand registration"""
-
- brand_relationship: Required[Annotated[TcrBrandRelationship, PropertyInfo(alias="brandRelationship")]]
-
- vertical: Required[TcrVertical]
-
- destination_countries: Annotated[
- Optional[Iterable[DestinationCountryParam]], PropertyInfo(alias="destinationCountries")
- ]
- """List of destination countries for messaging"""
-
- expected_messaging_volume: Annotated[Optional[str], PropertyInfo(alias="expectedMessagingVolume")]
- """Expected daily messaging volume"""
-
- is_tcr_application: Annotated[Optional[bool], PropertyInfo(alias="isTcrApplication")]
- """Whether this is a TCR (Campaign Registry) application"""
-
- notes: Optional[str]
- """Additional notes about the business or use case"""
-
- phone_number_prefix: Annotated[Optional[str], PropertyInfo(alias="phoneNumberPrefix")]
- """Phone number prefix for messaging (e.g., "+1")"""
-
- primary_use_case: Annotated[Optional[str], PropertyInfo(alias="primaryUseCase")]
- """Primary messaging use case description"""
-
-
-class Contact(TypedDict, total=False):
- """Contact information for brand KYC"""
-
- name: Required[str]
- """Primary contact name (required)"""
-
- business_name: Annotated[Optional[str], PropertyInfo(alias="businessName")]
- """Business/brand name"""
-
- email: Optional[str]
- """Contact email address"""
-
- phone: Optional[str]
- """Contact phone number in E.164 format"""
-
- phone_country_code: Annotated[Optional[str], PropertyInfo(alias="phoneCountryCode")]
- """Contact phone country code (e.g., "1" for US)"""
-
- role: Optional[str]
- """Contact's role in the business"""
-
-
-class Business(TypedDict, total=False):
- """Business details and address for brand KYC"""
-
- city: Optional[str]
- """City"""
-
- country: Optional[str]
- """Country code (e.g., US, CA)"""
-
- country_of_registration: Annotated[Optional[str], PropertyInfo(alias="countryOfRegistration")]
- """Country where the business is registered"""
-
- entity_type: Annotated[
- Optional[Literal["PRIVATE_PROFIT", "PUBLIC_PROFIT", "NON_PROFIT", "SOLE_PROPRIETOR", "GOVERNMENT"]],
- PropertyInfo(alias="entityType"),
- ]
-
- legal_name: Annotated[Optional[str], PropertyInfo(alias="legalName")]
- """Legal business name"""
-
- postal_code: Annotated[Optional[str], PropertyInfo(alias="postalCode")]
- """Postal/ZIP code"""
-
- state: Optional[str]
- """State/province code"""
-
- street: Optional[str]
- """Street address"""
-
- tax_id: Annotated[Optional[str], PropertyInfo(alias="taxId")]
- """Tax ID/EIN number"""
-
- tax_id_type: Annotated[Optional[str], PropertyInfo(alias="taxIdType")]
- """Type of tax ID (e.g., us_ein, ca_bn)"""
-
- url: Optional[str]
- """Business website URL"""
+__all__ = ["BrandsBrandDataParam"]
class BrandsBrandDataParam(TypedDict, total=False):
"""Brand and KYC data grouped into contact, business, and compliance sections"""
- compliance: Required[Compliance]
+ compliance: Required[SentDmServicesEndpointsCustomerApIv3ContractsRequestsBrandsBrandComplianceInfoParam]
"""Compliance and TCR information for brand registration"""
- contact: Required[Contact]
+ contact: Required[SentDmServicesEndpointsCustomerApIv3ContractsRequestsBrandsBrandContactInfoParam]
"""Contact information for brand KYC"""
- business: Optional[Business]
+ business: Optional[SentDmServicesEndpointsCustomerApIv3ContractsRequestsBrandsBrandBusinessInfoParam]
"""Business details and address for brand KYC"""
diff --git a/src/sent_dm/types/profiles/__init__.py b/src/sent_dm/types/profiles/__init__.py
index e5bc778..4c8ff4e 100644
--- a/src/sent_dm/types/profiles/__init__.py
+++ b/src/sent_dm/types/profiles/__init__.py
@@ -13,3 +13,6 @@
from .api_response_of_tcr_campaign_with_use_cases import (
APIResponseOfTcrCampaignWithUseCases as APIResponseOfTcrCampaignWithUseCases,
)
+from .sent_dm_services_endpoints_customer_ap_iv3_contracts_requests_campaigns_campaign_use_case_data_param import (
+ SentDmServicesEndpointsCustomerApIv3ContractsRequestsCampaignsCampaignUseCaseDataParam as SentDmServicesEndpointsCustomerApIv3ContractsRequestsCampaignsCampaignUseCaseDataParam,
+)
diff --git a/src/sent_dm/types/profiles/campaign_data_param.py b/src/sent_dm/types/profiles/campaign_data_param.py
index 0ad81c6..422f312 100644
--- a/src/sent_dm/types/profiles/campaign_data_param.py
+++ b/src/sent_dm/types/profiles/campaign_data_param.py
@@ -5,20 +5,12 @@
from typing import Iterable, Optional
from typing_extensions import Required, Annotated, TypedDict
-from ..._types import SequenceNotStr
from ..._utils import PropertyInfo
-from .messaging_use_case_us import MessagingUseCaseUs
+from .sent_dm_services_endpoints_customer_ap_iv3_contracts_requests_campaigns_campaign_use_case_data_param import (
+ SentDmServicesEndpointsCustomerApIv3ContractsRequestsCampaignsCampaignUseCaseDataParam,
+)
-__all__ = ["CampaignDataParam", "UseCase"]
-
-
-class UseCase(TypedDict, total=False):
- """Campaign use case with sample messages"""
-
- messaging_use_case_us: Required[Annotated[MessagingUseCaseUs, PropertyInfo(alias="messagingUseCaseUs")]]
-
- sample_messages: Required[Annotated[SequenceNotStr[str], PropertyInfo(alias="sampleMessages")]]
- """Sample messages for this use case (1-5 messages, max 1024 characters each)"""
+__all__ = ["CampaignDataParam"]
class CampaignDataParam(TypedDict, total=False):
@@ -33,7 +25,12 @@ class CampaignDataParam(TypedDict, total=False):
type: Required[str]
"""Campaign type (e.g., "KYC", "App")"""
- use_cases: Required[Annotated[Iterable[UseCase], PropertyInfo(alias="useCases")]]
+ use_cases: Required[
+ Annotated[
+ Iterable[SentDmServicesEndpointsCustomerApIv3ContractsRequestsCampaignsCampaignUseCaseDataParam],
+ PropertyInfo(alias="useCases"),
+ ]
+ ]
"""List of use cases with sample messages"""
help_keywords: Annotated[Optional[str], PropertyInfo(alias="helpKeywords")]
diff --git a/src/sent_dm/types/profiles/sent_dm_services_endpoints_customer_ap_iv3_contracts_requests_campaigns_campaign_use_case_data_param.py b/src/sent_dm/types/profiles/sent_dm_services_endpoints_customer_ap_iv3_contracts_requests_campaigns_campaign_use_case_data_param.py
new file mode 100644
index 0000000..0527f60
--- /dev/null
+++ b/src/sent_dm/types/profiles/sent_dm_services_endpoints_customer_ap_iv3_contracts_requests_campaigns_campaign_use_case_data_param.py
@@ -0,0 +1,20 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from __future__ import annotations
+
+from typing_extensions import Required, Annotated, TypedDict
+
+from ..._types import SequenceNotStr
+from ..._utils import PropertyInfo
+from .messaging_use_case_us import MessagingUseCaseUs
+
+__all__ = ["SentDmServicesEndpointsCustomerApIv3ContractsRequestsCampaignsCampaignUseCaseDataParam"]
+
+
+class SentDmServicesEndpointsCustomerApIv3ContractsRequestsCampaignsCampaignUseCaseDataParam(TypedDict, total=False):
+ """Campaign use case with sample messages"""
+
+ messaging_use_case_us: Required[Annotated[MessagingUseCaseUs, PropertyInfo(alias="messagingUseCaseUs")]]
+
+ sample_messages: Required[Annotated[SequenceNotStr[str], PropertyInfo(alias="sampleMessages")]]
+ """Sample messages for this use case (1-5 messages, max 1024 characters each)"""
diff --git a/src/sent_dm/types/sent_dm_services_common_contracts_poc_os_authentication_config_param.py b/src/sent_dm/types/sent_dm_services_common_contracts_poc_os_authentication_config_param.py
new file mode 100644
index 0000000..70a0a31
--- /dev/null
+++ b/src/sent_dm/types/sent_dm_services_common_contracts_poc_os_authentication_config_param.py
@@ -0,0 +1,26 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from __future__ import annotations
+
+from typing import Optional
+from typing_extensions import Annotated, TypedDict
+
+from .._utils import PropertyInfo
+
+__all__ = ["SentDmServicesCommonContractsPocOsAuthenticationConfigParam"]
+
+
+class SentDmServicesCommonContractsPocOsAuthenticationConfigParam(TypedDict, total=False):
+ """Configuration for AUTHENTICATION category templates"""
+
+ add_security_recommendation: Annotated[bool, PropertyInfo(alias="addSecurityRecommendation")]
+ """
+ Whether to add the security recommendation text: "For your security, do not
+ share this code."
+ """
+
+ code_expiration_minutes: Annotated[Optional[int], PropertyInfo(alias="codeExpirationMinutes")]
+ """Code expiration time in minutes (1-90).
+
+ If set, adds footer: "This code expires in X minutes."
+ """
diff --git a/src/sent_dm/types/sent_dm_services_common_contracts_poc_os_template_body_param.py b/src/sent_dm/types/sent_dm_services_common_contracts_poc_os_template_body_param.py
new file mode 100644
index 0000000..92437e1
--- /dev/null
+++ b/src/sent_dm/types/sent_dm_services_common_contracts_poc_os_template_body_param.py
@@ -0,0 +1,30 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from __future__ import annotations
+
+from typing import Optional
+from typing_extensions import Annotated, TypedDict
+
+from .._utils import PropertyInfo
+from .template_body_content_param import TemplateBodyContentParam
+
+__all__ = ["SentDmServicesCommonContractsPocOsTemplateBodyParam"]
+
+
+class SentDmServicesCommonContractsPocOsTemplateBodyParam(TypedDict, total=False):
+ """Body section of a message template with channel-specific content"""
+
+ multi_channel: Annotated[Optional[TemplateBodyContentParam], PropertyInfo(alias="multiChannel")]
+ """
+ Content that will be used for all channels (SMS and WhatsApp) unless
+ channel-specific content is provided
+ """
+
+ sms: Optional[TemplateBodyContentParam]
+ """SMS-specific content that overrides multi-channel content for SMS messages"""
+
+ whatsapp: Optional[TemplateBodyContentParam]
+ """
+ WhatsApp-specific content that overrides multi-channel content for WhatsApp
+ messages
+ """
diff --git a/src/sent_dm/types/sent_dm_services_common_contracts_poc_os_template_button_param.py b/src/sent_dm/types/sent_dm_services_common_contracts_poc_os_template_button_param.py
new file mode 100644
index 0000000..2770c6e
--- /dev/null
+++ b/src/sent_dm/types/sent_dm_services_common_contracts_poc_os_template_button_param.py
@@ -0,0 +1,26 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from __future__ import annotations
+
+from typing_extensions import TypedDict
+
+from .sent_dm_services_common_contracts_poc_os_template_button_props_param import (
+ SentDmServicesCommonContractsPocOsTemplateButtonPropsParam,
+)
+
+__all__ = ["SentDmServicesCommonContractsPocOsTemplateButtonParam"]
+
+
+class SentDmServicesCommonContractsPocOsTemplateButtonParam(TypedDict, total=False):
+ """Interactive button in a message template"""
+
+ id: int
+ """The unique identifier of the button (1-based index)"""
+
+ props: SentDmServicesCommonContractsPocOsTemplateButtonPropsParam
+ """Properties specific to the button type"""
+
+ type: str
+ """
+ The type of button (e.g., QUICK_REPLY, URL, PHONE_NUMBER, VOICE_CALL, COPY_CODE)
+ """
diff --git a/src/sent_dm/types/sent_dm_services_common_contracts_poc_os_template_button_props_param.py b/src/sent_dm/types/sent_dm_services_common_contracts_poc_os_template_button_props_param.py
new file mode 100644
index 0000000..aa508bc
--- /dev/null
+++ b/src/sent_dm/types/sent_dm_services_common_contracts_poc_os_template_button_props_param.py
@@ -0,0 +1,36 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from __future__ import annotations
+
+from typing import Optional
+from typing_extensions import Annotated, TypedDict
+
+from .._utils import PropertyInfo
+
+__all__ = ["SentDmServicesCommonContractsPocOsTemplateButtonPropsParam"]
+
+
+class SentDmServicesCommonContractsPocOsTemplateButtonPropsParam(TypedDict, total=False):
+ active_for: Annotated[Optional[int], PropertyInfo(alias="activeFor")]
+
+ autofill_text: Annotated[Optional[str], PropertyInfo(alias="autofillText")]
+
+ country_code: Annotated[Optional[str], PropertyInfo(alias="countryCode")]
+
+ offer_code: Annotated[Optional[str], PropertyInfo(alias="offerCode")]
+
+ otp_type: Annotated[Optional[str], PropertyInfo(alias="otpType")]
+
+ package_name: Annotated[Optional[str], PropertyInfo(alias="packageName")]
+
+ phone_number: Annotated[Optional[str], PropertyInfo(alias="phoneNumber")]
+
+ quick_reply_type: Annotated[Optional[str], PropertyInfo(alias="quickReplyType")]
+
+ signature_hash: Annotated[Optional[str], PropertyInfo(alias="signatureHash")]
+
+ text: Optional[str]
+
+ url: Optional[str]
+
+ url_type: Annotated[Optional[str], PropertyInfo(alias="urlType")]
diff --git a/src/sent_dm/types/sent_dm_services_common_contracts_poc_os_template_footer_param.py b/src/sent_dm/types/sent_dm_services_common_contracts_poc_os_template_footer_param.py
new file mode 100644
index 0000000..1431cb1
--- /dev/null
+++ b/src/sent_dm/types/sent_dm_services_common_contracts_poc_os_template_footer_param.py
@@ -0,0 +1,23 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from __future__ import annotations
+
+from typing import Iterable, Optional
+from typing_extensions import TypedDict
+
+from .template_variable_param import TemplateVariableParam
+
+__all__ = ["SentDmServicesCommonContractsPocOsTemplateFooterParam"]
+
+
+class SentDmServicesCommonContractsPocOsTemplateFooterParam(TypedDict, total=False):
+ """Footer section of a message template"""
+
+ template: str
+ """The footer template text with optional variable placeholders"""
+
+ type: Optional[str]
+ """The type of footer (typically "text")"""
+
+ variables: Optional[Iterable[TemplateVariableParam]]
+ """List of variables used in the footer template"""
diff --git a/src/sent_dm/types/sent_dm_services_common_contracts_poc_os_template_header_param.py b/src/sent_dm/types/sent_dm_services_common_contracts_poc_os_template_header_param.py
new file mode 100644
index 0000000..da6a254
--- /dev/null
+++ b/src/sent_dm/types/sent_dm_services_common_contracts_poc_os_template_header_param.py
@@ -0,0 +1,26 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from __future__ import annotations
+
+from typing import Iterable, Optional
+from typing_extensions import TypedDict
+
+from .template_variable_param import TemplateVariableParam
+
+__all__ = ["SentDmServicesCommonContractsPocOsTemplateHeaderParam"]
+
+
+class SentDmServicesCommonContractsPocOsTemplateHeaderParam(TypedDict, total=False):
+ """Header section of a message template"""
+
+ template: str
+ """
+ The header template text with optional variable placeholders (e.g., "Welcome to
+ {{0:variable}}")
+ """
+
+ type: Optional[str]
+ """The type of header (e.g., "text", "image", "video", "document")"""
+
+ variables: Optional[Iterable[TemplateVariableParam]]
+ """List of variables used in the header template"""
diff --git a/src/sent_dm/types/sent_dm_services_endpoints_customer_ap_iv3_contracts_requests_brands_brand_business_info_param.py b/src/sent_dm/types/sent_dm_services_endpoints_customer_ap_iv3_contracts_requests_brands_brand_business_info_param.py
new file mode 100644
index 0000000..dfb0149
--- /dev/null
+++ b/src/sent_dm/types/sent_dm_services_endpoints_customer_ap_iv3_contracts_requests_brands_brand_business_info_param.py
@@ -0,0 +1,49 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from __future__ import annotations
+
+from typing import Optional
+from typing_extensions import Literal, Annotated, TypedDict
+
+from .._utils import PropertyInfo
+
+__all__ = ["SentDmServicesEndpointsCustomerApIv3ContractsRequestsBrandsBrandBusinessInfoParam"]
+
+
+class SentDmServicesEndpointsCustomerApIv3ContractsRequestsBrandsBrandBusinessInfoParam(TypedDict, total=False):
+ """Business details and address for brand KYC"""
+
+ city: Optional[str]
+ """City"""
+
+ country: Optional[str]
+ """Country code (e.g., US, CA)"""
+
+ country_of_registration: Annotated[Optional[str], PropertyInfo(alias="countryOfRegistration")]
+ """Country where the business is registered"""
+
+ entity_type: Annotated[
+ Optional[Literal["PRIVATE_PROFIT", "PUBLIC_PROFIT", "NON_PROFIT", "SOLE_PROPRIETOR", "GOVERNMENT"]],
+ PropertyInfo(alias="entityType"),
+ ]
+
+ legal_name: Annotated[Optional[str], PropertyInfo(alias="legalName")]
+ """Legal business name"""
+
+ postal_code: Annotated[Optional[str], PropertyInfo(alias="postalCode")]
+ """Postal/ZIP code"""
+
+ state: Optional[str]
+ """State/province code"""
+
+ street: Optional[str]
+ """Street address"""
+
+ tax_id: Annotated[Optional[str], PropertyInfo(alias="taxId")]
+ """Tax ID/EIN number"""
+
+ tax_id_type: Annotated[Optional[str], PropertyInfo(alias="taxIdType")]
+ """Type of tax ID (e.g., us_ein, ca_bn)"""
+
+ url: Optional[str]
+ """Business website URL"""
diff --git a/src/sent_dm/types/sent_dm_services_endpoints_customer_ap_iv3_contracts_requests_brands_brand_compliance_info_param.py b/src/sent_dm/types/sent_dm_services_endpoints_customer_ap_iv3_contracts_requests_brands_brand_compliance_info_param.py
new file mode 100644
index 0000000..2030a52
--- /dev/null
+++ b/src/sent_dm/types/sent_dm_services_endpoints_customer_ap_iv3_contracts_requests_brands_brand_compliance_info_param.py
@@ -0,0 +1,41 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from __future__ import annotations
+
+from typing import Iterable, Optional
+from typing_extensions import Required, Annotated, TypedDict
+
+from .._utils import PropertyInfo
+from .tcr_vertical import TcrVertical
+from .tcr_brand_relationship import TcrBrandRelationship
+from .destination_country_param import DestinationCountryParam
+
+__all__ = ["SentDmServicesEndpointsCustomerApIv3ContractsRequestsBrandsBrandComplianceInfoParam"]
+
+
+class SentDmServicesEndpointsCustomerApIv3ContractsRequestsBrandsBrandComplianceInfoParam(TypedDict, total=False):
+ """Compliance and TCR information for brand registration"""
+
+ brand_relationship: Required[Annotated[TcrBrandRelationship, PropertyInfo(alias="brandRelationship")]]
+
+ vertical: Required[TcrVertical]
+
+ destination_countries: Annotated[
+ Optional[Iterable[DestinationCountryParam]], PropertyInfo(alias="destinationCountries")
+ ]
+ """List of destination countries for messaging"""
+
+ expected_messaging_volume: Annotated[Optional[str], PropertyInfo(alias="expectedMessagingVolume")]
+ """Expected daily messaging volume"""
+
+ is_tcr_application: Annotated[Optional[bool], PropertyInfo(alias="isTcrApplication")]
+ """Whether this is a TCR (Campaign Registry) application"""
+
+ notes: Optional[str]
+ """Additional notes about the business or use case"""
+
+ phone_number_prefix: Annotated[Optional[str], PropertyInfo(alias="phoneNumberPrefix")]
+ """Phone number prefix for messaging (e.g., "+1")"""
+
+ primary_use_case: Annotated[Optional[str], PropertyInfo(alias="primaryUseCase")]
+ """Primary messaging use case description"""
diff --git a/src/sent_dm/types/sent_dm_services_endpoints_customer_ap_iv3_contracts_requests_brands_brand_contact_info_param.py b/src/sent_dm/types/sent_dm_services_endpoints_customer_ap_iv3_contracts_requests_brands_brand_contact_info_param.py
new file mode 100644
index 0000000..e808c53
--- /dev/null
+++ b/src/sent_dm/types/sent_dm_services_endpoints_customer_ap_iv3_contracts_requests_brands_brand_contact_info_param.py
@@ -0,0 +1,32 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from __future__ import annotations
+
+from typing import Optional
+from typing_extensions import Required, Annotated, TypedDict
+
+from .._utils import PropertyInfo
+
+__all__ = ["SentDmServicesEndpointsCustomerApIv3ContractsRequestsBrandsBrandContactInfoParam"]
+
+
+class SentDmServicesEndpointsCustomerApIv3ContractsRequestsBrandsBrandContactInfoParam(TypedDict, total=False):
+ """Contact information for brand KYC"""
+
+ name: Required[str]
+ """Primary contact name (required)"""
+
+ business_name: Annotated[Optional[str], PropertyInfo(alias="businessName")]
+ """Business/brand name"""
+
+ email: Optional[str]
+ """Contact email address"""
+
+ phone: Optional[str]
+ """Contact phone number in E.164 format"""
+
+ phone_country_code: Annotated[Optional[str], PropertyInfo(alias="phoneCountryCode")]
+ """Contact phone country code (e.g., "1" for US)"""
+
+ role: Optional[str]
+ """Contact's role in the business"""
diff --git a/src/sent_dm/types/template_definition_param.py b/src/sent_dm/types/template_definition_param.py
index fa83bb3..055f801 100644
--- a/src/sent_dm/types/template_definition_param.py
+++ b/src/sent_dm/types/template_definition_param.py
@@ -6,117 +6,23 @@
from typing_extensions import Required, Annotated, TypedDict
from .._utils import PropertyInfo
-from .template_variable_param import TemplateVariableParam
-from .template_body_content_param import TemplateBodyContentParam
-
-__all__ = ["TemplateDefinitionParam", "Body", "AuthenticationConfig", "Button", "ButtonProps", "Footer", "Header"]
-
-
-class Body(TypedDict, total=False):
- """Body section of a message template with channel-specific content"""
-
- multi_channel: Annotated[Optional[TemplateBodyContentParam], PropertyInfo(alias="multiChannel")]
- """
- Content that will be used for all channels (SMS and WhatsApp) unless
- channel-specific content is provided
- """
-
- sms: Optional[TemplateBodyContentParam]
- """SMS-specific content that overrides multi-channel content for SMS messages"""
-
- whatsapp: Optional[TemplateBodyContentParam]
- """
- WhatsApp-specific content that overrides multi-channel content for WhatsApp
- messages
- """
-
-
-class AuthenticationConfig(TypedDict, total=False):
- """Configuration for AUTHENTICATION category templates"""
-
- add_security_recommendation: Annotated[bool, PropertyInfo(alias="addSecurityRecommendation")]
- """
- Whether to add the security recommendation text: "For your security, do not
- share this code."
- """
-
- code_expiration_minutes: Annotated[Optional[int], PropertyInfo(alias="codeExpirationMinutes")]
- """Code expiration time in minutes (1-90).
-
- If set, adds footer: "This code expires in X minutes."
- """
-
-
-class ButtonProps(TypedDict, total=False):
- """Properties specific to the button type"""
-
- active_for: Annotated[Optional[int], PropertyInfo(alias="activeFor")]
-
- autofill_text: Annotated[Optional[str], PropertyInfo(alias="autofillText")]
-
- country_code: Annotated[Optional[str], PropertyInfo(alias="countryCode")]
-
- offer_code: Annotated[Optional[str], PropertyInfo(alias="offerCode")]
-
- otp_type: Annotated[Optional[str], PropertyInfo(alias="otpType")]
-
- package_name: Annotated[Optional[str], PropertyInfo(alias="packageName")]
-
- phone_number: Annotated[Optional[str], PropertyInfo(alias="phoneNumber")]
-
- quick_reply_type: Annotated[Optional[str], PropertyInfo(alias="quickReplyType")]
-
- signature_hash: Annotated[Optional[str], PropertyInfo(alias="signatureHash")]
-
- text: Optional[str]
-
- url: Optional[str]
-
- url_type: Annotated[Optional[str], PropertyInfo(alias="urlType")]
-
-
-class Button(TypedDict, total=False):
- """Interactive button in a message template"""
-
- id: int
- """The unique identifier of the button (1-based index)"""
-
- props: ButtonProps
- """Properties specific to the button type"""
-
- type: str
- """
- The type of button (e.g., QUICK_REPLY, URL, PHONE_NUMBER, VOICE_CALL, COPY_CODE)
- """
-
-
-class Footer(TypedDict, total=False):
- """Footer section of a message template"""
-
- template: str
- """The footer template text with optional variable placeholders"""
-
- type: Optional[str]
- """The type of footer (typically "text")"""
-
- variables: Optional[Iterable[TemplateVariableParam]]
- """List of variables used in the footer template"""
-
-
-class Header(TypedDict, total=False):
- """Header section of a message template"""
-
- template: str
- """
- The header template text with optional variable placeholders (e.g., "Welcome to
- {{0:variable}}")
- """
-
- type: Optional[str]
- """The type of header (e.g., "text", "image", "video", "document")"""
-
- variables: Optional[Iterable[TemplateVariableParam]]
- """List of variables used in the header template"""
+from .sent_dm_services_common_contracts_poc_os_template_body_param import (
+ SentDmServicesCommonContractsPocOsTemplateBodyParam,
+)
+from .sent_dm_services_common_contracts_poc_os_template_button_param import (
+ SentDmServicesCommonContractsPocOsTemplateButtonParam,
+)
+from .sent_dm_services_common_contracts_poc_os_template_footer_param import (
+ SentDmServicesCommonContractsPocOsTemplateFooterParam,
+)
+from .sent_dm_services_common_contracts_poc_os_template_header_param import (
+ SentDmServicesCommonContractsPocOsTemplateHeaderParam,
+)
+from .sent_dm_services_common_contracts_poc_os_authentication_config_param import (
+ SentDmServicesCommonContractsPocOsAuthenticationConfigParam,
+)
+
+__all__ = ["TemplateDefinitionParam"]
class TemplateDefinitionParam(TypedDict, total=False):
@@ -124,20 +30,23 @@ class TemplateDefinitionParam(TypedDict, total=False):
Complete definition of a message template including header, body, footer, and buttons
"""
- body: Required[Body]
+ body: Required[SentDmServicesCommonContractsPocOsTemplateBodyParam]
"""Body section of a message template with channel-specific content"""
- authentication_config: Annotated[Optional[AuthenticationConfig], PropertyInfo(alias="authenticationConfig")]
+ authentication_config: Annotated[
+ Optional[SentDmServicesCommonContractsPocOsAuthenticationConfigParam],
+ PropertyInfo(alias="authenticationConfig"),
+ ]
"""Configuration for AUTHENTICATION category templates"""
- buttons: Optional[Iterable[Button]]
+ buttons: Optional[Iterable[SentDmServicesCommonContractsPocOsTemplateButtonParam]]
"""Optional list of interactive buttons (e.g., quick replies, URLs, phone numbers)"""
definition_version: Annotated[Optional[str], PropertyInfo(alias="definitionVersion")]
"""The version of the template definition format"""
- footer: Optional[Footer]
+ footer: Optional[SentDmServicesCommonContractsPocOsTemplateFooterParam]
"""Footer section of a message template"""
- header: Optional[Header]
+ header: Optional[SentDmServicesCommonContractsPocOsTemplateHeaderParam]
"""Header section of a message template"""
From 61049aeee01c5cf13058c032e98ed5fb845f16ff Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Thu, 12 Mar 2026 12:32:25 +0000
Subject: [PATCH 13/15] codegen metadata
---
.stats.yml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/.stats.yml b/.stats.yml
index 274df57..fc685b8 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
configured_endpoints: 40
-openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent%2Fsent-dm-2566cdc5d8e0bffe2a8c442692b0fc1b35d3bfe7e9bf578331fc19d402361c1f.yml
-openapi_spec_hash: 85e1feeb9bbc8d59bb34d6cdd679575a
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent%2Fsent-dm-9018dd2a21f9b82281aa5dc76bb26a35b9b03458b08b198ba366585122619e85.yml
+openapi_spec_hash: 3fc863551dd722031eb83384f76ca399
config_hash: 497506d9e2e66cd0573bd9c1f1242462
From f690a63fdd8839041a0317e9c66e6154b23b9493 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Thu, 12 Mar 2026 13:01:50 +0000
Subject: [PATCH 14/15] codegen metadata
---
.stats.yml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/.stats.yml b/.stats.yml
index fc685b8..fe2e934 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
configured_endpoints: 40
-openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent%2Fsent-dm-9018dd2a21f9b82281aa5dc76bb26a35b9b03458b08b198ba366585122619e85.yml
-openapi_spec_hash: 3fc863551dd722031eb83384f76ca399
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent%2Fsent-dm-294831f61f7890b2cdb89d181f26297732387d5e1288f446c0138e46fb1a4608.yml
+openapi_spec_hash: a7f20451621ee678fbe09ff7a297b3ea
config_hash: 497506d9e2e66cd0573bd9c1f1242462
From e662c6317ebf0a3142ec58393e6e45cdd6f99ba4 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Thu, 12 Mar 2026 13:02:08 +0000
Subject: [PATCH 15/15] release: 0.12.0
---
.release-please-manifest.json | 2 +-
CHANGELOG.md | 10 ++++++++++
pyproject.toml | 2 +-
src/sent_dm/_version.py | 2 +-
4 files changed, 13 insertions(+), 3 deletions(-)
diff --git a/.release-please-manifest.json b/.release-please-manifest.json
index f7014c3..a713055 100644
--- a/.release-please-manifest.json
+++ b/.release-please-manifest.json
@@ -1,3 +1,3 @@
{
- ".": "0.11.0"
+ ".": "0.12.0"
}
\ No newline at end of file
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 71908b4..999f361 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,15 @@
# Changelog
+## 0.12.0 (2026-03-12)
+
+Full Changelog: [v0.11.0...v0.12.0](https://github.com/sentdm/sent-dm-python/compare/v0.11.0...v0.12.0)
+
+### Features
+
+* **api:** api update ([42a3b0e](https://github.com/sentdm/sent-dm-python/commit/42a3b0ed01ad9db6bf7d0a899d71831fbfbcd861))
+* **api:** manual updates ([e08ed33](https://github.com/sentdm/sent-dm-python/commit/e08ed33e783744f84c88826061b47ccd27fc4324))
+* **api:** manual updates ([7c9c66a](https://github.com/sentdm/sent-dm-python/commit/7c9c66ac0bc7944a91e658a311dfd38f70e9adf8))
+
## 0.11.0 (2026-03-11)
Full Changelog: [v0.10.0...v0.11.0](https://github.com/sentdm/sent-dm-python/compare/v0.10.0...v0.11.0)
diff --git a/pyproject.toml b/pyproject.toml
index f51484c..d98f2ad 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,6 +1,6 @@
[project]
name = "sentdm"
-version = "0.11.0"
+version = "0.12.0"
description = "The official Python library for the sent-dm API"
dynamic = ["readme"]
license = "Apache-2.0"
diff --git a/src/sent_dm/_version.py b/src/sent_dm/_version.py
index f4a29db..85a5a9f 100644
--- a/src/sent_dm/_version.py
+++ b/src/sent_dm/_version.py
@@ -1,4 +1,4 @@
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
__title__ = "sent_dm"
-__version__ = "0.11.0" # x-release-please-version
+__version__ = "0.12.0" # x-release-please-version