@whooshbang/contracts 1.0.0-rc.21 → 1.0.0-rc.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (125) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/README.md +9 -3
  3. package/contract-manifest.json +43 -41
  4. package/dist/generated/artifact-index.d.ts +35 -35
  5. package/dist/generated/artifact-index.js +43 -41
  6. package/dist/generated/artifact-index.js.map +1 -1
  7. package/dist/generated/validators-standalone.d.ts +340 -288
  8. package/dist/generated/validators-standalone.js +5560 -2925
  9. package/dist/generated/validators-standalone.js.map +1 -1
  10. package/dist/generated/validators.d.ts +12 -8
  11. package/dist/generated/validators.js +22 -18
  12. package/dist/generated/validators.js.map +1 -1
  13. package/dist/generated/whooshbang-event-v1.d.ts +1 -1
  14. package/dist/generated/whooshbang-v1.d.ts +211 -121
  15. package/dist/index.d.ts +2 -2
  16. package/dist/index.js +1 -1
  17. package/dist/index.js.map +1 -1
  18. package/fixtures/core-v1/fixture-index.json +50 -34
  19. package/fixtures/core-v1/problems/credential-organization-mismatch.json +9 -0
  20. package/fixtures/core-v1/problems/live-simulator-refused.json +16 -0
  21. package/fixtures/core-v1/problems/project-slug-conflict.json +1 -1
  22. package/fixtures/core-v1/requests/create-organization-credential.json +4 -0
  23. package/fixtures/core-v1/requests/update-project.json +3 -0
  24. package/fixtures/core-v1/scenarios/api-credential-invalid-indistinguishable.json +1 -1
  25. package/fixtures/core-v1/scenarios/api-credential-one-time-reveal.json +1 -1
  26. package/fixtures/core-v1/scenarios/api-credential-revocation-replay.json +1 -1
  27. package/fixtures/core-v1/scenarios/api-credential-rotation-overlap.json +1 -1
  28. package/fixtures/core-v1/scenarios/cancellation-too-late.json +1 -1
  29. package/fixtures/core-v1/scenarios/cross-organization-project.json +14 -0
  30. package/fixtures/core-v1/scenarios/cross-project-resource.json +1 -1
  31. package/fixtures/core-v1/scenarios/environment-mismatch.json +1 -1
  32. package/fixtures/core-v1/scenarios/idempotency-conflict.json +1 -1
  33. package/fixtures/core-v1/scenarios/idempotency-equivalent-replay.json +1 -1
  34. package/fixtures/core-v1/scenarios/malformed-bearer.json +1 -1
  35. package/fixtures/core-v1/scenarios/metadata-overrun.json +1 -1
  36. package/fixtures/core-v1/scenarios/missing-scope.json +1 -1
  37. package/fixtures/core-v1/scenarios/project-create-equivalent-replay.json +2 -2
  38. package/fixtures/core-v1/scenarios/project-slug-conflict.json +2 -2
  39. package/fixtures/core-v1/scenarios/provider-outcome-unknown.json +1 -1
  40. package/fixtures/core-v1/scenarios/subscription-activation-replay.json +1 -1
  41. package/fixtures/core-v1/scenarios/subscription-authorization-capability-opacity.json +1 -1
  42. package/fixtures/core-v1/scenarios/subscription-cross-connection-callback-rejected.json +1 -1
  43. package/fixtures/core-v1/scenarios/subscription-expired-replay.json +1 -1
  44. package/fixtures/core-v1/scenarios/subscription-selected-connection-replay.json +1 -1
  45. package/fixtures/core-v1/success/{account-credential-collection.json → organization-credential-collection.json} +3 -3
  46. package/fixtures/core-v1/success/organization-credential-created.json +12 -0
  47. package/fixtures/core-v1/success/{account-credential-revoked.json → organization-credential-revoked.json} +3 -3
  48. package/fixtures/core-v1/success/{account-credential-rotated.json → organization-credential-rotated.json} +7 -7
  49. package/fixtures/core-v1/success/{account-projection.json → organization-projection.json} +2 -2
  50. package/fixtures/core-v1/success/project-collection.json +3 -2
  51. package/fixtures/core-v1/success/project-created.json +3 -2
  52. package/fixtures/interaction-machine-v1/scenarios/ack-conflict.json +1 -1
  53. package/fixtures/interaction-machine-v1/scenarios/ack-cross-machine.json +1 -1
  54. package/fixtures/interaction-machine-v1/scenarios/ack-out-of-order.json +1 -1
  55. package/fixtures/interaction-machine-v1/scenarios/ack-replay.json +1 -1
  56. package/fixtures/interaction-machine-v1/scenarios/ambiguous-free-text.json +1 -1
  57. package/fixtures/interaction-machine-v1/scenarios/callback-token-opacity.json +1 -1
  58. package/fixtures/interaction-machine-v1/scenarios/credential-registration-conflict.json +1 -1
  59. package/fixtures/interaction-machine-v1/scenarios/credential-registration-replay.json +1 -1
  60. package/fixtures/interaction-machine-v1/scenarios/credential-revocation-replay.json +1 -1
  61. package/fixtures/interaction-machine-v1/scenarios/credential-rotation.json +1 -1
  62. package/fixtures/interaction-machine-v1/scenarios/first-credential-activates.json +1 -1
  63. package/fixtures/interaction-machine-v1/scenarios/interaction-duplicate.json +1 -1
  64. package/fixtures/interaction-machine-v1/scenarios/interaction-expired.json +1 -1
  65. package/fixtures/interaction-machine-v1/scenarios/interaction-mismatch.json +1 -1
  66. package/fixtures/interaction-machine-v1/scenarios/interaction-retired.json +1 -1
  67. package/fixtures/interaction-machine-v1/scenarios/interaction-stale.json +1 -1
  68. package/fixtures/interaction-machine-v1/scenarios/machine-admin-denied.json +1 -1
  69. package/fixtures/interaction-machine-v1/scenarios/machine-bound-message-create.json +1 -1
  70. package/fixtures/interaction-machine-v1/scenarios/machine-cancel-denied.json +1 -1
  71. package/fixtures/interaction-machine-v1/scenarios/machine-crash-before-ack.json +1 -1
  72. package/fixtures/interaction-machine-v1/scenarios/machine-notifier-mismatch.json +1 -1
  73. package/fixtures/interaction-machine-v1/scenarios/machine-other-message-read.json +1 -1
  74. package/fixtures/interaction-machine-v1/scenarios/machine-owned-message-read.json +1 -1
  75. package/fixtures/interaction-machine-v1/scenarios/machine-subscriber-mismatch.json +1 -1
  76. package/fixtures/interaction-machine-v1/scenarios/poll-uncommitted-cursor-rejected.json +1 -1
  77. package/fixtures/interaction-machine-v1/scenarios/project-credential-machine-endpoint-denied.json +1 -1
  78. package/fixtures/interaction-machine-v1/scenarios/quarantine-integrity-rejected.json +1 -1
  79. package/fixtures/interaction-machine-v1/scenarios/quarantine-signature-rejected.json +1 -1
  80. package/fixtures/interaction-machine-v1/scenarios/quarantine-valid.json +1 -1
  81. package/fixtures/interaction-machine-v1/scenarios/revoked-machine-credential.json +1 -1
  82. package/fixtures/recipient-experience-v1/requests/create-recipient-group.json +1 -1
  83. package/fixtures/recipient-experience-v1/requests/create-subscriber-with-groups.json +1 -1
  84. package/fixtures/recipient-experience-v1/scenarios/membership-broadcast-snapshot.json +1 -1
  85. package/fixtures/recipient-experience-v1/scenarios/preferred-binding-resolution.json +1 -1
  86. package/fixtures/recipient-experience-v1/scenarios/recipient-session-security.json +1 -1
  87. package/fixtures/recipient-experience-v1/scenarios/subscriber-initial-groups-transaction.json +2 -2
  88. package/fixtures/recipient-experience-v1/success/recipient-group.json +1 -1
  89. package/fixtures/whooshbang-events-v1/events/agent-binding-degraded.json +1 -1
  90. package/fixtures/whooshbang-events-v1/events/interaction-expired.json +1 -1
  91. package/fixtures/whooshbang-events-v1/events/interaction-received.json +1 -1
  92. package/fixtures/whooshbang-events-v1/events/message-delivered.json +1 -1
  93. package/fixtures/whooshbang-events-v1/events/message-expired.json +1 -1
  94. package/fixtures/whooshbang-events-v1/events/message-failed.json +1 -1
  95. package/fixtures/whooshbang-events-v1/events/message-provider-accepted.json +1 -1
  96. package/fixtures/whooshbang-events-v1/events/subscription-activated.json +1 -1
  97. package/fixtures/whooshbang-events-v1/events/subscription-revoked.json +1 -1
  98. package/fixtures/whooshbang-events-v1/signing/vectors.json +29 -29
  99. package/openapi/generated/whooshbang-v1.bundle.json +641 -248
  100. package/openapi/whooshbang-v1.yaml +403 -189
  101. package/package.json +1 -1
  102. package/schemas/core-scenario.schema.json +1 -1
  103. package/schemas/events/agent-binding-degraded-v1.schema.json +1 -1
  104. package/schemas/events/interaction-expired-v1.schema.json +1 -1
  105. package/schemas/events/interaction-received-v1.schema.json +1 -1
  106. package/schemas/events/message-delivered-v1.schema.json +1 -1
  107. package/schemas/events/message-expired-v1.schema.json +1 -1
  108. package/schemas/events/message-failed-v1.schema.json +1 -1
  109. package/schemas/events/message-provider-accepted-v1.schema.json +1 -1
  110. package/schemas/events/subscription-activated-v1.schema.json +1 -1
  111. package/schemas/events/subscription-revoked-v1.schema.json +1 -1
  112. package/schemas/events/whooshbang-event-v1.schema.json +3 -3
  113. package/schemas/fixture-index.schema.json +1 -1
  114. package/schemas/interaction-machine-scenario.schema.json +1 -1
  115. package/schemas/interaction-v1.schema.json +1 -1
  116. package/schemas/machine-v1.schema.json +1 -1
  117. package/schemas/provider-capabilities-v1.schema.json +1 -1
  118. package/schemas/webhooks/webhook-delivery-case-v1.schema.json +1 -1
  119. package/schemas/webhooks/webhook-signing-vector-v1.schema.json +1 -1
  120. package/schemas/whooshbang-v1.schema.json +289 -67
  121. package/fixtures/core-v1/problems/credential-account-mismatch.json +0 -9
  122. package/fixtures/core-v1/requests/create-account-credential.json +0 -4
  123. package/fixtures/core-v1/scenarios/cross-account-project.json +0 -14
  124. package/fixtures/core-v1/success/account-credential-created.json +0 -12
  125. /package/fixtures/core-v1/requests/{rotate-account-credential.json → rotate-organization-credential.json} +0 -0
