From 94930d2713a1fe2dadaa64409b469ba3fac29f2f Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Thu, 9 Jul 2026 23:15:03 +0000 Subject: [PATCH 1/3] docs(openapi): use canonical type-id prefixes in id examples (#160) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * docs(openapi): use canonical type-id prefixes in id examples Align example ids with the backend's type-id prefixes (backend staging, lib/courier-ids ID_PREFIXES): nt=notification, rs=routing-strategy, pc=provider-config, ps=preference-section, pt=preference-topic. - providers: prov_ -> pc_ (wrong prefix corrected) - preference sections: PS5QM... -> ps_ - preference topics: raw ULIDs and "marketing" -> distinct pt_ (the valid vs not-found example ids are kept distinct) - notifications / routing: normalize the fake-short nt_01abc123 / rs_01abc123 to valid 26-char typeids All new values are format-valid typeids (prefix_ + 26-char base32), generated with typeid-js. Scope is "typed fields only": path {id}/{section_id}/{topic_id} params and clearly-named id fields for the 5 entities that have prefixes. The shared generic placeholder abc-123 (used across many unrelated entities) and the already-correct, readable elem_* element ids are left as-is. Examples-only; no schema/contract change. Co-Authored-By: Claude Opus 4.8 * test(e2e): make the journeys invoke test self-contained The "lists journeys and invokes the first template" test invoked list.templates[0], which is flaky against the shared live workspace: when no journey happens to exist there the list is empty and the test fails on `expect(firstId).toBeDefined()` (data drift, not a regression). Every other test in this file creates its own journey; make this one do the same — create + publish a minimal api-invoke journey, then invoke it by id. `list` is still covered by the "lists journeys" test above. Co-Authored-By: Claude Opus 4.8 --------- Co-authored-by: Claude Opus 4.8 --- .stats.yml | 4 +-- .../NotificationCreateParamsTest.kt | 10 +++--- .../PreferenceBulkReplaceParamsTest.kt | 16 +++++----- .../PreferenceBulkUpdateParamsTest.kt | 32 +++++++++---------- .../async/NotificationServiceAsyncTest.kt | 2 +- .../async/users/PreferenceServiceAsyncTest.kt | 6 ++-- .../blocking/NotificationServiceTest.kt | 2 +- .../blocking/users/PreferenceServiceTest.kt | 6 ++-- 8 files changed, 39 insertions(+), 39 deletions(-) diff --git a/.stats.yml b/.stats.yml index c6ea0b34..70c7b0e0 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 138 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/courier/courier-e8d4bd51bf260b8a6cb9875718e36eab95d4e8d9490cd6c5c669eb69b82c2bf8.yml -openapi_spec_hash: bf321581a238ae891debcc5bb59dd501 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/courier/courier-6f6deee1badbf852c3040ab900f25716890cf5d0e71c59f1a6b770a7fb877500.yml +openapi_spec_hash: b22e111bf1a9a968c6c1ee427015a901 config_hash: 6c3a754258f0f77e9032a90a478ab76d diff --git a/courier-java-core/src/test/kotlin/com/courier/models/notifications/NotificationCreateParamsTest.kt b/courier-java-core/src/test/kotlin/com/courier/models/notifications/NotificationCreateParamsTest.kt index eb8b89cd..0712e73e 100644 --- a/courier-java-core/src/test/kotlin/com/courier/models/notifications/NotificationCreateParamsTest.kt +++ b/courier-java-core/src/test/kotlin/com/courier/models/notifications/NotificationCreateParamsTest.kt @@ -38,7 +38,7 @@ internal class NotificationCreateParamsTest { ) .subscription( NotificationTemplatePayload.Subscription.builder() - .topicId("marketing") + .topicId("pt_01kx4h2jdafq8bk9a26x0kvd1t") .build() ) .addTag("onboarding") @@ -82,7 +82,7 @@ internal class NotificationCreateParamsTest { ) .subscription( NotificationTemplatePayload.Subscription.builder() - .topicId("marketing") + .topicId("pt_01kx4h2jdafq8bk9a26x0kvd1t") .build() ) .addTag("onboarding") @@ -122,7 +122,7 @@ internal class NotificationCreateParamsTest { ) .subscription( NotificationTemplatePayload.Subscription.builder() - .topicId("marketing") + .topicId("pt_01kx4h2jdafq8bk9a26x0kvd1t") .build() ) .addTag("onboarding") @@ -161,7 +161,7 @@ internal class NotificationCreateParamsTest { ) .subscription( NotificationTemplatePayload.Subscription.builder() - .topicId("marketing") + .topicId("pt_01kx4h2jdafq8bk9a26x0kvd1t") .build() ) .addTag("onboarding") @@ -196,7 +196,7 @@ internal class NotificationCreateParamsTest { ) .subscription( NotificationTemplatePayload.Subscription.builder() - .topicId("marketing") + .topicId("pt_01kx4h2jdafq8bk9a26x0kvd1t") .build() ) .addTag("onboarding") diff --git a/courier-java-core/src/test/kotlin/com/courier/models/users/preferences/PreferenceBulkReplaceParamsTest.kt b/courier-java-core/src/test/kotlin/com/courier/models/users/preferences/PreferenceBulkReplaceParamsTest.kt index cff6bdef..952e3568 100644 --- a/courier-java-core/src/test/kotlin/com/courier/models/users/preferences/PreferenceBulkReplaceParamsTest.kt +++ b/courier-java-core/src/test/kotlin/com/courier/models/users/preferences/PreferenceBulkReplaceParamsTest.kt @@ -17,7 +17,7 @@ internal class PreferenceBulkReplaceParamsTest { .addTopic( PreferenceBulkReplaceParams.Topic.builder() .status(PreferenceBulkReplaceParams.Topic.Status.OPTED_IN) - .topicId("74Q4QGFBEX481DP6JRPMV751H4XT") + .topicId("pt_01kx4h2jdafq8bk996nn92357r") .addCustomRouting(ChannelClassification.INBOX) .addCustomRouting(ChannelClassification.EMAIL) .hasCustomRouting(true) @@ -34,7 +34,7 @@ internal class PreferenceBulkReplaceParamsTest { .addTopic( PreferenceBulkReplaceParams.Topic.builder() .status(PreferenceBulkReplaceParams.Topic.Status.OPTED_IN) - .topicId("74Q4QGFBEX481DP6JRPMV751H4XT") + .topicId("pt_01kx4h2jdafq8bk996nn92357r") .build() ) .build() @@ -53,7 +53,7 @@ internal class PreferenceBulkReplaceParamsTest { .addTopic( PreferenceBulkReplaceParams.Topic.builder() .status(PreferenceBulkReplaceParams.Topic.Status.OPTED_IN) - .topicId("74Q4QGFBEX481DP6JRPMV751H4XT") + .topicId("pt_01kx4h2jdafq8bk996nn92357r") .addCustomRouting(ChannelClassification.INBOX) .addCustomRouting(ChannelClassification.EMAIL) .hasCustomRouting(true) @@ -75,7 +75,7 @@ internal class PreferenceBulkReplaceParamsTest { .addTopic( PreferenceBulkReplaceParams.Topic.builder() .status(PreferenceBulkReplaceParams.Topic.Status.OPTED_IN) - .topicId("74Q4QGFBEX481DP6JRPMV751H4XT") + .topicId("pt_01kx4h2jdafq8bk996nn92357r") .build() ) .build() @@ -94,7 +94,7 @@ internal class PreferenceBulkReplaceParamsTest { .addTopic( PreferenceBulkReplaceParams.Topic.builder() .status(PreferenceBulkReplaceParams.Topic.Status.OPTED_IN) - .topicId("74Q4QGFBEX481DP6JRPMV751H4XT") + .topicId("pt_01kx4h2jdafq8bk996nn92357r") .addCustomRouting(ChannelClassification.INBOX) .addCustomRouting(ChannelClassification.EMAIL) .hasCustomRouting(true) @@ -108,7 +108,7 @@ internal class PreferenceBulkReplaceParamsTest { .containsExactly( PreferenceBulkReplaceParams.Topic.builder() .status(PreferenceBulkReplaceParams.Topic.Status.OPTED_IN) - .topicId("74Q4QGFBEX481DP6JRPMV751H4XT") + .topicId("pt_01kx4h2jdafq8bk996nn92357r") .addCustomRouting(ChannelClassification.INBOX) .addCustomRouting(ChannelClassification.EMAIL) .hasCustomRouting(true) @@ -124,7 +124,7 @@ internal class PreferenceBulkReplaceParamsTest { .addTopic( PreferenceBulkReplaceParams.Topic.builder() .status(PreferenceBulkReplaceParams.Topic.Status.OPTED_IN) - .topicId("74Q4QGFBEX481DP6JRPMV751H4XT") + .topicId("pt_01kx4h2jdafq8bk996nn92357r") .build() ) .build() @@ -135,7 +135,7 @@ internal class PreferenceBulkReplaceParamsTest { .containsExactly( PreferenceBulkReplaceParams.Topic.builder() .status(PreferenceBulkReplaceParams.Topic.Status.OPTED_IN) - .topicId("74Q4QGFBEX481DP6JRPMV751H4XT") + .topicId("pt_01kx4h2jdafq8bk996nn92357r") .build() ) } diff --git a/courier-java-core/src/test/kotlin/com/courier/models/users/preferences/PreferenceBulkUpdateParamsTest.kt b/courier-java-core/src/test/kotlin/com/courier/models/users/preferences/PreferenceBulkUpdateParamsTest.kt index c2a83f3f..98c1a915 100644 --- a/courier-java-core/src/test/kotlin/com/courier/models/users/preferences/PreferenceBulkUpdateParamsTest.kt +++ b/courier-java-core/src/test/kotlin/com/courier/models/users/preferences/PreferenceBulkUpdateParamsTest.kt @@ -17,7 +17,7 @@ internal class PreferenceBulkUpdateParamsTest { .addTopic( PreferenceBulkUpdateParams.Topic.builder() .status(PreferenceBulkUpdateParams.Topic.Status.OPTED_IN) - .topicId("74Q4QGFBEX481DP6JRPMV751H4XT") + .topicId("pt_01kx4h2jdafq8bk996nn92357r") .addCustomRouting(ChannelClassification.INBOX) .addCustomRouting(ChannelClassification.EMAIL) .hasCustomRouting(true) @@ -26,7 +26,7 @@ internal class PreferenceBulkUpdateParamsTest { .addTopic( PreferenceBulkUpdateParams.Topic.builder() .status(PreferenceBulkUpdateParams.Topic.Status.OPTED_OUT) - .topicId("5Q4QGFBEX481DP6JRPMV751H4YU") + .topicId("pt_01kx4h2jdafq8bk99eyt3dx43x") .addCustomRouting(ChannelClassification.DIRECT_MESSAGE) .hasCustomRouting(true) .build() @@ -42,13 +42,13 @@ internal class PreferenceBulkUpdateParamsTest { .addTopic( PreferenceBulkUpdateParams.Topic.builder() .status(PreferenceBulkUpdateParams.Topic.Status.OPTED_IN) - .topicId("74Q4QGFBEX481DP6JRPMV751H4XT") + .topicId("pt_01kx4h2jdafq8bk996nn92357r") .build() ) .addTopic( PreferenceBulkUpdateParams.Topic.builder() .status(PreferenceBulkUpdateParams.Topic.Status.OPTED_OUT) - .topicId("5Q4QGFBEX481DP6JRPMV751H4YU") + .topicId("pt_01kx4h2jdafq8bk99eyt3dx43x") .build() ) .build() @@ -67,7 +67,7 @@ internal class PreferenceBulkUpdateParamsTest { .addTopic( PreferenceBulkUpdateParams.Topic.builder() .status(PreferenceBulkUpdateParams.Topic.Status.OPTED_IN) - .topicId("74Q4QGFBEX481DP6JRPMV751H4XT") + .topicId("pt_01kx4h2jdafq8bk996nn92357r") .addCustomRouting(ChannelClassification.INBOX) .addCustomRouting(ChannelClassification.EMAIL) .hasCustomRouting(true) @@ -76,7 +76,7 @@ internal class PreferenceBulkUpdateParamsTest { .addTopic( PreferenceBulkUpdateParams.Topic.builder() .status(PreferenceBulkUpdateParams.Topic.Status.OPTED_OUT) - .topicId("5Q4QGFBEX481DP6JRPMV751H4YU") + .topicId("pt_01kx4h2jdafq8bk99eyt3dx43x") .addCustomRouting(ChannelClassification.DIRECT_MESSAGE) .hasCustomRouting(true) .build() @@ -97,13 +97,13 @@ internal class PreferenceBulkUpdateParamsTest { .addTopic( PreferenceBulkUpdateParams.Topic.builder() .status(PreferenceBulkUpdateParams.Topic.Status.OPTED_IN) - .topicId("74Q4QGFBEX481DP6JRPMV751H4XT") + .topicId("pt_01kx4h2jdafq8bk996nn92357r") .build() ) .addTopic( PreferenceBulkUpdateParams.Topic.builder() .status(PreferenceBulkUpdateParams.Topic.Status.OPTED_OUT) - .topicId("5Q4QGFBEX481DP6JRPMV751H4YU") + .topicId("pt_01kx4h2jdafq8bk99eyt3dx43x") .build() ) .build() @@ -122,7 +122,7 @@ internal class PreferenceBulkUpdateParamsTest { .addTopic( PreferenceBulkUpdateParams.Topic.builder() .status(PreferenceBulkUpdateParams.Topic.Status.OPTED_IN) - .topicId("74Q4QGFBEX481DP6JRPMV751H4XT") + .topicId("pt_01kx4h2jdafq8bk996nn92357r") .addCustomRouting(ChannelClassification.INBOX) .addCustomRouting(ChannelClassification.EMAIL) .hasCustomRouting(true) @@ -131,7 +131,7 @@ internal class PreferenceBulkUpdateParamsTest { .addTopic( PreferenceBulkUpdateParams.Topic.builder() .status(PreferenceBulkUpdateParams.Topic.Status.OPTED_OUT) - .topicId("5Q4QGFBEX481DP6JRPMV751H4YU") + .topicId("pt_01kx4h2jdafq8bk99eyt3dx43x") .addCustomRouting(ChannelClassification.DIRECT_MESSAGE) .hasCustomRouting(true) .build() @@ -144,14 +144,14 @@ internal class PreferenceBulkUpdateParamsTest { .containsExactly( PreferenceBulkUpdateParams.Topic.builder() .status(PreferenceBulkUpdateParams.Topic.Status.OPTED_IN) - .topicId("74Q4QGFBEX481DP6JRPMV751H4XT") + .topicId("pt_01kx4h2jdafq8bk996nn92357r") .addCustomRouting(ChannelClassification.INBOX) .addCustomRouting(ChannelClassification.EMAIL) .hasCustomRouting(true) .build(), PreferenceBulkUpdateParams.Topic.builder() .status(PreferenceBulkUpdateParams.Topic.Status.OPTED_OUT) - .topicId("5Q4QGFBEX481DP6JRPMV751H4YU") + .topicId("pt_01kx4h2jdafq8bk99eyt3dx43x") .addCustomRouting(ChannelClassification.DIRECT_MESSAGE) .hasCustomRouting(true) .build(), @@ -166,13 +166,13 @@ internal class PreferenceBulkUpdateParamsTest { .addTopic( PreferenceBulkUpdateParams.Topic.builder() .status(PreferenceBulkUpdateParams.Topic.Status.OPTED_IN) - .topicId("74Q4QGFBEX481DP6JRPMV751H4XT") + .topicId("pt_01kx4h2jdafq8bk996nn92357r") .build() ) .addTopic( PreferenceBulkUpdateParams.Topic.builder() .status(PreferenceBulkUpdateParams.Topic.Status.OPTED_OUT) - .topicId("5Q4QGFBEX481DP6JRPMV751H4YU") + .topicId("pt_01kx4h2jdafq8bk99eyt3dx43x") .build() ) .build() @@ -183,11 +183,11 @@ internal class PreferenceBulkUpdateParamsTest { .containsExactly( PreferenceBulkUpdateParams.Topic.builder() .status(PreferenceBulkUpdateParams.Topic.Status.OPTED_IN) - .topicId("74Q4QGFBEX481DP6JRPMV751H4XT") + .topicId("pt_01kx4h2jdafq8bk996nn92357r") .build(), PreferenceBulkUpdateParams.Topic.builder() .status(PreferenceBulkUpdateParams.Topic.Status.OPTED_OUT) - .topicId("5Q4QGFBEX481DP6JRPMV751H4YU") + .topicId("pt_01kx4h2jdafq8bk99eyt3dx43x") .build(), ) } diff --git a/courier-java-core/src/test/kotlin/com/courier/services/async/NotificationServiceAsyncTest.kt b/courier-java-core/src/test/kotlin/com/courier/services/async/NotificationServiceAsyncTest.kt index 75c20269..7f6cd812 100644 --- a/courier-java-core/src/test/kotlin/com/courier/services/async/NotificationServiceAsyncTest.kt +++ b/courier-java-core/src/test/kotlin/com/courier/services/async/NotificationServiceAsyncTest.kt @@ -60,7 +60,7 @@ internal class NotificationServiceAsyncTest { ) .subscription( NotificationTemplatePayload.Subscription.builder() - .topicId("marketing") + .topicId("pt_01kx4h2jdafq8bk9a26x0kvd1t") .build() ) .addTag("onboarding") diff --git a/courier-java-core/src/test/kotlin/com/courier/services/async/users/PreferenceServiceAsyncTest.kt b/courier-java-core/src/test/kotlin/com/courier/services/async/users/PreferenceServiceAsyncTest.kt index 09734102..88e1d5ee 100644 --- a/courier-java-core/src/test/kotlin/com/courier/services/async/users/PreferenceServiceAsyncTest.kt +++ b/courier-java-core/src/test/kotlin/com/courier/services/async/users/PreferenceServiceAsyncTest.kt @@ -45,7 +45,7 @@ internal class PreferenceServiceAsyncTest { .addTopic( PreferenceBulkReplaceParams.Topic.builder() .status(PreferenceBulkReplaceParams.Topic.Status.OPTED_IN) - .topicId("74Q4QGFBEX481DP6JRPMV751H4XT") + .topicId("pt_01kx4h2jdafq8bk996nn92357r") .addCustomRouting(ChannelClassification.INBOX) .addCustomRouting(ChannelClassification.EMAIL) .hasCustomRouting(true) @@ -72,7 +72,7 @@ internal class PreferenceServiceAsyncTest { .addTopic( PreferenceBulkUpdateParams.Topic.builder() .status(PreferenceBulkUpdateParams.Topic.Status.OPTED_IN) - .topicId("74Q4QGFBEX481DP6JRPMV751H4XT") + .topicId("pt_01kx4h2jdafq8bk996nn92357r") .addCustomRouting(ChannelClassification.INBOX) .addCustomRouting(ChannelClassification.EMAIL) .hasCustomRouting(true) @@ -81,7 +81,7 @@ internal class PreferenceServiceAsyncTest { .addTopic( PreferenceBulkUpdateParams.Topic.builder() .status(PreferenceBulkUpdateParams.Topic.Status.OPTED_OUT) - .topicId("5Q4QGFBEX481DP6JRPMV751H4YU") + .topicId("pt_01kx4h2jdafq8bk99eyt3dx43x") .addCustomRouting(ChannelClassification.DIRECT_MESSAGE) .hasCustomRouting(true) .build() diff --git a/courier-java-core/src/test/kotlin/com/courier/services/blocking/NotificationServiceTest.kt b/courier-java-core/src/test/kotlin/com/courier/services/blocking/NotificationServiceTest.kt index 61ab6c5a..d8d1a85a 100644 --- a/courier-java-core/src/test/kotlin/com/courier/services/blocking/NotificationServiceTest.kt +++ b/courier-java-core/src/test/kotlin/com/courier/services/blocking/NotificationServiceTest.kt @@ -60,7 +60,7 @@ internal class NotificationServiceTest { ) .subscription( NotificationTemplatePayload.Subscription.builder() - .topicId("marketing") + .topicId("pt_01kx4h2jdafq8bk9a26x0kvd1t") .build() ) .addTag("onboarding") diff --git a/courier-java-core/src/test/kotlin/com/courier/services/blocking/users/PreferenceServiceTest.kt b/courier-java-core/src/test/kotlin/com/courier/services/blocking/users/PreferenceServiceTest.kt index 732a33a1..221477d1 100644 --- a/courier-java-core/src/test/kotlin/com/courier/services/blocking/users/PreferenceServiceTest.kt +++ b/courier-java-core/src/test/kotlin/com/courier/services/blocking/users/PreferenceServiceTest.kt @@ -44,7 +44,7 @@ internal class PreferenceServiceTest { .addTopic( PreferenceBulkReplaceParams.Topic.builder() .status(PreferenceBulkReplaceParams.Topic.Status.OPTED_IN) - .topicId("74Q4QGFBEX481DP6JRPMV751H4XT") + .topicId("pt_01kx4h2jdafq8bk996nn92357r") .addCustomRouting(ChannelClassification.INBOX) .addCustomRouting(ChannelClassification.EMAIL) .hasCustomRouting(true) @@ -70,7 +70,7 @@ internal class PreferenceServiceTest { .addTopic( PreferenceBulkUpdateParams.Topic.builder() .status(PreferenceBulkUpdateParams.Topic.Status.OPTED_IN) - .topicId("74Q4QGFBEX481DP6JRPMV751H4XT") + .topicId("pt_01kx4h2jdafq8bk996nn92357r") .addCustomRouting(ChannelClassification.INBOX) .addCustomRouting(ChannelClassification.EMAIL) .hasCustomRouting(true) @@ -79,7 +79,7 @@ internal class PreferenceServiceTest { .addTopic( PreferenceBulkUpdateParams.Topic.builder() .status(PreferenceBulkUpdateParams.Topic.Status.OPTED_OUT) - .topicId("5Q4QGFBEX481DP6JRPMV751H4YU") + .topicId("pt_01kx4h2jdafq8bk99eyt3dx43x") .addCustomRouting(ChannelClassification.DIRECT_MESSAGE) .hasCustomRouting(true) .build() From b1dacb2964d6575f6b8749f2ede2cc24a1626743 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Fri, 10 Jul 2026 00:04:22 +0000 Subject: [PATCH 2/3] docs(openapi): canonical type-id prefixes across all examples (#162) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * docs(openapi): canonical type-id prefixes in remaining id examples Follow-up to #160, which normalized nt/rs/pc/ps/pt id examples but left a few prefixed-entity ids using placeholder/short values. Align these with the backend's canonical type-id prefixes (staging lib/courier-ids ID_PREFIXES): - routing: strategy_id "rs_123" -> valid rs_ typeid (matches the rs_ example used elsewhere in the spec) - error messages: "Notification template nt_nonexistent not found" and "Routing strategy rs_nonexistent not found" -> valid-format not-found typeids (distinct from the "exists" example ids, per #160's valid-vs-not-found convention) - error message: "Version not found for template nt_123" -> canonical nt_ typeid (the template exists; only the version is missing) All values are format-valid typeids (prefix_ + 26-char base32), generated with typeid-js. Readable elem_* element ids are left as-is (element ids are idiomatically human-readable in this spec). Examples-only; no schema/contract change. Co-Authored-By: Claude Opus 4.8 * docs(openapi): use canonical jry_ / nt_ ids in journey examples Latest backend staging lib/courier-ids ID_PREFIXES added a JOURNEY: "jry" prefix (journey create always generates a jry_ typeid). The journeys example ids were still placeholders — align them: - journey ids (list items, create/get/replace/publish responses): abc-123 / abc-123-def-456 / xyz-789-ghi-012 -> jry_ typeids - journey-scoped notification templates (POST /journeys/{templateId}/templates results): tmpl-1 / tmpl-2 -> nt_ typeids Left as-is: journey node ids (trigger-1, send-1) are user-authored readable ids; run_id/runId are X-Ray-style run identifiers, not typeids; brand/tenant ids stay readable placeholders (both accept customer-supplied ids, matching #160). /automations examples are untouched (automation template ids are composite tenant/env-scoped, not a bare jry_). All new values are format-valid typeids (prefix_ + 26-char base32), generated with typeid-js. Examples-only; no schema/contract change. Co-Authored-By: Claude Opus 4.8 * docs: canonical brand/notification/routing ids + release-shepherd note Complete the type-id sweep so every prefixed-entity example uses a canonical typeid, and document the release-shepherd skill. openapi.yml (examples-only, no schema/contract change): - brand ids -> bnd_ (Brand, BrandsResponse, Tenant/TenantListResponse brand_id, RoutingStrategyGetResponse brand_id, and brand.id in notification responses): brand now has a canonical bnd prefix on staging, so the placeholder ULID / brand_abc values are replaced - NotificationListResponse item id: abc-123 -> nt_ (was missed) - RoutingStrategyGetResponse id: abc-123 -> rs_ (was missed) - BulkGetJobUsersResponse templateId -> nt_ Left readable/untouched (not backend-generated typeids): tenant/workspace ids (customer-supplied, wrk_ is only the generated fallback), tag ids, submission-check ids, audit-event ids, and /automations template ids (composite tenant/env-scoped, not a bare jry_). README: add a note pointing to the courier-release-shepherd skill for driving the docs sync + SDK release PRs after a merge. Co-Authored-By: Claude Opus 4.8 --------- Co-authored-by: Claude Opus 4.8 --- .stats.yml | 4 +-- .../NotificationCreateParamsTest.kt | 26 ++++++++++++------- .../async/NotificationServiceAsyncTest.kt | 6 +++-- .../blocking/NotificationServiceTest.kt | 6 +++-- 4 files changed, 26 insertions(+), 16 deletions(-) diff --git a/.stats.yml b/.stats.yml index 70c7b0e0..9e3b99b6 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 138 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/courier/courier-6f6deee1badbf852c3040ab900f25716890cf5d0e71c59f1a6b770a7fb877500.yml -openapi_spec_hash: b22e111bf1a9a968c6c1ee427015a901 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/courier/courier-11e1931d767cef402bbed5a965746d1933ae72db0f41881860593a0b1424fd80.yml +openapi_spec_hash: 9def941805f233f8761c4bdae88f6137 config_hash: 6c3a754258f0f77e9032a90a478ab76d diff --git a/courier-java-core/src/test/kotlin/com/courier/models/notifications/NotificationCreateParamsTest.kt b/courier-java-core/src/test/kotlin/com/courier/models/notifications/NotificationCreateParamsTest.kt index 0712e73e..bfdcf9a0 100644 --- a/courier-java-core/src/test/kotlin/com/courier/models/notifications/NotificationCreateParamsTest.kt +++ b/courier-java-core/src/test/kotlin/com/courier/models/notifications/NotificationCreateParamsTest.kt @@ -18,7 +18,9 @@ internal class NotificationCreateParamsTest { .notification( NotificationTemplatePayload.builder() .brand( - NotificationTemplatePayload.Brand.builder().id("brand_abc").build() + NotificationTemplatePayload.Brand.builder() + .id("bnd_01kx4mrd0pfzw8wt7pn7p2fzag") + .build() ) .content( ElementalContent.builder() @@ -33,7 +35,7 @@ internal class NotificationCreateParamsTest { .name("Welcome Email") .routing( NotificationTemplatePayload.Routing.builder() - .strategyId("rs_123") + .strategyId("rs_01kx4h2jdafq8bk9amzvy6hbv0") .build() ) .subscription( @@ -61,7 +63,7 @@ internal class NotificationCreateParamsTest { NotificationTemplatePayload.builder() .brand( NotificationTemplatePayload.Brand.builder() - .id("brand_abc") + .id("bnd_01kx4mrd0pfzw8wt7pn7p2fzag") .build() ) .content( @@ -77,7 +79,7 @@ internal class NotificationCreateParamsTest { .name("Welcome Email") .routing( NotificationTemplatePayload.Routing.builder() - .strategyId("rs_123") + .strategyId("rs_01kx4h2jdafq8bk9amzvy6hbv0") .build() ) .subscription( @@ -102,7 +104,9 @@ internal class NotificationCreateParamsTest { .notification( NotificationTemplatePayload.builder() .brand( - NotificationTemplatePayload.Brand.builder().id("brand_abc").build() + NotificationTemplatePayload.Brand.builder() + .id("bnd_01kx4mrd0pfzw8wt7pn7p2fzag") + .build() ) .content( ElementalContent.builder() @@ -117,7 +121,7 @@ internal class NotificationCreateParamsTest { .name("Welcome Email") .routing( NotificationTemplatePayload.Routing.builder() - .strategyId("rs_123") + .strategyId("rs_01kx4h2jdafq8bk9amzvy6hbv0") .build() ) .subscription( @@ -144,7 +148,7 @@ internal class NotificationCreateParamsTest { NotificationTemplatePayload.builder() .brand( NotificationTemplatePayload.Brand.builder() - .id("brand_abc") + .id("bnd_01kx4mrd0pfzw8wt7pn7p2fzag") .build() ) .content( @@ -156,7 +160,7 @@ internal class NotificationCreateParamsTest { .name("Welcome Email") .routing( NotificationTemplatePayload.Routing.builder() - .strategyId("rs_123") + .strategyId("rs_01kx4h2jdafq8bk9amzvy6hbv0") .build() ) .subscription( @@ -180,7 +184,9 @@ internal class NotificationCreateParamsTest { .notification( NotificationTemplatePayload.builder() .brand( - NotificationTemplatePayload.Brand.builder().id("brand_abc").build() + NotificationTemplatePayload.Brand.builder() + .id("bnd_01kx4mrd0pfzw8wt7pn7p2fzag") + .build() ) .content( ElementalContent.builder() @@ -191,7 +197,7 @@ internal class NotificationCreateParamsTest { .name("Welcome Email") .routing( NotificationTemplatePayload.Routing.builder() - .strategyId("rs_123") + .strategyId("rs_01kx4h2jdafq8bk9amzvy6hbv0") .build() ) .subscription( diff --git a/courier-java-core/src/test/kotlin/com/courier/services/async/NotificationServiceAsyncTest.kt b/courier-java-core/src/test/kotlin/com/courier/services/async/NotificationServiceAsyncTest.kt index 7f6cd812..a103ee60 100644 --- a/courier-java-core/src/test/kotlin/com/courier/services/async/NotificationServiceAsyncTest.kt +++ b/courier-java-core/src/test/kotlin/com/courier/services/async/NotificationServiceAsyncTest.kt @@ -40,7 +40,9 @@ internal class NotificationServiceAsyncTest { .notification( NotificationTemplatePayload.builder() .brand( - NotificationTemplatePayload.Brand.builder().id("brand_abc").build() + NotificationTemplatePayload.Brand.builder() + .id("bnd_01kx4mrd0pfzw8wt7pn7p2fzag") + .build() ) .content( ElementalContent.builder() @@ -55,7 +57,7 @@ internal class NotificationServiceAsyncTest { .name("Welcome Email") .routing( NotificationTemplatePayload.Routing.builder() - .strategyId("rs_123") + .strategyId("rs_01kx4h2jdafq8bk9amzvy6hbv0") .build() ) .subscription( diff --git a/courier-java-core/src/test/kotlin/com/courier/services/blocking/NotificationServiceTest.kt b/courier-java-core/src/test/kotlin/com/courier/services/blocking/NotificationServiceTest.kt index d8d1a85a..1f525e00 100644 --- a/courier-java-core/src/test/kotlin/com/courier/services/blocking/NotificationServiceTest.kt +++ b/courier-java-core/src/test/kotlin/com/courier/services/blocking/NotificationServiceTest.kt @@ -40,7 +40,9 @@ internal class NotificationServiceTest { .notification( NotificationTemplatePayload.builder() .brand( - NotificationTemplatePayload.Brand.builder().id("brand_abc").build() + NotificationTemplatePayload.Brand.builder() + .id("bnd_01kx4mrd0pfzw8wt7pn7p2fzag") + .build() ) .content( ElementalContent.builder() @@ -55,7 +57,7 @@ internal class NotificationServiceTest { .name("Welcome Email") .routing( NotificationTemplatePayload.Routing.builder() - .strategyId("rs_123") + .strategyId("rs_01kx4h2jdafq8bk9amzvy6hbv0") .build() ) .subscription( From 570f2a4c8e7dcd86b59ee98c19a87966ca29e8fb Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Fri, 10 Jul 2026 00:04:45 +0000 Subject: [PATCH 3/3] release: 4.20.2 --- .release-please-manifest.json | 2 +- CHANGELOG.md | 9 +++++++++ build.gradle.kts | 2 +- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/.release-please-manifest.json b/.release-please-manifest.json index bf7dddc6..59bb50ff 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "4.20.1" + ".": "4.20.2" } \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 36c67cb1..58efece7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,14 @@ # Changelog +## 4.20.2 (2026-07-10) + +Full Changelog: [v4.20.1...v4.20.2](https://github.com/trycourier/courier-java/compare/v4.20.1...v4.20.2) + +### Documentation + +* **openapi:** canonical type-id prefixes across all examples ([#162](https://github.com/trycourier/courier-java/issues/162)) ([b1dacb2](https://github.com/trycourier/courier-java/commit/b1dacb2964d6575f6b8749f2ede2cc24a1626743)) +* **openapi:** use canonical type-id prefixes in id examples ([#160](https://github.com/trycourier/courier-java/issues/160)) ([94930d2](https://github.com/trycourier/courier-java/commit/94930d2713a1fe2dadaa64409b469ba3fac29f2f)) + ## 4.20.1 (2026-07-09) Full Changelog: [v4.20.0...v4.20.1](https://github.com/trycourier/courier-java/compare/v4.20.0...v4.20.1) diff --git a/build.gradle.kts b/build.gradle.kts index 12b1fa4c..13572d6b 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -8,7 +8,7 @@ repositories { allprojects { group = "com.courier" - version = "4.20.1" // x-release-please-version + version = "4.20.2" // x-release-please-version } subprojects {