Skip to content

Commit 2b6bfcb

Browse files
authored
Merge pull request #11 from sentdm/release-please--branches--main--changes--next
release: 0.7.0
2 parents f4eb491 + 6aea92c commit 2b6bfcb

File tree

190 files changed

+12525
-14928
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

190 files changed

+12525
-14928
lines changed

.release-please-manifest.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
{
2-
".": "0.6.1"
2+
".": "0.7.0"
33
}

.stats.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
configured_endpoints: 44
2-
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent%2Fsent-dm-c1e54655c045f25bd08ecc70c87f938e429911c413c09957d83d3eb9eaab2372.yml
3-
openapi_spec_hash: 44b7f99e2660bde83eff178b9d4ec00c
1+
configured_endpoints: 35
2+
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent%2Fsent-dm-7d07f940431b5639f643a4f1b35fddb31c382750eee128f26d3117a7b2715be3.yml
3+
openapi_spec_hash: e16dd2048bf6170fab4a79fa447fafe1
44
config_hash: d475a61f5b59375bf562f85f19b80409

CHANGELOG.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,13 @@
11
# Changelog
22

3+
## 0.7.0 (2026-03-11)
4+
5+
Full Changelog: [v0.6.1...v0.7.0](https://github.com/sentdm/sent-dm-java/compare/v0.6.1...v0.7.0)
6+
7+
### Features
8+
9+
* **api:** api update ([f38cad9](https://github.com/sentdm/sent-dm-java/commit/f38cad9c87268ca7d85d4e11a59ebb26782f7e7c))
10+
311
## 0.6.1 (2026-03-11)
412

513
Full Changelog: [v0.6.0...v0.6.1](https://github.com/sentdm/sent-dm-java/compare/v0.6.0...v0.6.1)

README.md

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22

33
<!-- x-release-please-start-version -->
44

5-
[![Maven Central](https://img.shields.io/maven-central/v/dm.sent/sent-dm-java)](https://central.sonatype.com/artifact/dm.sent/sent-dm-java/0.6.1)
6-
[![javadoc](https://javadoc.io/badge2/dm.sent/sent-dm-java/0.6.1/javadoc.svg)](https://javadoc.io/doc/dm.sent/sent-dm-java/0.6.1)
5+
[![Maven Central](https://img.shields.io/maven-central/v/dm.sent/sent-dm-java)](https://central.sonatype.com/artifact/dm.sent/sent-dm-java/0.7.0)
6+
[![javadoc](https://javadoc.io/badge2/dm.sent/sent-dm-java/0.7.0/javadoc.svg)](https://javadoc.io/doc/dm.sent/sent-dm-java/0.7.0)
77

88
<!-- x-release-please-end -->
99

@@ -22,7 +22,7 @@ Use the Sent Dm MCP Server to enable AI assistants to interact with this API, al
2222
2323
<!-- x-release-please-start-version -->
2424

25-
The REST API documentation can be found on [docs.sent.dm](https://docs.sent.dm). Javadocs are available on [javadoc.io](https://javadoc.io/doc/dm.sent/sent-dm-java/0.6.1).
25+
The REST API documentation can be found on [docs.sent.dm](https://docs.sent.dm). Javadocs are available on [javadoc.io](https://javadoc.io/doc/dm.sent/sent-dm-java/0.7.0).
2626

2727
<!-- x-release-please-end -->
2828

@@ -33,7 +33,7 @@ The REST API documentation can be found on [docs.sent.dm](https://docs.sent.dm).
3333
### Gradle
3434

3535
```kotlin
36-
implementation("dm.sent:sent-dm-java:0.6.1")
36+
implementation("dm.sent:sent-dm-java:0.7.0")
3737
```
3838

3939
### Maven
@@ -42,7 +42,7 @@ implementation("dm.sent:sent-dm-java:0.6.1")
4242
<dependency>
4343
<groupId>dm.sent</groupId>
4444
<artifactId>sent-dm-java</artifactId>
45-
<version>0.6.1</version>
45+
<version>0.7.0</version>
4646
</dependency>
4747
```
4848

@@ -624,19 +624,19 @@ To access a property's raw JSON value, which may be undocumented, call its `_` p
624624
import dm.sent.core.JsonField;
625625
import java.util.Optional;
626626

627-
JsonField<Boolean> testMode = client.messages().send(params)._testMode();
627+
JsonField<Boolean> sandbox = client.messages().send(params)._sandbox();
628628

629-
if (testMode.isMissing()) {
629+
if (sandbox.isMissing()) {
630630
// The property is absent from the JSON response
631-
} else if (testMode.isNull()) {
631+
} else if (sandbox.isNull()) {
632632
// The property was set to literal null
633633
} else {
634634
// Check if value was provided as a string
635635
// Other methods include `asNumber()`, `asBoolean()`, etc.
636-
Optional<String> jsonString = testMode.asString();
636+
Optional<String> jsonString = sandbox.asString();
637637

638638
// Try to deserialize into a custom type
639-
MyClass myObject = testMode.asUnknown().orElseThrow().convert(MyClass.class);
639+
MyClass myObject = sandbox.asUnknown().orElseThrow().convert(MyClass.class);
640640
}
641641
```
642642

build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ repositories {
88

99
allprojects {
1010
group = "dm.sent"
11-
version = "0.6.1" // x-release-please-version
11+
version = "0.7.0" // x-release-please-version
1212
}
1313

1414
subprojects {

buildSrc/src/main/kotlin/sent-dm.publish.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ configure<MavenPublishBaseExtension> {
4343

4444
pom {
4545
name.set("Sent DM API - v3")
46-
description.set("The Sent DM API enables programmatic SMS and WhatsApp messaging with contact\nmanagement, template-based messaging, compliance (10DLC brand/campaign\nregistration), and webhook delivery tracking.\n\n## Authentication\n\nAll requests require the `x-api-key` header with your API key (e.g.\n`sk_live_...` for production, `sk_test_...` for sandbox). Your account is\nidentified automatically from the key.\n\n## Idempotency\n\nPOST, PUT, and PATCH requests accept an optional `Idempotency-Key` header. When\nprovided, the API guarantees at-most-once execution: duplicate requests with the\nsame key return the original response. Keys are scoped per customer and expire\nafter 24 hours.\n\n## Test Mode\n\nAll mutation endpoints (POST, PUT, DELETE) accept an optional `test_mode` field\nin the request body. When set to `true`, the API validates the request and\nreturns a realistic fake response **without executing any side effects** — no\ndatabase writes, no messages sent, no external API calls.\n\nTest mode is useful for:\n\n- **Integration testing** — verify your request payloads and response parsing\n without affecting real data\n- **CI/CD pipelines** — run end-to-end tests against the live API without\n consuming resources\n- **Client development** — build and test your integration before going live\n\n```json\n{\n \"test_mode\": true,\n \"phone_number\": \"+1234567890\"\n}\n```\n\nTest mode responses include the `X-Test-Mode: true` header and return the same\nschema as real responses with sample data. Authentication and validation still\nrun normally — only the service-layer execution is skipped.\n\n## Rate Limiting\n\nAPI requests are rate-limited per customer. Standard endpoints allow **200\nrequests/minute**; sensitive endpoints (e.g. secret rotation) allow **10\nrequests/minute**. When limits are exceeded, the API returns\n`429 Too Many Requests`.\n\nRate limit headers on `429` responses: | Header | Description |\n|--------|-------------| | `Retry-After` | Seconds until you can retry | |\n`X-RateLimit-Limit` | Maximum requests allowed in the window | |\n`X-RateLimit-Remaining` | Requests remaining (always `0` on 429) | |\n`X-RateLimit-Reset` | Unix timestamp when the window resets |\n\n## Common Response Headers\n\nAll responses include these headers: | Header | Description |\n|--------|-------------| | `X-Request-Id` | Unique request identifier for\nsupport and debugging | | `X-Response-Time` | Server processing time (e.g.\n`12ms`) | | `X-API-Version` | API version (always `v3`) |\n\nIdempotent replay responses also include: | Header | Description |\n|--------|-------------| | `Idempotent-Replayed` | `true` if this is a cached\nreplay | | `X-Original-Request-Id` | Request ID of the original request |\n\n## Errors\n\nAll errors follow a consistent JSON envelope:\n\n```json\n{\n \"success\": false,\n \"error\": {\n \"code\": \"RESOURCE_001\",\n \"message\": \"Contact not found\",\n \"doc_url\": \"https://docs.sent.dm/errors/RESOURCE_001\"\n },\n \"meta\": { \"request_id\": \"req_...\", \"timestamp\": \"...\", \"version\": \"v3\" }\n}\n```\n\n### Error Code Reference\n\n| Code | Description |\n| ------------------ | ---------------------------------------------- |\n| **Authentication** | |\n| `AUTH_001` | User is not authenticated |\n| `AUTH_002` | Invalid or expired API key |\n| `AUTH_004` | Insufficient permissions for this operation |\n| **Validation** | |\n| `VALIDATION_001` | Request validation failed |\n| `VALIDATION_002` | Invalid phone number format |\n| `VALIDATION_003` | Invalid GUID format |\n| `VALIDATION_004` | Required field is missing |\n| `VALIDATION_005` | Field value out of valid range |\n| `VALIDATION_006` | Invalid enum value |\n| `VALIDATION_007` | Invalid Idempotency-Key format |\n| **Resource** | |\n| `RESOURCE_001` | Contact not found |\n| `RESOURCE_002` | Template not found |\n| `RESOURCE_003` | Message not found |\n| `RESOURCE_004` | Customer not found |\n| `RESOURCE_005` | Organization not found |\n| `RESOURCE_006` | User not found |\n| `RESOURCE_007` | Resource already exists (duplicate) |\n| `RESOURCE_008` | Webhook not found |\n| **Business Logic** | |\n| `BUSINESS_001` | Cannot modify inherited contact |\n| `BUSINESS_002` | Rate limit exceeded |\n| `BUSINESS_003` | Insufficient account balance |\n| `BUSINESS_004` | Contact has opted out of messaging |\n| `BUSINESS_005` | Template not approved for sending |\n| `BUSINESS_006` | Message cannot be modified in current state |\n| `BUSINESS_007` | Channel not available for this contact |\n| `BUSINESS_008` | Operation would exceed quota |\n| **Conflict** | |\n| `CONFLICT_001` | Concurrent idempotent request in progress |\n| **Service** | |\n| `SERVICE_001` | Cache service temporarily unavailable |\n| **Internal** | |\n| `INTERNAL_001` | Unexpected internal server error |\n| `INTERNAL_002` | Database operation failed |\n| `INTERNAL_003` | External service error (SMS/WhatsApp provider) |\n| `INTERNAL_004` | Timeout waiting for operation |\n| `INTERNAL_005` | Service temporarily unavailable |")
46+
description.set("The Sent DM API enables programmatic SMS and WhatsApp messaging with contact\nmanagement, template-based messaging, compliance (10DLC brand/campaign\nregistration), and webhook delivery tracking.\n\n## Authentication\n\nAll requests require the `x-api-key` header with your API key (e.g.\n`sk_live_...` for production, `sk_test_...` for sandbox). Your account is\nidentified automatically from the key.\n\n## Profile Scoping\n\nOrganization API keys can act on behalf of a child profile by passing the\noptional `x-profile-id` header with the profile's UUID. When present, all\noperations are scoped to that profile — contacts, messages, templates, and other\nresources are read and written as if the profile's own API key were used.\n\n- Only **organization** API keys may use this header. Profile API keys will\n receive `403`.\n- The profile must belong to the calling organization, otherwise `404` is\n returned.\n- When profile-scoped, the `X-Profile-Id` response header echoes the profile\n UUID.\n- Rate limits remain on the organization's pool regardless of profile scoping.\n\n## Idempotency\n\nPOST, PUT, and PATCH requests accept an optional `Idempotency-Key` header. When\nprovided, the API guarantees at-most-once execution: duplicate requests with the\nsame key return the original response. Keys are scoped per customer and expire\nafter 24 hours.\n\n## Sandbox Mode\n\nAll mutation endpoints (POST, PUT, DELETE) accept an optional `sandbox` field in\nthe request body. When set to `true`, the API validates the request and returns\na realistic fake response **without executing any side effects** — no database\nwrites, no messages sent, no external API calls.\n\nSandbox mode is useful for:\n\n- **Integration testing** — verify your request payloads and response parsing\n without affecting real data\n- **CI/CD pipelines** — run end-to-end tests against the live API without\n consuming resources\n- **Client development** — build and test your integration before going live\n\n```json\n{\n \"sandbox\": true,\n \"phone_number\": \"+1234567890\"\n}\n```\n\nSandbox mode responses include the `X-Sandbox: true` header and return the same\nschema as real responses with sample data. Authentication and validation still\nrun normally — only the service-layer execution is skipped.\n\n## Rate Limiting\n\nAPI requests are rate-limited per customer. Standard endpoints allow **200\nrequests/minute**; sensitive endpoints (e.g. secret rotation) allow **10\nrequests/minute**. When limits are exceeded, the API returns\n`429 Too Many Requests`.\n\nRate limit headers on `429` responses: | Header | Description |\n|--------|-------------| | `Retry-After` | Seconds until you can retry | |\n`X-RateLimit-Limit` | Maximum requests allowed in the window | |\n`X-RateLimit-Remaining` | Requests remaining (always `0` on 429) | |\n`X-RateLimit-Reset` | Unix timestamp when the window resets |\n\n## Common Response Headers\n\nAll responses include these headers: | Header | Description |\n|--------|-------------| | `X-Request-Id` | Unique request identifier for\nsupport and debugging | | `X-Response-Time` | Server processing time (e.g.\n`12ms`) | | `X-API-Version` | API version (always `v3`) | | `X-Profile-Id` |\nEchoed profile UUID when the request is profile-scoped via `x-profile-id` |\n\nIdempotent replay responses also include: | Header | Description |\n|--------|-------------| | `Idempotent-Replayed` | `true` if this is a cached\nreplay | | `X-Original-Request-Id` | Request ID of the original request |\n\n## Errors\n\nAll errors follow a consistent JSON envelope:\n\n```json\n{\n \"success\": false,\n \"error\": {\n \"code\": \"RESOURCE_001\",\n \"message\": \"Contact not found\",\n \"doc_url\": \"https://docs.sent.dm/errors/RESOURCE_001\"\n },\n \"meta\": { \"request_id\": \"req_...\", \"timestamp\": \"...\", \"version\": \"v3\" }\n}\n```\n\n### Error Code Reference\n\n| Code | Description |\n| ------------------ | ---------------------------------------------- |\n| **Authentication** | |\n| `AUTH_001` | User is not authenticated |\n| `AUTH_002` | Invalid or expired API key |\n| `AUTH_004` | Insufficient permissions for this operation |\n| **Validation** | |\n| `VALIDATION_001` | Request validation failed |\n| `VALIDATION_002` | Invalid phone number format |\n| `VALIDATION_003` | Invalid GUID format |\n| `VALIDATION_004` | Required field is missing |\n| `VALIDATION_005` | Field value out of valid range |\n| `VALIDATION_006` | Invalid enum value |\n| `VALIDATION_007` | Invalid Idempotency-Key format |\n| **Resource** | |\n| `RESOURCE_001` | Contact not found |\n| `RESOURCE_002` | Template not found |\n| `RESOURCE_003` | Message not found |\n| `RESOURCE_004` | Customer not found |\n| `RESOURCE_005` | Organization not found |\n| `RESOURCE_006` | User not found |\n| `RESOURCE_007` | Resource already exists (duplicate) |\n| `RESOURCE_008` | Webhook not found |\n| **Business Logic** | |\n| `BUSINESS_001` | Cannot modify inherited contact |\n| `BUSINESS_002` | Rate limit exceeded |\n| `BUSINESS_003` | Insufficient account balance |\n| `BUSINESS_004` | Contact has opted out of messaging |\n| `BUSINESS_005` | Template not approved for sending |\n| `BUSINESS_006` | Message cannot be modified in current state |\n| `BUSINESS_007` | Channel not available for this contact |\n| `BUSINESS_008` | Operation would exceed quota |\n| **Conflict** | |\n| `CONFLICT_001` | Concurrent idempotent request in progress |\n| **Service** | |\n| `SERVICE_001` | Cache service temporarily unavailable |\n| **Internal** | |\n| `INTERNAL_001` | Unexpected internal server error |\n| `INTERNAL_002` | Database operation failed |\n| `INTERNAL_003` | External service error (SMS/WhatsApp provider) |\n| `INTERNAL_004` | Timeout waiting for operation |\n| `INTERNAL_005` | Service temporarily unavailable |")
4747
url.set("https://docs.sent.dm")
4848

4949
licenses {

sent-dm-java-core/src/main/kotlin/dm/sent/client/SentDmClient.kt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,6 @@ interface SentDmClient {
7070
/** Create, update, and manage customer contact lists */
7171
fun contacts(): ContactService
7272

73-
/** Register and manage 10DLC brands for SMS compliance */
7473
fun brands(): BrandService
7574

7675
/** Retrieve account details */
@@ -119,7 +118,6 @@ interface SentDmClient {
119118
/** Create, update, and manage customer contact lists */
120119
fun contacts(): ContactService.WithRawResponse
121120

122-
/** Register and manage 10DLC brands for SMS compliance */
123121
fun brands(): BrandService.WithRawResponse
124122

125123
/** Retrieve account details */

sent-dm-java-core/src/main/kotlin/dm/sent/client/SentDmClientAsync.kt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,6 @@ interface SentDmClientAsync {
7070
/** Create, update, and manage customer contact lists */
7171
fun contacts(): ContactServiceAsync
7272

73-
/** Register and manage 10DLC brands for SMS compliance */
7473
fun brands(): BrandServiceAsync
7574

7675
/** Retrieve account details */
@@ -121,7 +120,6 @@ interface SentDmClientAsync {
121120
/** Create, update, and manage customer contact lists */
122121
fun contacts(): ContactServiceAsync.WithRawResponse
123122

124-
/** Register and manage 10DLC brands for SMS compliance */
125123
fun brands(): BrandServiceAsync.WithRawResponse
126124

127125
/** Retrieve account details */

sent-dm-java-core/src/main/kotlin/dm/sent/client/SentDmClientAsyncImpl.kt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,6 @@ class SentDmClientAsyncImpl(private val clientOptions: ClientOptions) : SentDmCl
100100
/** Create, update, and manage customer contact lists */
101101
override fun contacts(): ContactServiceAsync = contacts
102102

103-
/** Register and manage 10DLC brands for SMS compliance */
104103
override fun brands(): BrandServiceAsync = brands
105104

106105
/** Retrieve account details */
@@ -174,7 +173,6 @@ class SentDmClientAsyncImpl(private val clientOptions: ClientOptions) : SentDmCl
174173
/** Create, update, and manage customer contact lists */
175174
override fun contacts(): ContactServiceAsync.WithRawResponse = contacts
176175

177-
/** Register and manage 10DLC brands for SMS compliance */
178176
override fun brands(): BrandServiceAsync.WithRawResponse = brands
179177

180178
/** Retrieve account details */

sent-dm-java-core/src/main/kotlin/dm/sent/client/SentDmClientImpl.kt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,6 @@ class SentDmClientImpl(private val clientOptions: ClientOptions) : SentDmClient
8888
/** Create, update, and manage customer contact lists */
8989
override fun contacts(): ContactService = contacts
9090

91-
/** Register and manage 10DLC brands for SMS compliance */
9291
override fun brands(): BrandService = brands
9392

9493
/** Retrieve account details */
@@ -162,7 +161,6 @@ class SentDmClientImpl(private val clientOptions: ClientOptions) : SentDmClient
162161
/** Create, update, and manage customer contact lists */
163162
override fun contacts(): ContactService.WithRawResponse = contacts
164163

165-
/** Register and manage 10DLC brands for SMS compliance */
166164
override fun brands(): BrandService.WithRawResponse = brands
167165

168166
/** Retrieve account details */

0 commit comments

Comments
 (0)