@@ -1,18 +1,18 @@
1
1
  openapi: 3.1.1
2
2
  jsonSchemaDialect: https://json-schema.org/draft/2020-12/schema
3
3
  # whooshbang:public-origin production api https://api.whooshbang.com
4
- x-contract-version: 1.0.0-rc.21
4
+ x-contract-version: 1.0.0-rc.23
5
5
  info:
6
6
  title: WhooshBang API
7
- version: 1.0.0-rc.21
7
+ version: 1.0.0-rc.23
8
8
  description: |
9
- The V1 contract for human account/project administration, project-scoped
9
+ The V1 contract for human organization/project administration, project-scoped
10
10
  subscription links, and asynchronous text messages. A Clerk session selects
11
- one account for administration. A project credential selects one account,
11
+ one organization for administration. A project credential selects one organization,
12
12
  project, and `test` or `live` environment for product operations; request
13
13
  bodies cannot override either authenticated scope.
14
14
 
15
- A person's OAuth grant selects one account and carries scopes, but no
15
+ A person's OAuth grant selects one organization and carries scopes, but no
16
16
  project. It names the project and environment it acts in through the URL
17
17
  path, on the environment-scoped form of each operation; the service checks
18
18
  that path against the granting person's membership on every call. The flat
@@ -35,14 +35,14 @@ servers:
35
35
  security:
36
36
  - bearerCredential: []
37
37
  tags:
38
- - name: Account
39
- description: The current Clerk organization projected as a WhooshBang account.
38
+ - name: Organization
39
+ description: The current Clerk organization projected as a WhooshBang organization.
40
40
  - name: Projects
41
- description: Account-scoped applications with transactionally bootstrapped test/live environments.
41
+ description: Organization-scoped applications with transactionally bootstrapped test/live environments.
42
42
  - name: API credentials
43
43
  description: Human-administered, environment-scoped bearer credentials with one-time secret reveal.
44
- - name: Account credentials
45
- description: Human-administered, account-scoped bearer credentials that name their project and environment per call.
44
+ - name: Organization credentials
45
+ description: Human-administered, organization-scoped bearer credentials that name their project and environment per call.
46
46
  - name: Subscription links
47
47
  description: Single-use, expiring Telegram authorization links.
48
48
  - name: Messages
@@ -66,69 +66,119 @@ tags:
66
66
  - name: Group broadcasts
67
67
  description: Durable group acceptance and aggregate projection over ordinary child messages.
68
68
  paths:
69
- /v1/account:
69
+ /v1/organization:
70
70
  get:
71
- operationId: getAccount
72
- summary: Read the current account projection
71
+ operationId: getOrganization
72
+ summary: Read the current organization projection
73
73
  description: |
74
- Returns the WhooshBang account selected by the verified Clerk
74
+ Returns the WhooshBang organization selected by the verified Clerk
75
75
  organization session and the caller's projected role. Clerk organization
76
76
  and user identifiers are never public response fields.
77
77
  tags:
78
- - Account
78
+ - Organization
79
79
  security:
80
80
  - clerkSession: []
81
81
  - bearerGrant: []
82
- x-account-membership: required
82
+ x-organization-membership: required
83
83
  responses:
84
84
  "200":
85
- description: The current account projection.
85
+ description: The current organization projection.
86
86
  headers:
87
87
  WhooshBang-Diagnostic-Id:
88
88
  $ref: "#/components/headers/DiagnosticId"
89
89
  content:
90
90
  application/json:
91
91
  schema:
92
- $ref: "#/components/schemas/AccountProjection"
92
+ $ref: "#/components/schemas/OrganizationProjection"
93
93
  examples:
94
- projectedAccount:
95
- externalValue: ../fixtures/core-v1/success/account-projection.json
94
+ projectedOrganization:
95
+ externalValue: ../fixtures/core-v1/success/organization-projection.json
96
96
  "401":
97
97
  $ref: "#/components/responses/Unauthorized"
98
98
  "403":
99
99
  $ref: "#/components/responses/Forbidden"
100
100
  "429":
101
101
  $ref: "#/components/responses/RateLimited"
102
- /v1/account/credentials:
102
+ /v1/organization/close:
103
+ post:
104
+ operationId: closeOrganization
105
+ summary: Close the current customer organization
106
+ description: |
107
+ Terminally closes the organization selected by the verified Clerk
108
+ organization session. Only an administrator may close it. OAuth grants
109
+ and API credentials are deliberately excluded: delegated authority must
110
+ not be able to erase the organization that granted it.
111
+
112
+ The request requires the exact confirmation `close-organization`. Repeating a
113
+ completed closure is safe and returns the original `closed_at`. The
114
+ result names provider-owned resources the administrator must still retire
115
+ outside WhooshBang, such as revoking a customer-managed Telegram bot token
116
+ in BotFather; no provider credential is returned.
117
+ tags:
118
+ - Organization
119
+ security:
120
+ - clerkSession: []
121
+ x-organization-membership: required
122
+ x-required-membership-role: admin
123
+ x-repeat-semantics:
124
+ same_target: idempotent
125
+ secret_returned: false
126
+ requestBody:
127
+ required: true
128
+ content:
129
+ application/json:
130
+ schema:
131
+ $ref: "#/components/schemas/CloseOrganizationRequest"
132
+ responses:
133
+ "200":
134
+ description: The organization is closed, with any manual provider retirement still required.
135
+ headers:
136
+ WhooshBang-Diagnostic-Id:
137
+ $ref: "#/components/headers/DiagnosticId"
138
+ content:
139
+ application/json:
140
+ schema:
141
+ $ref: "#/components/schemas/OrganizationClosureResult"
142
+ "400":
143
+ $ref: "#/components/responses/BadRequest"
144
+ "401":
145
+ $ref: "#/components/responses/Unauthorized"
146
+ "403":
147
+ $ref: "#/components/responses/Forbidden"
148
+ "409":
149
+ $ref: "#/components/responses/Conflict"
150
+ "429":
151
+ $ref: "#/components/responses/RateLimited"
152
+ /v1/organization/credentials:
103
153
  get:
104
- operationId: listAccountCredentials
105
- summary: List safe account credential metadata
154
+ operationId: listOrganizationCredentials
155
+ summary: List safe organization credential metadata
106
156
  description: |
107
- Returns only credentials owned by the account selected by the verified
157
+ Returns only credentials owned by the organization selected by the verified
108
158
  Clerk organization session. Secrets and digest material are never
109
159
  returned.
110
160
  tags:
111
- - Account credentials
161
+ - Organization credentials
112
162
  security:
113
163
  - clerkSession: []
114
- x-account-membership: required
164
+ x-organization-membership: required
115
165
  parameters:
116
166
  - $ref: "#/components/parameters/ApiCredentialAfterCursor"
117
167
  - $ref: "#/components/parameters/ApiCredentialPageLimit"
118
168
  - $ref: "#/components/parameters/PageNumber"
119
169
  responses:
120
170
  "200":
121
- description: A stable page of safe account credential metadata.
171
+ description: A stable page of safe organization credential metadata.
122
172
  headers:
123
173
  WhooshBang-Diagnostic-Id:
124
174
  $ref: "#/components/headers/DiagnosticId"
125
175
  content:
126
176
  application/json:
127
177
  schema:
128
- $ref: "#/components/schemas/AccountCredentialCollection"
178
+ $ref: "#/components/schemas/OrganizationCredentialCollection"
129
179
  examples:
130
- accountCredentials:
131
- externalValue: ../fixtures/core-v1/success/account-credential-collection.json
180
+ organizationCredentials:
181
+ externalValue: ../fixtures/core-v1/success/organization-credential-collection.json
132
182
  "400":
133
183
  $ref: "#/components/responses/BadRequest"
134
184
  "401":
@@ -140,10 +190,10 @@ paths:
140
190
  "429":
141
191
  $ref: "#/components/responses/RateLimited"
142
192
  post:
143
- operationId: createAccountCredential
144
- summary: Create an account-scoped API credential
193
+ operationId: createOrganizationCredential
194
+ summary: Create an organization-scoped API credential
145
195
  description: |
