@whooshbang/contracts 2.0.0-rc.8 → 2.1.0
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.
- package/CHANGELOG.md +11 -0
- package/README.md +4 -5
- package/contract-manifest.json +32 -32
- package/dist/generated/artifact-index.d.ts +33 -33
- package/dist/generated/artifact-index.js +32 -32
- package/dist/generated/artifact-index.js.map +1 -1
- package/dist/generated/validators-standalone.d.ts +577 -447
- package/dist/generated/validators-standalone.js +7127 -1096
- package/dist/generated/validators-standalone.js.map +1 -1
- package/dist/generated/validators.d.ts +11 -1
- package/dist/generated/validators.js +11 -1
- package/dist/generated/validators.js.map +1 -1
- package/dist/generated/whooshbang-v1.d.ts +135 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/fixtures/core-v1/fixture-index.json +1 -1
- package/fixtures/core-v1/scenarios/api-credential-invalid-indistinguishable.json +1 -1
- package/fixtures/core-v1/scenarios/api-credential-one-time-reveal.json +1 -1
- package/fixtures/core-v1/scenarios/api-credential-revocation-replay.json +1 -1
- package/fixtures/core-v1/scenarios/api-credential-rotation-overlap.json +1 -1
- package/fixtures/core-v1/scenarios/cancellation-too-late.json +1 -1
- package/fixtures/core-v1/scenarios/cross-organization-project.json +1 -1
- package/fixtures/core-v1/scenarios/cross-project-resource.json +1 -1
- package/fixtures/core-v1/scenarios/environment-mismatch.json +1 -1
- package/fixtures/core-v1/scenarios/idempotency-conflict.json +1 -1
- package/fixtures/core-v1/scenarios/idempotency-equivalent-replay.json +1 -1
- package/fixtures/core-v1/scenarios/malformed-bearer.json +1 -1
- package/fixtures/core-v1/scenarios/metadata-overrun.json +1 -1
- package/fixtures/core-v1/scenarios/missing-scope.json +1 -1
- package/fixtures/core-v1/scenarios/project-create-equivalent-replay.json +1 -1
- package/fixtures/core-v1/scenarios/project-slug-conflict.json +1 -1
- package/fixtures/core-v1/scenarios/provider-outcome-unknown.json +1 -1
- package/fixtures/core-v1/scenarios/subscription-activation-replay.json +1 -1
- package/fixtures/core-v1/scenarios/subscription-authorization-capability-opacity.json +1 -1
- package/fixtures/core-v1/scenarios/subscription-cross-connection-callback-rejected.json +1 -1
- package/fixtures/core-v1/scenarios/subscription-expired-replay.json +1 -1
- package/fixtures/core-v1/scenarios/subscription-selected-connection-replay.json +1 -1
- package/fixtures/interaction-machine-v1/scenarios/ack-conflict.json +1 -1
- package/fixtures/interaction-machine-v1/scenarios/ack-cross-machine.json +1 -1
- package/fixtures/interaction-machine-v1/scenarios/ack-out-of-order.json +1 -1
- package/fixtures/interaction-machine-v1/scenarios/ack-replay.json +1 -1
- package/fixtures/interaction-machine-v1/scenarios/ambiguous-free-text.json +1 -1
- package/fixtures/interaction-machine-v1/scenarios/callback-token-opacity.json +1 -1
- package/fixtures/interaction-machine-v1/scenarios/credential-registration-conflict.json +1 -1
- package/fixtures/interaction-machine-v1/scenarios/credential-registration-replay.json +1 -1
- package/fixtures/interaction-machine-v1/scenarios/credential-revocation-replay.json +1 -1
- package/fixtures/interaction-machine-v1/scenarios/credential-rotation.json +1 -1
- package/fixtures/interaction-machine-v1/scenarios/first-credential-activates.json +1 -1
- package/fixtures/interaction-machine-v1/scenarios/interaction-duplicate.json +1 -1
- package/fixtures/interaction-machine-v1/scenarios/interaction-expired.json +1 -1
- package/fixtures/interaction-machine-v1/scenarios/interaction-mismatch.json +1 -1
- package/fixtures/interaction-machine-v1/scenarios/interaction-retired.json +1 -1
- package/fixtures/interaction-machine-v1/scenarios/interaction-stale.json +1 -1
- package/fixtures/interaction-machine-v1/scenarios/machine-admin-denied.json +1 -1
- package/fixtures/interaction-machine-v1/scenarios/machine-bound-message-create.json +1 -1
- package/fixtures/interaction-machine-v1/scenarios/machine-cancel-denied.json +1 -1
- package/fixtures/interaction-machine-v1/scenarios/machine-crash-before-ack.json +1 -1
- package/fixtures/interaction-machine-v1/scenarios/machine-notifier-mismatch.json +1 -1
- package/fixtures/interaction-machine-v1/scenarios/machine-other-message-read.json +1 -1
- package/fixtures/interaction-machine-v1/scenarios/machine-owned-message-read.json +1 -1
- package/fixtures/interaction-machine-v1/scenarios/machine-subscriber-mismatch.json +1 -1
- package/fixtures/interaction-machine-v1/scenarios/poll-uncommitted-cursor-rejected.json +1 -1
- package/fixtures/interaction-machine-v1/scenarios/project-credential-machine-endpoint-denied.json +1 -1
- package/fixtures/interaction-machine-v1/scenarios/quarantine-integrity-rejected.json +1 -1
- package/fixtures/interaction-machine-v1/scenarios/quarantine-signature-rejected.json +1 -1
- package/fixtures/interaction-machine-v1/scenarios/quarantine-valid.json +1 -1
- package/fixtures/interaction-machine-v1/scenarios/revoked-machine-credential.json +1 -1
- package/fixtures/recipient-experience-v1/scenarios/membership-broadcast-snapshot.json +1 -1
- package/fixtures/recipient-experience-v1/scenarios/preferred-binding-resolution.json +1 -1
- package/fixtures/recipient-experience-v1/scenarios/recipient-session-security.json +1 -1
- package/fixtures/recipient-experience-v1/scenarios/subscriber-initial-groups-transaction.json +1 -1
- package/openapi/generated/whooshbang-v1.bundle.json +1353 -771
- package/openapi/whooshbang-v1.yaml +291 -2
- package/package.json +2 -3
- package/schemas/core-scenario.schema.json +1 -1
- package/schemas/events/agent-binding-degraded-v1.schema.json +1 -1
- package/schemas/events/interaction-expired-v1.schema.json +1 -1
- package/schemas/events/interaction-received-v1.schema.json +1 -1
- package/schemas/events/message-delivered-v1.schema.json +1 -1
- package/schemas/events/message-expired-v1.schema.json +1 -1
- package/schemas/events/message-failed-v1.schema.json +1 -1
- package/schemas/events/message-provider-accepted-v1.schema.json +1 -1
- package/schemas/events/subscription-activated-v1.schema.json +1 -1
- package/schemas/events/subscription-revoked-v1.schema.json +1 -1
- package/schemas/events/whooshbang-event-v1.schema.json +1 -1
- package/schemas/fixture-index.schema.json +1 -1
- package/schemas/interaction-machine-scenario.schema.json +1 -1
- package/schemas/interaction-v1.schema.json +1 -1
- package/schemas/machine-v1.schema.json +1 -1
- package/schemas/provider-capabilities-v1.schema.json +1 -1
- package/schemas/webhooks/webhook-delivery-case-v1.schema.json +1 -1
- package/schemas/webhooks/webhook-signing-vector-v1.schema.json +1 -1
- package/schemas/whooshbang-v1.schema.json +385 -1
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"openapi": "3.1.1",
|
|
3
3
|
"info": {
|
|
4
4
|
"title": "WhooshBang API",
|
|
5
|
-
"version": "2.
|
|
5
|
+
"version": "2.1.0",
|
|
6
6
|
"description": "The V1 contract for human organization/project administration, project-scoped\nsubscription links, and asynchronous text messages. A Clerk session selects\none organization for administration. A project credential selects one organization,\nproject, and `test` or `live` environment for product operations; request\nbodies cannot override either authenticated scope.\n\nA person's OAuth grant selects one organization and carries scopes, but no\nproject. It names the project and environment it acts in through the URL\npath, on the environment-scoped form of each operation; the service checks\nthat path against the granting person's membership on every call. The flat\nforms remain credential-only and are unchanged.\n\nResource identifiers are opaque and are not authorization. Reads outside the\ncredential scope return the same `404` shape as absent resources. Provider\ncredentials, raw Telegram identity, and protected provider responses are\nnever part of this API.\n",
|
|
7
7
|
"termsOfService": "https://flowxo.com/terms",
|
|
8
8
|
"contact": {
|
|
@@ -84,12 +84,350 @@
|
|
|
84
84
|
"name": "Subscriber groups",
|
|
85
85
|
"description": "Environment-scoped static groups and monotonic membership generations."
|
|
86
86
|
},
|
|
87
|
+
{
|
|
88
|
+
"name": "Operators",
|
|
89
|
+
"description": "Current teammates, personal notification preferences and membership-derived service email."
|
|
90
|
+
},
|
|
87
91
|
{
|
|
88
92
|
"name": "Group broadcasts",
|
|
89
93
|
"description": "Durable group acceptance and aggregate projection over ordinary child messages."
|
|
90
94
|
}
|
|
91
95
|
],
|
|
92
96
|
"paths": {
|
|
97
|
+
"/v1/projects/{project_id}/environments/{environment_id}/whoami": {
|
|
98
|
+
"get": {
|
|
99
|
+
"operationId": "whoAmI",
|
|
100
|
+
"summary": "Identify the authenticated caller",
|
|
101
|
+
"description": "Personal login identifies me without a recipient question. Shared or service credentials report their actual principal and require an explicit recipient. No account owner or credential creator is inferred.",
|
|
102
|
+
"tags": ["Operators"],
|
|
103
|
+
"security": [
|
|
104
|
+
{ "clerkSession": [] },
|
|
105
|
+
{ "bearerCredential": [] },
|
|
106
|
+
{ "bearerOrganizationCredential": [] },
|
|
107
|
+
{ "bearerGrant": ["messages:read"] },
|
|
108
|
+
{ "machineCredential": [] }
|
|
109
|
+
],
|
|
110
|
+
"x-required-scopes": ["messages:read"],
|
|
111
|
+
"parameters": [
|
|
112
|
+
{ "$ref": "#/components/parameters/ProjectId" },
|
|
113
|
+
{ "$ref": "#/components/parameters/EnvironmentId" }
|
|
114
|
+
],
|
|
115
|
+
"responses": {
|
|
116
|
+
"200": {
|
|
117
|
+
"description": "Actual principal and safe authorized messaging context.",
|
|
118
|
+
"content": {
|
|
119
|
+
"application/json": {
|
|
120
|
+
"schema": { "$ref": "#/components/schemas/WhoAmI" }
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
},
|
|
124
|
+
"401": { "$ref": "#/components/responses/Unauthorized" },
|
|
125
|
+
"403": { "$ref": "#/components/responses/Forbidden" }
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
},
|
|
129
|
+
"/v1/projects/{project_id}/environments/{environment_id}/operators": {
|
|
130
|
+
"get": {
|
|
131
|
+
"operationId": "listOperators",
|
|
132
|
+
"summary": "listOperators",
|
|
133
|
+
"description": "Membership-derived operator messaging. Only the authenticated human can manage personal preferences.",
|
|
134
|
+
"tags": ["Operators"],
|
|
135
|
+
"security": [
|
|
136
|
+
{ "clerkSession": [] },
|
|
137
|
+
{ "bearerCredential": [] },
|
|
138
|
+
{ "bearerGrant": ["messages:read"] }
|
|
139
|
+
],
|
|
140
|
+
"x-required-scopes": ["messages:read"],
|
|
141
|
+
"parameters": [
|
|
142
|
+
{ "$ref": "#/components/parameters/ProjectId" },
|
|
143
|
+
{ "$ref": "#/components/parameters/EnvironmentId" },
|
|
144
|
+
{ "$ref": "#/components/parameters/ListAfterCursor" },
|
|
145
|
+
{ "$ref": "#/components/parameters/ListPageLimit" },
|
|
146
|
+
{ "$ref": "#/components/parameters/PageNumber" }
|
|
147
|
+
],
|
|
148
|
+
"responses": {
|
|
149
|
+
"200": {
|
|
150
|
+
"description": "Authorized result.",
|
|
151
|
+
"content": {
|
|
152
|
+
"application/json": {
|
|
153
|
+
"schema": { "$ref": "#/components/schemas/OperatorCollection" }
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
},
|
|
157
|
+
"401": { "$ref": "#/components/responses/Unauthorized" },
|
|
158
|
+
"403": { "$ref": "#/components/responses/Forbidden" }
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
},
|
|
162
|
+
"/v1/projects/{project_id}/environments/{environment_id}/operators/resolve": {
|
|
163
|
+
"get": {
|
|
164
|
+
"operationId": "resolveOperator",
|
|
165
|
+
"summary": "resolveOperator",
|
|
166
|
+
"description": "Membership-derived operator messaging. Only the authenticated human can manage personal preferences.",
|
|
167
|
+
"tags": ["Operators"],
|
|
168
|
+
"security": [
|
|
169
|
+
{ "clerkSession": [] },
|
|
170
|
+
{ "bearerCredential": [] },
|
|
171
|
+
{ "bearerGrant": ["messages:read"] }
|
|
172
|
+
],
|
|
173
|
+
"x-required-scopes": ["messages:read"],
|
|
174
|
+
"parameters": [
|
|
175
|
+
{ "$ref": "#/components/parameters/ProjectId" },
|
|
176
|
+
{ "$ref": "#/components/parameters/EnvironmentId" },
|
|
177
|
+
{
|
|
178
|
+
"name": "recipient",
|
|
179
|
+
"in": "query",
|
|
180
|
+
"required": true,
|
|
181
|
+
"schema": { "type": "string", "minLength": 1, "maxLength": 128 }
|
|
182
|
+
}
|
|
183
|
+
],
|
|
184
|
+
"responses": {
|
|
185
|
+
"200": {
|
|
186
|
+
"description": "Authorized result.",
|
|
187
|
+
"content": {
|
|
188
|
+
"application/json": {
|
|
189
|
+
"schema": { "$ref": "#/components/schemas/OperatorResolution" }
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
},
|
|
193
|
+
"401": { "$ref": "#/components/responses/Unauthorized" },
|
|
194
|
+
"403": { "$ref": "#/components/responses/Forbidden" }
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
},
|
|
198
|
+
"/v1/projects/{project_id}/environments/{environment_id}/operator-messages": {
|
|
199
|
+
"post": {
|
|
200
|
+
"operationId": "sendOperatorMessage",
|
|
201
|
+
"summary": "sendOperatorMessage",
|
|
202
|
+
"description": "Message a current teammate by name or operator ID. Personal callers may omit recipient or use me. Shared credentials must name a recipient. Runtime machine credentials report recipient_required for omitted or me; named operator sends are forbidden because runtime authority remains subscriber-bound.",
|
|
203
|
+
"tags": ["Operators"],
|
|
204
|
+
"security": [
|
|
205
|
+
{ "clerkSession": [] },
|
|
206
|
+
{ "bearerCredential": [] },
|
|
207
|
+
{ "bearerOrganizationCredential": [] },
|
|
208
|
+
{ "machineCredential": [] },
|
|
209
|
+
{ "bearerGrant": ["messages:write"] }
|
|
210
|
+
],
|
|
211
|
+
"x-required-scopes": ["messages:write"],
|
|
212
|
+
"parameters": [
|
|
213
|
+
{ "$ref": "#/components/parameters/ProjectId" },
|
|
214
|
+
{ "$ref": "#/components/parameters/EnvironmentId" },
|
|
215
|
+
{ "$ref": "#/components/parameters/IdempotencyKey" }
|
|
216
|
+
],
|
|
217
|
+
"requestBody": {
|
|
218
|
+
"required": true,
|
|
219
|
+
"content": {
|
|
220
|
+
"application/json": {
|
|
221
|
+
"schema": {
|
|
222
|
+
"$ref": "#/components/schemas/CreateOperatorMessageRequest"
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
},
|
|
227
|
+
"responses": {
|
|
228
|
+
"200": {
|
|
229
|
+
"description": "Authorized result.",
|
|
230
|
+
"content": {
|
|
231
|
+
"application/json": {
|
|
232
|
+
"schema": {
|
|
233
|
+
"$ref": "#/components/schemas/OperatorMessageResult"
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
},
|
|
238
|
+
"401": { "$ref": "#/components/responses/Unauthorized" },
|
|
239
|
+
"403": { "$ref": "#/components/responses/Forbidden" }
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
},
|
|
243
|
+
"/v1/projects/{project_id}/environments/{environment_id}/operators/broadcasts": {
|
|
244
|
+
"post": {
|
|
245
|
+
"operationId": "broadcastOperators",
|
|
246
|
+
"summary": "broadcastOperators",
|
|
247
|
+
"description": "Membership-derived operator messaging. Only the authenticated human can manage personal preferences.",
|
|
248
|
+
"tags": ["Operators"],
|
|
249
|
+
"security": [
|
|
250
|
+
{ "clerkSession": [] },
|
|
251
|
+
{ "bearerCredential": [] },
|
|
252
|
+
{ "bearerGrant": ["messages:write"] }
|
|
253
|
+
],
|
|
254
|
+
"x-required-scopes": ["messages:write"],
|
|
255
|
+
"parameters": [
|
|
256
|
+
{ "$ref": "#/components/parameters/ProjectId" },
|
|
257
|
+
{ "$ref": "#/components/parameters/EnvironmentId" },
|
|
258
|
+
{ "$ref": "#/components/parameters/IdempotencyKey" }
|
|
259
|
+
],
|
|
260
|
+
"requestBody": {
|
|
261
|
+
"required": true,
|
|
262
|
+
"content": {
|
|
263
|
+
"application/json": {
|
|
264
|
+
"schema": {
|
|
265
|
+
"$ref": "#/components/schemas/CreateGroupBroadcastRequest"
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
},
|
|
270
|
+
"responses": {
|
|
271
|
+
"200": {
|
|
272
|
+
"description": "Authorized result.",
|
|
273
|
+
"content": {
|
|
274
|
+
"application/json": {
|
|
275
|
+
"schema": { "$ref": "#/components/schemas/OperatorBroadcast" }
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
},
|
|
279
|
+
"401": { "$ref": "#/components/responses/Unauthorized" },
|
|
280
|
+
"403": { "$ref": "#/components/responses/Forbidden" }
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
},
|
|
284
|
+
"/v1/projects/{project_id}/environments/{environment_id}/operators/broadcasts/{broadcast_id}": {
|
|
285
|
+
"get": {
|
|
286
|
+
"operationId": "getOperatorBroadcast",
|
|
287
|
+
"summary": "getOperatorBroadcast",
|
|
288
|
+
"description": "Membership-derived operator messaging. Only the authenticated human can manage personal preferences.",
|
|
289
|
+
"tags": ["Operators"],
|
|
290
|
+
"security": [
|
|
291
|
+
{ "clerkSession": [] },
|
|
292
|
+
{ "bearerCredential": [] },
|
|
293
|
+
{ "bearerGrant": ["messages:read"] }
|
|
294
|
+
],
|
|
295
|
+
"x-required-scopes": ["messages:read"],
|
|
296
|
+
"parameters": [
|
|
297
|
+
{ "$ref": "#/components/parameters/ProjectId" },
|
|
298
|
+
{ "$ref": "#/components/parameters/EnvironmentId" },
|
|
299
|
+
{
|
|
300
|
+
"name": "broadcast_id",
|
|
301
|
+
"in": "path",
|
|
302
|
+
"required": true,
|
|
303
|
+
"schema": { "type": "string" }
|
|
304
|
+
}
|
|
305
|
+
],
|
|
306
|
+
"responses": {
|
|
307
|
+
"200": {
|
|
308
|
+
"description": "Authorized result.",
|
|
309
|
+
"content": {
|
|
310
|
+
"application/json": {
|
|
311
|
+
"schema": { "$ref": "#/components/schemas/OperatorBroadcast" }
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
},
|
|
315
|
+
"401": { "$ref": "#/components/responses/Unauthorized" },
|
|
316
|
+
"403": { "$ref": "#/components/responses/Forbidden" }
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
},
|
|
320
|
+
"/v1/projects/{project_id}/environments/{environment_id}/notification-preferences": {
|
|
321
|
+
"get": {
|
|
322
|
+
"operationId": "getOperatorPreferences",
|
|
323
|
+
"summary": "getOperatorPreferences",
|
|
324
|
+
"description": "Membership-derived operator messaging. Only the authenticated human can manage personal preferences.",
|
|
325
|
+
"tags": ["Operators"],
|
|
326
|
+
"security": [
|
|
327
|
+
{ "clerkSession": [] },
|
|
328
|
+
{ "bearerCredential": [] },
|
|
329
|
+
{ "bearerGrant": ["messages:read"] }
|
|
330
|
+
],
|
|
331
|
+
"x-required-scopes": ["messages:read"],
|
|
332
|
+
"parameters": [
|
|
333
|
+
{ "$ref": "#/components/parameters/ProjectId" },
|
|
334
|
+
{ "$ref": "#/components/parameters/EnvironmentId" }
|
|
335
|
+
],
|
|
336
|
+
"responses": {
|
|
337
|
+
"200": {
|
|
338
|
+
"description": "Authorized result.",
|
|
339
|
+
"content": {
|
|
340
|
+
"application/json": {
|
|
341
|
+
"schema": { "$ref": "#/components/schemas/OperatorPreferences" }
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
},
|
|
345
|
+
"401": { "$ref": "#/components/responses/Unauthorized" },
|
|
346
|
+
"403": { "$ref": "#/components/responses/Forbidden" }
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
},
|
|
350
|
+
"/v1/projects/{project_id}/environments/{environment_id}/notification-preferences/preferred-binding": {
|
|
351
|
+
"put": {
|
|
352
|
+
"operationId": "setOperatorPreferredBinding",
|
|
353
|
+
"summary": "setOperatorPreferredBinding",
|
|
354
|
+
"description": "Membership-derived operator messaging. Only the authenticated human can manage personal preferences.",
|
|
355
|
+
"tags": ["Operators"],
|
|
356
|
+
"security": [
|
|
357
|
+
{ "clerkSession": [] },
|
|
358
|
+
{ "bearerCredential": [] },
|
|
359
|
+
{ "bearerGrant": ["messages:write"] }
|
|
360
|
+
],
|
|
361
|
+
"x-required-scopes": ["messages:write"],
|
|
362
|
+
"parameters": [
|
|
363
|
+
{ "$ref": "#/components/parameters/ProjectId" },
|
|
364
|
+
{ "$ref": "#/components/parameters/EnvironmentId" }
|
|
365
|
+
],
|
|
366
|
+
"requestBody": {
|
|
367
|
+
"required": true,
|
|
368
|
+
"content": {
|
|
369
|
+
"application/json": {
|
|
370
|
+
"schema": {
|
|
371
|
+
"$ref": "#/components/schemas/SetPreferredBindingRequest"
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
},
|
|
376
|
+
"responses": {
|
|
377
|
+
"200": {
|
|
378
|
+
"description": "Authorized result.",
|
|
379
|
+
"content": {
|
|
380
|
+
"application/json": {
|
|
381
|
+
"schema": { "$ref": "#/components/schemas/OperatorPreferences" }
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
},
|
|
385
|
+
"401": { "$ref": "#/components/responses/Unauthorized" },
|
|
386
|
+
"403": { "$ref": "#/components/responses/Forbidden" }
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
},
|
|
390
|
+
"/v1/projects/{project_id}/environments/{environment_id}/notification-preferences/connect": {
|
|
391
|
+
"post": {
|
|
392
|
+
"operationId": "connectOperatorChannel",
|
|
393
|
+
"summary": "connectOperatorChannel",
|
|
394
|
+
"description": "Membership-derived operator messaging. Only the authenticated human can manage personal preferences.",
|
|
395
|
+
"tags": ["Operators"],
|
|
396
|
+
"security": [
|
|
397
|
+
{ "clerkSession": [] },
|
|
398
|
+
{ "bearerCredential": [] },
|
|
399
|
+
{ "bearerGrant": ["messages:write"] }
|
|
400
|
+
],
|
|
401
|
+
"x-required-scopes": ["messages:write"],
|
|
402
|
+
"parameters": [
|
|
403
|
+
{ "$ref": "#/components/parameters/ProjectId" },
|
|
404
|
+
{ "$ref": "#/components/parameters/EnvironmentId" },
|
|
405
|
+
{ "$ref": "#/components/parameters/IdempotencyKey" }
|
|
406
|
+
],
|
|
407
|
+
"requestBody": {
|
|
408
|
+
"required": true,
|
|
409
|
+
"content": {
|
|
410
|
+
"application/json": {
|
|
411
|
+
"schema": {
|
|
412
|
+
"$ref": "#/components/schemas/OperatorConnectRequest"
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
},
|
|
417
|
+
"responses": {
|
|
418
|
+
"201": {
|
|
419
|
+
"description": "Authorized result.",
|
|
420
|
+
"content": {
|
|
421
|
+
"application/json": {
|
|
422
|
+
"schema": { "$ref": "#/components/schemas/SubscriptionLink" }
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
},
|
|
426
|
+
"401": { "$ref": "#/components/responses/Unauthorized" },
|
|
427
|
+
"403": { "$ref": "#/components/responses/Forbidden" }
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
},
|
|
93
431
|
"/v1/billing/project-slots": {
|
|
94
432
|
"get": {
|
|
95
433
|
"operationId": "getBillingProjectSlots",
|
|
@@ -10716,25 +11054,269 @@
|
|
|
10716
11054
|
}
|
|
10717
11055
|
},
|
|
10718
11056
|
"schemas": {
|
|
10719
|
-
"
|
|
10720
|
-
"type": "
|
|
10721
|
-
"
|
|
10722
|
-
"
|
|
10723
|
-
"
|
|
10724
|
-
|
|
10725
|
-
|
|
10726
|
-
|
|
10727
|
-
|
|
10728
|
-
|
|
10729
|
-
|
|
10730
|
-
|
|
10731
|
-
|
|
10732
|
-
|
|
10733
|
-
|
|
10734
|
-
|
|
10735
|
-
|
|
10736
|
-
|
|
10737
|
-
|
|
11057
|
+
"WhoAmI": {
|
|
11058
|
+
"type": "object",
|
|
11059
|
+
"description": "Current principal, authorized context, safe channel readiness and deterministic personal me identity. Contains no email or provider destination.",
|
|
11060
|
+
"required": ["principal", "context", "capabilities", "detail"],
|
|
11061
|
+
"properties": {
|
|
11062
|
+
"principal": {
|
|
11063
|
+
"type": "object",
|
|
11064
|
+
"description": "The credential actually authenticated for this request; service identity never implies its creator is the recipient.",
|
|
11065
|
+
"required": ["type", "id"],
|
|
11066
|
+
"properties": {
|
|
11067
|
+
"type": {
|
|
11068
|
+
"enum": [
|
|
11069
|
+
"personal_session",
|
|
11070
|
+
"personal_mcp",
|
|
11071
|
+
"project_credential",
|
|
11072
|
+
"organization_credential",
|
|
11073
|
+
"machine_client"
|
|
11074
|
+
]
|
|
11075
|
+
},
|
|
11076
|
+
"id": { "type": "string", "minLength": 1, "maxLength": 128 }
|
|
11077
|
+
},
|
|
11078
|
+
"additionalProperties": false
|
|
11079
|
+
},
|
|
11080
|
+
"context": {
|
|
11081
|
+
"type": "object",
|
|
11082
|
+
"description": "Explicit authorized account and project context. No context is guessed across tenants.",
|
|
11083
|
+
"required": [
|
|
11084
|
+
"organization_id",
|
|
11085
|
+
"project_id",
|
|
11086
|
+
"environment_id",
|
|
11087
|
+
"environment"
|
|
11088
|
+
],
|
|
11089
|
+
"properties": {
|
|
11090
|
+
"organization_id": {
|
|
11091
|
+
"type": "string",
|
|
11092
|
+
"minLength": 1,
|
|
11093
|
+
"maxLength": 128
|
|
11094
|
+
},
|
|
11095
|
+
"project_id": {
|
|
11096
|
+
"type": "string",
|
|
11097
|
+
"minLength": 1,
|
|
11098
|
+
"maxLength": 128
|
|
11099
|
+
},
|
|
11100
|
+
"environment_id": {
|
|
11101
|
+
"type": "string",
|
|
11102
|
+
"minLength": 1,
|
|
11103
|
+
"maxLength": 128
|
|
11104
|
+
},
|
|
11105
|
+
"environment": { "enum": ["test", "live"] }
|
|
11106
|
+
},
|
|
11107
|
+
"additionalProperties": false
|
|
11108
|
+
},
|
|
11109
|
+
"capabilities": {
|
|
11110
|
+
"type": "object",
|
|
11111
|
+
"description": "Current messaging permissions; quota, binding readiness and provider gates still apply per send.",
|
|
11112
|
+
"required": [
|
|
11113
|
+
"can_message_self",
|
|
11114
|
+
"can_message_teammates",
|
|
11115
|
+
"can_broadcast_operators"
|
|
11116
|
+
],
|
|
11117
|
+
"properties": {
|
|
11118
|
+
"can_message_self": { "type": "boolean" },
|
|
11119
|
+
"can_message_teammates": { "type": "boolean" },
|
|
11120
|
+
"can_broadcast_operators": { "type": "boolean" }
|
|
11121
|
+
},
|
|
11122
|
+
"additionalProperties": false
|
|
11123
|
+
},
|
|
11124
|
+
"user": {
|
|
11125
|
+
"type": "object",
|
|
11126
|
+
"description": "Verified authenticated human identity. Absent for shared/service credentials.",
|
|
11127
|
+
"required": ["id", "name"],
|
|
11128
|
+
"properties": {
|
|
11129
|
+
"id": { "type": "string", "minLength": 1, "maxLength": 128 },
|
|
11130
|
+
"name": { "type": "string", "minLength": 1, "maxLength": 256 }
|
|
11131
|
+
},
|
|
11132
|
+
"additionalProperties": false
|
|
11133
|
+
},
|
|
11134
|
+
"me": { "$ref": "#/components/schemas/Operator" },
|
|
11135
|
+
"detail": { "type": "string", "minLength": 1, "maxLength": 1024 }
|
|
11136
|
+
},
|
|
11137
|
+
"additionalProperties": false
|
|
11138
|
+
},
|
|
11139
|
+
"Operator": {
|
|
11140
|
+
"type": "object",
|
|
11141
|
+
"description": "A safe, membership-derived operator in the authorized project. No email, provider identifiers or credentials are exposed.",
|
|
11142
|
+
"required": ["id", "name", "role", "readiness", "preferences_url"],
|
|
11143
|
+
"properties": {
|
|
11144
|
+
"id": { "type": "string", "minLength": 1, "maxLength": 128 },
|
|
11145
|
+
"name": { "type": "string", "minLength": 1, "maxLength": 256 },
|
|
11146
|
+
"role": { "enum": ["admin", "member", "messenger"] },
|
|
11147
|
+
"readiness": { "enum": ["ready", "channel_unavailable"] },
|
|
11148
|
+
"preferred_channel": { "$ref": "#/components/schemas/Channel" },
|
|
11149
|
+
"preferences_url": { "type": "string", "format": "uri" }
|
|
11150
|
+
},
|
|
11151
|
+
"additionalProperties": false
|
|
11152
|
+
},
|
|
11153
|
+
"OperatorCollection": {
|
|
11154
|
+
"type": "object",
|
|
11155
|
+
"description": "Read-only predefined operators audience, filtered to current account and project membership.",
|
|
11156
|
+
"required": ["group", "items", "total"],
|
|
11157
|
+
"properties": {
|
|
11158
|
+
"group": { "const": "operators" },
|
|
11159
|
+
"items": {
|
|
11160
|
+
"type": "array",
|
|
11161
|
+
"items": { "$ref": "#/components/schemas/Operator" }
|
|
11162
|
+
},
|
|
11163
|
+
"total": { "$ref": "#/components/schemas/ListTotal" },
|
|
11164
|
+
"next_cursor": { "type": "string", "minLength": 1, "maxLength": 128 },
|
|
11165
|
+
"page": { "$ref": "#/components/schemas/ListPageNumber" },
|
|
11166
|
+
"page_size": { "$ref": "#/components/schemas/ListPageSize" }
|
|
11167
|
+
},
|
|
11168
|
+
"additionalProperties": false
|
|
11169
|
+
},
|
|
11170
|
+
"OperatorResolution": {
|
|
11171
|
+
"type": "object",
|
|
11172
|
+
"description": "Exact normalized name or stable operator identity. Duplicate names are never guessed.",
|
|
11173
|
+
"required": ["outcome", "choices"],
|
|
11174
|
+
"properties": {
|
|
11175
|
+
"outcome": { "enum": ["resolved", "ambiguous", "not_found"] },
|
|
11176
|
+
"choices": {
|
|
11177
|
+
"type": "array",
|
|
11178
|
+
"items": { "$ref": "#/components/schemas/Operator" }
|
|
11179
|
+
}
|
|
11180
|
+
},
|
|
11181
|
+
"additionalProperties": false
|
|
11182
|
+
},
|
|
11183
|
+
"CreateOperatorMessageRequest": {
|
|
11184
|
+
"type": "object",
|
|
11185
|
+
"description": "Send to a teammate by exact name or operator ID, or use me. Omitted recipient means the verified authenticated human only. Shared and service credentials must name a recipient. Preferred channel, service-email billing and marketing restrictions still apply.",
|
|
11186
|
+
"required": ["content"],
|
|
11187
|
+
"properties": {
|
|
11188
|
+
"recipient": { "type": "string", "minLength": 1, "maxLength": 128 },
|
|
11189
|
+
"content": { "$ref": "#/components/schemas/MessageContent" },
|
|
11190
|
+
"expires_at": {
|
|
11191
|
+
"$ref": "#/components/schemas/Timestamp",
|
|
11192
|
+
"description": "Optional server-authoritative expiry no more than 24 hours after acceptance."
|
|
11193
|
+
},
|
|
11194
|
+
"correlation_id": {
|
|
11195
|
+
"type": "string",
|
|
11196
|
+
"minLength": 1,
|
|
11197
|
+
"maxLength": 128
|
|
11198
|
+
},
|
|
11199
|
+
"metadata": { "$ref": "#/components/schemas/Metadata" },
|
|
11200
|
+
"interaction": { "$ref": "#/components/schemas/InteractionRequest" },
|
|
11201
|
+
"purpose": {
|
|
11202
|
+
"enum": ["service", "marketing"],
|
|
11203
|
+
"default": "service",
|
|
11204
|
+
"description": "Omitted means service. Marketing refuses service-only bindings before charging and at every delayed dispatch."
|
|
11205
|
+
}
|
|
11206
|
+
},
|
|
11207
|
+
"additionalProperties": false
|
|
11208
|
+
},
|
|
11209
|
+
"OperatorMessageResult": {
|
|
11210
|
+
"type": "object",
|
|
11211
|
+
"description": "Readable acceptance or refusal. Accepted means queued, never proof of provider delivery.",
|
|
11212
|
+
"required": ["outcome", "choices", "detail"],
|
|
11213
|
+
"properties": {
|
|
11214
|
+
"outcome": {
|
|
11215
|
+
"enum": [
|
|
11216
|
+
"accepted",
|
|
11217
|
+
"ambiguous",
|
|
11218
|
+
"not_found",
|
|
11219
|
+
"recipient_required",
|
|
11220
|
+
"channel_unavailable"
|
|
11221
|
+
]
|
|
11222
|
+
},
|
|
11223
|
+
"choices": {
|
|
11224
|
+
"type": "array",
|
|
11225
|
+
"items": { "$ref": "#/components/schemas/Operator" }
|
|
11226
|
+
},
|
|
11227
|
+
"detail": { "type": "string", "minLength": 1, "maxLength": 1024 },
|
|
11228
|
+
"message": { "$ref": "#/components/schemas/Message" },
|
|
11229
|
+
"preferences_url": { "type": "string", "format": "uri" }
|
|
11230
|
+
},
|
|
11231
|
+
"additionalProperties": false
|
|
11232
|
+
},
|
|
11233
|
+
"OperatorBroadcastRecipient": {
|
|
11234
|
+
"type": "object",
|
|
11235
|
+
"description": "Per-person broadcast result. Sent requires provider acceptance; skipped includes removed membership or an unavailable destination.",
|
|
11236
|
+
"required": ["operator_id", "outcome"],
|
|
11237
|
+
"properties": {
|
|
11238
|
+
"operator_id": { "type": "string", "minLength": 1, "maxLength": 128 },
|
|
11239
|
+
"name": { "type": "string" },
|
|
11240
|
+
"outcome": { "enum": ["pending", "sent", "skipped", "failed"] },
|
|
11241
|
+
"message_id": { "type": "string", "minLength": 1, "maxLength": 128 },
|
|
11242
|
+
"reason": { "type": "string" }
|
|
11243
|
+
},
|
|
11244
|
+
"additionalProperties": false
|
|
11245
|
+
},
|
|
11246
|
+
"OperatorBroadcast": {
|
|
11247
|
+
"type": "object",
|
|
11248
|
+
"description": "Durable operators broadcast using ordinary child messages and charging. Read again for provider outcomes.",
|
|
11249
|
+
"required": ["broadcast", "recipients"],
|
|
11250
|
+
"properties": {
|
|
11251
|
+
"broadcast": { "$ref": "#/components/schemas/GroupBroadcast" },
|
|
11252
|
+
"recipients": {
|
|
11253
|
+
"type": "array",
|
|
11254
|
+
"items": {
|
|
11255
|
+
"$ref": "#/components/schemas/OperatorBroadcastRecipient"
|
|
11256
|
+
}
|
|
11257
|
+
}
|
|
11258
|
+
},
|
|
11259
|
+
"additionalProperties": false
|
|
11260
|
+
},
|
|
11261
|
+
"OperatorPreferences": {
|
|
11262
|
+
"type": "object",
|
|
11263
|
+
"description": "The authenticated person’s own destinations and preferred channel in this project. Shared credentials cannot manage a human’s preferences.",
|
|
11264
|
+
"required": ["operator", "settings", "connections"],
|
|
11265
|
+
"properties": {
|
|
11266
|
+
"operator": { "$ref": "#/components/schemas/Operator" },
|
|
11267
|
+
"settings": {
|
|
11268
|
+
"$ref": "#/components/schemas/SubscriberChannelSettings"
|
|
11269
|
+
},
|
|
11270
|
+
"connections": {
|
|
11271
|
+
"type": "array",
|
|
11272
|
+
"items": {
|
|
11273
|
+
"type": "object",
|
|
11274
|
+
"description": "An available personal connection route.",
|
|
11275
|
+
"required": ["id", "channel", "name"],
|
|
11276
|
+
"properties": {
|
|
11277
|
+
"id": { "type": "string", "minLength": 1, "maxLength": 128 },
|
|
11278
|
+
"channel": { "$ref": "#/components/schemas/Channel" },
|
|
11279
|
+
"name": { "type": "string" }
|
|
11280
|
+
},
|
|
11281
|
+
"additionalProperties": false
|
|
11282
|
+
}
|
|
11283
|
+
}
|
|
11284
|
+
},
|
|
11285
|
+
"additionalProperties": false
|
|
11286
|
+
},
|
|
11287
|
+
"OperatorConnectRequest": {
|
|
11288
|
+
"type": "object",
|
|
11289
|
+
"description": "Connect the signed-in person’s own destination through a configured channel. This never changes another person’s channels.",
|
|
11290
|
+
"required": ["connection_id", "channel"],
|
|
11291
|
+
"properties": {
|
|
11292
|
+
"connection_id": {
|
|
11293
|
+
"type": "string",
|
|
11294
|
+
"minLength": 1,
|
|
11295
|
+
"maxLength": 128
|
|
11296
|
+
},
|
|
11297
|
+
"channel": { "enum": ["telegram", "slack"] }
|
|
11298
|
+
},
|
|
11299
|
+
"additionalProperties": false
|
|
11300
|
+
},
|
|
11301
|
+
"ListPageSize": {
|
|
11302
|
+
"type": "integer",
|
|
11303
|
+
"minimum": 1,
|
|
11304
|
+
"maximum": 100,
|
|
11305
|
+
"description": "The page size that produced `items`, echoed so a caller that sent no `limit` can still divide `total` into pages without knowing the server default."
|
|
11306
|
+
},
|
|
11307
|
+
"MessageState": {
|
|
11308
|
+
"type": "string",
|
|
11309
|
+
"enum": [
|
|
11310
|
+
"accepted",
|
|
11311
|
+
"dispatch_pending",
|
|
11312
|
+
"queued",
|
|
11313
|
+
"sending",
|
|
11314
|
+
"provider_accepted",
|
|
11315
|
+
"retry_wait",
|
|
11316
|
+
"terminal_failed",
|
|
11317
|
+
"outcome_unknown",
|
|
11318
|
+
"cancelled",
|
|
11319
|
+
"expired"
|
|
10738
11320
|
]
|
|
10739
11321
|
},
|
|
10740
11322
|
"Timestamp": {
|
|
@@ -17647,6 +18229,11 @@
|
|
|
17647
18229
|
},
|
|
17648
18230
|
"additionalProperties": false
|
|
17649
18231
|
},
|
|
18232
|
+
"Channel": {
|
|
18233
|
+
"type": "string",
|
|
18234
|
+
"enum": ["telegram", "slack", "email"],
|
|
18235
|
+
"description": "A provider-neutral delivery channel. Adding a member makes it representable; it does not claim that every deployment has registered an executable adapter."
|
|
18236
|
+
},
|
|
17650
18237
|
"ProblemCode": {
|
|
17651
18238
|
"type": "string",
|
|
17652
18239
|
"enum": [
|
|
@@ -17854,409 +18441,499 @@
|
|
|
17854
18441
|
}
|
|
17855
18442
|
]
|
|
17856
18443
|
},
|
|
17857
|
-
"Channel": {
|
|
17858
|
-
"type": "string",
|
|
17859
|
-
"enum": ["telegram", "slack", "email"],
|
|
17860
|
-
"description": "A provider-neutral delivery channel. Adding a member makes it representable; it does not claim that every deployment has registered an executable adapter."
|
|
17861
|
-
},
|
|
17862
18444
|
"ListTotal": {
|
|
17863
18445
|
"type": "integer",
|
|
17864
18446
|
"minimum": 0,
|
|
17865
18447
|
"description": "How many records the list holds in total, not only on this page. Counted while the page was read, so a write landing between the count and the page can leave it a record or two out of step with `items`. That is noise on an inspection surface; it never changes which records a page addresses."
|
|
17866
18448
|
},
|
|
17867
|
-
"
|
|
17868
|
-
"type": "string",
|
|
17869
|
-
"minLength": 3,
|
|
17870
|
-
"maxLength": 254,
|
|
17871
|
-
"pattern": "^(?=[^@]{1,64}@)(?!\\.)(?![^@]*\\.@)(?![^@]*\\.\\.)[A-Za-z0-9!#$%&'*+/=?^_`{|}~.-]+@(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$",
|
|
17872
|
-
"description": "Exactly one mailbox: an unquoted ASCII dot-atom local part plus a canonical lower-case IDNA domain. The comparison key preserves local-part bytes and case and lower-cases only the domain; dot, plus-tag, alias and provider equivalence are never inferred."
|
|
17873
|
-
},
|
|
17874
|
-
"OrganizationRole": {
|
|
17875
|
-
"type": "string",
|
|
17876
|
-
"enum": ["admin", "member", "messenger"],
|
|
17877
|
-
"description": "The person's WhooshBang role in the organization. `admin` does everything, including billing, API keys and teammates. `member` runs the projects they were given: channels, subscribers, messages and project settings. `messenger` sends messages and reads replies in the projects they were given. Clients must tolerate roles added later."
|
|
17878
|
-
},
|
|
17879
|
-
"OrganizationMembershipSummary": {
|
|
18449
|
+
"StructuredTextSection": {
|
|
17880
18450
|
"type": "object",
|
|
17881
|
-
"required": ["
|
|
18451
|
+
"required": ["text"],
|
|
17882
18452
|
"properties": {
|
|
17883
|
-
"
|
|
18453
|
+
"heading": {
|
|
18454
|
+
"description": "An optional semantic heading for this section.",
|
|
18455
|
+
"type": "string",
|
|
18456
|
+
"minLength": 1,
|
|
18457
|
+
"maxLength": 200,
|
|
18458
|
+
"x-max-utf8-bytes": 800
|
|
18459
|
+
},
|
|
18460
|
+
"text": {
|
|
18461
|
+
"description": "The section body, also represented in the complete fallback text.",
|
|
18462
|
+
"type": "string",
|
|
18463
|
+
"minLength": 1,
|
|
18464
|
+
"maxLength": 1000,
|
|
18465
|
+
"x-max-utf8-bytes": 4000
|
|
18466
|
+
}
|
|
17884
18467
|
},
|
|
17885
18468
|
"additionalProperties": false
|
|
17886
18469
|
},
|
|
17887
|
-
"
|
|
18470
|
+
"DocumentSectionBlock": {
|
|
18471
|
+
"description": "One prose section in an ordered portable document.",
|
|
17888
18472
|
"type": "object",
|
|
17889
|
-
"
|
|
17890
|
-
"required": ["provider", "action", "connection_id"],
|
|
18473
|
+
"required": ["type", "text"],
|
|
17891
18474
|
"properties": {
|
|
17892
|
-
"
|
|
17893
|
-
|
|
17894
|
-
|
|
17895
|
-
"action": {
|
|
18475
|
+
"type": { "const": "section" },
|
|
18476
|
+
"heading": {
|
|
18477
|
+
"description": "An optional semantic heading for this section.",
|
|
17896
18478
|
"type": "string",
|
|
17897
|
-
"
|
|
18479
|
+
"minLength": 1,
|
|
18480
|
+
"maxLength": 200,
|
|
18481
|
+
"x-max-utf8-bytes": 800
|
|
17898
18482
|
},
|
|
17899
|
-
"
|
|
18483
|
+
"text": {
|
|
18484
|
+
"description": "The section prose.",
|
|
18485
|
+
"type": "string",
|
|
18486
|
+
"minLength": 1,
|
|
18487
|
+
"maxLength": 1000,
|
|
18488
|
+
"x-max-utf8-bytes": 4000
|
|
18489
|
+
}
|
|
17900
18490
|
},
|
|
17901
18491
|
"additionalProperties": false
|
|
17902
18492
|
},
|
|
17903
|
-
"
|
|
17904
|
-
"type": "string",
|
|
17905
|
-
"enum": ["active", "invited"],
|
|
17906
|
-
"description": "`active` has joined. `invited` has an invitation they have not accepted."
|
|
17907
|
-
},
|
|
17908
|
-
"TeammateProjectAccess": {
|
|
18493
|
+
"DocumentFact": {
|
|
17909
18494
|
"type": "object",
|
|
17910
|
-
"
|
|
17911
|
-
"required": ["all", "project_ids"],
|
|
18495
|
+
"required": ["label", "value"],
|
|
17912
18496
|
"properties": {
|
|
17913
|
-
"
|
|
17914
|
-
|
|
17915
|
-
"type": "
|
|
17916
|
-
"
|
|
17917
|
-
"
|
|
17918
|
-
"
|
|
17919
|
-
|
|
17920
|
-
|
|
17921
|
-
|
|
17922
|
-
|
|
17923
|
-
|
|
17924
|
-
|
|
17925
|
-
|
|
17926
|
-
|
|
17927
|
-
|
|
17928
|
-
|
|
17929
|
-
"reauthorization_required",
|
|
17930
|
-
"revoked",
|
|
17931
|
-
"invalid"
|
|
17932
|
-
],
|
|
17933
|
-
"description": "The safe customer-facing lifecycle of a provider installation. Credential and provider-native state stay private."
|
|
18497
|
+
"label": {
|
|
18498
|
+
"description": "The semantic label for this fact.",
|
|
18499
|
+
"type": "string",
|
|
18500
|
+
"minLength": 1,
|
|
18501
|
+
"maxLength": 200,
|
|
18502
|
+
"x-max-utf8-bytes": 800
|
|
18503
|
+
},
|
|
18504
|
+
"value": {
|
|
18505
|
+
"description": "The semantic value for this fact.",
|
|
18506
|
+
"type": "string",
|
|
18507
|
+
"minLength": 1,
|
|
18508
|
+
"maxLength": 1000,
|
|
18509
|
+
"x-max-utf8-bytes": 4000
|
|
18510
|
+
}
|
|
18511
|
+
},
|
|
18512
|
+
"additionalProperties": false
|
|
17934
18513
|
},
|
|
17935
|
-
"
|
|
17936
|
-
"description": "
|
|
17937
|
-
"
|
|
17938
|
-
|
|
17939
|
-
|
|
17940
|
-
|
|
17941
|
-
|
|
17942
|
-
|
|
17943
|
-
|
|
17944
|
-
|
|
17945
|
-
|
|
17946
|
-
|
|
17947
|
-
|
|
17948
|
-
|
|
17949
|
-
|
|
17950
|
-
|
|
17951
|
-
|
|
17952
|
-
|
|
18514
|
+
"DocumentFactsBlock": {
|
|
18515
|
+
"description": "One ordered group of semantic label/value facts.",
|
|
18516
|
+
"type": "object",
|
|
18517
|
+
"required": ["type", "items"],
|
|
18518
|
+
"properties": {
|
|
18519
|
+
"type": { "const": "facts" },
|
|
18520
|
+
"items": {
|
|
18521
|
+
"type": "array",
|
|
18522
|
+
"minItems": 1,
|
|
18523
|
+
"maxItems": 24,
|
|
18524
|
+
"items": { "$ref": "#/components/schemas/DocumentFact" }
|
|
18525
|
+
}
|
|
18526
|
+
},
|
|
18527
|
+
"additionalProperties": false
|
|
18528
|
+
},
|
|
18529
|
+
"DocumentTableCell": {
|
|
18530
|
+
"type": "string",
|
|
18531
|
+
"minLength": 1,
|
|
18532
|
+
"maxLength": 500,
|
|
18533
|
+
"x-max-utf8-bytes": 2000
|
|
18534
|
+
},
|
|
18535
|
+
"DocumentTableRow": {
|
|
18536
|
+
"type": "array",
|
|
18537
|
+
"minItems": 2,
|
|
18538
|
+
"maxItems": 8,
|
|
18539
|
+
"items": { "$ref": "#/components/schemas/DocumentTableCell" }
|
|
18540
|
+
},
|
|
18541
|
+
"DocumentTableBlock": {
|
|
18542
|
+
"description": "One small semantic table. Every row must have exactly one cell for each column.",
|
|
18543
|
+
"type": "object",
|
|
18544
|
+
"required": ["type", "heading", "columns", "rows"],
|
|
18545
|
+
"properties": {
|
|
18546
|
+
"type": { "const": "table" },
|
|
18547
|
+
"heading": {
|
|
18548
|
+
"description": "The semantic heading for this table.",
|
|
18549
|
+
"type": "string",
|
|
18550
|
+
"minLength": 1,
|
|
18551
|
+
"maxLength": 200,
|
|
18552
|
+
"x-max-utf8-bytes": 800
|
|
17953
18553
|
},
|
|
17954
|
-
{
|
|
17955
|
-
"
|
|
17956
|
-
"
|
|
17957
|
-
"
|
|
17958
|
-
|
|
17959
|
-
|
|
17960
|
-
},
|
|
17961
|
-
"additionalProperties": false
|
|
18554
|
+
"columns": {
|
|
18555
|
+
"description": "The ordered column headings.",
|
|
18556
|
+
"type": "array",
|
|
18557
|
+
"minItems": 2,
|
|
18558
|
+
"maxItems": 8,
|
|
18559
|
+
"items": { "$ref": "#/components/schemas/DocumentTableCell" }
|
|
17962
18560
|
},
|
|
17963
|
-
{
|
|
17964
|
-
"
|
|
17965
|
-
"
|
|
17966
|
-
"
|
|
17967
|
-
|
|
17968
|
-
|
|
17969
|
-
|
|
17970
|
-
|
|
17971
|
-
|
|
18561
|
+
"rows": {
|
|
18562
|
+
"description": "The ordered table rows.",
|
|
18563
|
+
"type": "array",
|
|
18564
|
+
"minItems": 1,
|
|
18565
|
+
"maxItems": 20,
|
|
18566
|
+
"items": { "$ref": "#/components/schemas/DocumentTableRow" }
|
|
18567
|
+
}
|
|
18568
|
+
},
|
|
18569
|
+
"x-rows-match-columns": true,
|
|
18570
|
+
"additionalProperties": false
|
|
18571
|
+
},
|
|
18572
|
+
"DocumentDetailsBlock": {
|
|
18573
|
+
"description": "One supporting disclosure in an ordered portable document.",
|
|
18574
|
+
"type": "object",
|
|
18575
|
+
"required": ["type", "summary", "text"],
|
|
18576
|
+
"properties": {
|
|
18577
|
+
"type": { "const": "details" },
|
|
18578
|
+
"summary": {
|
|
18579
|
+
"description": "The always-visible semantic summary.",
|
|
18580
|
+
"type": "string",
|
|
18581
|
+
"minLength": 1,
|
|
18582
|
+
"maxLength": 200,
|
|
18583
|
+
"x-max-utf8-bytes": 800
|
|
17972
18584
|
},
|
|
17973
|
-
{
|
|
17974
|
-
"
|
|
17975
|
-
"
|
|
17976
|
-
"
|
|
17977
|
-
|
|
17978
|
-
|
|
17979
|
-
},
|
|
17980
|
-
"additionalProperties": false
|
|
18585
|
+
"text": {
|
|
18586
|
+
"description": "The supporting prose.",
|
|
18587
|
+
"type": "string",
|
|
18588
|
+
"minLength": 1,
|
|
18589
|
+
"maxLength": 2000,
|
|
18590
|
+
"x-max-utf8-bytes": 8000
|
|
17981
18591
|
}
|
|
18592
|
+
},
|
|
18593
|
+
"additionalProperties": false
|
|
18594
|
+
},
|
|
18595
|
+
"DocumentBlock": {
|
|
18596
|
+
"oneOf": [
|
|
18597
|
+
{ "$ref": "#/components/schemas/DocumentSectionBlock" },
|
|
18598
|
+
{ "$ref": "#/components/schemas/DocumentFactsBlock" },
|
|
18599
|
+
{ "$ref": "#/components/schemas/DocumentTableBlock" },
|
|
18600
|
+
{ "$ref": "#/components/schemas/DocumentDetailsBlock" }
|
|
17982
18601
|
]
|
|
17983
18602
|
},
|
|
17984
|
-
"
|
|
18603
|
+
"DocumentContent": {
|
|
18604
|
+
"description": "An authoritative ordered portable notification document that every delivery adapter renders faithfully.",
|
|
18605
|
+
"type": "object",
|
|
18606
|
+
"required": ["type", "blocks"],
|
|
18607
|
+
"properties": {
|
|
18608
|
+
"type": { "const": "document" },
|
|
18609
|
+
"title": {
|
|
18610
|
+
"description": "An optional semantic document title. The adapter chooses its native presentation.",
|
|
18611
|
+
"type": "string",
|
|
18612
|
+
"minLength": 1,
|
|
18613
|
+
"maxLength": 200,
|
|
18614
|
+
"x-max-utf8-bytes": 800
|
|
18615
|
+
},
|
|
18616
|
+
"blocks": {
|
|
18617
|
+
"description": "The complete portable document in exact authored order.",
|
|
18618
|
+
"type": "array",
|
|
18619
|
+
"minItems": 1,
|
|
18620
|
+
"maxItems": 24,
|
|
18621
|
+
"items": { "$ref": "#/components/schemas/DocumentBlock" }
|
|
18622
|
+
},
|
|
18623
|
+
"image": { "$ref": "#/components/schemas/NotificationImage" }
|
|
18624
|
+
},
|
|
18625
|
+
"additionalProperties": false
|
|
18626
|
+
},
|
|
18627
|
+
"MessageContent": {
|
|
18628
|
+
"oneOf": [
|
|
18629
|
+
{ "$ref": "#/components/schemas/TextContent" },
|
|
18630
|
+
{ "$ref": "#/components/schemas/DocumentContent" }
|
|
18631
|
+
]
|
|
18632
|
+
},
|
|
18633
|
+
"MetadataValue": {
|
|
18634
|
+
"oneOf": [
|
|
18635
|
+
{ "type": "string" },
|
|
18636
|
+
{ "type": "number" },
|
|
18637
|
+
{ "type": "boolean" },
|
|
18638
|
+
{ "type": "null" }
|
|
18639
|
+
]
|
|
18640
|
+
},
|
|
18641
|
+
"Metadata": {
|
|
18642
|
+
"type": "object",
|
|
18643
|
+
"description": "Bounded customer correlation data. Do not include secrets or personal data.",
|
|
18644
|
+
"maxProperties": 20,
|
|
18645
|
+
"propertyNames": { "minLength": 1, "maxLength": 64 },
|
|
18646
|
+
"additionalProperties": {
|
|
18647
|
+
"$ref": "#/components/schemas/MetadataValue"
|
|
18648
|
+
},
|
|
18649
|
+
"x-max-json-bytes": 4096
|
|
18650
|
+
},
|
|
18651
|
+
"InteractionPrompt": {
|
|
17985
18652
|
"type": "string",
|
|
17986
|
-
"minLength":
|
|
17987
|
-
"maxLength":
|
|
17988
|
-
"pattern": "^(?=.{1,253}$)(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\\.){2,}[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$",
|
|
17989
|
-
"description": "A canonical lower-case IDNA ASCII customer sending domain with its trailing dot removed. It must be a dedicated subdomain below the registrable domain; runtime validation uses the public suffix list so a registrable root such as example.co.uk is still rejected. URLs, ports, wildcards and mailbox addresses are invalid."
|
|
18653
|
+
"minLength": 1,
|
|
18654
|
+
"maxLength": 1000
|
|
17990
18655
|
},
|
|
17991
|
-
"
|
|
18656
|
+
"Timestamp-2": {
|
|
17992
18657
|
"type": "string",
|
|
17993
|
-
"
|
|
17994
|
-
|
|
17995
|
-
"creating",
|
|
17996
|
-
"dns_required",
|
|
17997
|
-
"verifying",
|
|
17998
|
-
"testing",
|
|
17999
|
-
"active",
|
|
18000
|
-
"provider_action_required",
|
|
18001
|
-
"dns_failed",
|
|
18002
|
-
"oauth_required",
|
|
18003
|
-
"held",
|
|
18004
|
-
"deleting",
|
|
18005
|
-
"deleted"
|
|
18006
|
-
],
|
|
18007
|
-
"description": "The provider-neutral domain lifecycle. Sending and receiving capabilities are reported separately because they verify on different clocks."
|
|
18658
|
+
"format": "date-time",
|
|
18659
|
+
"pattern": "^[0-9]{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12][0-9]|3[01])T(?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:Z|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])$"
|
|
18008
18660
|
},
|
|
18009
|
-
"
|
|
18661
|
+
"InteractionCorrelationId": {
|
|
18010
18662
|
"type": "string",
|
|
18011
|
-
"
|
|
18663
|
+
"minLength": 8,
|
|
18664
|
+
"maxLength": 128,
|
|
18665
|
+
"pattern": "^[^\\u0000-\\u001F\\u007F]+$",
|
|
18666
|
+
"description": "Caller-owned opaque correlation returned as data, never treated as execution authority."
|
|
18012
18667
|
},
|
|
18013
|
-
"
|
|
18668
|
+
"ConfirmInteractionRequest": {
|
|
18669
|
+
"type": "object",
|
|
18670
|
+
"required": ["type", "prompt", "expires_at"],
|
|
18671
|
+
"properties": {
|
|
18672
|
+
"type": { "const": "confirm" },
|
|
18673
|
+
"prompt": { "$ref": "#/components/schemas/InteractionPrompt" },
|
|
18674
|
+
"confirm_label": {
|
|
18675
|
+
"type": "string",
|
|
18676
|
+
"minLength": 1,
|
|
18677
|
+
"maxLength": 40
|
|
18678
|
+
},
|
|
18679
|
+
"deny_label": { "type": "string", "minLength": 1, "maxLength": 40 },
|
|
18680
|
+
"expires_at": {
|
|
18681
|
+
"$ref": "#/components/schemas/Timestamp-2",
|
|
18682
|
+
"description": "Must be 30 seconds through 24 hours after server acceptance."
|
|
18683
|
+
},
|
|
18684
|
+
"correlation_id": {
|
|
18685
|
+
"$ref": "#/components/schemas/InteractionCorrelationId"
|
|
18686
|
+
}
|
|
18687
|
+
},
|
|
18688
|
+
"additionalProperties": false
|
|
18689
|
+
},
|
|
18690
|
+
"InteractionOption": {
|
|
18691
|
+
"type": "object",
|
|
18692
|
+
"required": ["value", "label"],
|
|
18693
|
+
"properties": {
|
|
18694
|
+
"value": {
|
|
18695
|
+
"type": "string",
|
|
18696
|
+
"minLength": 1,
|
|
18697
|
+
"maxLength": 128,
|
|
18698
|
+
"pattern": "^[^\\u0000-\\u001F\\u007F]+$",
|
|
18699
|
+
"description": "Opaque customer data. It is never interpreted as a command."
|
|
18700
|
+
},
|
|
18701
|
+
"label": { "type": "string", "minLength": 1, "maxLength": 120 },
|
|
18702
|
+
"intent": {
|
|
18703
|
+
"type": "string",
|
|
18704
|
+
"enum": ["accept", "destructive", "informational", "neutral"],
|
|
18705
|
+
"default": "neutral",
|
|
18706
|
+
"description": "What choosing this option does, so a channel can present it accordingly. Describes consequence rather than appearance: a channel renders `accept` green where it can, `destructive` red, `informational` prominent, and `neutral` plainly. A channel that cannot colour a control ignores this and the option still renders. Omitted means `neutral`."
|
|
18707
|
+
}
|
|
18708
|
+
},
|
|
18709
|
+
"additionalProperties": false
|
|
18710
|
+
},
|
|
18711
|
+
"SelectInteractionRequest": {
|
|
18712
|
+
"type": "object",
|
|
18713
|
+
"required": ["type", "prompt", "options", "expires_at"],
|
|
18714
|
+
"properties": {
|
|
18715
|
+
"type": { "const": "select" },
|
|
18716
|
+
"prompt": { "$ref": "#/components/schemas/InteractionPrompt" },
|
|
18717
|
+
"options": {
|
|
18718
|
+
"type": "array",
|
|
18719
|
+
"minItems": 2,
|
|
18720
|
+
"maxItems": 6,
|
|
18721
|
+
"items": { "$ref": "#/components/schemas/InteractionOption" },
|
|
18722
|
+
"x-unique-property": "value"
|
|
18723
|
+
},
|
|
18724
|
+
"expires_at": {
|
|
18725
|
+
"$ref": "#/components/schemas/Timestamp-2",
|
|
18726
|
+
"description": "Must be 30 seconds through 24 hours after server acceptance."
|
|
18727
|
+
},
|
|
18728
|
+
"correlation_id": {
|
|
18729
|
+
"$ref": "#/components/schemas/InteractionCorrelationId"
|
|
18730
|
+
}
|
|
18731
|
+
},
|
|
18732
|
+
"additionalProperties": false
|
|
18733
|
+
},
|
|
18734
|
+
"InputInteractionRequest": {
|
|
18735
|
+
"type": "object",
|
|
18736
|
+
"required": ["type", "prompt", "expires_at"],
|
|
18737
|
+
"properties": {
|
|
18738
|
+
"type": { "const": "input" },
|
|
18739
|
+
"prompt": { "$ref": "#/components/schemas/InteractionPrompt" },
|
|
18740
|
+
"expires_at": {
|
|
18741
|
+
"$ref": "#/components/schemas/Timestamp-2",
|
|
18742
|
+
"description": "Must be 30 seconds through 24 hours after server acceptance."
|
|
18743
|
+
},
|
|
18744
|
+
"correlation_id": {
|
|
18745
|
+
"$ref": "#/components/schemas/InteractionCorrelationId"
|
|
18746
|
+
}
|
|
18747
|
+
},
|
|
18748
|
+
"additionalProperties": false
|
|
18749
|
+
},
|
|
18750
|
+
"HighestProvenProviderState": {
|
|
18751
|
+
"type": "string",
|
|
18752
|
+
"enum": ["none", "provider_accepted"],
|
|
18753
|
+
"description": "The strongest provider assertion the service can prove; it is not an end-device delivery receipt."
|
|
18754
|
+
},
|
|
18755
|
+
"ClassifiedError": {
|
|
18756
|
+
"type": "object",
|
|
18757
|
+
"description": "A stable, safe error classification with no provider response or credential material.",
|
|
18758
|
+
"required": ["code", "retryable"],
|
|
18759
|
+
"properties": {
|
|
18760
|
+
"code": { "$ref": "#/components/schemas/ProblemCode" },
|
|
18761
|
+
"retryable": { "type": "boolean" },
|
|
18762
|
+
"detail": { "type": "string", "minLength": 1, "maxLength": 1024 },
|
|
18763
|
+
"diagnostic_id": { "$ref": "#/components/schemas/DiagnosticId" }
|
|
18764
|
+
},
|
|
18765
|
+
"additionalProperties": false
|
|
18766
|
+
},
|
|
18767
|
+
"Environment": {
|
|
18768
|
+
"type": "string",
|
|
18769
|
+
"enum": ["test", "live"],
|
|
18770
|
+
"description": "The single environment selected by the authenticated credential."
|
|
18771
|
+
},
|
|
18772
|
+
"EmailAddress": {
|
|
18773
|
+
"type": "string",
|
|
18774
|
+
"minLength": 3,
|
|
18775
|
+
"maxLength": 254,
|
|
18776
|
+
"pattern": "^(?=[^@]{1,64}@)(?!\\.)(?![^@]*\\.@)(?![^@]*\\.\\.)[A-Za-z0-9!#$%&'*+/=?^_`{|}~.-]+@(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$",
|
|
18777
|
+
"description": "Exactly one mailbox: an unquoted ASCII dot-atom local part plus a canonical lower-case IDNA domain. The comparison key preserves local-part bytes and case and lower-cases only the domain; dot, plus-tag, alias and provider equivalence are never inferred."
|
|
18778
|
+
},
|
|
18779
|
+
"BroadcastMessageProvenance": {
|
|
18780
|
+
"type": "object",
|
|
18781
|
+
"description": "Provenance carried by an ordinary message created during group expansion. The broadcast, message subscriber_id, and exact historical membership generation form the child uniqueness boundary.",
|
|
18782
|
+
"required": ["broadcast_id", "group_id", "membership_generation"],
|
|
18783
|
+
"properties": {
|
|
18784
|
+
"broadcast_id": { "$ref": "#/components/schemas/OpaqueIdentifier" },
|
|
18785
|
+
"group_id": { "$ref": "#/components/schemas/OpaqueIdentifier" },
|
|
18786
|
+
"membership_generation": { "type": "integer", "minimum": 1 }
|
|
18787
|
+
},
|
|
18788
|
+
"additionalProperties": false
|
|
18789
|
+
},
|
|
18790
|
+
"MessageDeliveryTarget": {
|
|
18791
|
+
"type": "string",
|
|
18792
|
+
"enum": ["connection", "simulator"],
|
|
18793
|
+
"description": "The effective provider boundary selected for a message. Connection delivery uses the exact authorized environment connection; simulator delivery never calls a provider."
|
|
18794
|
+
},
|
|
18795
|
+
"TrimmedInputAnswer": {
|
|
18796
|
+
"type": "string",
|
|
18797
|
+
"minLength": 1,
|
|
18798
|
+
"maxLength": 4000,
|
|
18799
|
+
"pattern": "^\\S(?:[\\s\\S]*\\S)?$",
|
|
18800
|
+
"description": "Untrusted input text after leading and trailing whitespace is removed."
|
|
18801
|
+
},
|
|
18802
|
+
"OpaqueIdentifier-2": {
|
|
18803
|
+
"type": "string",
|
|
18804
|
+
"minLength": 1,
|
|
18805
|
+
"maxLength": 128,
|
|
18806
|
+
"pattern": "^[^\\u0000-\\u001F\\u007F]+$",
|
|
18807
|
+
"description": "An opaque identifier whose internal encoding is not a public promise."
|
|
18808
|
+
},
|
|
18809
|
+
"InteractionState": {
|
|
18810
|
+
"type": "string",
|
|
18811
|
+
"enum": ["open", "answered", "expired", "cancelled", "retired"]
|
|
18812
|
+
},
|
|
18813
|
+
"DeveloperKey": {
|
|
18814
|
+
"type": "string",
|
|
18815
|
+
"minLength": 1,
|
|
18816
|
+
"maxLength": 63,
|
|
18817
|
+
"pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
|
|
18818
|
+
"description": "A stable, lowercase developer key used by registered return destinations and subscriber groups."
|
|
18819
|
+
},
|
|
18820
|
+
"BroadcastAggregate": {
|
|
18014
18821
|
"type": "object",
|
|
18822
|
+
"description": "A projection over expansion and ordinary child-message states, not an independent delivery state machine.",
|
|
18015
18823
|
"required": [
|
|
18016
|
-
"
|
|
18017
|
-
"
|
|
18018
|
-
"
|
|
18019
|
-
"
|
|
18020
|
-
"
|
|
18824
|
+
"audience",
|
|
18825
|
+
"expanded",
|
|
18826
|
+
"pending",
|
|
18827
|
+
"provider_accepted",
|
|
18828
|
+
"delivered",
|
|
18829
|
+
"skipped",
|
|
18830
|
+
"failed",
|
|
18831
|
+
"cancelled",
|
|
18832
|
+
"expired"
|
|
18021
18833
|
],
|
|
18022
18834
|
"properties": {
|
|
18023
|
-
"
|
|
18024
|
-
|
|
18025
|
-
},
|
|
18026
|
-
"
|
|
18027
|
-
|
|
18028
|
-
},
|
|
18029
|
-
"
|
|
18030
|
-
"
|
|
18031
|
-
"
|
|
18032
|
-
"type": "boolean",
|
|
18033
|
-
"description": "False when free-text replies cannot be lowered: receiving may not be verified yet, or the provider team may have message-content storage disabled. Delivery and link-based interaction remain independently available; no undocumented eligibility or storage-state endpoint is assumed."
|
|
18034
|
-
}
|
|
18835
|
+
"audience": { "type": "integer", "minimum": 0 },
|
|
18836
|
+
"expanded": { "type": "integer", "minimum": 0 },
|
|
18837
|
+
"pending": { "type": "integer", "minimum": 0 },
|
|
18838
|
+
"provider_accepted": { "type": "integer", "minimum": 0 },
|
|
18839
|
+
"delivered": { "type": "integer", "minimum": 0 },
|
|
18840
|
+
"skipped": { "type": "integer", "minimum": 0 },
|
|
18841
|
+
"failed": { "type": "integer", "minimum": 0 },
|
|
18842
|
+
"cancelled": { "type": "integer", "minimum": 0 },
|
|
18843
|
+
"expired": { "type": "integer", "minimum": 0 }
|
|
18035
18844
|
},
|
|
18036
18845
|
"additionalProperties": false
|
|
18037
18846
|
},
|
|
18038
|
-
"
|
|
18039
|
-
"description": "
|
|
18847
|
+
"EmailBindingConsent": {
|
|
18848
|
+
"description": "How consent for this exact subscriber, notifier and connection was established. A customer assertion never becomes recipient-observed verification. Complaint, unsubscribe and suppression override either arm.",
|
|
18040
18849
|
"oneOf": [
|
|
18041
18850
|
{
|
|
18042
18851
|
"type": "object",
|
|
18043
|
-
"required": ["
|
|
18852
|
+
"required": ["kind", "observed_at"],
|
|
18044
18853
|
"properties": {
|
|
18045
|
-
"
|
|
18046
|
-
"
|
|
18047
|
-
"type": "string",
|
|
18048
|
-
"minLength": 1,
|
|
18049
|
-
"maxLength": 253,
|
|
18050
|
-
"pattern": "^[^\u0000-\u001f-
]+$"
|
|
18051
|
-
},
|
|
18052
|
-
"value": {
|
|
18053
|
-
"type": "string",
|
|
18054
|
-
"minLength": 1,
|
|
18055
|
-
"maxLength": 2048,
|
|
18056
|
-
"pattern": "^[^\u0000-\u001f-
]+$"
|
|
18057
|
-
},
|
|
18058
|
-
"priority": { "type": "integer", "minimum": 0, "maximum": 65535 },
|
|
18059
|
-
"status": {
|
|
18060
|
-
"enum": [
|
|
18061
|
-
"not_started",
|
|
18062
|
-
"pending",
|
|
18063
|
-
"verified",
|
|
18064
|
-
"failed",
|
|
18065
|
-
"temporary_failure"
|
|
18066
|
-
]
|
|
18067
|
-
}
|
|
18854
|
+
"kind": { "const": "recipient_observed" },
|
|
18855
|
+
"observed_at": { "$ref": "#/components/schemas/Timestamp" }
|
|
18068
18856
|
},
|
|
18069
18857
|
"additionalProperties": false
|
|
18070
18858
|
},
|
|
18071
18859
|
{
|
|
18072
18860
|
"type": "object",
|
|
18073
|
-
"required": ["
|
|
18861
|
+
"required": ["kind", "consented_at", "source"],
|
|
18074
18862
|
"properties": {
|
|
18075
|
-
"
|
|
18076
|
-
"
|
|
18863
|
+
"kind": { "const": "asserted_prior_consent" },
|
|
18864
|
+
"consented_at": { "$ref": "#/components/schemas/Timestamp" },
|
|
18865
|
+
"source": {
|
|
18077
18866
|
"type": "string",
|
|
18078
18867
|
"minLength": 1,
|
|
18079
|
-
"maxLength":
|
|
18080
|
-
"pattern": "^[^\u0000-\u001f-
]+$"
|
|
18868
|
+
"maxLength": 100,
|
|
18869
|
+
"pattern": "^[^\u0000-\u001f-
]+$",
|
|
18870
|
+
"description": "A bounded customer description of where consent was collected. The authenticated asserting actor is recorded by the service, never accepted from this object."
|
|
18081
18871
|
},
|
|
18082
|
-
"
|
|
18083
|
-
|
|
18084
|
-
"
|
|
18085
|
-
"
|
|
18086
|
-
"
|
|
18872
|
+
"asserted_at": { "$ref": "#/components/schemas/Timestamp" },
|
|
18873
|
+
"asserted_by": {
|
|
18874
|
+
"type": "object",
|
|
18875
|
+
"required": ["kind", "id"],
|
|
18876
|
+
"properties":
|
|
18877
|
+
"kind": { "enum": ["credential", "grant", "session"] },
|
|
18878
|
+
"id": { "$ref": "#/components/schemas/OpaqueIdentifier" }
|
|
18879
|
+
},
|
|
18880
|
+
"additionalProperties": false
|
|
18087
18881
|
},
|
|
18088
|
-
"
|
|
18089
|
-
"enum": [
|
|
18090
|
-
"not_started",
|
|
18091
|
-
"pending",
|
|
18092
|
-
"verified",
|
|
18093
|
-
"failed",
|
|
18094
|
-
"temporary_failure"
|
|
18095
|
-
]
|
|
18096
|
-
}
|
|
18882
|
+
"domain_id": { "$ref": "#/components/schemas/OpaqueIdentifier" }
|
|
18097
18883
|
},
|
|
18098
18884
|
"additionalProperties": false
|
|
18099
18885
|
}
|
|
18100
18886
|
]
|
|
18101
18887
|
},
|
|
18102
|
-
"
|
|
18888
|
+
"RecipientChannelSummary": {
|
|
18103
18889
|
"type": "object",
|
|
18104
|
-
"
|
|
18890
|
+
"description": "Safe state for one configured channel. Provider identities, credentials, callback state, and other subscribers are absent.",
|
|
18891
|
+
"required": ["channel", "state", "preferred"],
|
|
18105
18892
|
"properties": {
|
|
18893
|
+
"channel": { "$ref": "#/components/schemas/Channel" },
|
|
18106
18894
|
"state": {
|
|
18107
|
-
"enum": [
|
|
18108
|
-
"detecting",
|
|
18109
|
-
"guided",
|
|
18110
|
-
"domain_connect_available",
|
|
18111
|
-
"complete",
|
|
18112
|
-
"unavailable"
|
|
18113
|
-
]
|
|
18114
|
-
},
|
|
18115
|
-
"dns_provider": {
|
|
18116
18895
|
"type": "string",
|
|
18117
|
-
"
|
|
18118
|
-
"maxLength": 100,
|
|
18119
|
-
"pattern": "^[^\u0000-\u001f-
]+$"
|
|
18896
|
+
"enum": ["available", "connected", "paused"]
|
|
18120
18897
|
},
|
|
18121
|
-
"
|
|
18898
|
+
"binding_id": {
|
|
18899
|
+
"$ref": "#/components/schemas/OpaqueIdentifier",
|
|
18900
|
+
"description": "The exact binding owned by this session's subscriber. Present only for connected or paused state."
|
|
18901
|
+
},
|
|
18902
|
+
"preferred": { "type": "boolean" },
|
|
18903
|
+
"connection_id": { "$ref": "#/components/schemas/OpaqueIdentifier" },
|
|
18904
|
+
"masked_address": {
|
|
18122
18905
|
"type": "string",
|
|
18123
|
-
"
|
|
18124
|
-
"
|
|
18125
|
-
"
|
|
18126
|
-
"description": "A short-lived secret-free instruction link for a DNS administrator. It contains no WhooshBang session or provider OAuth material."
|
|
18127
|
-
}
|
|
18128
|
-
},
|
|
18129
|
-
"allOf": [
|
|
18130
|
-
{
|
|
18131
|
-
"if": {
|
|
18132
|
-
"properties": {
|
|
18133
|
-
"state": {
|
|
18134
|
-
"enum": ["guided", "domain_connect_available", "complete"]
|
|
18135
|
-
}
|
|
18136
|
-
},
|
|
18137
|
-
"required": ["state"]
|
|
18138
|
-
},
|
|
18139
|
-
"then": {
|
|
18140
|
-
"properties": { "dns_provider": true },
|
|
18141
|
-
"required": ["dns_provider"]
|
|
18142
|
-
},
|
|
18143
|
-
"else": { "properties": { "dns_provider": false } }
|
|
18144
|
-
}
|
|
18145
|
-
],
|
|
18146
|
-
"additionalProperties": false
|
|
18147
|
-
},
|
|
18148
|
-
"EmailSubjectPolicy": {
|
|
18149
|
-
"type": "object",
|
|
18150
|
-
"description": "The fixed subject rendering contract. Notification title wins; otherwise localized copy equivalent to `Notification from {notifier display name}` is used. Whitespace is normalized and the final value is capped at 200 Unicode code points.",
|
|
18151
|
-
"required": ["fallback", "maximum_code_points", "normalize_whitespace"],
|
|
18152
|
-
"properties": {
|
|
18153
|
-
"fallback": { "const": "localized_notifier_name" },
|
|
18154
|
-
"maximum_code_points": { "const": 200 },
|
|
18155
|
-
"normalize_whitespace": { "const": true }
|
|
18156
|
-
},
|
|
18157
|
-
"additionalProperties": false
|
|
18158
|
-
},
|
|
18159
|
-
"EmailDeliveryPolicy": {
|
|
18160
|
-
"type": "object",
|
|
18161
|
-
"description": "Privacy-safe email defaults. Return-Path and Message-ID remain provider-owned, arbitrary headers are unsupported, and every ordinary message carries a visible management route plus safe one-click unsubscribe semantics when custom headers are available. A GET never mutates consent; the matching POST resolves the exact binding.",
|
|
18162
|
-
"required": [
|
|
18163
|
-
"open_tracking",
|
|
18164
|
-
"click_tracking",
|
|
18165
|
-
"tls",
|
|
18166
|
-
"unsubscribe",
|
|
18167
|
-
"subject"
|
|
18168
|
-
],
|
|
18169
|
-
"properties": {
|
|
18170
|
-
"open_tracking": { "const": false },
|
|
18171
|
-
"click_tracking": { "const": false },
|
|
18172
|
-
"tls": {
|
|
18173
|
-
"enum": ["opportunistic", "enforced"],
|
|
18174
|
-
"default": "opportunistic"
|
|
18906
|
+
"minLength": 3,
|
|
18907
|
+
"maxLength": 254,
|
|
18908
|
+
"description": "Masked recipient address. Never the full mailbox."
|
|
18175
18909
|
},
|
|
18176
|
-
"
|
|
18177
|
-
|
|
18178
|
-
|
|
18179
|
-
|
|
18180
|
-
|
|
18181
|
-
|
|
18182
|
-
|
|
18183
|
-
|
|
18184
|
-
|
|
18185
|
-
|
|
18186
|
-
|
|
18187
|
-
|
|
18188
|
-
|
|
18189
|
-
|
|
18190
|
-
|
|
18191
|
-
|
|
18192
|
-
|
|
18193
|
-
|
|
18194
|
-
|
|
18195
|
-
|
|
18196
|
-
|
|
18197
|
-
|
|
18198
|
-
|
|
18199
|
-
|
|
18200
|
-
|
|
18201
|
-
],
|
|
18202
|
-
"description": "One organization-credential capability. `organization:read` is the organization's project directory — listing the organization's projects and reading one — and is the only scope here a project credential can never carry; it authorizes nothing below the organization. Every other name is the project-credential vocabulary unchanged, and is exercised only on the environment-scoped routes, where the project and environment come from the path and the credential's authority is the intersection of these scopes with the project-credential vocabulary. An organization credential is therefore never wider than a project credential would have been for the same project environment."
|
|
18203
|
-
},
|
|
18204
|
-
"OrganizationCredentialScopeSet": {
|
|
18205
|
-
"type": "array",
|
|
18206
|
-
"minItems": 1,
|
|
18207
|
-
"maxItems": 12,
|
|
18208
|
-
"uniqueItems": true,
|
|
18209
|
-
"items": { "$ref": "#/components/schemas/OrganizationCredentialScope" }
|
|
18210
|
-
},
|
|
18211
|
-
"OrganizationCredentialSecret": {
|
|
18212
|
-
"type": "string",
|
|
18213
|
-
"pattern": "^wb_oc1\\.ocred_[A-Za-z0-9_-]{21}[AQgw]\\.[A-Za-z0-9_-]{42}[AEIMQUYcgkosw048]$",
|
|
18214
|
-
"description": "The exact one-time runtime bearer syntax. The final segment is canonical unpadded base64url for exactly 32 random secret bytes."
|
|
18215
|
-
},
|
|
18216
|
-
"Environment": {
|
|
18217
|
-
"type": "string",
|
|
18218
|
-
"enum": ["test", "live"],
|
|
18219
|
-
"description": "The single environment selected by the authenticated credential."
|
|
18220
|
-
},
|
|
18221
|
-
"RecipientCopyOverrideValue": {
|
|
18222
|
-
"type": "string",
|
|
18223
|
-
"minLength": 1,
|
|
18224
|
-
"maxLength": 500,
|
|
18225
|
-
"description": "Customer-authored plain text with optional plain template placeholders. The service enforces key-specific length and rejects invisible controls. Rendering escapes text; changing labels does not change recipient control actions."
|
|
18226
|
-
},
|
|
18227
|
-
"ApiCredentialPrefix": {
|
|
18228
|
-
"type": "string",
|
|
18229
|
-
"pattern": "^wb_pc1\\.pcred_[A-Za-z0-9_-]{8}$",
|
|
18230
|
-
"description": "A safe display prefix containing the credential format marker and first eight base64url identity characters, never secret bytes."
|
|
18231
|
-
},
|
|
18232
|
-
"ApiCredentialScope": {
|
|
18233
|
-
"type": "string",
|
|
18234
|
-
"enum": [
|
|
18235
|
-
"projects:write",
|
|
18236
|
-
"projects:read",
|
|
18237
|
-
"messages:write",
|
|
18238
|
-
"messages:read",
|
|
18239
|
-
"subscriptions:write",
|
|
18240
|
-
"subscriptions:read",
|
|
18241
|
-
"machine-clients:write",
|
|
18242
|
-
"machine-clients:read",
|
|
18243
|
-
"capabilities:read",
|
|
18244
|
-
"connections:write",
|
|
18245
|
-
"connections:read"
|
|
18910
|
+
"consent": { "$ref": "#/components/schemas/EmailBindingConsent" }
|
|
18911
|
+
},
|
|
18912
|
+
"allOf": [
|
|
18913
|
+
{
|
|
18914
|
+
"if": {
|
|
18915
|
+
"properties": { "state": { "enum": ["connected", "paused"] } },
|
|
18916
|
+
"required": ["state"]
|
|
18917
|
+
},
|
|
18918
|
+
"then": {
|
|
18919
|
+
"required": ["binding_id"],
|
|
18920
|
+
"properties": { "binding_id": {} }
|
|
18921
|
+
}
|
|
18922
|
+
},
|
|
18923
|
+
{
|
|
18924
|
+
"if": {
|
|
18925
|
+
"properties": { "state": { "const": "available" } },
|
|
18926
|
+
"required": ["state"]
|
|
18927
|
+
},
|
|
18928
|
+
"then": {
|
|
18929
|
+
"properties": {
|
|
18930
|
+
"binding_id": false,
|
|
18931
|
+
"preferred": { "const": false }
|
|
18932
|
+
}
|
|
18933
|
+
}
|
|
18934
|
+
}
|
|
18246
18935
|
],
|
|
18247
|
-
"
|
|
18248
|
-
},
|
|
18249
|
-
"ApiCredentialScopeSet": {
|
|
18250
|
-
"type": "array",
|
|
18251
|
-
"minItems": 1,
|
|
18252
|
-
"maxItems": 11,
|
|
18253
|
-
"uniqueItems": true,
|
|
18254
|
-
"items": { "$ref": "#/components/schemas/ApiCredentialScope" }
|
|
18255
|
-
},
|
|
18256
|
-
"ApiCredentialSecret": {
|
|
18257
|
-
"type": "string",
|
|
18258
|
-
"pattern": "^wb_pc1\\.pcred_[A-Za-z0-9_-]{21}[AQgw]\\.[A-Za-z0-9_-]{42}[AEIMQUYcgkosw048]$",
|
|
18259
|
-
"description": "The exact one-time runtime bearer syntax. The final segment is canonical unpadded base64url for exactly 32 random secret bytes."
|
|
18936
|
+
"additionalProperties": false
|
|
18260
18937
|
},
|
|
18261
18938
|
"ConnectionIdentity": {
|
|
18262
18939
|
"type": "object",
|
|
@@ -18290,18 +18967,6 @@
|
|
|
18290
18967
|
],
|
|
18291
18968
|
"additionalProperties": false
|
|
18292
18969
|
},
|
|
18293
|
-
"ClassifiedError": {
|
|
18294
|
-
"type": "object",
|
|
18295
|
-
"description": "A stable, safe error classification with no provider response or credential material.",
|
|
18296
|
-
"required": ["code", "retryable"],
|
|
18297
|
-
"properties": {
|
|
18298
|
-
"code": { "$ref": "#/components/schemas/ProblemCode" },
|
|
18299
|
-
"retryable": { "type": "boolean" },
|
|
18300
|
-
"detail": { "type": "string", "minLength": 1, "maxLength": 1024 },
|
|
18301
|
-
"diagnostic_id": { "$ref": "#/components/schemas/DiagnosticId" }
|
|
18302
|
-
},
|
|
18303
|
-
"additionalProperties": false
|
|
18304
|
-
},
|
|
18305
18970
|
"EmailVerificationSummary": {
|
|
18306
18971
|
"type": "object",
|
|
18307
18972
|
"required": ["status", "masked_address", "expires_at"],
|
|
@@ -18317,353 +18982,395 @@
|
|
|
18317
18982
|
},
|
|
18318
18983
|
"additionalProperties": false
|
|
18319
18984
|
},
|
|
18320
|
-
"
|
|
18321
|
-
"type": "object",
|
|
18322
|
-
"required": ["subscriber_id"],
|
|
18323
|
-
"properties": {
|
|
18324
|
-
"subscriber_id": { "$ref": "#/components/schemas/OpaqueIdentifier" }
|
|
18325
|
-
},
|
|
18326
|
-
"additionalProperties": false
|
|
18327
|
-
},
|
|
18328
|
-
"MessageDeliveryTarget": {
|
|
18985
|
+
"OrganizationRole": {
|
|
18329
18986
|
"type": "string",
|
|
18330
|
-
"enum": ["
|
|
18331
|
-
"description": "The
|
|
18987
|
+
"enum": ["admin", "member", "messenger"],
|
|
18988
|
+
"description": "The person's WhooshBang role in the organization. `admin` does everything, including billing, API keys and teammates. `member` runs the projects they were given: channels, subscribers, messages and project settings. `messenger` sends messages and reads replies in the projects they were given. Clients must tolerate roles added later."
|
|
18332
18989
|
},
|
|
18333
|
-
"
|
|
18990
|
+
"OrganizationMembershipSummary": {
|
|
18334
18991
|
"type": "object",
|
|
18335
|
-
"required": ["
|
|
18992
|
+
"required": ["role"],
|
|
18336
18993
|
"properties": {
|
|
18337
|
-
"
|
|
18338
|
-
"description": "An optional semantic heading for this section.",
|
|
18339
|
-
"type": "string",
|
|
18340
|
-
"minLength": 1,
|
|
18341
|
-
"maxLength": 200,
|
|
18342
|
-
"x-max-utf8-bytes": 800
|
|
18343
|
-
},
|
|
18344
|
-
"text": {
|
|
18345
|
-
"description": "The section body, also represented in the complete fallback text.",
|
|
18346
|
-
"type": "string",
|
|
18347
|
-
"minLength": 1,
|
|
18348
|
-
"maxLength": 1000,
|
|
18349
|
-
"x-max-utf8-bytes": 4000
|
|
18350
|
-
}
|
|
18994
|
+
"role": { "$ref": "#/components/schemas/OrganizationRole" }
|
|
18351
18995
|
},
|
|
18352
18996
|
"additionalProperties": false
|
|
18353
18997
|
},
|
|
18354
|
-
"
|
|
18355
|
-
"description": "One prose section in an ordered portable document.",
|
|
18998
|
+
"OrganizationClosureProviderAction": {
|
|
18356
18999
|
"type": "object",
|
|
18357
|
-
"
|
|
19000
|
+
"description": "One provider-owned resource the customer must retire outside WhooshBang after organization closure. It contains safe identifiers only, never provider credentials.",
|
|
19001
|
+
"required": ["provider", "action", "connection_id"],
|
|
18358
19002
|
"properties": {
|
|
18359
|
-
"
|
|
18360
|
-
|
|
18361
|
-
"description": "An optional semantic heading for this section.",
|
|
18362
|
-
"type": "string",
|
|
18363
|
-
"minLength": 1,
|
|
18364
|
-
"maxLength": 200,
|
|
18365
|
-
"x-max-utf8-bytes": 800
|
|
19003
|
+
"provider": {
|
|
19004
|
+
"$ref": "#/components/schemas/ChannelConnectionProvider"
|
|
18366
19005
|
},
|
|
18367
|
-
"
|
|
18368
|
-
"description": "The section prose.",
|
|
18369
|
-
"type": "string",
|
|
18370
|
-
"minLength": 1,
|
|
18371
|
-
"maxLength": 1000,
|
|
18372
|
-
"x-max-utf8-bytes": 4000
|
|
18373
|
-
}
|
|
18374
|
-
},
|
|
18375
|
-
"additionalProperties": false
|
|
18376
|
-
},
|
|
18377
|
-
"DocumentFact": {
|
|
18378
|
-
"type": "object",
|
|
18379
|
-
"required": ["label", "value"],
|
|
18380
|
-
"properties": {
|
|
18381
|
-
"label": {
|
|
18382
|
-
"description": "The semantic label for this fact.",
|
|
19006
|
+
"action": {
|
|
18383
19007
|
"type": "string",
|
|
18384
|
-
"
|
|
18385
|
-
"maxLength": 200,
|
|
18386
|
-
"x-max-utf8-bytes": 800
|
|
19008
|
+
"enum": ["revoke_bot_token", "delete_provider_application"]
|
|
18387
19009
|
},
|
|
18388
|
-
"
|
|
18389
|
-
"description": "The semantic value for this fact.",
|
|
18390
|
-
"type": "string",
|
|
18391
|
-
"minLength": 1,
|
|
18392
|
-
"maxLength": 1000,
|
|
18393
|
-
"x-max-utf8-bytes": 4000
|
|
18394
|
-
}
|
|
18395
|
-
},
|
|
18396
|
-
"additionalProperties": false
|
|
18397
|
-
},
|
|
18398
|
-
"DocumentFactsBlock": {
|
|
18399
|
-
"description": "One ordered group of semantic label/value facts.",
|
|
18400
|
-
"type": "object",
|
|
18401
|
-
"required": ["type", "items"],
|
|
18402
|
-
"properties": {
|
|
18403
|
-
"type": { "const": "facts" },
|
|
18404
|
-
"items": {
|
|
18405
|
-
"type": "array",
|
|
18406
|
-
"minItems": 1,
|
|
18407
|
-
"maxItems": 24,
|
|
18408
|
-
"items": { "$ref": "#/components/schemas/DocumentFact" }
|
|
18409
|
-
}
|
|
19010
|
+
"connection_id": { "$ref": "#/components/schemas/OpaqueIdentifier" }
|
|
18410
19011
|
},
|
|
18411
19012
|
"additionalProperties": false
|
|
18412
19013
|
},
|
|
18413
|
-
"
|
|
19014
|
+
"TeammateStatus": {
|
|
18414
19015
|
"type": "string",
|
|
18415
|
-
"
|
|
18416
|
-
"
|
|
18417
|
-
"x-max-utf8-bytes": 2000
|
|
18418
|
-
},
|
|
18419
|
-
"DocumentTableRow": {
|
|
18420
|
-
"type": "array",
|
|
18421
|
-
"minItems": 2,
|
|
18422
|
-
"maxItems": 8,
|
|
18423
|
-
"items": { "$ref": "#/components/schemas/DocumentTableCell" }
|
|
19016
|
+
"enum": ["active", "invited"],
|
|
19017
|
+
"description": "`active` has joined. `invited` has an invitation they have not accepted."
|
|
18424
19018
|
},
|
|
18425
|
-
"
|
|
18426
|
-
"description": "One small semantic table. Every row must have exactly one cell for each column.",
|
|
19019
|
+
"TeammateProjectAccess": {
|
|
18427
19020
|
"type": "object",
|
|
18428
|
-
"
|
|
19021
|
+
"description": "Which projects the teammate can see. An admin sees every project, including ones created later.",
|
|
19022
|
+
"required": ["all", "project_ids"],
|
|
18429
19023
|
"properties": {
|
|
18430
|
-
"
|
|
18431
|
-
"
|
|
18432
|
-
"description": "The semantic heading for this table.",
|
|
18433
|
-
"type": "string",
|
|
18434
|
-
"minLength": 1,
|
|
18435
|
-
"maxLength": 200,
|
|
18436
|
-
"x-max-utf8-bytes": 800
|
|
18437
|
-
},
|
|
18438
|
-
"columns": {
|
|
18439
|
-
"description": "The ordered column headings.",
|
|
18440
|
-
"type": "array",
|
|
18441
|
-
"minItems": 2,
|
|
18442
|
-
"maxItems": 8,
|
|
18443
|
-
"items": { "$ref": "#/components/schemas/DocumentTableCell" }
|
|
18444
|
-
},
|
|
18445
|
-
"rows": {
|
|
18446
|
-
"description": "The ordered table rows.",
|
|
19024
|
+
"all": { "type": "boolean" },
|
|
19025
|
+
"project_ids": {
|
|
18447
19026
|
"type": "array",
|
|
18448
|
-
"
|
|
18449
|
-
"
|
|
18450
|
-
"items": { "$ref": "#/components/schemas/
|
|
19027
|
+
"maxItems": 1000,
|
|
19028
|
+
"uniqueItems": true,
|
|
19029
|
+
"items": { "$ref": "#/components/schemas/OpaqueIdentifier" },
|
|
19030
|
+
"description": "The projects given to this teammate. Empty when `all` is true."
|
|
18451
19031
|
}
|
|
18452
19032
|
},
|
|
18453
|
-
"x-rows-match-columns": true,
|
|
18454
19033
|
"additionalProperties": false
|
|
18455
19034
|
},
|
|
18456
|
-
"
|
|
18457
|
-
"
|
|
18458
|
-
"
|
|
18459
|
-
|
|
18460
|
-
|
|
18461
|
-
"
|
|
18462
|
-
"
|
|
18463
|
-
|
|
18464
|
-
|
|
18465
|
-
|
|
18466
|
-
"maxLength": 200,
|
|
18467
|
-
"x-max-utf8-bytes": 800
|
|
18468
|
-
},
|
|
18469
|
-
"text": {
|
|
18470
|
-
"description": "The supporting prose.",
|
|
18471
|
-
"type": "string",
|
|
18472
|
-
"minLength": 1,
|
|
18473
|
-
"maxLength": 2000,
|
|
18474
|
-
"x-max-utf8-bytes": 8000
|
|
18475
|
-
}
|
|
18476
|
-
},
|
|
18477
|
-
"additionalProperties": false
|
|
19035
|
+
"ProviderInstallationStatus": {
|
|
19036
|
+
"type": "string",
|
|
19037
|
+
"enum": [
|
|
19038
|
+
"pending",
|
|
19039
|
+
"active",
|
|
19040
|
+
"reauthorization_required",
|
|
19041
|
+
"revoked",
|
|
19042
|
+
"invalid"
|
|
19043
|
+
],
|
|
19044
|
+
"description": "The safe customer-facing lifecycle of a provider installation. Credential and provider-native state stay private."
|
|
18478
19045
|
},
|
|
18479
|
-
"
|
|
19046
|
+
"ProviderAuthorizationSetup": {
|
|
19047
|
+
"description": "A credential-free provider authorization handoff for one exact connection. The URL is short-lived and safe to render, but never contains a provider credential, team identifier or raw authorization code; actual OAuth state and callback handling remain service-private.",
|
|
18480
19048
|
"oneOf": [
|
|
18481
|
-
{
|
|
18482
|
-
|
|
18483
|
-
|
|
18484
|
-
|
|
18485
|
-
|
|
18486
|
-
|
|
18487
|
-
|
|
18488
|
-
|
|
18489
|
-
|
|
18490
|
-
|
|
18491
|
-
|
|
18492
|
-
|
|
18493
|
-
|
|
18494
|
-
|
|
18495
|
-
"
|
|
18496
|
-
"minLength": 1,
|
|
18497
|
-
"maxLength": 200,
|
|
18498
|
-
"x-max-utf8-bytes": 800
|
|
19049
|
+
{
|
|
19050
|
+
"type": "object",
|
|
19051
|
+
"required": ["status", "authorization_url", "expires_at"],
|
|
19052
|
+
"properties": {
|
|
19053
|
+
"status": { "const": "awaiting_authorization" },
|
|
19054
|
+
"authorization_url": {
|
|
19055
|
+
"type": "string",
|
|
19056
|
+
"format": "uri",
|
|
19057
|
+
"pattern": "^https://[^\\s]+$",
|
|
19058
|
+
"maxLength": 2048,
|
|
19059
|
+
"description": "The short-lived HTTPS authorization handoff for this connection. It carries opaque state, not provider credentials or a raw authorization code."
|
|
19060
|
+
},
|
|
19061
|
+
"expires_at": { "$ref": "#/components/schemas/Timestamp" }
|
|
19062
|
+
},
|
|
19063
|
+
"additionalProperties": false
|
|
18499
19064
|
},
|
|
18500
|
-
|
|
18501
|
-
"
|
|
18502
|
-
"
|
|
18503
|
-
"
|
|
18504
|
-
|
|
18505
|
-
|
|
19065
|
+
{
|
|
19066
|
+
"type": "object",
|
|
19067
|
+
"required": ["status", "expires_at"],
|
|
19068
|
+
"properties": {
|
|
19069
|
+
"status": { "const": "provisioning" },
|
|
19070
|
+
"expires_at": { "$ref": "#/components/schemas/Timestamp" }
|
|
19071
|
+
},
|
|
19072
|
+
"additionalProperties": false
|
|
18506
19073
|
},
|
|
18507
|
-
|
|
18508
|
-
|
|
18509
|
-
|
|
18510
|
-
|
|
18511
|
-
|
|
18512
|
-
|
|
18513
|
-
|
|
18514
|
-
|
|
18515
|
-
|
|
18516
|
-
|
|
18517
|
-
|
|
18518
|
-
|
|
18519
|
-
|
|
18520
|
-
|
|
18521
|
-
|
|
18522
|
-
|
|
19074
|
+
{
|
|
19075
|
+
"type": "object",
|
|
19076
|
+
"required": ["status", "expires_at", "failure"],
|
|
19077
|
+
"properties": {
|
|
19078
|
+
"status": { "const": "failed" },
|
|
19079
|
+
"expires_at": { "$ref": "#/components/schemas/Timestamp" },
|
|
19080
|
+
"failure": { "$ref": "#/components/schemas/ProviderFailure" }
|
|
19081
|
+
},
|
|
19082
|
+
"additionalProperties": false
|
|
19083
|
+
},
|
|
19084
|
+
{
|
|
19085
|
+
"type": "object",
|
|
19086
|
+
"required": ["status", "expires_at"],
|
|
19087
|
+
"properties": {
|
|
19088
|
+
"status": { "const": "expired" },
|
|
19089
|
+
"expires_at": { "$ref": "#/components/schemas/Timestamp" }
|
|
19090
|
+
},
|
|
19091
|
+
"additionalProperties": false
|
|
19092
|
+
}
|
|
18523
19093
|
]
|
|
18524
19094
|
},
|
|
18525
|
-
"
|
|
18526
|
-
"type": "object",
|
|
18527
|
-
"description": "Bounded customer correlation data. Do not include secrets or personal data.",
|
|
18528
|
-
"maxProperties": 20,
|
|
18529
|
-
"propertyNames": { "minLength": 1, "maxLength": 64 },
|
|
18530
|
-
"additionalProperties": {
|
|
18531
|
-
"$ref": "#/components/schemas/MetadataValue"
|
|
18532
|
-
},
|
|
18533
|
-
"x-max-json-bytes": 4096
|
|
18534
|
-
},
|
|
18535
|
-
"InteractionPrompt": {
|
|
19095
|
+
"EmailDomainName": {
|
|
18536
19096
|
"type": "string",
|
|
18537
|
-
"minLength":
|
|
18538
|
-
"maxLength":
|
|
19097
|
+
"minLength": 4,
|
|
19098
|
+
"maxLength": 253,
|
|
19099
|
+
"pattern": "^(?=.{1,253}$)(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\\.){2,}[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$",
|
|
19100
|
+
"description": "A canonical lower-case IDNA ASCII customer sending domain with its trailing dot removed. It must be a dedicated subdomain below the registrable domain; runtime validation uses the public suffix list so a registrable root such as example.co.uk is still rejected. URLs, ports, wildcards and mailbox addresses are invalid."
|
|
18539
19101
|
},
|
|
18540
|
-
"
|
|
19102
|
+
"EmailDomainLifecycle": {
|
|
18541
19103
|
"type": "string",
|
|
18542
|
-
"
|
|
18543
|
-
|
|
19104
|
+
"enum": [
|
|
19105
|
+
"requested",
|
|
19106
|
+
"creating",
|
|
19107
|
+
"dns_required",
|
|
19108
|
+
"verifying",
|
|
19109
|
+
"testing",
|
|
19110
|
+
"active",
|
|
19111
|
+
"provider_action_required",
|
|
19112
|
+
"dns_failed",
|
|
19113
|
+
"oauth_required",
|
|
19114
|
+
"held",
|
|
19115
|
+
"deleting",
|
|
19116
|
+
"deleted"
|
|
19117
|
+
],
|
|
19118
|
+
"description": "The provider-neutral domain lifecycle. Sending and receiving capabilities are reported separately because they verify on different clocks."
|
|
18544
19119
|
},
|
|
18545
|
-
"
|
|
19120
|
+
"EmailDomainCapabilityState": {
|
|
18546
19121
|
"type": "string",
|
|
18547
|
-
"
|
|
18548
|
-
"maxLength": 128,
|
|
18549
|
-
"pattern": "^[^\\u0000-\\u001F\\u007F]+$",
|
|
18550
|
-
"description": "Caller-owned opaque correlation returned as data, never treated as execution authority."
|
|
19122
|
+
"enum": ["pending", "verified", "failed", "unsupported"]
|
|
18551
19123
|
},
|
|
18552
|
-
"
|
|
19124
|
+
"EmailDomainCapabilities": {
|
|
18553
19125
|
"type": "object",
|
|
18554
|
-
"required": [
|
|
19126
|
+
"required": [
|
|
19127
|
+
"sending",
|
|
19128
|
+
"receiving",
|
|
19129
|
+
"delivery",
|
|
19130
|
+
"link_interactions",
|
|
19131
|
+
"free_text_reply"
|
|
19132
|
+
],
|
|
18555
19133
|
"properties": {
|
|
18556
|
-
"
|
|
18557
|
-
|
|
18558
|
-
"confirm_label": {
|
|
18559
|
-
"type": "string",
|
|
18560
|
-
"minLength": 1,
|
|
18561
|
-
"maxLength": 40
|
|
19134
|
+
"sending": {
|
|
19135
|
+
"$ref": "#/components/schemas/EmailDomainCapabilityState"
|
|
18562
19136
|
},
|
|
18563
|
-
"
|
|
18564
|
-
|
|
18565
|
-
"$ref": "#/components/schemas/Timestamp-2",
|
|
18566
|
-
"description": "Must be 30 seconds through 24 hours after server acceptance."
|
|
19137
|
+
"receiving": {
|
|
19138
|
+
"$ref": "#/components/schemas/EmailDomainCapabilityState"
|
|
18567
19139
|
},
|
|
18568
|
-
"
|
|
18569
|
-
|
|
19140
|
+
"delivery": { "type": "boolean" },
|
|
19141
|
+
"link_interactions": { "type": "boolean" },
|
|
19142
|
+
"free_text_reply": {
|
|
19143
|
+
"type": "boolean",
|
|
19144
|
+
"description": "False when free-text replies cannot be lowered: receiving may not be verified yet, or the provider team may have message-content storage disabled. Delivery and link-based interaction remain independently available; no undocumented eligibility or storage-state endpoint is assumed."
|
|
18570
19145
|
}
|
|
18571
19146
|
},
|
|
18572
19147
|
"additionalProperties": false
|
|
18573
19148
|
},
|
|
18574
|
-
"
|
|
19149
|
+
"EmailDnsRecord": {
|
|
19150
|
+
"description": "One exact neutral DNS record. `name` is preserved exactly as the provider returns it and is relative to the registrable domain (for example `send.notify`, not `send.notify.example.com`).",
|
|
19151
|
+
"oneOf": [
|
|
19152
|
+
{
|
|
19153
|
+
"type": "object",
|
|
19154
|
+
"required": ["type", "name", "value", "priority", "status"],
|
|
19155
|
+
"properties": {
|
|
19156
|
+
"type": { "const": "MX" },
|
|
19157
|
+
"name": {
|
|
19158
|
+
"type": "string",
|
|
19159
|
+
"minLength": 1,
|
|
19160
|
+
"maxLength": 253,
|
|
19161
|
+
"pattern": "^[^\u0000-\u001f-
]+$"
|
|
19162
|
+
},
|
|
19163
|
+
"value": {
|
|
19164
|
+
"type": "string",
|
|
19165
|
+
"minLength": 1,
|
|
19166
|
+
"maxLength": 2048,
|
|
19167
|
+
"pattern": "^[^\u0000-\u001f-
]+$"
|
|
19168
|
+
},
|
|
19169
|
+
"priority": { "type": "integer", "minimum": 0, "maximum": 65535 },
|
|
19170
|
+
"status": {
|
|
19171
|
+
"enum": [
|
|
19172
|
+
"not_started",
|
|
19173
|
+
"pending",
|
|
19174
|
+
"verified",
|
|
19175
|
+
"failed",
|
|
19176
|
+
"temporary_failure"
|
|
19177
|
+
]
|
|
19178
|
+
}
|
|
19179
|
+
},
|
|
19180
|
+
"additionalProperties": false
|
|
19181
|
+
},
|
|
19182
|
+
{
|
|
19183
|
+
"type": "object",
|
|
19184
|
+
"required": ["type", "name", "value", "status"],
|
|
19185
|
+
"properties": {
|
|
19186
|
+
"type": { "enum": ["TXT", "CNAME"] },
|
|
19187
|
+
"name": {
|
|
19188
|
+
"type": "string",
|
|
19189
|
+
"minLength": 1,
|
|
19190
|
+
"maxLength": 253,
|
|
19191
|
+
"pattern": "^[^\u0000-\u001f-
]+$"
|
|
19192
|
+
},
|
|
19193
|
+
"value": {
|
|
19194
|
+
"type": "string",
|
|
19195
|
+
"minLength": 1,
|
|
19196
|
+
"maxLength": 2048,
|
|
19197
|
+
"pattern": "^[^\u0000-\u001f-
]+$"
|
|
19198
|
+
},
|
|
19199
|
+
"status": {
|
|
19200
|
+
"enum": [
|
|
19201
|
+
"not_started",
|
|
19202
|
+
"pending",
|
|
19203
|
+
"verified",
|
|
19204
|
+
"failed",
|
|
19205
|
+
"temporary_failure"
|
|
19206
|
+
]
|
|
19207
|
+
}
|
|
19208
|
+
},
|
|
19209
|
+
"additionalProperties": false
|
|
19210
|
+
}
|
|
19211
|
+
]
|
|
19212
|
+
},
|
|
19213
|
+
"EmailDomainGuide": {
|
|
18575
19214
|
"type": "object",
|
|
18576
|
-
"required": ["
|
|
19215
|
+
"required": ["state"],
|
|
18577
19216
|
"properties": {
|
|
18578
|
-
"
|
|
19217
|
+
"state": {
|
|
19218
|
+
"enum": [
|
|
19219
|
+
"detecting",
|
|
19220
|
+
"guided",
|
|
19221
|
+
"domain_connect_available",
|
|
19222
|
+
"complete",
|
|
19223
|
+
"unavailable"
|
|
19224
|
+
]
|
|
19225
|
+
},
|
|
19226
|
+
"dns_provider": {
|
|
18579
19227
|
"type": "string",
|
|
18580
19228
|
"minLength": 1,
|
|
18581
|
-
"maxLength":
|
|
18582
|
-
"pattern": "^[
|
|
18583
|
-
"description": "Opaque customer data. It is never interpreted as a command."
|
|
19229
|
+
"maxLength": 100,
|
|
19230
|
+
"pattern": "^[^\u0000-\u001f-
]+$"
|
|
18584
19231
|
},
|
|
18585
|
-
"
|
|
18586
|
-
"intent": {
|
|
19232
|
+
"instructions_url": {
|
|
18587
19233
|
"type": "string",
|
|
18588
|
-
"
|
|
18589
|
-
"
|
|
18590
|
-
"
|
|
19234
|
+
"format": "uri",
|
|
19235
|
+
"pattern": "^https://[^\\s]+$",
|
|
19236
|
+
"maxLength": 2048,
|
|
19237
|
+
"description": "A short-lived secret-free instruction link for a DNS administrator. It contains no WhooshBang session or provider OAuth material."
|
|
18591
19238
|
}
|
|
18592
19239
|
},
|
|
19240
|
+
"allOf": [
|
|
19241
|
+
{
|
|
19242
|
+
"if": {
|
|
19243
|
+
"properties": {
|
|
19244
|
+
"state": {
|
|
19245
|
+
"enum": ["guided", "domain_connect_available", "complete"]
|
|
19246
|
+
}
|
|
19247
|
+
},
|
|
19248
|
+
"required": ["state"]
|
|
19249
|
+
},
|
|
19250
|
+
"then": {
|
|
19251
|
+
"properties": { "dns_provider": true },
|
|
19252
|
+
"required": ["dns_provider"]
|
|
19253
|
+
},
|
|
19254
|
+
"else": { "properties": { "dns_provider": false } }
|
|
19255
|
+
}
|
|
19256
|
+
],
|
|
18593
19257
|
"additionalProperties": false
|
|
18594
19258
|
},
|
|
18595
|
-
"
|
|
18596
|
-
"type": "object",
|
|
18597
|
-
"
|
|
18598
|
-
"
|
|
18599
|
-
|
|
18600
|
-
"
|
|
18601
|
-
"
|
|
18602
|
-
|
|
18603
|
-
"minItems": 2,
|
|
18604
|
-
"maxItems": 6,
|
|
18605
|
-
"items": { "$ref": "#/components/schemas/InteractionOption" },
|
|
18606
|
-
"x-unique-property": "value"
|
|
18607
|
-
},
|
|
18608
|
-
"expires_at": {
|
|
18609
|
-
"$ref": "#/components/schemas/Timestamp-2",
|
|
18610
|
-
"description": "Must be 30 seconds through 24 hours after server acceptance."
|
|
18611
|
-
},
|
|
18612
|
-
"correlation_id": {
|
|
18613
|
-
"$ref": "#/components/schemas/InteractionCorrelationId"
|
|
18614
|
-
}
|
|
19259
|
+
"EmailSubjectPolicy": {
|
|
19260
|
+
"type": "object",
|
|
19261
|
+
"description": "The fixed subject rendering contract. Notification title wins; otherwise localized copy equivalent to `Notification from {notifier display name}` is used. Whitespace is normalized and the final value is capped at 200 Unicode code points.",
|
|
19262
|
+
"required": ["fallback", "maximum_code_points", "normalize_whitespace"],
|
|
19263
|
+
"properties": {
|
|
19264
|
+
"fallback": { "const": "localized_notifier_name" },
|
|
19265
|
+
"maximum_code_points": { "const": 200 },
|
|
19266
|
+
"normalize_whitespace": { "const": true }
|
|
18615
19267
|
},
|
|
18616
19268
|
"additionalProperties": false
|
|
18617
19269
|
},
|
|
18618
|
-
"
|
|
19270
|
+
"EmailDeliveryPolicy": {
|
|
18619
19271
|
"type": "object",
|
|
18620
|
-
"
|
|
19272
|
+
"description": "Privacy-safe email defaults. Return-Path and Message-ID remain provider-owned, arbitrary headers are unsupported, and every ordinary message carries a visible management route plus safe one-click unsubscribe semantics when custom headers are available. A GET never mutates consent; the matching POST resolves the exact binding.",
|
|
19273
|
+
"required": [
|
|
19274
|
+
"open_tracking",
|
|
19275
|
+
"click_tracking",
|
|
19276
|
+
"tls",
|
|
19277
|
+
"unsubscribe",
|
|
19278
|
+
"subject"
|
|
19279
|
+
],
|
|
18621
19280
|
"properties": {
|
|
18622
|
-
"
|
|
18623
|
-
"
|
|
18624
|
-
"
|
|
18625
|
-
"
|
|
18626
|
-
"
|
|
19281
|
+
"open_tracking": { "const": false },
|
|
19282
|
+
"click_tracking": { "const": false },
|
|
19283
|
+
"tls": {
|
|
19284
|
+
"enum": ["opportunistic", "enforced"],
|
|
19285
|
+
"default": "opportunistic"
|
|
18627
19286
|
},
|
|
18628
|
-
"
|
|
18629
|
-
|
|
18630
|
-
}
|
|
19287
|
+
"unsubscribe": { "const": "visible_and_one_click_where_supported" },
|
|
19288
|
+
"subject": { "$ref": "#/components/schemas/EmailSubjectPolicy" }
|
|
18631
19289
|
},
|
|
18632
19290
|
"additionalProperties": false
|
|
18633
19291
|
},
|
|
18634
|
-
"
|
|
19292
|
+
"OrganizationCredentialPrefix": {
|
|
18635
19293
|
"type": "string",
|
|
18636
|
-
"
|
|
18637
|
-
"description": "
|
|
19294
|
+
"pattern": "^wb_oc1\\.ocred_[A-Za-z0-9_-]{8}$",
|
|
19295
|
+
"description": "A safe display prefix containing the organization-credential format marker and first eight base64url identity characters, never secret bytes."
|
|
18638
19296
|
},
|
|
18639
|
-
"
|
|
18640
|
-
"type": "
|
|
18641
|
-
"
|
|
18642
|
-
|
|
18643
|
-
|
|
18644
|
-
"
|
|
18645
|
-
"
|
|
18646
|
-
"
|
|
18647
|
-
|
|
18648
|
-
|
|
19297
|
+
"OrganizationCredentialScope": {
|
|
19298
|
+
"type": "string",
|
|
19299
|
+
"enum": [
|
|
19300
|
+
"organization:read",
|
|
19301
|
+
"projects:write",
|
|
19302
|
+
"projects:read",
|
|
19303
|
+
"messages:write",
|
|
19304
|
+
"messages:read",
|
|
19305
|
+
"subscriptions:write",
|
|
19306
|
+
"subscriptions:read",
|
|
19307
|
+
"machine-clients:write",
|
|
19308
|
+
"machine-clients:read",
|
|
19309
|
+
"capabilities:read",
|
|
19310
|
+
"connections:write",
|
|
19311
|
+
"connections:read"
|
|
19312
|
+
],
|
|
19313
|
+
"description": "One organization-credential capability. `organization:read` is the organization's project directory — listing the organization's projects and reading one — and is the only scope here a project credential can never carry; it authorizes nothing below the organization. Every other name is the project-credential vocabulary unchanged, and is exercised only on the environment-scoped routes, where the project and environment come from the path and the credential's authority is the intersection of these scopes with the project-credential vocabulary. An organization credential is therefore never wider than a project credential would have been for the same project environment."
|
|
18649
19314
|
},
|
|
18650
|
-
"
|
|
19315
|
+
"OrganizationCredentialScopeSet": {
|
|
19316
|
+
"type": "array",
|
|
19317
|
+
"minItems": 1,
|
|
19318
|
+
"maxItems": 12,
|
|
19319
|
+
"uniqueItems": true,
|
|
19320
|
+
"items": { "$ref": "#/components/schemas/OrganizationCredentialScope" }
|
|
19321
|
+
},
|
|
19322
|
+
"OrganizationCredentialSecret": {
|
|
18651
19323
|
"type": "string",
|
|
18652
|
-
"
|
|
18653
|
-
"
|
|
18654
|
-
"pattern": "^\\S(?:[\\s\\S]*\\S)?$",
|
|
18655
|
-
"description": "Untrusted input text after leading and trailing whitespace is removed."
|
|
19324
|
+
"pattern": "^wb_oc1\\.ocred_[A-Za-z0-9_-]{21}[AQgw]\\.[A-Za-z0-9_-]{42}[AEIMQUYcgkosw048]$",
|
|
19325
|
+
"description": "The exact one-time runtime bearer syntax. The final segment is canonical unpadded base64url for exactly 32 random secret bytes."
|
|
18656
19326
|
},
|
|
18657
|
-
"
|
|
19327
|
+
"RecipientCopyOverrideValue": {
|
|
18658
19328
|
"type": "string",
|
|
18659
19329
|
"minLength": 1,
|
|
18660
|
-
"maxLength":
|
|
18661
|
-
"
|
|
18662
|
-
"description": "An opaque identifier whose internal encoding is not a public promise."
|
|
19330
|
+
"maxLength": 500,
|
|
19331
|
+
"description": "Customer-authored plain text with optional plain template placeholders. The service enforces key-specific length and rejects invisible controls. Rendering escapes text; changing labels does not change recipient control actions."
|
|
18663
19332
|
},
|
|
18664
|
-
"
|
|
19333
|
+
"ApiCredentialPrefix": {
|
|
18665
19334
|
"type": "string",
|
|
18666
|
-
"
|
|
19335
|
+
"pattern": "^wb_pc1\\.pcred_[A-Za-z0-9_-]{8}$",
|
|
19336
|
+
"description": "A safe display prefix containing the credential format marker and first eight base64url identity characters, never secret bytes."
|
|
19337
|
+
},
|
|
19338
|
+
"ApiCredentialScope": {
|
|
19339
|
+
"type": "string",
|
|
19340
|
+
"enum": [
|
|
19341
|
+
"projects:write",
|
|
19342
|
+
"projects:read",
|
|
19343
|
+
"messages:write",
|
|
19344
|
+
"messages:read",
|
|
19345
|
+
"subscriptions:write",
|
|
19346
|
+
"subscriptions:read",
|
|
19347
|
+
"machine-clients:write",
|
|
19348
|
+
"machine-clients:read",
|
|
19349
|
+
"capabilities:read",
|
|
19350
|
+
"connections:write",
|
|
19351
|
+
"connections:read"
|
|
19352
|
+
],
|
|
19353
|
+
"description": "One project-credential capability. Environment authority always comes from the credential record, never a scope or request field. `projects:write` configures the credential's own project and environment; it never creates a project, which remains an organization authority. The project-wide singletons — brand, default locale, logo and recipient copy — are what a live recipient sees, so writing them requires a live credential; a test credential may read them and may write its own environment's policy."
|
|
19354
|
+
},
|
|
19355
|
+
"ApiCredentialScopeSet": {
|
|
19356
|
+
"type": "array",
|
|
19357
|
+
"minItems": 1,
|
|
19358
|
+
"maxItems": 11,
|
|
19359
|
+
"uniqueItems": true,
|
|
19360
|
+
"items": { "$ref": "#/components/schemas/ApiCredentialScope" }
|
|
19361
|
+
},
|
|
19362
|
+
"ApiCredentialSecret": {
|
|
19363
|
+
"type": "string",
|
|
19364
|
+
"pattern": "^wb_pc1\\.pcred_[A-Za-z0-9_-]{21}[AQgw]\\.[A-Za-z0-9_-]{42}[AEIMQUYcgkosw048]$",
|
|
19365
|
+
"description": "The exact one-time runtime bearer syntax. The final segment is canonical unpadded base64url for exactly 32 random secret bytes."
|
|
19366
|
+
},
|
|
19367
|
+
"MessageTarget": {
|
|
19368
|
+
"type": "object",
|
|
19369
|
+
"required": ["subscriber_id"],
|
|
19370
|
+
"properties": {
|
|
19371
|
+
"subscriber_id": { "$ref": "#/components/schemas/OpaqueIdentifier" }
|
|
19372
|
+
},
|
|
19373
|
+
"additionalProperties": false
|
|
18667
19374
|
},
|
|
18668
19375
|
"OpaqueIdentifier-3": {
|
|
18669
19376
|
"type": "string",
|
|
@@ -19472,13 +20179,6 @@
|
|
|
19472
20179
|
"pattern": "^https?://[^/?#*\\s]+(?::[0-9]{1,5})?/?$",
|
|
19473
20180
|
"description": "One exact scheme, host, and optional port, in any spelling that means that same origin. A trailing slash, an uppercase host, and an explicitly written default port are accepted and stored in canonical form. Paths, queries, fragments, credentials, and wildcards are forbidden; HTTP is accepted only for localhost or synthetic .test configuration."
|
|
19474
20181
|
},
|
|
19475
|
-
"DeveloperKey": {
|
|
19476
|
-
"type": "string",
|
|
19477
|
-
"minLength": 1,
|
|
19478
|
-
"maxLength": 63,
|
|
19479
|
-
"pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
|
|
19480
|
-
"description": "A stable, lowercase developer key used by registered return destinations and subscriber groups."
|
|
19481
|
-
},
|
|
19482
20182
|
"RegisteredReturnUrl": {
|
|
19483
20183
|
"type": "string",
|
|
19484
20184
|
"format": "uri",
|
|
@@ -19496,97 +20196,6 @@
|
|
|
19496
20196
|
},
|
|
19497
20197
|
"additionalProperties": false
|
|
19498
20198
|
},
|
|
19499
|
-
"EmailBindingConsent": {
|
|
19500
|
-
"description": "How consent for this exact subscriber, notifier and connection was established. A customer assertion never becomes recipient-observed verification. Complaint, unsubscribe and suppression override either arm.",
|
|
19501
|
-
"oneOf": [
|
|
19502
|
-
{
|
|
19503
|
-
"type": "object",
|
|
19504
|
-
"required": ["kind", "observed_at"],
|
|
19505
|
-
"properties": {
|
|
19506
|
-
"kind": { "const": "recipient_observed" },
|
|
19507
|
-
"observed_at": { "$ref": "#/components/schemas/Timestamp" }
|
|
19508
|
-
},
|
|
19509
|
-
"additionalProperties": false
|
|
19510
|
-
},
|
|
19511
|
-
{
|
|
19512
|
-
"type": "object",
|
|
19513
|
-
"required": ["kind", "consented_at", "source"],
|
|
19514
|
-
"properties": {
|
|
19515
|
-
"kind": { "const": "asserted_prior_consent" },
|
|
19516
|
-
"consented_at": { "$ref": "#/components/schemas/Timestamp" },
|
|
19517
|
-
"source": {
|
|
19518
|
-
"type": "string",
|
|
19519
|
-
"minLength": 1,
|
|
19520
|
-
"maxLength": 100,
|
|
19521
|
-
"pattern": "^[^\u0000-\u001f-
]+$",
|
|
19522
|
-
"description": "A bounded customer description of where consent was collected. The authenticated asserting actor is recorded by the service, never accepted from this object."
|
|
19523
|
-
},
|
|
19524
|
-
"asserted_at": { "$ref": "#/components/schemas/Timestamp" },
|
|
19525
|
-
"asserted_by": {
|
|
19526
|
-
"type": "object",
|
|
19527
|
-
"required": ["kind", "id"],
|
|
19528
|
-
"properties": {
|
|
19529
|
-
"kind": { "enum": ["credential", "grant", "session"] },
|
|
19530
|
-
"id": { "$ref": "#/components/schemas/OpaqueIdentifier" }
|
|
19531
|
-
},
|
|
19532
|
-
"additionalProperties": false
|
|
19533
|
-
},
|
|
19534
|
-
"domain_id": { "$ref": "#/components/schemas/OpaqueIdentifier" }
|
|
19535
|
-
},
|
|
19536
|
-
"additionalProperties": false
|
|
19537
|
-
}
|
|
19538
|
-
]
|
|
19539
|
-
},
|
|
19540
|
-
"RecipientChannelSummary": {
|
|
19541
|
-
"type": "object",
|
|
19542
|
-
"description": "Safe state for one configured channel. Provider identities, credentials, callback state, and other subscribers are absent.",
|
|
19543
|
-
"required": ["channel", "state", "preferred"],
|
|
19544
|
-
"properties": {
|
|
19545
|
-
"channel": { "$ref": "#/components/schemas/Channel" },
|
|
19546
|
-
"state": {
|
|
19547
|
-
"type": "string",
|
|
19548
|
-
"enum": ["available", "connected", "paused"]
|
|
19549
|
-
},
|
|
19550
|
-
"binding_id": {
|
|
19551
|
-
"$ref": "#/components/schemas/OpaqueIdentifier",
|
|
19552
|
-
"description": "The exact binding owned by this session's subscriber. Present only for connected or paused state."
|
|
19553
|
-
},
|
|
19554
|
-
"preferred": { "type": "boolean" },
|
|
19555
|
-
"connection_id": { "$ref": "#/components/schemas/OpaqueIdentifier" },
|
|
19556
|
-
"masked_address": {
|
|
19557
|
-
"type": "string",
|
|
19558
|
-
"minLength": 3,
|
|
19559
|
-
"maxLength": 254,
|
|
19560
|
-
"description": "Masked recipient address. Never the full mailbox."
|
|
19561
|
-
},
|
|
19562
|
-
"consent": { "$ref": "#/components/schemas/EmailBindingConsent" }
|
|
19563
|
-
},
|
|
19564
|
-
"allOf": [
|
|
19565
|
-
{
|
|
19566
|
-
"if": {
|
|
19567
|
-
"properties": { "state": { "enum": ["connected", "paused"] } },
|
|
19568
|
-
"required": ["state"]
|
|
19569
|
-
},
|
|
19570
|
-
"then": {
|
|
19571
|
-
"required": ["binding_id"],
|
|
19572
|
-
"properties": { "binding_id": {} }
|
|
19573
|
-
}
|
|
19574
|
-
},
|
|
19575
|
-
{
|
|
19576
|
-
"if": {
|
|
19577
|
-
"properties": { "state": { "const": "available" } },
|
|
19578
|
-
"required": ["state"]
|
|
19579
|
-
},
|
|
19580
|
-
"then": {
|
|
19581
|
-
"properties": {
|
|
19582
|
-
"binding_id": false,
|
|
19583
|
-
"preferred": { "const": false }
|
|
19584
|
-
}
|
|
19585
|
-
}
|
|
19586
|
-
}
|
|
19587
|
-
],
|
|
19588
|
-
"additionalProperties": false
|
|
19589
|
-
},
|
|
19590
20199
|
"RecipientSessionCapabilityPrefix": {
|
|
19591
20200
|
"type": "string",
|
|
19592
20201
|
"minLength": 33,
|
|
@@ -19645,33 +20254,6 @@
|
|
|
19645
20254
|
"pattern": "^(?:UTC|[A-Za-z][A-Za-z0-9._+-]*(?:/[A-Za-z][A-Za-z0-9._+-]*)+)$",
|
|
19646
20255
|
"description": "A named IANA time-zone identifier. Numeric offsets, abbreviations and display labels are invalid; recognized aliases normalize to the runtime's canonical identifier before persistence. Providers may leave it absent."
|
|
19647
20256
|
},
|
|
19648
|
-
"BroadcastAggregate": {
|
|
19649
|
-
"type": "object",
|
|
19650
|
-
"description": "A projection over expansion and ordinary child-message states, not an independent delivery state machine.",
|
|
19651
|
-
"required": [
|
|
19652
|
-
"audience",
|
|
19653
|
-
"expanded",
|
|
19654
|
-
"pending",
|
|
19655
|
-
"provider_accepted",
|
|
19656
|
-
"delivered",
|
|
19657
|
-
"skipped",
|
|
19658
|
-
"failed",
|
|
19659
|
-
"cancelled",
|
|
19660
|
-
"expired"
|
|
19661
|
-
],
|
|
19662
|
-
"properties": {
|
|
19663
|
-
"audience": { "type": "integer", "minimum": 0 },
|
|
19664
|
-
"expanded": { "type": "integer", "minimum": 0 },
|
|
19665
|
-
"pending": { "type": "integer", "minimum": 0 },
|
|
19666
|
-
"provider_accepted": { "type": "integer", "minimum": 0 },
|
|
19667
|
-
"delivered": { "type": "integer", "minimum": 0 },
|
|
19668
|
-
"skipped": { "type": "integer", "minimum": 0 },
|
|
19669
|
-
"failed": { "type": "integer", "minimum": 0 },
|
|
19670
|
-
"cancelled": { "type": "integer", "minimum": 0 },
|
|
19671
|
-
"expired": { "type": "integer", "minimum": 0 }
|
|
19672
|
-
},
|
|
19673
|
-
"additionalProperties": false
|
|
19674
|
-
},
|
|
19675
20257
|
"SafeExplanation": { "type": "string", "minLength": 1, "maxLength": 500 },
|
|
19676
20258
|
"InteractionCapability": {
|
|
19677
20259
|
"type": "object",
|
|
@@ -19752,7 +20334,7 @@
|
|
|
19752
20334
|
"provider-capabilities-v1.schema": {
|
|
19753
20335
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
19754
20336
|
"$id": "https://whooshbang.flowxo.com/schemas/provider-capabilities-v1.schema.json",
|
|
19755
|
-
"x-contract-version": "2.
|
|
20337
|
+
"x-contract-version": "2.1.0",
|
|
19756
20338
|
"title": "ProviderCapabilitiesV1",
|
|
19757
20339
|
"description": "Provider-neutral, renderer-facing delivery and interaction capabilities with explicit degradation.",
|
|
19758
20340
|
"type": "object",
|
|
@@ -20472,5 +21054,5 @@
|
|
|
20472
21054
|
}
|
|
20473
21055
|
}
|
|
20474
21056
|
},
|
|
20475
|
-
"x-contract-version": "2.
|
|
21057
|
+
"x-contract-version": "2.1.0"
|
|
20476
21058
|
}
|