146
- Creates one credential against the whole account. It names no project
196
+ Creates one credential against the whole organization. It names no project
147
197
  and no environment: a request names them in its path, and the
148
198
  credential's authority on that path is the intersection of its scopes
149
199
  with the project-credential vocabulary, so it is never wider than a
@@ -151,10 +201,10 @@ paths:
151
201
  The complete bearer secret appears only in this creation response. It
152
202
  cannot be read later and is never replayed from an idempotency cache.
153
203
  tags:
154
- - Account credentials
204
+ - Organization credentials
155
205
  security:
156
206
  - clerkSession: []
157
- x-account-membership: required
207
+ x-organization-membership: required
158
208
  x-secret-reveal:
159
209
  responses: 1
160
210
  replayable: false
@@ -164,10 +214,10 @@ paths:
164
214
  content:
165
215
  application/json:
166
216
  schema:
167
- $ref: "#/components/schemas/CreateAccountCredentialRequest"
217
+ $ref: "#/components/schemas/CreateOrganizationCredentialRequest"
168
218
  examples:
169
- createAccountCredential:
170
- externalValue: ../fixtures/core-v1/requests/create-account-credential.json
219
+ createOrganizationCredential:
220
+ externalValue: ../fixtures/core-v1/requests/create-organization-credential.json
171
221
  responses:
172
222
  "201":
173
223
  description: Creation-only secret reveal and safe credential metadata.
@@ -177,10 +227,10 @@ paths:
177
227
  content:
178
228
  application/json:
179
229
  schema:
180
- $ref: "#/components/schemas/AccountCredentialSecretReveal"
230
+ $ref: "#/components/schemas/OrganizationCredentialSecretReveal"
181
231
  examples:
182
- createdAccountCredential:
183
- externalValue: ../fixtures/core-v1/success/account-credential-created.json
232
+ createdOrganizationCredential:
233
+ externalValue: ../fixtures/core-v1/success/organization-credential-created.json
184
234
  "400":
185
235
  $ref: "#/components/responses/BadRequest"
186
236
  "401":
@@ -191,24 +241,24 @@ paths:
191
241
  $ref: "#/components/responses/NotFound"
192
242
  "429":
193
243
  $ref: "#/components/responses/RateLimited"
194
- /v1/account/credentials/{account_credential_id}/rotate:
244
+ /v1/organization/credentials/{organization_credential_id}/rotate:
195
245
  parameters:
196
- - $ref: "#/components/parameters/AccountCredentialId"
246
+ - $ref: "#/components/parameters/OrganizationCredentialId"
197
247
  post:
198
- operationId: rotateAccountCredential
199
- summary: Rotate an account-scoped API credential
248
+ operationId: rotateOrganizationCredential
249
+ summary: Rotate an organization-scoped API credential
200
250
  description: |
201
251
  Creates one replacement with the same label and scopes. The complete new
202
252
  bearer secret appears only in this response. The replaced credential
203
253
  remains active for the explicitly declared overlap, from zero through
204
254
  86400 seconds, then becomes terminally revoked. A revoked credential
205
- cannot be rotated. Missing and out-of-account credentials use the same
255
+ cannot be rotated. Missing and out-of-organization credentials use the same
206
256
  non-enumerating `404`.
207
257
  tags:
208
- - Account credentials
258
+ - Organization credentials
209
259
  security:
210
260
  - clerkSession: []
211
- x-account-membership: required
261
+ x-organization-membership: required
212
262
  x-secret-reveal:
213
263
  responses: 1
214
264
  replayable: false
@@ -218,10 +268,10 @@ paths:
218
268
  content:
219
269
  application/json:
220
270
  schema:
221
- $ref: "#/components/schemas/RotateAccountCredentialRequest"
271
+ $ref: "#/components/schemas/RotateOrganizationCredentialRequest"
222
272
  examples:
223
- rotateAccountCredential:
224
- externalValue: ../fixtures/core-v1/requests/rotate-account-credential.json
273
+ rotateOrganizationCredential:
274
+ externalValue: ../fixtures/core-v1/requests/rotate-organization-credential.json
225
275
  responses:
226
276
  "201":
227
277
  description: Creation-only replacement secret and safe metadata for both credentials.
@@ -231,10 +281,10 @@ paths:
231
281
  content:
232
282
  application/json:
233
283
  schema:
234
- $ref: "#/components/schemas/AccountCredentialRotation"
284
+ $ref: "#/components/schemas/OrganizationCredentialRotation"
235
285
  examples:
236
- rotatedAccountCredential:
237
- externalValue: ../fixtures/core-v1/success/account-credential-rotated.json
286
+ rotatedOrganizationCredential:
287
+ externalValue: ../fixtures/core-v1/success/organization-credential-rotated.json
238
288
  "400":
239
289
  $ref: "#/components/responses/BadRequest"
240
290
  "401":
@@ -245,23 +295,23 @@ paths:
245
295
  $ref: "#/components/responses/NotFound"
246
296
  "429":
247
297
  $ref: "#/components/responses/RateLimited"
248
- /v1/account/credentials/{account_credential_id}/revoke:
298
+ /v1/organization/credentials/{organization_credential_id}/revoke:
249
299
  parameters:
250
- - $ref: "#/components/parameters/AccountCredentialId"
300
+ - $ref: "#/components/parameters/OrganizationCredentialId"
251
301
  post:
252
- operationId: revokeAccountCredential
253
- summary: Revoke an account-scoped API credential
302
+ operationId: revokeOrganizationCredential
303
+ summary: Revoke an organization-scoped API credential
254
304
  description: |
255
305
  Immediately and terminally revokes the selected credential. Repeating
256
306
  the request for the same visible credential is safe and returns the
257
307
  same revoked metadata without revealing secret or digest material.
258
- Missing and out-of-account credentials use the same non-enumerating
308
+ Missing and out-of-organization credentials use the same non-enumerating
259
309
  `404`.
260
310
  tags:
261
- - Account credentials
311
+ - Organization credentials
262
312
  security:
263
313
  - clerkSession: []
264
- x-account-membership: required
314
+ x-organization-membership: required
265
315
  x-repeat-semantics:
266
316
  same_target: idempotent
267
317
  secret_returned: false
@@ -274,10 +324,10 @@ paths:
274
324
  content:
275
325
  application/json:
276
326
  schema:
277
- $ref: "#/components/schemas/AccountCredential"
327
+ $ref: "#/components/schemas/OrganizationCredential"
278
328
  examples:
279
- revokedAccountCredential:
280
- externalValue: ../fixtures/core-v1/success/account-credential-revoked.json
329
+ revokedOrganizationCredential:
330
+ externalValue: ../fixtures/core-v1/success/organization-credential-revoked.json
281
331
  "401":
282
332
  $ref: "#/components/responses/Unauthorized"
283
333
  "403":
@@ -289,9 +339,9 @@ paths:
289
339
  /v1/projects:
290
340
  get:
291
341
  operationId: listProjects
292
- summary: List projects in the current account
342
+ summary: List projects in the current organization
293
343
  description: |
294
- Returns only projects owned by the account selected by the verified
344
+ Returns only projects owned by the organization selected by the verified
295
345
  Clerk organization session. Every project includes its complete test/live
296
346
  environment and default-notifier bootstrap.
297
347
  tags:
@@ -299,17 +349,17 @@ paths:
299
349
  security:
300
350
  - clerkSession: []
301
351
  - bearerGrant: []
302
- - bearerAccountCredential: []
352
+ - bearerOrganizationCredential: []
303
353
  x-required-scopes:
304
354
  - projects:read
305
- x-account-membership: required
355
+ x-organization-membership: required
306
356
  parameters:
307
357
  - $ref: "#/components/parameters/ProjectAfterCursor"
308
358
  - $ref: "#/components/parameters/ProjectPageLimit"
309
359
  - $ref: "#/components/parameters/PageNumber"
310
360
  responses:
311
361
  "200":
312
- description: A stable page of projects in the current account.
362
+ description: A stable page of projects in the current organization.
313
363
  headers:
314
364
  WhooshBang-Diagnostic-Id:
315
365
  $ref: "#/components/headers/DiagnosticId"
@@ -332,7 +382,7 @@ paths:
332
382
  operationId: createProject
333
383
  summary: Create a project and its default environments
334
384
  description: |
335
- Creates one project inside the authenticated account. The project, its
385
+ Creates one project inside the authenticated organization. The project, its
336
386
  `test` and `live` environments, and one `Default` notifier per
337
387
  environment are one atomic logical resource. Equivalent replay returns
338
388
  the original `201` response without extending idempotency retention.
@@ -343,12 +393,12 @@ paths:
343
393
  - bearerGrant: []
344
394
  x-required-scopes:
345
395
  - projects:write
346
- x-account-membership: required
396
+ x-organization-membership: required
347
397
  x-idempotency:
348
398
  required: true
349
399
  retention_seconds: 604800
350
400
  scope:
351
- - authenticated_account
401
+ - authenticated_organization
352
402
  - operation_id
353
403
  - key
354
404
  equivalence: validated_request
@@ -392,19 +442,19 @@ paths:
392
442
  - $ref: "#/components/parameters/ProjectId"
393
443
  get:
394
444
  operationId: getProject
395
- summary: Read one project in the current account
445
+ summary: Read one project in the current organization
396
446
  description: |
397
447
  Returns the complete project bootstrap. An absent project and a project
398
- outside the authenticated account use the same non-enumerating `404`.
448
+ outside the authenticated organization use the same non-enumerating `404`.
399
449
  tags:
400
450
  - Projects
401
451
  security:
402
452
  - clerkSession: []
403
453
  - bearerGrant: []
404
- - bearerAccountCredential: []
454
+ - bearerOrganizationCredential: []
405
455
  x-required-scopes:
406
456
  - projects:read
407
- x-account-membership: required
457
+ x-organization-membership: required
408
458
  responses:
409
459
  "200":
410
460
  description: The current project and its two environments.
@@ -426,6 +476,57 @@ paths:
426
476
  $ref: "#/components/responses/NotFound"
427
477
  "429":
428
478
  $ref: "#/components/responses/RateLimited"
479
+ patch:
480
+ operationId: updateProject
481
+ summary: Set a project's privacy policy
482
+ description: |
483
+ Changes profile collection for both project environments. minimal is the
484
+ default for new and existing projects. standard permits messenger profiles;
485
+ minimal keeps recipient language only; private keeps delivery routing and
486
+ the customer-supplied subscriber identifier, with no profile data.
487
+ Moving standard to minimal erases existing identifying profile fields.
488
+ Moving to private also erases recipient language. Increasing collection
489
+ does not restore erased data. The operation is naturally idempotent.
490
+ An absent project and one outside the organization return the same 404.
491
+ tags:
492
+ - Projects
493
+ security:
494
+ - clerkSession: []
495
+ - bearerGrant: []
496
+ - bearerCredential: []
497
+ - bearerOrganizationCredential: []
498
+ x-required-scopes:
499
+ - projects:write
500
+ x-organization-membership: required
501
+ requestBody:
502
+ required: true
503
+ content:
504
+ application/json:
505
+ schema:
506
+ $ref: "#/components/schemas/UpdateProjectRequest"
507
+ examples:
508
+ updateProject:
509
+ externalValue: ../fixtures/core-v1/requests/update-project.json
510
+ responses:
511
+ "200":
512
+ description: The project after changing its privacy policy and clearing disallowed profile fields.
513
+ headers:
514
+ WhooshBang-Diagnostic-Id:
515
+ $ref: "#/components/headers/DiagnosticId"
516
+ content:
517
+ application/json:
518
+ schema:
519
+ $ref: "#/components/schemas/Project"
520
+ "400":
521
+ $ref: "#/components/responses/BadRequest"
522
+ "401":
523
+ $ref: "#/components/responses/Unauthorized"
524
+ "403":
525
+ $ref: "#/components/responses/Forbidden"
526
+ "404":
527
+ $ref: "#/components/responses/NotFound"
528
+ "429":
529
+ $ref: "#/components/responses/RateLimited"
429
530
  /v1/projects/{project_id}/recipient-copy-overrides:
430
531
  parameters:
431
532
  - $ref: "#/components/parameters/ProjectId"
@@ -434,7 +535,7 @@ paths:
434
535
  summary: List sparse recipient-copy overrides for one project
435
536
  description: |
436
537
  Returns only customer-authored overrides for the project in the
437
- authenticated account. Missing values are intentionally absent and use
538
+ authenticated organization. Missing values are intentionally absent and use
438
539
  WhooshBang's complete shipped catalog at render time. An optional
439
540
  canonical language filter preserves the project + language + string
440
541
  address without applying locale negotiation.
@@ -446,7 +547,7 @@ paths:
446
547
  - bearerCredential: []
447
548
  x-required-scopes:
448
549
  - projects:read
449
- x-account-membership: required
550
+ x-organization-membership: required
450
551
  parameters:
451
552
  - name: language
452
553
  in: query
@@ -504,7 +605,7 @@ paths:
504
605
  - bearerCredential: []
505
606
  x-required-scopes:
506
607
  - projects:write
507
- x-account-membership: required
608
+ x-organization-membership: required
508
609
  requestBody:
509
610
  required: true
510
611
  content:
@@ -546,7 +647,7 @@ paths:
546
647
  - bearerCredential: []
547
648
  x-required-scopes:
548
649
  - projects:write
549
- x-account-membership: required
650
+ x-organization-membership: required
550
651
  responses:
551
652
  "204":
552
653
  description: The shipped catalog value is effective at this address.
@@ -569,15 +670,15 @@ paths:
569
670
  summary: List safe API credential metadata
570
671
  description: |
571
672
  Returns only credentials in the selected project environment owned by
572
- the account selected by the verified Clerk organization session.
673
+ the organization selected by the verified Clerk organization session.
573
674
  Secrets and digest material are never returned. An absent or
574
- out-of-account project or environment uses the same non-enumerating
675
+ out-of-organization project or environment uses the same non-enumerating
575
676
  `404`.
576
677
  tags:
577
678
  - API credentials
578
679
  security:
579
680
  - clerkSession: []
580
- x-account-membership: required
681
+ x-organization-membership: required
581
682
  parameters:
582
683
  - $ref: "#/components/parameters/ApiCredentialAfterCursor"
583
684
  - $ref: "#/components/parameters/ApiCredentialPageLimit"
@@ -618,7 +719,7 @@ paths:
618
719
  - API credentials
619
720
  security:
620
721
  - clerkSession: []
621
- x-account-membership: required
722
+ x-organization-membership: required
622
723
  x-secret-reveal:
623
724
  responses: 1
624
725
  replayable: false
@@ -674,7 +775,7 @@ paths:
674
775
  - API credentials
675
776
  security:
676
777
  - clerkSession: []
677
- x-account-membership: required
778
+ x-organization-membership: required
678
779
  x-secret-reveal:
679
780
  responses: 1
680
781
  replayable: false
@@ -728,7 +829,7 @@ paths:
728
829
  - API credentials
729
830
  security:
730
831
  - clerkSession: []
731
- x-account-membership: required
832
+ x-organization-membership: required
732
833
  x-repeat-semantics:
733
834
  same_target: idempotent
734
835
  secret_returned: false
@@ -922,7 +1023,7 @@ paths:
922
1023
  security:
923
1024
  - bearerCredential: []
924
1025
  - bearerGrant: []
925
- - bearerAccountCredential: []
1026
+ - bearerOrganizationCredential: []
926
1027
  x-required-scopes:
927
1028
  - messages:write
928
1029
  x-idempotency:
@@ -996,7 +1097,7 @@ paths:
996
1097
  security:
997
1098
  - bearerCredential: []
998
1099
  - bearerGrant: []
999
- - bearerAccountCredential: []
1100
+ - bearerOrganizationCredential: []
1000
1101
  x-required-scopes:
1001
1102
  - messages:write
1002
1103
  x-repeat-semantics:
@@ -1021,6 +1122,10 @@ paths:
1021
1122
  Durably accepts one logical text message for one subscriber and one
1022
1123
  resolved channel binding. `202` proves API acceptance only; it does not
1023
1124
  claim provider acceptance or end-device delivery.
1125
+ The reserved `test:` subscriber prefix and `delivery_target: simulator`
1126
+ are test-environment-only. Live sends are refused before acceptance or
1127
+ idempotent replay with `400 request_invalid`; reserved subscriber IDs
1128
+ carry a field error at `/to/subscriber_id`.
1024
1129
  tags:
1025
1130
  - Messages
1026
1131
  security:
@@ -1276,6 +1381,8 @@ paths:
1276
1381
  project credential. The notifier, subscriber, and active binding become
1277
1382
  immutable authorization bounds. The response never contains a readable
1278
1383
  secret or digest.
1384
+ Live environments reject the reserved `test:` subscriber prefix with
1385
+ `400 request_invalid` and a field error at `/subscriber_id` before creation.
1279
1386
  tags:
1280
1387
  - Machine clients
1281
1388
  security:
@@ -1669,7 +1776,7 @@ paths:
1669
1776
  - clerkSession: []
1670
1777
  - bearerCredential: []
1671
1778
  - bearerGrant: []
1672
- - bearerAccountCredential: []
1779
+ - bearerOrganizationCredential: []
1673
1780
  x-required-scopes:
1674
1781
  - messages:read
1675
1782
  parameters:
@@ -1709,7 +1816,7 @@ paths:
1709
1816
  - clerkSession: []
1710
1817
  - bearerCredential: []
1711
1818
  - bearerGrant: []
1712
- - bearerAccountCredential: []
1819
+ - bearerOrganizationCredential: []
1713
1820
  x-required-scopes:
1714
1821
  - messages:write
1715
1822
  x-idempotency:
@@ -1784,7 +1891,7 @@ paths:
1784
1891
  - clerkSession: []
1785
1892
  - bearerCredential: []
1786
1893
  - bearerGrant: []
1787
- - bearerAccountCredential: []
1894
+ - bearerOrganizationCredential: []
1788
1895
  x-required-scopes:
1789
1896
  - messages:read
1790
1897
  responses:
@@ -1814,7 +1921,7 @@ paths:
1814
1921
  - clerkSession: []
1815
1922
  - bearerCredential: []
1816
1923
  - bearerGrant: []
1817
- - bearerAccountCredential: []
1924
+ - bearerOrganizationCredential: []
1818
1925
  x-required-scopes:
1819
1926
  - messages:write
1820
1927
  responses:
@@ -1848,7 +1955,7 @@ paths:
1848
1955
  - clerkSession: []
1849
1956
  - bearerCredential: []
1850
1957
  - bearerGrant: []
1851
- - bearerAccountCredential: []
1958
+ - bearerOrganizationCredential: []
1852
1959
  x-required-scopes:
1853
1960
  - messages:write
1854
1961
  x-idempotency:
@@ -1921,7 +2028,7 @@ paths:
1921
2028
  - clerkSession: []
1922
2029
  - bearerCredential: []
1923
2030
  - bearerGrant: []
1924
- - bearerAccountCredential: []
2031
+ - bearerOrganizationCredential: []
1925
2032
  x-required-scopes:
1926
2033
  - messages:write
1927
2034
  x-repeat-semantics:
@@ -1956,7 +2063,7 @@ paths:
1956
2063
  - clerkSession: []
1957
2064
  - bearerCredential: []
1958
2065
  - bearerGrant: []
1959
- - bearerAccountCredential: []
2066
+ - bearerOrganizationCredential: []
1960
2067
  x-required-scopes:
1961
2068
  - messages:read
1962
2069
  parameters:
@@ -1997,7 +2104,7 @@ paths:
1997
2104
  - clerkSession: []
1998
2105
  - bearerCredential: []
1999
2106
  - bearerGrant: []
2000
- - bearerAccountCredential: []
2107
+ - bearerOrganizationCredential: []
2001
2108
  x-required-scopes:
2002
2109
  - connections:read
2003
2110
  responses:
@@ -2034,7 +2141,7 @@ paths:
2034
2141
  - clerkSession: []
2035
2142
  - bearerCredential: []
2036
2143
  - bearerGrant: []
2037
- - bearerAccountCredential: []
2144
+ - bearerOrganizationCredential: []
2038
2145
  x-required-scopes:
2039
2146
  - connections:read
2040
2147
  parameters:
@@ -2043,7 +2150,7 @@ paths:
2043
2150
  - $ref: "#/components/parameters/PageNumber"
2044
2151
  responses:
2045
2152
  "200":
2046
- description: Connections owned by exactly this account, project, and environment.
2153
+ description: Connections owned by exactly this organization, project, and environment.
2047
2154
  headers:
2048
2155
  WhooshBang-Diagnostic-Id:
2049
2156
  $ref: "#/components/headers/DiagnosticId"
@@ -2078,7 +2185,7 @@ paths:
2078
2185
  on the submitted credential instead.
2079
2186
 
2080
2187
  `customer_managed` supplies no credential at all. Telegram creates a
2081
- brand new bot on the administrator's own account and hands WhooshBang
2188
+ brand new bot on the administrator's own Telegram account and hands WhooshBang
2082
2189
  its token server to server, so the token never reaches a browser, a
2083
2190
  clipboard, this request, or any response. The connection is returned
2084
2191
  `pending` with a `setup` carrying the link the administrator opens and
@@ -2112,7 +2219,7 @@ paths:
2112
2219
  consequence is separate: confirming this one **disables** the other
2113
2220
  connection, which would otherwise go on reporting itself healthy while
2114
2221
  receiving nothing;
2115
- - the identity is already connected, by this account or any other —
2222
+ - the identity is already connected, by this organization or any other —
2116
2223
  `idempotency_conflict` 409, `provider_identity_claimed` at `/`, which
2117
2224
  reports only that the identity the submitted credential proves is in
2118
2225
  use and never that some other identity is;
@@ -2126,7 +2233,7 @@ paths:
2126
2233
  - clerkSession: []
2127
2234
  - bearerCredential: []
2128
2235
  - bearerGrant: []
2129
- - bearerAccountCredential: []
2236
+ - bearerOrganizationCredential: []
2130
2237
  x-required-scopes:
2131
2238
  - connections:write
2132
2239
  x-idempotency:
@@ -2207,7 +2314,7 @@ paths:
2207
2314
  - clerkSession: []
2208
2315
  - bearerCredential: []
2209
2316
  - bearerGrant: []
2210
- - bearerAccountCredential: []
2317
+ - bearerOrganizationCredential: []
2211
2318
  x-required-scopes:
2212
2319
  - connections:read
2213
2320
  responses:
@@ -2240,7 +2347,7 @@ paths:
2240
2347
  - clerkSession: []
2241
2348
  - bearerCredential: []
2242
2349
  - bearerGrant: []
2243
- - bearerAccountCredential: []
2350
+ - bearerOrganizationCredential: []
2244
2351
  x-required-scopes:
2245
2352
  - connections:write
2246
2353
  requestBody:
@@ -2288,7 +2395,7 @@ paths:
2288
2395
  - clerkSession: []
2289
2396
  - bearerCredential: []
2290
2397
  - bearerGrant: []
2291
- - bearerAccountCredential: []
2398
+ - bearerOrganizationCredential: []
2292
2399
  x-required-scopes:
2293
2400
  - connections:write
2294
2401
  responses:
@@ -2348,7 +2455,7 @@ paths:
2348
2455
  - clerkSession: []
2349
2456
  - bearerCredential: []
2350
2457
  - bearerGrant: []
2351
- - bearerAccountCredential: []
2458
+ - bearerOrganizationCredential: []
2352
2459
  x-required-scopes:
2353
2460
  - connections:write
2354
2461
  responses:
@@ -2402,7 +2509,7 @@ paths:
2402
2509
  - clerkSession: []
2403
2510
  - bearerCredential: []
2404
2511
  - bearerGrant: []
2405
- - bearerAccountCredential: []
2512
+ - bearerOrganizationCredential: []
2406
2513
  x-required-scopes:
2407
2514
  - connections:write
2408
2515
  x-idempotency:
@@ -2482,7 +2589,7 @@ paths:
2482
2589
 
2483
2590
  A bot the previous attempt already created is not withdrawn and cannot
2484
2591
  be: Telegram exposes no way to delete a bot. The administrator keeps it
2485
- in their own account until they retire it in BotFather, and a restart
2592
+ in their own Telegram account until they retire it in BotFather, and a restart
2486
2593
  walks them through creating another rather than pretending the first
2487
2594
  never happened.
2488
2595
 
@@ -2506,7 +2613,7 @@ paths:
2506
2613
  - clerkSession: []
2507
2614
  - bearerCredential: []
2508
2615
  - bearerGrant: []
2509
- - bearerAccountCredential: []
2616
+ - bearerOrganizationCredential: []
2510
2617
  x-required-scopes:
2511
2618
  - connections:write
2512
2619
  x-repeat-semantics:
@@ -2621,7 +2728,7 @@ paths:
2621
2728
  - clerkSession: []
2622
2729
  - bearerCredential: []
2623
2730
  - bearerGrant: []
2624
- - bearerAccountCredential: []
2731
+ - bearerOrganizationCredential: []
2625
2732
  x-required-scopes:
2626
2733
  - connections:write
2627
2734
  requestBody:
@@ -2700,7 +2807,7 @@ paths:
2700
2807
  - clerkSession: []
2701
2808
  - bearerCredential: []
2702
2809
  - bearerGrant: []
2703
- - bearerAccountCredential: []
2810
+ - bearerOrganizationCredential: []
2704
2811
  x-required-scopes:
2705
2812
  - connections:write
2706
2813
  responses:
@@ -2764,7 +2871,7 @@ paths:
2764
2871
  - clerkSession: []
2765
2872
  - bearerCredential: []
2766
2873
  - bearerGrant: []
2767
- - bearerAccountCredential: []
2874
+ - bearerOrganizationCredential: []
2768
2875
  x-required-scopes:
2769
2876
  - connections:write
2770
2877
  responses:
@@ -2806,7 +2913,7 @@ paths:
2806
2913
 
2807
2914
  It exists so the owner can read what they are about to approve, and a
2808
2915
  reviewer can check it, without opening Slack or decoding a URL. It
2809
- carries configuration only: no account, project, or environment, no
2916
+ carries configuration only: no organization, project, or environment, no
2810
2917
  credential, and no provider-native identifier.
2811
2918
 
2812
2919
  Only a `customer_managed` Slack connection has one. Every other
@@ -2818,7 +2925,7 @@ paths:
2818
2925
  - clerkSession: []
2819
2926
  - bearerCredential: []
2820
2927
  - bearerGrant: []
2821
- - bearerAccountCredential: []
2928
+ - bearerOrganizationCredential: []
2822
2929
  x-required-scopes:
2823
2930
  - connections:read
2824
2931
  responses:
@@ -2858,7 +2965,7 @@ paths:
2858
2965
  - clerkSession: []
2859
2966
  - bearerCredential: []
2860
2967
  - bearerGrant: []
2861
- - bearerAccountCredential: []
2968
+ - bearerOrganizationCredential: []
2862
2969
  x-required-scopes:
2863
2970
  - connections:read
2864
2971
  parameters:
@@ -2951,7 +3058,7 @@ paths:
2951
3058
  - clerkSession: []
2952
3059
  - bearerCredential: []
2953
3060
  - bearerGrant: []
2954
- - bearerAccountCredential: []
3061
+ - bearerOrganizationCredential: []
2955
3062
  x-required-scopes:
2956
3063
  - connections:write
2957
3064
  x-idempotency:
@@ -3024,7 +3131,7 @@ paths:
3024
3131
  - clerkSession: []
3025
3132
  - bearerCredential: []
3026
3133
  - bearerGrant: []
3027
- - bearerAccountCredential: []
3134
+ - bearerOrganizationCredential: []
3028
3135
  x-required-scopes:
3029
3136
  - connections:read
3030
3137
  responses:
@@ -3068,7 +3175,7 @@ paths:
3068
3175
  - clerkSession: []
3069
3176
  - bearerCredential: []
3070
3177
  - bearerGrant: []
3071
- - bearerAccountCredential: []
3178
+ - bearerOrganizationCredential: []
3072
3179
  x-required-scopes:
3073
3180
  - connections:read
3074
3181
  parameters:
@@ -3077,7 +3184,7 @@ paths:
3077
3184
  - $ref: "#/components/parameters/PageNumber"
3078
3185
  responses:
3079
3186
  "200":
3080
- description: Routes owned by exactly this account, project, and environment.
3187
+ description: Routes owned by exactly this organization, project, and environment.
3081
3188
  headers:
3082
3189
  WhooshBang-Diagnostic-Id:
3083
3190
  $ref: "#/components/headers/DiagnosticId"
@@ -3133,7 +3240,7 @@ paths:
3133
3240
  - clerkSession: []
3134
3241
  - bearerCredential: []
3135
3242
  - bearerGrant: []
3136
- - bearerAccountCredential: []
3243
+ - bearerOrganizationCredential: []
3137
3244
  x-required-scopes:
3138
3245
  - connections:write
3139
3246
  requestBody:
@@ -3196,7 +3303,7 @@ paths:
3196
3303
  - clerkSession: []
3197
3304
  - bearerCredential: []
3198
3305
  - bearerGrant: []
3199
- - bearerAccountCredential: []
3306
+ - bearerOrganizationCredential: []
3200
3307
  x-required-scopes:
3201
3308
  - connections:write
3202
3309
  responses:
@@ -3232,7 +3339,7 @@ paths:
3232
3339
  - bearerCredential: []
3233
3340
  x-required-scopes:
3234
3341
  - projects:read
3235
- x-account-membership: required
3342
+ x-organization-membership: required
3236
3343
  responses:
3237
3344
  "200":
3238
3345
  description: Current constrained project recipient experience.
@@ -3260,7 +3367,7 @@ paths:
3260
3367
  - bearerCredential: []
3261
3368
  x-required-scopes:
3262
3369
  - projects:write
3263
- x-account-membership: required
3370
+ x-organization-membership: required
3264
3371
  requestBody:
3265
3372
  required: true
3266
3373
  content:
@@ -3305,7 +3412,7 @@ paths:
3305
3412
  - bearerCredential: []
3306
3413
  x-required-scopes:
3307
3414
  - projects:write
3308
- x-account-membership: required
3415
+ x-organization-membership: required
3309
3416
  parameters:
3310
3417
  - name: WhooshBang-Recipient-Experience-Version
3311
3418
  in: header
@@ -3352,10 +3459,10 @@ paths:
3352
3459
  - clerkSession: []
3353
3460
  - bearerGrant: []
3354
3461
  - bearerCredential: []
3355
- - bearerAccountCredential: []
3462
+ - bearerOrganizationCredential: []
3356
3463
  x-required-scopes:
3357
3464
  - projects:read
3358
- x-account-membership: required
3465
+ x-organization-membership: required
3359
3466
  responses:
3360
3467
  "200":
3361
3468
  description: Current revisioned environment recipient experience.
@@ -3388,10 +3495,10 @@ paths:
3388
3495
  - clerkSession: []
3389
3496
  - bearerGrant: []
3390
3497
  - bearerCredential: []
3391
- - bearerAccountCredential: []
3498
+ - bearerOrganizationCredential: []
3392
3499
  x-required-scopes:
3393
3500
  - projects:write
3394
- x-account-membership: required
3501
+ x-organization-membership: required
3395
3502
  requestBody:
3396
3503
  required: true
3397
3504
  content:
@@ -3423,7 +3530,7 @@ paths:
3423
3530
  operationId: createRecipientSession
3424
3531
  summary: Create one attenuated recipient browser session
3425
3532
  description: |
3426
- The authenticated project credential supplies account, project, and
3533
+ The authenticated project credential supplies organization, project, and
3427
3534
  environment. The request supplies only one subscriber, optional locale,
3428
3535
  optional registered return key, and bounded expiry. The response is the
3429
3536
  only reveal of the browser capability and contains no resolved return
@@ -3494,7 +3601,7 @@ paths:
3494
3601
  Repeating the request is safe. An already revoked, absent, or
3495
3602
  out-of-scope session produces the same empty response, so this route
3496
3603
  cannot be used to enumerate session identifiers across environments or
3497
- accounts.
3604
+ organizations.
3498
3605
  tags:
3499
3606
  - Recipient experience
3500
3607
  security:
@@ -4231,7 +4338,7 @@ paths:
4231
4338
  summary: Create a subscription link in a named project environment
4232
4339
  description: |
4233
4340
  The environment-scoped form of `createSubscriptionLink`, for a caller
4234
- whose authority selects an account rather than a project. Behavior,
4341
+ whose authority selects an organization rather than a project. Behavior,
4235
4342
  request, and response are identical; the path names the scope the
4236
4343
  credential form takes from its bearer, and the service checks it
4237
4344
  against the granting person's membership before acting.
@@ -4239,14 +4346,14 @@ paths:
4239
4346
  - Subscription links
4240
4347
  security:
4241
4348
  - bearerGrant: []
4242
- - bearerAccountCredential: []
4349
+ - bearerOrganizationCredential: []
4243
4350
  x-required-scopes:
4244
4351
  - subscriptions:write
4245
4352
  x-idempotency:
4246
4353
  required: true
4247
4354
  retention_seconds: 604800
4248
4355
  scope:
4249
- - authenticated_account
4356
+ - authenticated_organization
4250
4357
  - operation_id
4251
4358
  - key
4252
4359
  equivalence: validated_request
@@ -4299,7 +4406,7 @@ paths:
4299
4406
  - Subscription links
4300
4407
  security:
4301
4408
  - bearerGrant: []
4302
- - bearerAccountCredential: []
4409
+ - bearerOrganizationCredential: []
4303
4410
  x-required-scopes:
4304
4411
  - subscriptions:read
4305
4412
  responses:
@@ -4332,21 +4439,21 @@ paths:
4332
4439
  summary: Create an asynchronous message in a named project environment
4333
4440
  description: |
4334
4441
  The environment-scoped form of `createMessage`. The path names the
4335
- account, project, and environment the credential form takes from its
4442
+ organization, project, and environment the credential form takes from its
4336
4443
  bearer; test and live remain a property of the named environment and are
4337
4444
  never selected by the request body.
4338
4445
  tags:
4339
4446
  - Messages
4340
4447
  security:
4341
4448
  - bearerGrant: []
4342
- - bearerAccountCredential: []
4449
+ - bearerOrganizationCredential: []
4343
4450
  x-required-scopes:
4344
4451
  - messages:write
4345
4452
  x-idempotency:
4346
4453
  required: true
4347
4454
  retention_seconds: 604800
4348
4455
  scope:
4349
- - authenticated_account
4456
+ - authenticated_organization
4350
4457
  - operation_id
4351
4458
  - key
4352
4459
  equivalence: validated_request
@@ -4404,7 +4511,7 @@ paths:
4404
4511
  - Messages
4405
4512
  security:
4406
4513
  - bearerGrant: []
4407
- - bearerAccountCredential: []
4514
+ - bearerOrganizationCredential: []
4408
4515
  x-required-scopes:
4409
4516
  - messages:read
4410
4517
  responses:
@@ -4447,7 +4554,7 @@ paths:
4447
4554
  - Messages
4448
4555
  security:
4449
4556
  - bearerGrant: []
4450
- - bearerAccountCredential: []
4557
+ - bearerOrganizationCredential: []
4451
4558
  x-required-scopes:
4452
4559
  - messages:read
4453
4560
  responses:
@@ -4487,14 +4594,14 @@ paths:
4487
4594
  - Machine clients
4488
4595
  security:
4489
4596
  - bearerGrant: []
4490
- - bearerAccountCredential: []
4597
+ - bearerOrganizationCredential: []
4491
4598
  x-required-scopes:
4492
4599
  - machine-clients:write
4493
4600
  x-idempotency:
4494
4601
  required: true
4495
4602
  retention_seconds: 604800
4496
4603
  scope:
4497
- - authenticated_account
4604
+ - authenticated_organization
4498
4605
  - operation_id
4499
4606
  - key
4500
4607
  equivalence: validated_request
@@ -4551,7 +4658,7 @@ paths:
4551
4658
  - Machine clients
4552
4659
  security:
4553
4660
  - bearerGrant: []
4554
- - bearerAccountCredential: []
4661
+ - bearerOrganizationCredential: []
4555
4662
  x-required-scopes:
4556
4663
  - machine-clients:write
4557
4664
  x-idempotency:
@@ -4617,7 +4724,7 @@ paths:
4617
4724
  - Capabilities
4618
4725
  security:
4619
4726
  - bearerGrant: []
4620
- - bearerAccountCredential: []
4727
+ - bearerOrganizationCredential: []
4621
4728
  x-required-scopes:
4622
4729
  - capabilities:read
4623
4730
  responses:
@@ -4650,7 +4757,7 @@ paths:
4650
4757
  summary: Create a subscriber and initial memberships in a named project environment
4651
4758
  description: |
4652
4759
  The environment-scoped form of `createSubscriber`, for a caller whose
4653
- authority selects an account rather than a project. Behavior, request,
4760
+ authority selects an organization rather than a project. Behavior, request,
4654
4761
  and response are identical; the path names the scope the credential
4655
4762
  form takes from its bearer, and the service checks it against the
4656
4763
  presenting session or grant before acting.
@@ -4660,7 +4767,7 @@ paths:
4660
4767
  - clerkSession: []
4661
4768
  - bearerCredential: []
4662
4769
  - bearerGrant: []
4663
- - bearerAccountCredential: []
4770
+ - bearerOrganizationCredential: []
4664
4771
  x-required-scopes:
4665
4772
  - subscriptions:write
4666
4773
  x-idempotency:
@@ -4724,7 +4831,7 @@ paths:
4724
4831
  - clerkSession: []
4725
4832
  - bearerCredential: []
4726
4833
  - bearerGrant: []
4727
- - bearerAccountCredential: []
4834
+ - bearerOrganizationCredential: []
4728
4835
  x-required-scopes:
4729
4836
  - subscriptions:read
4730
4837
  responses:
@@ -4740,6 +4847,103 @@ paths:
4740
4847
  $ref: "#/components/responses/Forbidden"
4741
4848
  "404":
4742
4849
  $ref: "#/components/responses/NotFound"
4850
+ /v1/projects/{project_id}/subscribers/{subscriber_id}:
4851
+ parameters:
4852
+ - $ref: "#/components/parameters/ProjectId"
4853
+ - name: subscriber_id
4854
+ in: path
4855
+ required: true
4856
+ schema:
4857
+ $ref: "#/components/schemas/OpaqueIdentifier"
4858
+ delete:
4859
+ operationId: eraseSubscriber
4860
+ summary: Erase one subscriber across the project
4861
+ description: |
4862
+ Erases the person represented by this customer-supplied subscriber id
4863
+ across both project environments. Personal content, answers, identities,
4864
+ and identifiers are removed while non-identifying delivery and usage
4865
+ shells remain. Pending work and old capabilities cannot restore or send
4866
+ data for the erased person.
4867
+
4868
+ Repeating the operation is safe, including when the subscriber is already
4869
+ absent. Project-environment credentials cannot call this project-wide
4870
+ operation. A provider action that has already begun returns
4871
+ `privacy_operation_in_progress` rather than claiming erasure won the race;
4872
+ retry after that operation finishes.
4873
+ tags:
4874
+ - Subscribers
4875
+ security:
4876
+ - clerkSession: []
4877
+ - bearerGrant: []
4878
+ - bearerOrganizationCredential: []
4879
+ x-required-scopes:
4880
+ - subscriptions:write
4881
+ - messages:write
4882
+ - machine-clients:write
4883
+ x-organization-membership: required
4884
+ x-repeat-semantics:
4885
+ same_target: idempotent
4886
+ secret_returned: false
4887
+ responses:
4888
+ "204":
4889
+ description: The subscriber's personal data is erased or was already absent.
4890
+ "401":
4891
+ $ref: "#/components/responses/Unauthorized"
4892
+ "403":
4893
+ $ref: "#/components/responses/Forbidden"
4894
+ "404":
4895
+ $ref: "#/components/responses/NotFound"
4896
+ "409":
4897
+ $ref: "#/components/responses/Conflict"
4898
+ "429":
4899
+ $ref: "#/components/responses/RateLimited"
4900
+ /v1/projects/{project_id}/subscribers/{subscriber_id}/data-export:
4901
+ parameters:
4902
+ - $ref: "#/components/parameters/ProjectId"
4903
+ - name: subscriber_id
4904
+ in: path
4905
+ required: true
4906
+ schema:
4907
+ $ref: "#/components/schemas/OpaqueIdentifier"
4908
+ get:
4909
+ operationId: getSubscriberDataExport
4910
+ summary: Export all customer-controlled data held for one subscriber
4911
+ description: |
4912
+ Returns one complete, machine-readable artifact across every environment
4913
+ in the project. `provided_by_subscriber` is the Article 20 portable subset;
4914
+ the three provenance sections together provide the Article 15 access copy.
4915
+ WhooshBang-controller audit and service log data is identified as excluded
4916
+ and requires a separate recipient request. Project-environment credentials
4917
+ cannot call this project-wide operation.
4918
+ tags:
4919
+ - Subscribers
4920
+ security:
4921
+ - clerkSession: []
4922
+ - bearerGrant: []
4923
+ - bearerOrganizationCredential: []
4924
+ x-required-scopes:
4925
+ - subscriptions:read
4926
+ - messages:read
4927
+ - machine-clients:read
4928
+ x-organization-membership: required
4929
+ responses:
4930
+ "200":
4931
+ description: Complete project-wide customer-controller subscriber data export.
4932
+ headers:
4933
+ Content-Disposition:
4934
+ schema:
4935
+ type: string
4936
+ description: Fixed safe attachment filename.
4937
+ content:
4938
+ application/json:
4939
+ schema:
4940
+ $ref: "#/components/schemas/SubscriberDataExport"
4941
+ "401":
4942
+ $ref: "#/components/responses/Unauthorized"
4943
+ "403":
4944
+ $ref: "#/components/responses/Forbidden"
4945
+ "404":
4946
+ $ref: "#/components/responses/NotFound"
4743
4947
  /v1/projects/{project_id}/environments/{environment_id}/recipient-groups:
4744
4948
  parameters:
4745
4949
  - $ref: "#/components/parameters/ProjectId"
@@ -4757,7 +4961,7 @@ paths:
4757
4961
  - clerkSession: []
4758
4962
  - bearerCredential: []
4759
4963
  - bearerGrant: []
4760
- - bearerAccountCredential: []
4964
+ - bearerOrganizationCredential: []
4761
4965
  x-required-scopes:
4762
4966
  - subscriptions:read
4763
4967
  parameters:
@@ -4803,7 +5007,7 @@ paths:
4803
5007
  - clerkSession: []
4804
5008
  - bearerCredential: []
4805
5009
  - bearerGrant: []
4806
- - bearerAccountCredential: []
5010
+ - bearerOrganizationCredential: []
4807
5011
  x-required-scopes:
4808
5012
  - subscriptions:write
4809
5013
  x-idempotency:
@@ -4868,7 +5072,7 @@ paths:
4868
5072
  - clerkSession: []
4869
5073
  - bearerCredential: []
4870
5074
  - bearerGrant: []
4871
- - bearerAccountCredential: []
5075
+ - bearerOrganizationCredential: []
4872
5076
  x-required-scopes:
4873
5077
  - subscriptions:read
4874
5078
  responses:
@@ -4896,7 +5100,7 @@ paths:
4896
5100
  - clerkSession: []
4897
5101
  - bearerCredential: []
4898
5102
  - bearerGrant: []
4899
- - bearerAccountCredential: []
5103
+ - bearerOrganizationCredential: []
4900
5104
  x-required-scopes:
4901
5105
  - subscriptions:write
4902
5106
  requestBody:
@@ -4935,7 +5139,7 @@ paths:
4935
5139
  - clerkSession: []
4936
5140
  - bearerCredential: []
4937
5141
  - bearerGrant: []
4938
- - bearerAccountCredential: []
5142
+ - bearerOrganizationCredential: []
4939
5143
  x-required-scopes:
4940
5144
  - subscriptions:write
4941
5145
  responses:
@@ -4976,7 +5180,7 @@ paths:
4976
5180
  - clerkSession: []
4977
5181
  - bearerCredential: []
4978
5182
  - bearerGrant: []
4979
- - bearerAccountCredential: []
5183
+ - bearerOrganizationCredential: []
4980
5184
  x-required-scopes:
4981
5185
  - subscriptions:read
4982
5186
  parameters:
@@ -5044,7 +5248,7 @@ paths:
5044
5248
  - clerkSession: []
5045
5249
  - bearerCredential: []
5046
5250
  - bearerGrant: []
5047
- - bearerAccountCredential: []
5251
+ - bearerOrganizationCredential: []
5048
5252
  x-required-scopes:
5049
5253
  - subscriptions:write
5050
5254
  responses:
@@ -5078,7 +5282,7 @@ paths:
5078
5282
  - clerkSession: []
5079
5283
  - bearerCredential: []
5080
5284
  - bearerGrant: []
5081
- - bearerAccountCredential: []
5285
+ - bearerOrganizationCredential: []
5082
5286
  x-required-scopes:
5083
5287
  - subscriptions:write
5084
5288
  responses:
@@ -5118,7 +5322,7 @@ paths:
5118
5322
  - clerkSession: []
5119
5323
  - bearerCredential: []
5120
5324
  - bearerGrant: []
5121
- - bearerAccountCredential: []
5325
+ - bearerOrganizationCredential: []
5122
5326
  x-required-scopes:
5123
5327
  - messages:write
5124
5328
  x-idempotency:
@@ -5183,7 +5387,7 @@ paths:
5183
5387
  - clerkSession: []
5184
5388
  - bearerCredential: []
5185
5389
  - bearerGrant: []
5186
- - bearerAccountCredential: []
5390
+ - bearerOrganizationCredential: []
5187
5391
  x-required-scopes:
5188
5392
  - messages:read
5189
5393
  responses:
@@ -5210,8 +5414,8 @@ components:
5210
5414
  bearerFormat: Clerk session JWT
5211
5415
  description: |
5212
5416
  A verified human session whose active Clerk organization selects exactly
5213
- one WhooshBang account. Every administration operation rechecks the
5214
- projected account membership; session identity never selects a project
5417
+ one WhooshBang organization. Every administration operation rechecks the
5418
+ projected organization membership; session identity never selects a project
5215
5419
  or environment from request data.
5216
5420
  bearerGrant:
5217
5421
  type: http
@@ -5219,27 +5423,27 @@ components:
5219
5423
  bearerFormat: OAuth 2.0 access token
5220
5424
  description: |
5221
5425
  An access token issued by the WhooshBang authorization server for one
5222
- consenting account member. It selects exactly one account and carries
5426
+ consenting organization member. It selects exactly one organization and carries
5223
5427
  the scopes that member consented to, and never a project: an operation
5224
5428
  names its project and environment in the path, and the service checks
5225
5429
  both against the granting person's membership before acting. A project
5226
- credential can name no project but its own; an account credential names
5430
+ credential can name no project but its own; an organization credential names
5227
5431
  one per call the same way this does.
5228
- bearerAccountCredential:
5432
+ bearerOrganizationCredential:
5229
5433
  type: http
5230
5434
  scheme: bearer
5231
- bearerFormat: wb_ac1.acred_<16-byte-base64url>.<32-byte-base64url-secret>
5435
+ bearerFormat: wb_oc1.ocred_<16-byte-base64url>.<32-byte-base64url-secret>
5232
5436
  description: |
5233
- Selects exactly one account and nothing below it. It names no project
5437
+ Selects exactly one organization and nothing below it. It names no project
5234
5438
  and no environment, so it authenticates only operations whose path does,
5235
5439
  and its authority there is the intersection of its scopes with the
5236
5440
  project-credential vocabulary — never wider than a project credential
5237
5441
  would have been for the same project environment. A path naming a
5238
- project outside its account is refused with `credential_account_mismatch`
5239
- rather than a bare scope failure. `account:read` is the one scope it can
5442
+ project outside its organization is refused with `credential_organization_mismatch`
5443
+ rather than a bare scope failure. `organization:read` is the one scope it can
5240
5444
  hold that a project credential cannot, and it authorizes only the
5241
- account's project directory: listing the account's projects and reading
5242
- one, which is the account-wide question a project credential cannot ask
5445
+ organization's project directory: listing the organization's projects and reading
5446
+ one, which is the organization-wide question a project credential cannot ask
5243
5447
  and the reason a `--project <slug>` selector can work at all. It is
5244
5448
  required *in addition to* each of those operations' own
5245
5449
  `x-required-scopes`, never instead of them.
@@ -5249,7 +5453,7 @@ components:
5249
5453
  scheme: bearer
5250
5454
  bearerFormat: wb_pc1.pcred_<16-byte-base64url>.<32-byte-base64url-secret>
5251
5455
  description: |
5252
- Selects exactly one account, project, and `test` or `live` environment.
5456
+ Selects exactly one organization, project, and `test` or `live` environment.
5253
5457
  Credentials cannot be read after creation. Except for explicitly
5254
5458
  synthetic creation/rotation reveal fixtures, complete bearer values
5255
5459
  must never appear in fixtures, errors, logs, metrics, or inspection
@@ -5269,7 +5473,7 @@ components:
5269
5473
  name: WhooshBang-Recipient-Capability
5270
5474
  description: |
5271
5475
  A creation-only, short-lived capability bound server-side to one exact
5272
- account, project, environment, subscriber, configuration revision,
5476
+ organization, project, environment, subscriber, configuration revision,
5273
5477
  presenting origin, and registered return destination. It is accepted
5274
5478
  only on the `/v1/recipient-session` browser surface and never as bearer
5275
5479
  authority on an ordinary application route.
@@ -5312,13 +5516,13 @@ components:
5312
5516
  description: Canonical opaque project credential identity; never a readable secret.
5313
5517
  schema:
5314
5518
  $ref: "#/components/schemas/ApiCredentialId"
5315
- AccountCredentialId:
5316
- name: account_credential_id
5519
+ OrganizationCredentialId:
5520
+ name: organization_credential_id
5317
5521
  in: path
5318
5522
  required: true
5319
- description: Canonical opaque account credential identity; never a readable secret.
5523
+ description: Canonical opaque organization credential identity; never a readable secret.
5320
5524
  schema:
5321
- $ref: "#/components/schemas/AccountCredentialId"
5525
+ $ref: "#/components/schemas/OrganizationCredentialId"
5322
5526
  ApiCredentialAfterCursor:
5323
5527
  name: after
5324
5528
  in: query
@@ -5575,8 +5779,12 @@ components:
5575
5779
  $ref: ../schemas/whooshbang-v1.schema.json#/$defs/DiagnosticId
5576
5780
  IdempotencyKey:
5577
5781
  $ref: ../schemas/whooshbang-v1.schema.json#/$defs/IdempotencyKey
5578
- AccountProjection:
5579
- $ref: ../schemas/whooshbang-v1.schema.json#/$defs/AccountProjection
5782
+ OrganizationProjection:
5783
+ $ref: ../schemas/whooshbang-v1.schema.json#/$defs/OrganizationProjection
5784
+ UpdateProjectRequest:
5785
+ $ref: ../schemas/whooshbang-v1.schema.json#/$defs/UpdateProjectRequest
5786
+ PrivacyMode:
5787
+ $ref: ../schemas/whooshbang-v1.schema.json#/$defs/PrivacyMode
5580
5788
  CreateProjectRequest:
5581
5789
  $ref: ../schemas/whooshbang-v1.schema.json#/$defs/CreateProjectRequest
5582
5790
  DefaultNotifierSummary:
@@ -5599,20 +5807,20 @@ components:
5599
5807
  $ref: ../schemas/whooshbang-v1.schema.json#/$defs/UpdateRecipientCopyOverrideRequest
5600
5808
  CreateApiCredentialRequest:
5601
5809
  $ref: ../schemas/whooshbang-v1.schema.json#/$defs/CreateApiCredentialRequest
5602
- CreateAccountCredentialRequest:
5603
- $ref: ../schemas/whooshbang-v1.schema.json#/$defs/CreateAccountCredentialRequest
5604
- RotateAccountCredentialRequest:
5605
- $ref: ../schemas/whooshbang-v1.schema.json#/$defs/RotateAccountCredentialRequest
5606
- AccountCredentialId:
5607
- $ref: ../schemas/whooshbang-v1.schema.json#/$defs/AccountCredentialId
5608
- AccountCredential:
5609
- $ref: ../schemas/whooshbang-v1.schema.json#/$defs/AccountCredential
5610
- AccountCredentialCollection:
5611
- $ref: ../schemas/whooshbang-v1.schema.json#/$defs/AccountCredentialCollection
5612
- AccountCredentialSecretReveal:
5613
- $ref: ../schemas/whooshbang-v1.schema.json#/$defs/AccountCredentialSecretReveal
5614
- AccountCredentialRotation:
5615
- $ref: ../schemas/whooshbang-v1.schema.json#/$defs/AccountCredentialRotation
5810
+ CreateOrganizationCredentialRequest:
5811
+ $ref: ../schemas/whooshbang-v1.schema.json#/$defs/CreateOrganizationCredentialRequest
5812
+ RotateOrganizationCredentialRequest:
5813
+ $ref: ../schemas/whooshbang-v1.schema.json#/$defs/RotateOrganizationCredentialRequest
5814
+ OrganizationCredentialId:
5815
+ $ref: ../schemas/whooshbang-v1.schema.json#/$defs/OrganizationCredentialId
5816
+ OrganizationCredential:
5817
+ $ref: ../schemas/whooshbang-v1.schema.json#/$defs/OrganizationCredential
5818
+ OrganizationCredentialCollection:
5819
+ $ref: ../schemas/whooshbang-v1.schema.json#/$defs/OrganizationCredentialCollection
5820
+ OrganizationCredentialSecretReveal:
5821
+ $ref: ../schemas/whooshbang-v1.schema.json#/$defs/OrganizationCredentialSecretReveal
5822
+ OrganizationCredentialRotation:
5823
+ $ref: ../schemas/whooshbang-v1.schema.json#/$defs/OrganizationCredentialRotation
5616
5824
  RotateApiCredentialRequest:
5617
5825
  $ref: ../schemas/whooshbang-v1.schema.json#/$defs/RotateApiCredentialRequest
5618
5826
  ApiCredentialId:
@@ -5725,6 +5933,12 @@ components:
5725
5933
  $ref: ../schemas/whooshbang-v1.schema.json#/$defs/CreateSubscriberRequest
5726
5934
  Subscriber:
5727
5935
  $ref: ../schemas/whooshbang-v1.schema.json#/$defs/Subscriber
5936
+ SubscriberDataExport:
5937
+ $ref: ../schemas/whooshbang-v1.schema.json#/$defs/SubscriberDataExport
5938
+ CloseOrganizationRequest:
5939
+ $ref: ../schemas/whooshbang-v1.schema.json#/$defs/CloseOrganizationRequest
5940
+ OrganizationClosureResult:
5941
+ $ref: ../schemas/whooshbang-v1.schema.json#/$defs/OrganizationClosureResult
5728
5942
  CreateRecipientGroupRequest:
5729
5943
  $ref: ../schemas/whooshbang-v1.schema.json#/$defs/CreateRecipientGroupRequest
5730
5944
  UpdateRecipientGroupRequest:
@@ -5804,7 +6018,7 @@ components:
5804
6018
  description: |
5805
6019
  An idempotency key, project slug, credential identity, existing
5806
6020
  acknowledgement, or resource state conflicts with the authorized
5807
- account or request.
6021
+ organization or request.
5808
6022
  headers:
5809
6023
  WhooshBang-Diagnostic-Id:
5810
6024
  $ref: "#/components/headers/DiagnosticId"