@whooshbang/contracts 2.5.0 → 3.0.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 +13 -2
- package/README.md +21 -21
- package/contract-manifest.json +32 -33
- package/dist/generated/artifact-index.d.ts +34 -34
- package/dist/generated/artifact-index.js +32 -33
- package/dist/generated/artifact-index.js.map +1 -1
- package/dist/generated/interaction-v1.d.ts +77 -4
- package/dist/generated/validators-standalone.d.ts +492 -492
- package/dist/generated/validators-standalone.js +6405 -4572
- package/dist/generated/validators-standalone.js.map +1 -1
- package/dist/generated/validators.d.ts +2 -2
- package/dist/generated/validators.js +1 -0
- package/dist/generated/validators.js.map +1 -1
- package/dist/generated/whooshbang-v1.d.ts +526 -116
- package/dist/index.d.ts +3 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/input-defaults.d.ts +7 -0
- package/dist/input-defaults.js +59 -0
- package/dist/input-defaults.js.map +1 -0
- package/dist/interaction-expiry.js +2 -1
- package/dist/interaction-expiry.js.map +1 -1
- package/fixtures/core-v1/fixture-index.json +1 -9
- package/fixtures/core-v1/problems/idempotency-key-required.json +2 -2
- 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 +1009 -302
- package/openapi/whooshbang-v1.yaml +455 -74
- package/package.json +1 -1
- 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 +192 -5
- 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 +410 -63
- package/fixtures/core-v1/problems/replay-unavailable-rollout.json +0 -16
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"openapi": "3.1.1",
|
|
3
3
|
"info": {
|
|
4
4
|
"title": "WhooshBang API",
|
|
5
|
-
"version": "
|
|
5
|
+
"version": "3.0.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": {
|
|
@@ -2397,7 +2397,7 @@
|
|
|
2397
2397
|
"x-required-scopes": ["projects:write"],
|
|
2398
2398
|
"x-organization-membership": "required",
|
|
2399
2399
|
"x-idempotency": {
|
|
2400
|
-
"required":
|
|
2400
|
+
"required": false,
|
|
2401
2401
|
"retention_seconds": 604800,
|
|
2402
2402
|
"scope": ["authenticated_organization", "operation_id", "key"],
|
|
2403
2403
|
"equivalence": "validated_request",
|
|
@@ -3070,7 +3070,7 @@
|
|
|
3070
3070
|
"security": [{ "bearerCredential": [] }],
|
|
3071
3071
|
"x-required-scopes": ["subscriptions:write"],
|
|
3072
3072
|
"x-idempotency": {
|
|
3073
|
-
"required":
|
|
3073
|
+
"required": false,
|
|
3074
3074
|
"retention_seconds": 604800,
|
|
3075
3075
|
"scope": ["authenticated_environment", "operation_id", "key"],
|
|
3076
3076
|
"equivalence": "validated_request_after_documented_defaults",
|
|
@@ -3225,7 +3225,7 @@
|
|
|
3225
3225
|
"security": [{ "bearerCredential": [] }],
|
|
3226
3226
|
"x-required-scopes": ["subscriptions:write"],
|
|
3227
3227
|
"x-idempotency": {
|
|
3228
|
-
"required":
|
|
3228
|
+
"required": false,
|
|
3229
3229
|
"retention_seconds": 604800,
|
|
3230
3230
|
"scope": ["authenticated_environment", "operation_id", "key"],
|
|
3231
3231
|
"equivalence": "validated_request_after_documented_defaults",
|
|
@@ -3306,7 +3306,7 @@
|
|
|
3306
3306
|
],
|
|
3307
3307
|
"x-required-scopes": ["messages:write"],
|
|
3308
3308
|
"x-idempotency": {
|
|
3309
|
-
"required":
|
|
3309
|
+
"required": false,
|
|
3310
3310
|
"retention_seconds": 604800,
|
|
3311
3311
|
"scope": ["authenticated_environment", "operation_id", "key"],
|
|
3312
3312
|
"equivalence": "canonical_rgba_png_after_validation",
|
|
@@ -3428,7 +3428,7 @@
|
|
|
3428
3428
|
"bound_subscriber"
|
|
3429
3429
|
],
|
|
3430
3430
|
"x-idempotency": {
|
|
3431
|
-
"required":
|
|
3431
|
+
"required": false,
|
|
3432
3432
|
"retention_seconds": 604800,
|
|
3433
3433
|
"scope": ["authenticated_environment", "operation_id", "key"],
|
|
3434
3434
|
"equivalence": "validated_request_after_documented_defaults",
|
|
@@ -3856,7 +3856,7 @@
|
|
|
3856
3856
|
"security": [{ "bearerCredential": [] }],
|
|
3857
3857
|
"x-required-scopes": ["messages:write"],
|
|
3858
3858
|
"x-idempotency": {
|
|
3859
|
-
"required":
|
|
3859
|
+
"required": false,
|
|
3860
3860
|
"retention_seconds": 604800,
|
|
3861
3861
|
"scope": ["authenticated_environment", "operation_id", "key"],
|
|
3862
3862
|
"equivalence": "validated_request_after_documented_defaults",
|
|
@@ -3962,7 +3962,7 @@
|
|
|
3962
3962
|
"security": [{ "bearerCredential": [] }],
|
|
3963
3963
|
"x-required-scopes": ["machine-clients:write"],
|
|
3964
3964
|
"x-idempotency": {
|
|
3965
|
-
"required":
|
|
3965
|
+
"required": false,
|
|
3966
3966
|
"retention_seconds": 604800,
|
|
3967
3967
|
"scope": ["authenticated_environment", "operation_id", "key"],
|
|
3968
3968
|
"equivalence": "validated_request_after_documented_defaults",
|
|
@@ -4099,7 +4099,7 @@
|
|
|
4099
4099
|
"security": [{ "bearerCredential": [] }],
|
|
4100
4100
|
"x-required-scopes": ["machine-clients:write"],
|
|
4101
4101
|
"x-idempotency": {
|
|
4102
|
-
"required":
|
|
4102
|
+
"required": false,
|
|
4103
4103
|
"retention_seconds": 604800,
|
|
4104
4104
|
"scope": ["authenticated_environment", "operation_id", "key"],
|
|
4105
4105
|
"equivalence": "validated_request_after_documented_defaults",
|
|
@@ -4207,7 +4207,7 @@
|
|
|
4207
4207
|
"security": [{ "bearerCredential": [] }],
|
|
4208
4208
|
"x-required-scopes": ["machine-clients:write"],
|
|
4209
4209
|
"x-idempotency": {
|
|
4210
|
-
"required":
|
|
4210
|
+
"required": false,
|
|
4211
4211
|
"retention_seconds": 604800,
|
|
4212
4212
|
"scope": ["authenticated_environment", "operation_id", "key"],
|
|
4213
4213
|
"equivalence": "validated_request_after_documented_defaults",
|
|
@@ -4265,7 +4265,7 @@
|
|
|
4265
4265
|
"security": [{ "bearerCredential": [] }],
|
|
4266
4266
|
"x-required-scopes": ["machine-clients:write"],
|
|
4267
4267
|
"x-idempotency": {
|
|
4268
|
-
"required":
|
|
4268
|
+
"required": false,
|
|
4269
4269
|
"retention_seconds": 604800,
|
|
4270
4270
|
"scope": ["authenticated_environment", "operation_id", "key"],
|
|
4271
4271
|
"equivalence": "validated_request_after_documented_defaults",
|
|
@@ -4428,7 +4428,7 @@
|
|
|
4428
4428
|
"security": [{ "machineCredential": [] }],
|
|
4429
4429
|
"x-required-scopes": ["machine-events:ack"],
|
|
4430
4430
|
"x-idempotency": {
|
|
4431
|
-
"required":
|
|
4431
|
+
"required": false,
|
|
4432
4432
|
"retention_seconds": 604800,
|
|
4433
4433
|
"scope": ["authenticated_environment", "operation_id", "key"],
|
|
4434
4434
|
"equivalence": "validated_request_after_documented_defaults",
|
|
@@ -4599,7 +4599,7 @@
|
|
|
4599
4599
|
},
|
|
4600
4600
|
"post": {
|
|
4601
4601
|
"operationId": "createCustomerEndpoint",
|
|
4602
|
-
"summary": "Create an
|
|
4602
|
+
"summary": "Create an active customer endpoint and reveal its signing secret once",
|
|
4603
4603
|
"description": "Validates the final normalized public HTTPS destination before storing it.\nThe initial response includes the new signing secret. An equivalent\nidempotent replay returns the same logical endpoint without the secret;\ndifferent input for the same key returns `idempotency_conflict`.\n",
|
|
4604
4604
|
"tags": ["Customer endpoints"],
|
|
4605
4605
|
"security": [
|
|
@@ -4610,7 +4610,7 @@
|
|
|
4610
4610
|
],
|
|
4611
4611
|
"x-required-scopes": ["messages:write"],
|
|
4612
4612
|
"x-idempotency": {
|
|
4613
|
-
"required":
|
|
4613
|
+
"required": false,
|
|
4614
4614
|
"retention_seconds": 604800,
|
|
4615
4615
|
"scope": ["authenticated_environment", "operation_id", "key"],
|
|
4616
4616
|
"equivalence": "final_normalized_url_and_validated_request",
|
|
@@ -4679,7 +4679,7 @@
|
|
|
4679
4679
|
}
|
|
4680
4680
|
},
|
|
4681
4681
|
"201": {
|
|
4682
|
-
"description": "Newly
|
|
4682
|
+
"description": "Newly active endpoint, recorded signed ping result, and its one-time signing secret.",
|
|
4683
4683
|
"headers": {
|
|
4684
4684
|
"WhooshBang-Diagnostic-Id": {
|
|
4685
4685
|
"$ref": "#/components/headers/DiagnosticId"
|
|
@@ -4766,7 +4766,7 @@
|
|
|
4766
4766
|
],
|
|
4767
4767
|
"post": {
|
|
4768
4768
|
"operationId": "verifyCustomerEndpoint",
|
|
4769
|
-
"summary": "Send a signed
|
|
4769
|
+
"summary": "Send a signed test ping and record whether the receiver returns 2xx",
|
|
4770
4770
|
"tags": ["Customer endpoints"],
|
|
4771
4771
|
"security": [
|
|
4772
4772
|
{ "clerkSession": [] },
|
|
@@ -4810,7 +4810,7 @@
|
|
|
4810
4810
|
],
|
|
4811
4811
|
"x-required-scopes": ["messages:write"],
|
|
4812
4812
|
"x-idempotency": {
|
|
4813
|
-
"required":
|
|
4813
|
+
"required": false,
|
|
4814
4814
|
"retention_seconds": 604800,
|
|
4815
4815
|
"scope": ["authenticated_environment", "operation_id", "key"],
|
|
4816
4816
|
"equivalence": "endpoint_and_validated_request",
|
|
@@ -5158,7 +5158,7 @@
|
|
|
5158
5158
|
],
|
|
5159
5159
|
"x-required-scopes": ["connections:write"],
|
|
5160
5160
|
"x-idempotency": {
|
|
5161
|
-
"required":
|
|
5161
|
+
"required": false,
|
|
5162
5162
|
"retention_seconds": 604800,
|
|
5163
5163
|
"scope": ["authenticated_environment", "operation_id", "key"],
|
|
5164
5164
|
"equivalence": "validated_request",
|
|
@@ -5649,7 +5649,7 @@
|
|
|
5649
5649
|
],
|
|
5650
5650
|
"x-required-scopes": ["connections:write"],
|
|
5651
5651
|
"x-idempotency": {
|
|
5652
|
-
"required":
|
|
5652
|
+
"required": false,
|
|
5653
5653
|
"retention_seconds": 604800,
|
|
5654
5654
|
"scope": ["authenticated_environment", "operation_id", "key"],
|
|
5655
5655
|
"equivalence": "selected_connection",
|
|
@@ -6259,7 +6259,7 @@
|
|
|
6259
6259
|
],
|
|
6260
6260
|
"x-required-scopes": ["connections:write"],
|
|
6261
6261
|
"x-idempotency": {
|
|
6262
|
-
"required":
|
|
6262
|
+
"required": false,
|
|
6263
6263
|
"retention_seconds": 604800,
|
|
6264
6264
|
"scope": ["authenticated_environment", "operation_id", "key"],
|
|
6265
6265
|
"equivalence": "exact_request_body",
|
|
@@ -7045,7 +7045,7 @@
|
|
|
7045
7045
|
"security": [{ "bearerCredential": [] }],
|
|
7046
7046
|
"x-required-scopes": ["subscriptions:write"],
|
|
7047
7047
|
"x-idempotency": {
|
|
7048
|
-
"required":
|
|
7048
|
+
"required": false,
|
|
7049
7049
|
"retention_seconds": 604800,
|
|
7050
7050
|
"scope": ["authenticated_project_environment", "operation_id", "key"],
|
|
7051
7051
|
"equivalence": "validated_request",
|
|
@@ -7473,7 +7473,7 @@
|
|
|
7473
7473
|
"security": [{ "bearerCredential": [] }],
|
|
7474
7474
|
"x-required-scopes": ["subscriptions:write"],
|
|
7475
7475
|
"x-idempotency": {
|
|
7476
|
-
"required":
|
|
7476
|
+
"required": false,
|
|
7477
7477
|
"retention_seconds": 604800,
|
|
7478
7478
|
"scope": ["authenticated_project_environment", "operation_id", "key"],
|
|
7479
7479
|
"equivalence": "validated_request",
|
|
@@ -7606,7 +7606,7 @@
|
|
|
7606
7606
|
"in": "query",
|
|
7607
7607
|
"required": false,
|
|
7608
7608
|
"description": "Only current members of the static group with this key, in the\nenvironment asked about. Combines with every other filter, so `q`\nsearches within the group.\n",
|
|
7609
|
-
"schema": { "$ref": "#/components/schemas/
|
|
7609
|
+
"schema": { "$ref": "#/components/schemas/GroupKey" }
|
|
7610
7610
|
},
|
|
7611
7611
|
{
|
|
7612
7612
|
"name": "created_after",
|
|
@@ -7681,7 +7681,7 @@
|
|
|
7681
7681
|
"security": [{ "bearerCredential": [] }],
|
|
7682
7682
|
"x-required-scopes": ["subscriptions:write"],
|
|
7683
7683
|
"x-idempotency": {
|
|
7684
|
-
"required":
|
|
7684
|
+
"required": false,
|
|
7685
7685
|
"retention_seconds": 604800,
|
|
7686
7686
|
"scope": ["authenticated_project_environment", "operation_id", "key"],
|
|
7687
7687
|
"equivalence": "validated_request",
|
|
@@ -7876,7 +7876,7 @@
|
|
|
7876
7876
|
"security": [{ "bearerCredential": [] }],
|
|
7877
7877
|
"x-required-scopes": ["subscriptions:write"],
|
|
7878
7878
|
"x-idempotency": {
|
|
7879
|
-
"required":
|
|
7879
|
+
"required": false,
|
|
7880
7880
|
"retention_seconds": 604800,
|
|
7881
7881
|
"scope": ["authenticated_project_environment", "operation_id", "key"],
|
|
7882
7882
|
"equivalence": "validated_request",
|
|
@@ -7942,12 +7942,7 @@
|
|
|
7942
7942
|
"name": "group_key",
|
|
7943
7943
|
"in": "path",
|
|
7944
7944
|
"required": true,
|
|
7945
|
-
"schema": {
|
|
7946
|
-
"type": "string",
|
|
7947
|
-
"minLength": 1,
|
|
7948
|
-
"maxLength": 63,
|
|
7949
|
-
"pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$"
|
|
7950
|
-
}
|
|
7945
|
+
"schema": { "$ref": "#/components/schemas/GroupKey" }
|
|
7951
7946
|
}
|
|
7952
7947
|
],
|
|
7953
7948
|
"get": {
|
|
@@ -8038,12 +8033,7 @@
|
|
|
8038
8033
|
"name": "group_key",
|
|
8039
8034
|
"in": "path",
|
|
8040
8035
|
"required": true,
|
|
8041
|
-
"schema": {
|
|
8042
|
-
"type": "string",
|
|
8043
|
-
"minLength": 1,
|
|
8044
|
-
"maxLength": 63,
|
|
8045
|
-
"pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$"
|
|
8046
|
-
}
|
|
8036
|
+
"schema": { "$ref": "#/components/schemas/GroupKey" }
|
|
8047
8037
|
}
|
|
8048
8038
|
],
|
|
8049
8039
|
"get": {
|
|
@@ -8125,12 +8115,7 @@
|
|
|
8125
8115
|
"name": "group_key",
|
|
8126
8116
|
"in": "path",
|
|
8127
8117
|
"required": true,
|
|
8128
|
-
"schema": {
|
|
8129
|
-
"type": "string",
|
|
8130
|
-
"minLength": 1,
|
|
8131
|
-
"maxLength": 63,
|
|
8132
|
-
"pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$"
|
|
8133
|
-
}
|
|
8118
|
+
"schema": { "$ref": "#/components/schemas/GroupKey" }
|
|
8134
8119
|
},
|
|
8135
8120
|
{
|
|
8136
8121
|
"name": "subscriber_id",
|
|
@@ -8200,12 +8185,7 @@
|
|
|
8200
8185
|
"name": "group_key",
|
|
8201
8186
|
"in": "path",
|
|
8202
8187
|
"required": true,
|
|
8203
|
-
"schema": {
|
|
8204
|
-
"type": "string",
|
|
8205
|
-
"minLength": 1,
|
|
8206
|
-
"maxLength": 63,
|
|
8207
|
-
"pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$"
|
|
8208
|
-
}
|
|
8188
|
+
"schema": { "$ref": "#/components/schemas/GroupKey" }
|
|
8209
8189
|
}
|
|
8210
8190
|
],
|
|
8211
8191
|
"post": {
|
|
@@ -8216,7 +8196,7 @@
|
|
|
8216
8196
|
"security": [{ "bearerCredential": [] }],
|
|
8217
8197
|
"x-required-scopes": ["messages:write"],
|
|
8218
8198
|
"x-idempotency": {
|
|
8219
|
-
"required":
|
|
8199
|
+
"required": false,
|
|
8220
8200
|
"retention_seconds": 604800,
|
|
8221
8201
|
"scope": ["authenticated_project_environment", "operation_id", "key"],
|
|
8222
8202
|
"equivalence": "validated_request_and_group_key",
|
|
@@ -8492,7 +8472,7 @@
|
|
|
8492
8472
|
],
|
|
8493
8473
|
"x-required-scopes": ["subscriptions:write"],
|
|
8494
8474
|
"x-idempotency": {
|
|
8495
|
-
"required":
|
|
8475
|
+
"required": false,
|
|
8496
8476
|
"retention_seconds": 604800,
|
|
8497
8477
|
"scope": ["authenticated_organization", "operation_id", "key"],
|
|
8498
8478
|
"equivalence": "validated_request",
|
|
@@ -8741,7 +8721,7 @@
|
|
|
8741
8721
|
],
|
|
8742
8722
|
"x-required-scopes": ["messages:write"],
|
|
8743
8723
|
"x-idempotency": {
|
|
8744
|
-
"required":
|
|
8724
|
+
"required": false,
|
|
8745
8725
|
"retention_seconds": 604800,
|
|
8746
8726
|
"scope": ["authenticated_organization", "operation_id", "key"],
|
|
8747
8727
|
"equivalence": "validated_request",
|
|
@@ -8821,15 +8801,18 @@
|
|
|
8821
8801
|
],
|
|
8822
8802
|
"get": {
|
|
8823
8803
|
"operationId": "getMessageInEnvironment",
|
|
8804
|
+
"x-notification-scopes": ["notifications:self", "notifications:team"],
|
|
8824
8805
|
"summary": "Inspect a message in a named project environment",
|
|
8825
|
-
"description": "The environment-scoped form of `getMessage`, including the same bounded\nlong poll. Inspection acknowledges, consumes, retries, and replays\nnothing.\n",
|
|
8806
|
+
"description": "The environment-scoped form of `getMessage`, including the same bounded\nlong poll. Inspection acknowledges, consumes, retries, and replays\nnothing.\nNotification grants can read only current operator recipients in their\naudience: self means the signed-in person; team includes current\nteammates with access to this project. Customer subscribers and retired\nmemberships are hidden with 404, including during a held poll.\n",
|
|
8826
8807
|
"parameters": [
|
|
8827
8808
|
{ "$ref": "#/components/parameters/ResponseInspectionWait" }
|
|
8828
8809
|
],
|
|
8829
8810
|
"tags": ["Messages"],
|
|
8830
8811
|
"security": [
|
|
8831
8812
|
{ "clerkSession": [] },
|
|
8832
|
-
{ "bearerGrant": [] },
|
|
8813
|
+
{ "bearerGrant": ["messages:read"] },
|
|
8814
|
+
{ "bearerGrant": ["notifications:self"] },
|
|
8815
|
+
{ "bearerGrant": ["notifications:team"] },
|
|
8833
8816
|
{ "bearerOrganizationCredential": [] }
|
|
8834
8817
|
],
|
|
8835
8818
|
"x-required-scopes": ["messages:read"],
|
|
@@ -8896,14 +8879,17 @@
|
|
|
8896
8879
|
],
|
|
8897
8880
|
"get": {
|
|
8898
8881
|
"operationId": "getInteractionInEnvironment",
|
|
8882
|
+
"x-notification-scopes": ["notifications:self", "notifications:team"],
|
|
8899
8883
|
"summary": "Inspect an interaction response in a named project environment",
|
|
8900
|
-
"description": "The environment-scoped form of `getInteraction`, including the same\nbounded long poll and the same retained-answer semantics.\n",
|
|
8884
|
+
"description": "The environment-scoped form of `getInteraction`, including the same\nbounded long poll and the same retained-answer semantics.\nNotification grants can read only current operator recipients in their\naudience: self means the signed-in person; team includes current\nteammates with access to this project. Customer subscribers and retired\nmemberships are hidden with 404, including during a held poll.\n",
|
|
8901
8885
|
"parameters": [
|
|
8902
8886
|
{ "$ref": "#/components/parameters/ResponseInspectionWait" }
|
|
8903
8887
|
],
|
|
8904
8888
|
"tags": ["Messages"],
|
|
8905
8889
|
"security": [
|
|
8906
|
-
{ "bearerGrant": [] },
|
|
8890
|
+
{ "bearerGrant": ["messages:read"] },
|
|
8891
|
+
{ "bearerGrant": ["notifications:self"] },
|
|
8892
|
+
{ "bearerGrant": ["notifications:team"] },
|
|
8907
8893
|
{ "bearerOrganizationCredential": [] }
|
|
8908
8894
|
],
|
|
8909
8895
|
"x-required-scopes": ["messages:read"],
|
|
@@ -9094,7 +9080,7 @@
|
|
|
9094
9080
|
],
|
|
9095
9081
|
"x-required-scopes": ["machine-clients:write"],
|
|
9096
9082
|
"x-idempotency": {
|
|
9097
|
-
"required":
|
|
9083
|
+
"required": false,
|
|
9098
9084
|
"retention_seconds": 604800,
|
|
9099
9085
|
"scope": ["authenticated_organization", "operation_id", "key"],
|
|
9100
9086
|
"equivalence": "validated_request",
|
|
@@ -9175,7 +9161,7 @@
|
|
|
9175
9161
|
],
|
|
9176
9162
|
"x-required-scopes": ["machine-clients:write"],
|
|
9177
9163
|
"x-idempotency": {
|
|
9178
|
-
"required":
|
|
9164
|
+
"required": false,
|
|
9179
9165
|
"retention_seconds": 604800,
|
|
9180
9166
|
"scope": ["authenticated_environment", "operation_id", "key"],
|
|
9181
9167
|
"equivalence": "validated_request_after_documented_defaults",
|
|
@@ -9383,7 +9369,7 @@
|
|
|
9383
9369
|
],
|
|
9384
9370
|
"x-required-scopes": ["subscriptions:write"],
|
|
9385
9371
|
"x-idempotency": {
|
|
9386
|
-
"required":
|
|
9372
|
+
"required": false,
|
|
9387
9373
|
"retention_seconds": 604800,
|
|
9388
9374
|
"scope": ["authenticated_project_environment", "operation_id", "key"],
|
|
9389
9375
|
"equivalence": "validated_request",
|
|
@@ -9525,7 +9511,7 @@
|
|
|
9525
9511
|
"in": "query",
|
|
9526
9512
|
"required": false,
|
|
9527
9513
|
"description": "Only current members of the static group with this key, in the\nenvironment asked about. Combines with every other filter, so `q`\nsearches within the group.\n",
|
|
9528
|
-
"schema": { "$ref": "#/components/schemas/
|
|
9514
|
+
"schema": { "$ref": "#/components/schemas/GroupKey" }
|
|
9529
9515
|
},
|
|
9530
9516
|
{
|
|
9531
9517
|
"name": "created_after",
|
|
@@ -9605,7 +9591,7 @@
|
|
|
9605
9591
|
],
|
|
9606
9592
|
"x-required-scopes": ["subscriptions:write"],
|
|
9607
9593
|
"x-idempotency": {
|
|
9608
|
-
"required":
|
|
9594
|
+
"required": false,
|
|
9609
9595
|
"retention_seconds": 604800,
|
|
9610
9596
|
"scope": ["authenticated_project_environment", "operation_id", "key"],
|
|
9611
9597
|
"equivalence": "validated_request",
|
|
@@ -9920,7 +9906,7 @@
|
|
|
9920
9906
|
],
|
|
9921
9907
|
"x-required-scopes": ["subscriptions:write"],
|
|
9922
9908
|
"x-idempotency": {
|
|
9923
|
-
"required":
|
|
9909
|
+
"required": false,
|
|
9924
9910
|
"retention_seconds": 604800,
|
|
9925
9911
|
"scope": ["authenticated_project_environment", "operation_id", "key"],
|
|
9926
9912
|
"equivalence": "validated_request",
|
|
@@ -9988,12 +9974,7 @@
|
|
|
9988
9974
|
"name": "group_key",
|
|
9989
9975
|
"in": "path",
|
|
9990
9976
|
"required": true,
|
|
9991
|
-
"schema": {
|
|
9992
|
-
"type": "string",
|
|
9993
|
-
"minLength": 1,
|
|
9994
|
-
"maxLength": 63,
|
|
9995
|
-
"pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$"
|
|
9996
|
-
}
|
|
9977
|
+
"schema": { "$ref": "#/components/schemas/GroupKey" }
|
|
9997
9978
|
}
|
|
9998
9979
|
],
|
|
9999
9980
|
"get": {
|
|
@@ -10104,12 +10085,7 @@
|
|
|
10104
10085
|
"name": "group_key",
|
|
10105
10086
|
"in": "path",
|
|
10106
10087
|
"required": true,
|
|
10107
|
-
"schema": {
|
|
10108
|
-
"type": "string",
|
|
10109
|
-
"minLength": 1,
|
|
10110
|
-
"maxLength": 63,
|
|
10111
|
-
"pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$"
|
|
10112
|
-
}
|
|
10088
|
+
"schema": { "$ref": "#/components/schemas/GroupKey" }
|
|
10113
10089
|
}
|
|
10114
10090
|
],
|
|
10115
10091
|
"get": {
|
|
@@ -10199,12 +10175,7 @@
|
|
|
10199
10175
|
"name": "group_key",
|
|
10200
10176
|
"in": "path",
|
|
10201
10177
|
"required": true,
|
|
10202
|
-
"schema": {
|
|
10203
|
-
"type": "string",
|
|
10204
|
-
"minLength": 1,
|
|
10205
|
-
"maxLength": 63,
|
|
10206
|
-
"pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$"
|
|
10207
|
-
}
|
|
10178
|
+
"schema": { "$ref": "#/components/schemas/GroupKey" }
|
|
10208
10179
|
},
|
|
10209
10180
|
{
|
|
10210
10181
|
"name": "subscriber_id",
|
|
@@ -10288,12 +10259,7 @@
|
|
|
10288
10259
|
"name": "group_key",
|
|
10289
10260
|
"in": "path",
|
|
10290
10261
|
"required": true,
|
|
10291
|
-
"schema": {
|
|
10292
|
-
"type": "string",
|
|
10293
|
-
"minLength": 1,
|
|
10294
|
-
"maxLength": 63,
|
|
10295
|
-
"pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$"
|
|
10296
|
-
}
|
|
10262
|
+
"schema": { "$ref": "#/components/schemas/GroupKey" }
|
|
10297
10263
|
}
|
|
10298
10264
|
],
|
|
10299
10265
|
"post": {
|
|
@@ -10309,7 +10275,7 @@
|
|
|
10309
10275
|
],
|
|
10310
10276
|
"x-required-scopes": ["messages:write"],
|
|
10311
10277
|
"x-idempotency": {
|
|
10312
|
-
"required":
|
|
10278
|
+
"required": false,
|
|
10313
10279
|
"retention_seconds": 604800,
|
|
10314
10280
|
"scope": ["authenticated_project_environment", "operation_id", "key"],
|
|
10315
10281
|
"equivalence": "validated_request_and_group_key",
|
|
@@ -10811,7 +10777,7 @@
|
|
|
10811
10777
|
],
|
|
10812
10778
|
"x-required-scopes": ["machine-clients:write"],
|
|
10813
10779
|
"x-idempotency": {
|
|
10814
|
-
"required":
|
|
10780
|
+
"required": false,
|
|
10815
10781
|
"retention_seconds": 604800,
|
|
10816
10782
|
"scope": ["authenticated_environment", "operation_id", "key"],
|
|
10817
10783
|
"equivalence": "validated_request_after_documented_defaults",
|
|
@@ -10885,118 +10851,635 @@
|
|
|
10885
10851
|
"429": { "$ref": "#/components/responses/RateLimited" }
|
|
10886
10852
|
}
|
|
10887
10853
|
}
|
|
10888
|
-
}
|
|
10889
|
-
},
|
|
10890
|
-
"components": {
|
|
10891
|
-
"securitySchemes": {
|
|
10892
|
-
"clerkSession": {
|
|
10893
|
-
"type": "http",
|
|
10894
|
-
"scheme": "bearer",
|
|
10895
|
-
"bearerFormat": "Clerk session JWT",
|
|
10896
|
-
"description": "A verified human session whose active Clerk organization selects exactly\none WhooshBang organization. Every administration operation rechecks the\nprojected organization membership; session identity never selects a project\nor environment from request data.\n"
|
|
10897
|
-
},
|
|
10898
|
-
"bearerGrant": {
|
|
10899
|
-
"type": "http",
|
|
10900
|
-
"scheme": "bearer",
|
|
10901
|
-
"bearerFormat": "OAuth 2.0 access token",
|
|
10902
|
-
"description": "An access token issued by the WhooshBang authorization server for one\nconsenting organization member. It selects exactly one organization and carries\nthe scopes that member consented to, and never a project: an operation\nnames its project and environment in the path, and the service checks\nboth against the granting person's membership before acting. A project\ncredential can name no project but its own; an organization credential names\none per call the same way this does.\n"
|
|
10903
|
-
},
|
|
10904
|
-
"bearerOrganizationCredential": {
|
|
10905
|
-
"type": "http",
|
|
10906
|
-
"scheme": "bearer",
|
|
10907
|
-
"bearerFormat": "wb_oc1.ocred_<16-byte-base64url>.<32-byte-base64url-secret>",
|
|
10908
|
-
"description": "Selects exactly one organization and nothing below it. It names no project\nand no environment, so it authenticates only operations whose path does,\nand its authority there is the intersection of its scopes with the\nproject-credential vocabulary — never wider than a project credential\nwould have been for the same project environment. A path naming a\nproject outside its organization is refused with `credential_organization_mismatch`\nrather than a bare scope failure. `organization:read` is the one scope it can\nhold that a project credential cannot, and it authorizes only the\norganization's project directory: listing the organization's projects and reading\none, which is the organization-wide question a project credential cannot ask\nand the reason a `--project <slug>` selector can work at all. It is\nrequired *in addition to* each of those operations' own\n`x-required-scopes`, never instead of them.\nCredentials cannot be read after creation.\n"
|
|
10909
|
-
},
|
|
10910
|
-
"bearerCredential": {
|
|
10911
|
-
"type": "http",
|
|
10912
|
-
"scheme": "bearer",
|
|
10913
|
-
"bearerFormat": "wb_pc1.pcred_<16-byte-base64url>.<32-byte-base64url-secret>",
|
|
10914
|
-
"description": "Selects exactly one organization, project, and `test` or `live` environment.\nCredentials cannot be read after creation. Except for explicitly\nsynthetic creation/rotation reveal fixtures, complete bearer values\nmust never appear in fixtures, errors, logs, metrics, or inspection\nsurfaces.\n"
|
|
10915
|
-
},
|
|
10916
|
-
"machineCredential": {
|
|
10917
|
-
"type": "http",
|
|
10918
|
-
"scheme": "bearer",
|
|
10919
|
-
"bearerFormat": "wb_mc1.mcred_<16-byte-base64url>.<32-byte-base64url-secret>",
|
|
10920
|
-
"description": "A locally generated runtime credential bound server-side to exactly one\nproject/environment, machine client, notifier, subscriber, binding, and\nevent stream. Project credentials cannot use machine-only endpoints.\nRevoked credentials fail before resource lookup.\n"
|
|
10921
|
-
},
|
|
10922
|
-
"recipientSessionCapability": {
|
|
10923
|
-
"type": "apiKey",
|
|
10924
|
-
"in": "header",
|
|
10925
|
-
"name": "WhooshBang-Recipient-Capability",
|
|
10926
|
-
"description": "A creation-only, short-lived capability bound server-side to one exact\norganization, project, environment, subscriber, configuration revision,\npresenting origin, and registered return destination. It is accepted\nonly on the `/v1/recipient-session` browser surface and never as bearer\nauthority on an ordinary application route.\n"
|
|
10927
|
-
}
|
|
10928
10854
|
},
|
|
10929
|
-
"
|
|
10930
|
-
"
|
|
10931
|
-
"
|
|
10932
|
-
"
|
|
10933
|
-
"
|
|
10934
|
-
"
|
|
10935
|
-
"
|
|
10936
|
-
|
|
10937
|
-
|
|
10938
|
-
"
|
|
10939
|
-
|
|
10940
|
-
|
|
10941
|
-
|
|
10942
|
-
|
|
10943
|
-
|
|
10944
|
-
|
|
10945
|
-
|
|
10946
|
-
|
|
10947
|
-
|
|
10948
|
-
"
|
|
10949
|
-
|
|
10950
|
-
|
|
10951
|
-
|
|
10952
|
-
|
|
10953
|
-
|
|
10954
|
-
|
|
10955
|
-
|
|
10956
|
-
|
|
10957
|
-
|
|
10958
|
-
|
|
10959
|
-
|
|
10960
|
-
|
|
10961
|
-
"required": true,
|
|
10962
|
-
"description": "Canonical opaque project credential identity; never a readable secret.",
|
|
10963
|
-
"schema": { "$ref": "#/components/schemas/ApiCredentialId" }
|
|
10964
|
-
},
|
|
10965
|
-
"OrganizationCredentialId": {
|
|
10966
|
-
"name": "organization_credential_id",
|
|
10967
|
-
"in": "path",
|
|
10968
|
-
"required": true,
|
|
10969
|
-
"description": "Canonical opaque organization credential identity; never a readable secret.",
|
|
10970
|
-
"schema": { "$ref": "#/components/schemas/OrganizationCredentialId" }
|
|
10971
|
-
},
|
|
10972
|
-
"ApiCredentialAfterCursor": {
|
|
10973
|
-
"name": "after",
|
|
10974
|
-
"in": "query",
|
|
10975
|
-
"required": false,
|
|
10976
|
-
"description": "Opaque cursor returned by the previous credential page.",
|
|
10977
|
-
"schema": {
|
|
10978
|
-
"type": "string",
|
|
10979
|
-
"minLength": 1,
|
|
10980
|
-
"maxLength": 256,
|
|
10981
|
-
"pattern": "^[A-Za-z0-9_-]+$"
|
|
10855
|
+
"/v1/operator-messages": {
|
|
10856
|
+
"post": {
|
|
10857
|
+
"operationId": "sendOperatorMessageWithCredential",
|
|
10858
|
+
"summary": "sendOperatorMessage",
|
|
10859
|
+
"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.",
|
|
10860
|
+
"tags": ["Operators"],
|
|
10861
|
+
"security": [{ "bearerCredential": [] }],
|
|
10862
|
+
"x-required-scopes": ["messages:write"],
|
|
10863
|
+
"parameters": [{ "$ref": "#/components/parameters/IdempotencyKey" }],
|
|
10864
|
+
"requestBody": {
|
|
10865
|
+
"required": true,
|
|
10866
|
+
"content": {
|
|
10867
|
+
"application/json": {
|
|
10868
|
+
"schema": {
|
|
10869
|
+
"$ref": "#/components/schemas/CreateOperatorMessageRequest"
|
|
10870
|
+
}
|
|
10871
|
+
}
|
|
10872
|
+
}
|
|
10873
|
+
},
|
|
10874
|
+
"responses": {
|
|
10875
|
+
"200": {
|
|
10876
|
+
"description": "Authorized result.",
|
|
10877
|
+
"content": {
|
|
10878
|
+
"application/json": {
|
|
10879
|
+
"schema": {
|
|
10880
|
+
"$ref": "#/components/schemas/OperatorMessageResult"
|
|
10881
|
+
}
|
|
10882
|
+
}
|
|
10883
|
+
}
|
|
10884
|
+
},
|
|
10885
|
+
"401": { "$ref": "#/components/responses/Unauthorized" },
|
|
10886
|
+
"403": { "$ref": "#/components/responses/Forbidden" }
|
|
10982
10887
|
}
|
|
10983
|
-
}
|
|
10984
|
-
|
|
10985
|
-
|
|
10986
|
-
|
|
10987
|
-
"
|
|
10988
|
-
"
|
|
10989
|
-
"
|
|
10990
|
-
|
|
10991
|
-
|
|
10992
|
-
|
|
10993
|
-
|
|
10888
|
+
}
|
|
10889
|
+
},
|
|
10890
|
+
"/v1/operators/broadcasts": {
|
|
10891
|
+
"post": {
|
|
10892
|
+
"operationId": "broadcastOperatorsWithCredential",
|
|
10893
|
+
"summary": "broadcastOperators",
|
|
10894
|
+
"description": "Membership-derived operator messaging. Only the authenticated human can manage personal preferences.",
|
|
10895
|
+
"tags": ["Operators"],
|
|
10896
|
+
"security": [{ "bearerCredential": [] }],
|
|
10897
|
+
"x-required-scopes": ["messages:write"],
|
|
10898
|
+
"parameters": [{ "$ref": "#/components/parameters/IdempotencyKey" }],
|
|
10899
|
+
"requestBody": {
|
|
10900
|
+
"required": true,
|
|
10901
|
+
"content": {
|
|
10902
|
+
"application/json": {
|
|
10903
|
+
"schema": {
|
|
10904
|
+
"$ref": "#/components/schemas/CreateGroupBroadcastRequest"
|
|
10905
|
+
}
|
|
10906
|
+
}
|
|
10907
|
+
}
|
|
10908
|
+
},
|
|
10909
|
+
"responses": {
|
|
10910
|
+
"200": {
|
|
10911
|
+
"description": "Authorized result.",
|
|
10912
|
+
"content": {
|
|
10913
|
+
"application/json": {
|
|
10914
|
+
"schema": { "$ref": "#/components/schemas/OperatorBroadcast" }
|
|
10915
|
+
}
|
|
10916
|
+
}
|
|
10917
|
+
},
|
|
10918
|
+
"401": { "$ref": "#/components/responses/Unauthorized" },
|
|
10919
|
+
"403": { "$ref": "#/components/responses/Forbidden" }
|
|
10994
10920
|
}
|
|
10995
|
-
}
|
|
10996
|
-
|
|
10997
|
-
|
|
10998
|
-
|
|
10999
|
-
"
|
|
10921
|
+
}
|
|
10922
|
+
},
|
|
10923
|
+
"/v1/operators/broadcasts/{broadcast_id}": {
|
|
10924
|
+
"get": {
|
|
10925
|
+
"operationId": "getOperatorBroadcastWithCredential",
|
|
10926
|
+
"summary": "getOperatorBroadcast",
|
|
10927
|
+
"description": "Membership-derived operator messaging. Only the authenticated human can manage personal preferences.",
|
|
10928
|
+
"tags": ["Operators"],
|
|
10929
|
+
"security": [{ "bearerCredential": [] }],
|
|
10930
|
+
"x-required-scopes": ["messages:read"],
|
|
10931
|
+
"parameters": [
|
|
10932
|
+
{
|
|
10933
|
+
"name": "broadcast_id",
|
|
10934
|
+
"in": "path",
|
|
10935
|
+
"required": true,
|
|
10936
|
+
"schema": { "type": "string" }
|
|
10937
|
+
}
|
|
10938
|
+
],
|
|
10939
|
+
"responses": {
|
|
10940
|
+
"200": {
|
|
10941
|
+
"description": "Authorized result.",
|
|
10942
|
+
"content": {
|
|
10943
|
+
"application/json": {
|
|
10944
|
+
"schema": { "$ref": "#/components/schemas/OperatorBroadcast" }
|
|
10945
|
+
}
|
|
10946
|
+
}
|
|
10947
|
+
},
|
|
10948
|
+
"401": { "$ref": "#/components/responses/Unauthorized" },
|
|
10949
|
+
"403": { "$ref": "#/components/responses/Forbidden" }
|
|
10950
|
+
}
|
|
10951
|
+
}
|
|
10952
|
+
},
|
|
10953
|
+
"/v1/customer-endpoints": {
|
|
10954
|
+
"get": {
|
|
10955
|
+
"operationId": "listCustomerEndpointsWithCredential",
|
|
10956
|
+
"summary": "List safe customer-endpoint health metadata",
|
|
10957
|
+
"tags": ["Customer endpoints"],
|
|
10958
|
+
"security": [{ "bearerCredential": [] }],
|
|
10959
|
+
"x-required-scopes": ["messages:read"],
|
|
10960
|
+
"parameters": [
|
|
10961
|
+
{ "$ref": "#/components/parameters/ListAfterCursor" },
|
|
10962
|
+
{ "$ref": "#/components/parameters/ListPageLimit" },
|
|
10963
|
+
{ "$ref": "#/components/parameters/PageNumber" }
|
|
10964
|
+
],
|
|
10965
|
+
"responses": {
|
|
10966
|
+
"200": {
|
|
10967
|
+
"description": "Safe endpoint lifecycle and health metadata without URLs or protected content.",
|
|
10968
|
+
"headers": {
|
|
10969
|
+
"WhooshBang-Diagnostic-Id": {
|
|
10970
|
+
"$ref": "#/components/headers/DiagnosticId"
|
|
10971
|
+
}
|
|
10972
|
+
},
|
|
10973
|
+
"content": {
|
|
10974
|
+
"application/json": {
|
|
10975
|
+
"schema": {
|
|
10976
|
+
"$ref": "#/components/schemas/CustomerEndpointCollection"
|
|
10977
|
+
},
|
|
10978
|
+
"examples": {
|
|
10979
|
+
"endpoints": {
|
|
10980
|
+
"value": {
|
|
10981
|
+
"items": [
|
|
10982
|
+
{
|
|
10983
|
+
"id": "endpoint_11111111111111111111111111111111",
|
|
10984
|
+
"project_id": "project_synthetic_alpha",
|
|
10985
|
+
"environment_id": "environment_test_synthetic_alpha",
|
|
10986
|
+
"environment": "test",
|
|
10987
|
+
"status": "active",
|
|
10988
|
+
"verification_status": "verified",
|
|
10989
|
+
"event_types": [
|
|
10990
|
+
"interaction.received",
|
|
10991
|
+
"message.delivered"
|
|
10992
|
+
],
|
|
10993
|
+
"secret_version": 2,
|
|
10994
|
+
"health": "failing",
|
|
10995
|
+
"created_at": "2026-08-06T12:00:00.000Z",
|
|
10996
|
+
"updated_at": "2026-08-06T14:00:00.000Z",
|
|
10997
|
+
"verification_attempted_at": "2026-08-06T12:05:00.000Z",
|
|
10998
|
+
"verified_at": "2026-08-06T12:05:00.000Z",
|
|
10999
|
+
"rotated_at": "2026-08-06T13:00:00.000Z",
|
|
11000
|
+
"last_success_at": "2026-08-06T13:30:00.000Z",
|
|
11001
|
+
"last_failure": {
|
|
11002
|
+
"at": "2026-08-06T14:00:00.000Z",
|
|
11003
|
+
"category": "network_failure"
|
|
11004
|
+
},
|
|
11005
|
+
"diagnostic_id": "diag_endpoint_list_001"
|
|
11006
|
+
}
|
|
11007
|
+
],
|
|
11008
|
+
"total": 1,
|
|
11009
|
+
"page": 1,
|
|
11010
|
+
"page_size": 50
|
|
11011
|
+
}
|
|
11012
|
+
}
|
|
11013
|
+
}
|
|
11014
|
+
}
|
|
11015
|
+
}
|
|
11016
|
+
},
|
|
11017
|
+
"401": { "$ref": "#/components/responses/Unauthorized" },
|
|
11018
|
+
"403": { "$ref": "#/components/responses/Forbidden" },
|
|
11019
|
+
"404": { "$ref": "#/components/responses/NotFound" }
|
|
11020
|
+
}
|
|
11021
|
+
},
|
|
11022
|
+
"post": {
|
|
11023
|
+
"operationId": "createCustomerEndpointWithCredential",
|
|
11024
|
+
"summary": "Create an active customer endpoint and reveal its signing secret once",
|
|
11025
|
+
"description": "Creates an active endpoint and sends a signed diagnostic ping. A 2xx acknowledges the ping; no echo handshake is required. SSRF destination validation applies.",
|
|
11026
|
+
"tags": ["Customer endpoints"],
|
|
11027
|
+
"security": [{ "bearerCredential": [] }],
|
|
11028
|
+
"x-required-scopes": ["messages:write"],
|
|
11029
|
+
"x-idempotency": {
|
|
11030
|
+
"required": false,
|
|
11031
|
+
"retention_seconds": 604800,
|
|
11032
|
+
"scope": ["authenticated_environment", "operation_id", "key"],
|
|
11033
|
+
"equivalence": "final_normalized_url_and_validated_request",
|
|
11034
|
+
"replay_retention_extends": false
|
|
11035
|
+
},
|
|
11036
|
+
"x-secret-reveal": {
|
|
11037
|
+
"responses": 1,
|
|
11038
|
+
"replayable": false,
|
|
11039
|
+
"later_reads": "metadata_only"
|
|
11040
|
+
},
|
|
11041
|
+
"parameters": [{ "$ref": "#/components/parameters/IdempotencyKey" }],
|
|
11042
|
+
"requestBody": {
|
|
11043
|
+
"required": true,
|
|
11044
|
+
"content": {
|
|
11045
|
+
"application/json": {
|
|
11046
|
+
"schema": {
|
|
11047
|
+
"$ref": "#/components/schemas/CreateCustomerEndpointRequest"
|
|
11048
|
+
},
|
|
11049
|
+
"examples": {
|
|
11050
|
+
"createEndpoint": {
|
|
11051
|
+
"value": {
|
|
11052
|
+
"url": "https://events.example.com/whooshbang",
|
|
11053
|
+
"event_types": [
|
|
11054
|
+
"interaction.received",
|
|
11055
|
+
"message.delivered"
|
|
11056
|
+
],
|
|
11057
|
+
"local_test": false
|
|
11058
|
+
}
|
|
11059
|
+
}
|
|
11060
|
+
}
|
|
11061
|
+
}
|
|
11062
|
+
}
|
|
11063
|
+
},
|
|
11064
|
+
"responses": {
|
|
11065
|
+
"200": {
|
|
11066
|
+
"description": "Equivalent replay returning safe endpoint metadata without the secret.",
|
|
11067
|
+
"content": {
|
|
11068
|
+
"application/json": {
|
|
11069
|
+
"schema": {
|
|
11070
|
+
"$ref": "#/components/schemas/CustomerEndpointMutationResult"
|
|
11071
|
+
},
|
|
11072
|
+
"examples": {
|
|
11073
|
+
"replayed": {
|
|
11074
|
+
"value": {
|
|
11075
|
+
"endpoint": {
|
|
11076
|
+
"id": "endpoint_11111111111111111111111111111111",
|
|
11077
|
+
"project_id": "project_synthetic_alpha",
|
|
11078
|
+
"environment_id": "environment_test_synthetic_alpha",
|
|
11079
|
+
"environment": "test",
|
|
11080
|
+
"status": "unverified",
|
|
11081
|
+
"verification_status": "pending",
|
|
11082
|
+
"event_types": [
|
|
11083
|
+
"interaction.received",
|
|
11084
|
+
"message.delivered"
|
|
11085
|
+
],
|
|
11086
|
+
"secret_version": 1,
|
|
11087
|
+
"health": "never_delivered",
|
|
11088
|
+
"created_at": "2026-08-06T12:00:00.000Z",
|
|
11089
|
+
"updated_at": "2026-08-06T12:00:00.000Z",
|
|
11090
|
+
"diagnostic_id": "diag_endpoint_replay_001"
|
|
11091
|
+
}
|
|
11092
|
+
}
|
|
11093
|
+
}
|
|
11094
|
+
}
|
|
11095
|
+
}
|
|
11096
|
+
}
|
|
11097
|
+
},
|
|
11098
|
+
"201": {
|
|
11099
|
+
"description": "Newly active endpoint, recorded signed ping result, and its one-time signing secret.",
|
|
11100
|
+
"headers": {
|
|
11101
|
+
"WhooshBang-Diagnostic-Id": {
|
|
11102
|
+
"$ref": "#/components/headers/DiagnosticId"
|
|
11103
|
+
}
|
|
11104
|
+
},
|
|
11105
|
+
"content": {
|
|
11106
|
+
"application/json": {
|
|
11107
|
+
"schema": {
|
|
11108
|
+
"$ref": "#/components/schemas/CustomerEndpointMutationResult"
|
|
11109
|
+
},
|
|
11110
|
+
"examples": {
|
|
11111
|
+
"created": {
|
|
11112
|
+
"value": {
|
|
11113
|
+
"endpoint": {
|
|
11114
|
+
"id": "endpoint_11111111111111111111111111111111",
|
|
11115
|
+
"project_id": "project_synthetic_alpha",
|
|
11116
|
+
"environment_id": "environment_test_synthetic_alpha",
|
|
11117
|
+
"environment": "test",
|
|
11118
|
+
"status": "unverified",
|
|
11119
|
+
"verification_status": "pending",
|
|
11120
|
+
"event_types": [
|
|
11121
|
+
"interaction.received",
|
|
11122
|
+
"message.delivered"
|
|
11123
|
+
],
|
|
11124
|
+
"secret_version": 1,
|
|
11125
|
+
"health": "never_delivered",
|
|
11126
|
+
"created_at": "2026-08-06T12:00:00.000Z",
|
|
11127
|
+
"updated_at": "2026-08-06T12:00:00.000Z",
|
|
11128
|
+
"diagnostic_id": "diag_endpoint_create_001"
|
|
11129
|
+
},
|
|
11130
|
+
"secret": "whsec_AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8="
|
|
11131
|
+
}
|
|
11132
|
+
}
|
|
11133
|
+
}
|
|
11134
|
+
}
|
|
11135
|
+
}
|
|
11136
|
+
},
|
|
11137
|
+
"400": { "$ref": "#/components/responses/BadRequest" },
|
|
11138
|
+
"401": { "$ref": "#/components/responses/Unauthorized" },
|
|
11139
|
+
"403": { "$ref": "#/components/responses/Forbidden" },
|
|
11140
|
+
"404": { "$ref": "#/components/responses/NotFound" },
|
|
11141
|
+
"409": { "$ref": "#/components/responses/Conflict" },
|
|
11142
|
+
"503": { "$ref": "#/components/responses/ProviderRetryable" }
|
|
11143
|
+
}
|
|
11144
|
+
}
|
|
11145
|
+
},
|
|
11146
|
+
"/v1/customer-endpoints/{endpoint_id}": {
|
|
11147
|
+
"parameters": [{ "$ref": "#/components/parameters/CustomerEndpointId" }],
|
|
11148
|
+
"get": {
|
|
11149
|
+
"operationId": "getCustomerEndpointWithCredential",
|
|
11150
|
+
"summary": "Read safe lifecycle and health metadata for one endpoint",
|
|
11151
|
+
"tags": ["Customer endpoints"],
|
|
11152
|
+
"security": [{ "bearerCredential": [] }],
|
|
11153
|
+
"x-required-scopes": ["messages:read"],
|
|
11154
|
+
"responses": {
|
|
11155
|
+
"200": {
|
|
11156
|
+
"description": "Safe endpoint metadata.",
|
|
11157
|
+
"content": {
|
|
11158
|
+
"application/json": {
|
|
11159
|
+
"schema": { "$ref": "#/components/schemas/CustomerEndpoint" }
|
|
11160
|
+
}
|
|
11161
|
+
}
|
|
11162
|
+
},
|
|
11163
|
+
"401": { "$ref": "#/components/responses/Unauthorized" },
|
|
11164
|
+
"403": { "$ref": "#/components/responses/Forbidden" },
|
|
11165
|
+
"404": { "$ref": "#/components/responses/NotFound" }
|
|
11166
|
+
}
|
|
11167
|
+
}
|
|
11168
|
+
},
|
|
11169
|
+
"/v1/customer-endpoints/{endpoint_id}/verify": {
|
|
11170
|
+
"parameters": [{ "$ref": "#/components/parameters/CustomerEndpointId" }],
|
|
11171
|
+
"post": {
|
|
11172
|
+
"operationId": "verifyCustomerEndpointWithCredential",
|
|
11173
|
+
"summary": "Send a signed test ping and record whether the receiver returns 2xx",
|
|
11174
|
+
"tags": ["Customer endpoints"],
|
|
11175
|
+
"security": [{ "bearerCredential": [] }],
|
|
11176
|
+
"x-required-scopes": ["messages:write"],
|
|
11177
|
+
"responses": {
|
|
11178
|
+
"200": {
|
|
11179
|
+
"description": "Verified active endpoint metadata.",
|
|
11180
|
+
"content": {
|
|
11181
|
+
"application/json": {
|
|
11182
|
+
"schema": { "$ref": "#/components/schemas/CustomerEndpoint" }
|
|
11183
|
+
}
|
|
11184
|
+
}
|
|
11185
|
+
},
|
|
11186
|
+
"401": { "$ref": "#/components/responses/Unauthorized" },
|
|
11187
|
+
"403": { "$ref": "#/components/responses/Forbidden" },
|
|
11188
|
+
"404": { "$ref": "#/components/responses/NotFound" },
|
|
11189
|
+
"502": { "$ref": "#/components/responses/ProviderTerminal" },
|
|
11190
|
+
"503": { "$ref": "#/components/responses/ProviderRetryable" }
|
|
11191
|
+
}
|
|
11192
|
+
}
|
|
11193
|
+
},
|
|
11194
|
+
"/v1/customer-endpoints/{endpoint_id}/rotate": {
|
|
11195
|
+
"parameters": [{ "$ref": "#/components/parameters/CustomerEndpointId" }],
|
|
11196
|
+
"post": {
|
|
11197
|
+
"operationId": "rotateCustomerEndpointWithCredential",
|
|
11198
|
+
"summary": "Create a new signing version with bounded old/new overlap",
|
|
11199
|
+
"tags": ["Customer endpoints"],
|
|
11200
|
+
"security": [{ "bearerCredential": [] }],
|
|
11201
|
+
"x-required-scopes": ["messages:write"],
|
|
11202
|
+
"x-idempotency": {
|
|
11203
|
+
"required": false,
|
|
11204
|
+
"retention_seconds": 604800,
|
|
11205
|
+
"scope": ["authenticated_environment", "operation_id", "key"],
|
|
11206
|
+
"equivalence": "endpoint_and_validated_request",
|
|
11207
|
+
"replay_retention_extends": false
|
|
11208
|
+
},
|
|
11209
|
+
"x-secret-reveal": {
|
|
11210
|
+
"responses": 1,
|
|
11211
|
+
"replayable": false,
|
|
11212
|
+
"later_reads": "metadata_only"
|
|
11213
|
+
},
|
|
11214
|
+
"parameters": [{ "$ref": "#/components/parameters/IdempotencyKey" }],
|
|
11215
|
+
"requestBody": {
|
|
11216
|
+
"required": true,
|
|
11217
|
+
"content": {
|
|
11218
|
+
"application/json": {
|
|
11219
|
+
"schema": {
|
|
11220
|
+
"$ref": "#/components/schemas/RotateCustomerEndpointRequest"
|
|
11221
|
+
},
|
|
11222
|
+
"examples": { "rotate": { "value": { "overlap_seconds": 3600 } } }
|
|
11223
|
+
}
|
|
11224
|
+
}
|
|
11225
|
+
},
|
|
11226
|
+
"responses": {
|
|
11227
|
+
"200": {
|
|
11228
|
+
"description": "Equivalent replay without another secret reveal.",
|
|
11229
|
+
"content": {
|
|
11230
|
+
"application/json": {
|
|
11231
|
+
"schema": {
|
|
11232
|
+
"$ref": "#/components/schemas/CustomerEndpointMutationResult"
|
|
11233
|
+
}
|
|
11234
|
+
}
|
|
11235
|
+
}
|
|
11236
|
+
},
|
|
11237
|
+
"201": {
|
|
11238
|
+
"description": "Rotated endpoint and one-time new secret.",
|
|
11239
|
+
"content": {
|
|
11240
|
+
"application/json": {
|
|
11241
|
+
"schema": {
|
|
11242
|
+
"$ref": "#/components/schemas/CustomerEndpointMutationResult"
|
|
11243
|
+
},
|
|
11244
|
+
"examples": {
|
|
11245
|
+
"rotated": {
|
|
11246
|
+
"value": {
|
|
11247
|
+
"endpoint": {
|
|
11248
|
+
"id": "endpoint_11111111111111111111111111111111",
|
|
11249
|
+
"project_id": "project_synthetic_alpha",
|
|
11250
|
+
"environment_id": "environment_test_synthetic_alpha",
|
|
11251
|
+
"environment": "test",
|
|
11252
|
+
"status": "active",
|
|
11253
|
+
"verification_status": "verified",
|
|
11254
|
+
"event_types": [
|
|
11255
|
+
"interaction.received",
|
|
11256
|
+
"message.delivered"
|
|
11257
|
+
],
|
|
11258
|
+
"secret_version": 2,
|
|
11259
|
+
"health": "healthy",
|
|
11260
|
+
"created_at": "2026-08-06T12:00:00.000Z",
|
|
11261
|
+
"updated_at": "2026-08-06T13:00:00.000Z",
|
|
11262
|
+
"verification_attempted_at": "2026-08-06T12:05:00.000Z",
|
|
11263
|
+
"verified_at": "2026-08-06T12:05:00.000Z",
|
|
11264
|
+
"rotated_at": "2026-08-06T13:00:00.000Z",
|
|
11265
|
+
"last_success_at": "2026-08-06T12:30:00.000Z",
|
|
11266
|
+
"diagnostic_id": "diag_endpoint_rotate_001"
|
|
11267
|
+
},
|
|
11268
|
+
"secret": "whsec_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="
|
|
11269
|
+
}
|
|
11270
|
+
}
|
|
11271
|
+
}
|
|
11272
|
+
}
|
|
11273
|
+
}
|
|
11274
|
+
},
|
|
11275
|
+
"400": { "$ref": "#/components/responses/BadRequest" },
|
|
11276
|
+
"401": { "$ref": "#/components/responses/Unauthorized" },
|
|
11277
|
+
"403": { "$ref": "#/components/responses/Forbidden" },
|
|
11278
|
+
"404": { "$ref": "#/components/responses/NotFound" },
|
|
11279
|
+
"409": { "$ref": "#/components/responses/EndpointRotationConflict" }
|
|
11280
|
+
}
|
|
11281
|
+
}
|
|
11282
|
+
},
|
|
11283
|
+
"/v1/customer-endpoints/{endpoint_id}/{action}": {
|
|
11284
|
+
"parameters": [
|
|
11285
|
+
{ "$ref": "#/components/parameters/CustomerEndpointId" },
|
|
11286
|
+
{
|
|
11287
|
+
"name": "action",
|
|
11288
|
+
"in": "path",
|
|
11289
|
+
"required": true,
|
|
11290
|
+
"schema": { "type": "string", "enum": ["pause", "resume", "disable"] }
|
|
11291
|
+
}
|
|
11292
|
+
],
|
|
11293
|
+
"post": {
|
|
11294
|
+
"operationId": "transitionCustomerEndpointWithCredential",
|
|
11295
|
+
"summary": "Pause, resume, or terminally disable an endpoint",
|
|
11296
|
+
"tags": ["Customer endpoints"],
|
|
11297
|
+
"security": [{ "bearerCredential": [] }],
|
|
11298
|
+
"x-required-scopes": ["messages:write"],
|
|
11299
|
+
"x-repeat-semantics": {
|
|
11300
|
+
"same_target": "idempotent",
|
|
11301
|
+
"secret_returned": false
|
|
11302
|
+
},
|
|
11303
|
+
"responses": {
|
|
11304
|
+
"200": {
|
|
11305
|
+
"description": "Updated safe endpoint metadata.",
|
|
11306
|
+
"content": {
|
|
11307
|
+
"application/json": {
|
|
11308
|
+
"schema": { "$ref": "#/components/schemas/CustomerEndpoint" }
|
|
11309
|
+
}
|
|
11310
|
+
}
|
|
11311
|
+
},
|
|
11312
|
+
"400": { "$ref": "#/components/responses/BadRequest" },
|
|
11313
|
+
"401": { "$ref": "#/components/responses/Unauthorized" },
|
|
11314
|
+
"403": { "$ref": "#/components/responses/Forbidden" },
|
|
11315
|
+
"404": { "$ref": "#/components/responses/NotFound" }
|
|
11316
|
+
},
|
|
11317
|
+
"description": "Creates an active endpoint and sends a signed diagnostic ping. A 2xx acknowledges the ping; no echo handshake is required. SSRF destination validation applies."
|
|
11318
|
+
}
|
|
11319
|
+
},
|
|
11320
|
+
"/v1/customer-endpoints/{endpoint_id}/attempts": {
|
|
11321
|
+
"parameters": [{ "$ref": "#/components/parameters/CustomerEndpointId" }],
|
|
11322
|
+
"get": {
|
|
11323
|
+
"operationId": "listCustomerEndpointAttemptsWithCredential",
|
|
11324
|
+
"summary": "Inspect protected content-free delivery diagnostics",
|
|
11325
|
+
"tags": ["Customer endpoints"],
|
|
11326
|
+
"security": [{ "bearerCredential": [] }],
|
|
11327
|
+
"x-required-scopes": ["messages:read"],
|
|
11328
|
+
"parameters": [
|
|
11329
|
+
{ "$ref": "#/components/parameters/ListAfterCursor" },
|
|
11330
|
+
{ "$ref": "#/components/parameters/ListPageLimit" },
|
|
11331
|
+
{ "$ref": "#/components/parameters/PageNumber" }
|
|
11332
|
+
],
|
|
11333
|
+
"responses": {
|
|
11334
|
+
"200": {
|
|
11335
|
+
"description": "Safe status, timing, and failure categories only.",
|
|
11336
|
+
"content": {
|
|
11337
|
+
"application/json": {
|
|
11338
|
+
"schema": {
|
|
11339
|
+
"$ref": "#/components/schemas/CustomerEndpointAttemptCollection"
|
|
11340
|
+
},
|
|
11341
|
+
"examples": {
|
|
11342
|
+
"attempts": {
|
|
11343
|
+
"value": {
|
|
11344
|
+
"endpoint_id": "endpoint_11111111111111111111111111111111",
|
|
11345
|
+
"attempts": [
|
|
11346
|
+
{
|
|
11347
|
+
"id": "ceattempt_11111111111111111111111111111111",
|
|
11348
|
+
"event_id": "evt_interaction_received_synthetic",
|
|
11349
|
+
"attempt": 1,
|
|
11350
|
+
"status": "terminal_failed",
|
|
11351
|
+
"diagnostic_code": "network_failure",
|
|
11352
|
+
"started_at": "2026-08-06T14:00:00.000Z",
|
|
11353
|
+
"completed_at": "2026-08-06T14:00:01.000Z",
|
|
11354
|
+
"created_at": "2026-08-06T14:00:00.000Z"
|
|
11355
|
+
}
|
|
11356
|
+
],
|
|
11357
|
+
"total": 1,
|
|
11358
|
+
"page": 1,
|
|
11359
|
+
"page_size": 50
|
|
11360
|
+
}
|
|
11361
|
+
}
|
|
11362
|
+
}
|
|
11363
|
+
}
|
|
11364
|
+
}
|
|
11365
|
+
},
|
|
11366
|
+
"401": { "$ref": "#/components/responses/Unauthorized" },
|
|
11367
|
+
"403": { "$ref": "#/components/responses/Forbidden" },
|
|
11368
|
+
"404": { "$ref": "#/components/responses/NotFound" }
|
|
11369
|
+
}
|
|
11370
|
+
}
|
|
11371
|
+
}
|
|
11372
|
+
},
|
|
11373
|
+
"components": {
|
|
11374
|
+
"securitySchemes": {
|
|
11375
|
+
"clerkSession": {
|
|
11376
|
+
"type": "http",
|
|
11377
|
+
"scheme": "bearer",
|
|
11378
|
+
"bearerFormat": "Clerk session JWT",
|
|
11379
|
+
"description": "A verified human session whose active Clerk organization selects exactly\none WhooshBang organization. Every administration operation rechecks the\nprojected organization membership; session identity never selects a project\nor environment from request data.\n"
|
|
11380
|
+
},
|
|
11381
|
+
"bearerGrant": {
|
|
11382
|
+
"type": "http",
|
|
11383
|
+
"scheme": "bearer",
|
|
11384
|
+
"bearerFormat": "OAuth 2.0 access token",
|
|
11385
|
+
"description": "An access token issued by the WhooshBang authorization server for one\nconsenting organization member. It selects exactly one organization and carries\nthe scopes that member consented to, and never a project: an operation\nnames its project and environment in the path, and the service checks\nboth against the granting person's membership before acting. A project\ncredential can name no project but its own; an organization credential names\none per call the same way this does.\n"
|
|
11386
|
+
},
|
|
11387
|
+
"bearerOrganizationCredential": {
|
|
11388
|
+
"type": "http",
|
|
11389
|
+
"scheme": "bearer",
|
|
11390
|
+
"bearerFormat": "wb_oc1.ocred_<16-byte-base64url>.<32-byte-base64url-secret>",
|
|
11391
|
+
"description": "Selects exactly one organization and nothing below it. It names no project\nand no environment, so it authenticates only operations whose path does,\nand its authority there is the intersection of its scopes with the\nproject-credential vocabulary — never wider than a project credential\nwould have been for the same project environment. A path naming a\nproject outside its organization is refused with `credential_organization_mismatch`\nrather than a bare scope failure. `organization:read` is the one scope it can\nhold that a project credential cannot, and it authorizes only the\norganization's project directory: listing the organization's projects and reading\none, which is the organization-wide question a project credential cannot ask\nand the reason a `--project <slug>` selector can work at all. It is\nrequired *in addition to* each of those operations' own\n`x-required-scopes`, never instead of them.\nCredentials cannot be read after creation.\n"
|
|
11392
|
+
},
|
|
11393
|
+
"bearerCredential": {
|
|
11394
|
+
"type": "http",
|
|
11395
|
+
"scheme": "bearer",
|
|
11396
|
+
"bearerFormat": "wb_pc1.pcred_<16-byte-base64url>.<32-byte-base64url-secret>",
|
|
11397
|
+
"description": "Selects exactly one organization, project, and `test` or `live` environment.\nCredentials cannot be read after creation. Except for explicitly\nsynthetic creation/rotation reveal fixtures, complete bearer values\nmust never appear in fixtures, errors, logs, metrics, or inspection\nsurfaces.\n"
|
|
11398
|
+
},
|
|
11399
|
+
"machineCredential": {
|
|
11400
|
+
"type": "http",
|
|
11401
|
+
"scheme": "bearer",
|
|
11402
|
+
"bearerFormat": "wb_mc1.mcred_<16-byte-base64url>.<32-byte-base64url-secret>",
|
|
11403
|
+
"description": "A locally generated runtime credential bound server-side to exactly one\nproject/environment, machine client, notifier, subscriber, binding, and\nevent stream. Project credentials cannot use machine-only endpoints.\nRevoked credentials fail before resource lookup.\n"
|
|
11404
|
+
},
|
|
11405
|
+
"recipientSessionCapability": {
|
|
11406
|
+
"type": "apiKey",
|
|
11407
|
+
"in": "header",
|
|
11408
|
+
"name": "WhooshBang-Recipient-Capability",
|
|
11409
|
+
"description": "A creation-only, short-lived capability bound server-side to one exact\norganization, project, environment, subscriber, configuration revision,\npresenting origin, and registered return destination. It is accepted\nonly on the `/v1/recipient-session` browser surface and never as bearer\nauthority on an ordinary application route.\n"
|
|
11410
|
+
}
|
|
11411
|
+
},
|
|
11412
|
+
"parameters": {
|
|
11413
|
+
"IdempotencyKey": {
|
|
11414
|
+
"name": "Idempotency-Key",
|
|
11415
|
+
"in": "header",
|
|
11416
|
+
"required": false,
|
|
11417
|
+
"description": "Optional visible ASCII key retained for seven days from first acceptance.\nA retry with the same key returns the original result and never acts twice.\nWithout a key each request is new.\nEquivalent replay returns the original status and logical resource;\nmaterially different validated input returns `idempotency_conflict`.\n",
|
|
11418
|
+
"schema": { "$ref": "#/components/schemas/IdempotencyKey" }
|
|
11419
|
+
},
|
|
11420
|
+
"SubscriptionLinkId": {
|
|
11421
|
+
"name": "subscription_link_id",
|
|
11422
|
+
"in": "path",
|
|
11423
|
+
"required": true,
|
|
11424
|
+
"description": "Opaque subscription-link identity; never authorization.",
|
|
11425
|
+
"schema": { "$ref": "#/components/schemas/OpaqueIdentifier" }
|
|
11426
|
+
},
|
|
11427
|
+
"ProjectId": {
|
|
11428
|
+
"name": "project_id",
|
|
11429
|
+
"in": "path",
|
|
11430
|
+
"required": true,
|
|
11431
|
+
"description": "Opaque project identity; never authorization.",
|
|
11432
|
+
"schema": { "$ref": "#/components/schemas/OpaqueIdentifier" }
|
|
11433
|
+
},
|
|
11434
|
+
"EnvironmentId": {
|
|
11435
|
+
"name": "environment_id",
|
|
11436
|
+
"in": "path",
|
|
11437
|
+
"required": true,
|
|
11438
|
+
"description": "Opaque project-environment identity; never authorization.",
|
|
11439
|
+
"schema": { "$ref": "#/components/schemas/OpaqueIdentifier" }
|
|
11440
|
+
},
|
|
11441
|
+
"ApiCredentialId": {
|
|
11442
|
+
"name": "credential_id",
|
|
11443
|
+
"in": "path",
|
|
11444
|
+
"required": true,
|
|
11445
|
+
"description": "Canonical opaque project credential identity; never a readable secret.",
|
|
11446
|
+
"schema": { "$ref": "#/components/schemas/ApiCredentialId" }
|
|
11447
|
+
},
|
|
11448
|
+
"OrganizationCredentialId": {
|
|
11449
|
+
"name": "organization_credential_id",
|
|
11450
|
+
"in": "path",
|
|
11451
|
+
"required": true,
|
|
11452
|
+
"description": "Canonical opaque organization credential identity; never a readable secret.",
|
|
11453
|
+
"schema": { "$ref": "#/components/schemas/OrganizationCredentialId" }
|
|
11454
|
+
},
|
|
11455
|
+
"ApiCredentialAfterCursor": {
|
|
11456
|
+
"name": "after",
|
|
11457
|
+
"in": "query",
|
|
11458
|
+
"required": false,
|
|
11459
|
+
"description": "Opaque cursor returned by the previous credential page.",
|
|
11460
|
+
"schema": {
|
|
11461
|
+
"type": "string",
|
|
11462
|
+
"minLength": 1,
|
|
11463
|
+
"maxLength": 256,
|
|
11464
|
+
"pattern": "^[A-Za-z0-9_-]+$"
|
|
11465
|
+
}
|
|
11466
|
+
},
|
|
11467
|
+
"ApiCredentialPageLimit": {
|
|
11468
|
+
"name": "limit",
|
|
11469
|
+
"in": "query",
|
|
11470
|
+
"required": false,
|
|
11471
|
+
"description": "Maximum credential metadata records returned in one page.",
|
|
11472
|
+
"schema": {
|
|
11473
|
+
"type": "integer",
|
|
11474
|
+
"minimum": 1,
|
|
11475
|
+
"maximum": 100,
|
|
11476
|
+
"default": 50
|
|
11477
|
+
}
|
|
11478
|
+
},
|
|
11479
|
+
"ListAfterCursor": {
|
|
11480
|
+
"name": "after",
|
|
11481
|
+
"in": "query",
|
|
11482
|
+
"required": false,
|
|
11000
11483
|
"description": "Opaque cursor returned by the previous page of this list.",
|
|
11001
11484
|
"schema": {
|
|
11002
11485
|
"type": "string",
|
|
@@ -11304,13 +11787,13 @@
|
|
|
11304
11787
|
"CreateOperatorMessageRequest": {
|
|
11305
11788
|
"type": "object",
|
|
11306
11789
|
"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.",
|
|
11307
|
-
"required": [
|
|
11790
|
+
"required": [],
|
|
11308
11791
|
"properties": {
|
|
11309
11792
|
"recipient": { "type": "string", "minLength": 1, "maxLength": 128 },
|
|
11310
|
-
"content": { "$ref": "#/components/schemas/
|
|
11793
|
+
"content": { "$ref": "#/components/schemas/MessageContentInput" },
|
|
11311
11794
|
"expires_at": {
|
|
11312
11795
|
"$ref": "#/components/schemas/Timestamp",
|
|
11313
|
-
"description": "Optional server-authoritative expiry
|
|
11796
|
+
"description": "Optional server-authoritative expiry after acceptance, through year 9999. Omit for 24 hours."
|
|
11314
11797
|
},
|
|
11315
11798
|
"correlation_id": {
|
|
11316
11799
|
"type": "string",
|
|
@@ -11327,7 +11810,31 @@
|
|
|
11327
11810
|
"description": "Omitted means service. Marketing refuses service-only bindings before charging and at every delayed dispatch."
|
|
11328
11811
|
}
|
|
11329
11812
|
},
|
|
11330
|
-
"additionalProperties": false
|
|
11813
|
+
"additionalProperties": false,
|
|
11814
|
+
"allOf": [
|
|
11815
|
+
{
|
|
11816
|
+
"anyOf": [
|
|
11817
|
+
{
|
|
11818
|
+
"required": ["content"],
|
|
11819
|
+
"properties": {
|
|
11820
|
+
"content": {
|
|
11821
|
+
"$ref": "#/components/schemas/MessageContentInput"
|
|
11822
|
+
}
|
|
11823
|
+
},
|
|
11824
|
+
"additionalProperties": true
|
|
11825
|
+
},
|
|
11826
|
+
{
|
|
11827
|
+
"required": ["interaction"],
|
|
11828
|
+
"properties": {
|
|
11829
|
+
"interaction": {
|
|
11830
|
+
"$ref": "#/components/schemas/InteractionSendRequest"
|
|
11831
|
+
}
|
|
11832
|
+
},
|
|
11833
|
+
"additionalProperties": true
|
|
11834
|
+
}
|
|
11835
|
+
]
|
|
11836
|
+
}
|
|
11837
|
+
]
|
|
11331
11838
|
},
|
|
11332
11839
|
"OperatorMessageResult": {
|
|
11333
11840
|
"type": "object",
|
|
@@ -15181,7 +15688,7 @@
|
|
|
15181
15688
|
"CreateCustomerEndpointRequest": {
|
|
15182
15689
|
"type": "object",
|
|
15183
15690
|
"description": "Creates one project/environment endpoint. The service validates the final normalized destination and never returns it from health or diagnostic reads.",
|
|
15184
|
-
"required": ["url"
|
|
15691
|
+
"required": ["url"],
|
|
15185
15692
|
"properties": {
|
|
15186
15693
|
"url": {
|
|
15187
15694
|
"type": "string",
|
|
@@ -15207,12 +15714,13 @@
|
|
|
15207
15714
|
},
|
|
15208
15715
|
"RotateCustomerEndpointRequest": {
|
|
15209
15716
|
"type": "object",
|
|
15210
|
-
"required": [
|
|
15717
|
+
"required": [],
|
|
15211
15718
|
"properties": {
|
|
15212
15719
|
"overlap_seconds": {
|
|
15213
15720
|
"type": "integer",
|
|
15214
15721
|
"minimum": 60,
|
|
15215
|
-
"maximum": 86400
|
|
15722
|
+
"maximum": 86400,
|
|
15723
|
+
"default": 86400
|
|
15216
15724
|
}
|
|
15217
15725
|
},
|
|
15218
15726
|
"additionalProperties": false
|
|
@@ -15269,7 +15777,13 @@
|
|
|
15269
15777
|
"last_failure": {
|
|
15270
15778
|
"$ref": "#/components/schemas/CustomerEndpointFailure"
|
|
15271
15779
|
},
|
|
15272
|
-
"diagnostic_id": { "$ref": "#/components/schemas/DiagnosticId" }
|
|
15780
|
+
"diagnostic_id": { "$ref": "#/components/schemas/DiagnosticId" },
|
|
15781
|
+
"pause_reason": {
|
|
15782
|
+
"type": "string",
|
|
15783
|
+
"enum": ["customer", "sustained_failure", "probe_failed"]
|
|
15784
|
+
},
|
|
15785
|
+
"next_probe_at": { "$ref": "#/components/schemas/Timestamp" },
|
|
15786
|
+
"recovery_pending": { "type": "boolean" }
|
|
15273
15787
|
},
|
|
15274
15788
|
"additionalProperties": false
|
|
15275
15789
|
},
|
|
@@ -15713,7 +16227,7 @@
|
|
|
15713
16227
|
"CreateSubscriptionLinkRequest": {
|
|
15714
16228
|
"type": "object",
|
|
15715
16229
|
"description": "Creates one project- and environment-scoped, single-use authorization link.",
|
|
15716
|
-
"required": ["subscriber_id"
|
|
16230
|
+
"required": ["subscriber_id"],
|
|
15717
16231
|
"properties": {
|
|
15718
16232
|
"subscriber_id": { "$ref": "#/components/schemas/OpaqueIdentifier" },
|
|
15719
16233
|
"notifier_id": {
|
|
@@ -15729,7 +16243,7 @@
|
|
|
15729
16243
|
},
|
|
15730
16244
|
"connection_id": {
|
|
15731
16245
|
"$ref": "#/components/schemas/OpaqueIdentifier",
|
|
15732
|
-
"description": "
|
|
16246
|
+
"description": "Optional exact connection. Otherwise the default or only compatible connection is used."
|
|
15733
16247
|
},
|
|
15734
16248
|
"address": {
|
|
15735
16249
|
"$ref": "#/components/schemas/EmailAddress",
|
|
@@ -15764,16 +16278,6 @@
|
|
|
15764
16278
|
{
|
|
15765
16279
|
"if": { "properties": { "address": {} }, "required": ["address"] },
|
|
15766
16280
|
"then": { "properties": { "channels": { "const": ["email"] } } }
|
|
15767
|
-
},
|
|
15768
|
-
{
|
|
15769
|
-
"if": {
|
|
15770
|
-
"properties": { "channels": { "const": ["slack"] } },
|
|
15771
|
-
"required": ["channels"]
|
|
15772
|
-
},
|
|
15773
|
-
"then": {
|
|
15774
|
-
"required": ["connection_id"],
|
|
15775
|
-
"properties": { "connection_id": {} }
|
|
15776
|
-
}
|
|
15777
16281
|
}
|
|
15778
16282
|
],
|
|
15779
16283
|
"additionalProperties": false
|
|
@@ -15892,9 +16396,14 @@
|
|
|
15892
16396
|
"CreateMessageRequest": {
|
|
15893
16397
|
"type": "object",
|
|
15894
16398
|
"description": "Creates one logical message for one subscriber and one resolved channel binding.",
|
|
15895
|
-
"required": ["to"
|
|
16399
|
+
"required": ["to"],
|
|
15896
16400
|
"properties": {
|
|
15897
|
-
"to": {
|
|
16401
|
+
"to": {
|
|
16402
|
+
"oneOf": [
|
|
16403
|
+
{ "$ref": "#/components/schemas/MessageTarget" },
|
|
16404
|
+
{ "$ref": "#/components/schemas/OpaqueIdentifier" }
|
|
16405
|
+
]
|
|
16406
|
+
},
|
|
15898
16407
|
"notifier_id": {
|
|
15899
16408
|
"allOf": [{ "$ref": "#/components/schemas/OpaqueIdentifier" }],
|
|
15900
16409
|
"default": "default"
|
|
@@ -15907,10 +16416,10 @@
|
|
|
15907
16416
|
"allOf": [{ "$ref": "#/components/schemas/OpaqueIdentifier" }],
|
|
15908
16417
|
"description": "Optional channel connection to send through, from the environment's connections. The subscriber must be connected through it; the service never substitutes another connection or provider. A connection the subscriber has not connected through is refused as `subscriber_not_connected` when they are connected through another, and as an unchosen send would be (`subscriber_unbound` or `preferred_binding_unavailable`) when no connected channel can take the message. Omitted, the service chooses: the subscriber's preferred channel when they set one, otherwise the default connection when they are connected there, otherwise the connection they connected through most recently. The accepted message's `binding.connection_id` records the connection used. Implies `delivery_target: connection`."
|
|
15909
16418
|
},
|
|
15910
|
-
"content": { "$ref": "#/components/schemas/
|
|
16419
|
+
"content": { "$ref": "#/components/schemas/MessageContentInput" },
|
|
15911
16420
|
"expires_at": {
|
|
15912
16421
|
"$ref": "#/components/schemas/Timestamp",
|
|
15913
|
-
"description": "Optional server-authoritative expiry
|
|
16422
|
+
"description": "Optional server-authoritative expiry after acceptance, through year 9999. Omit for 24 hours."
|
|
15914
16423
|
},
|
|
15915
16424
|
"correlation_id": {
|
|
15916
16425
|
"type": "string",
|
|
@@ -15936,6 +16445,28 @@
|
|
|
15936
16445
|
"then": {
|
|
15937
16446
|
"properties": { "delivery_target": { "const": "connection" } }
|
|
15938
16447
|
}
|
|
16448
|
+
},
|
|
16449
|
+
{
|
|
16450
|
+
"anyOf": [
|
|
16451
|
+
{
|
|
16452
|
+
"required": ["content"],
|
|
16453
|
+
"properties": {
|
|
16454
|
+
"content": {
|
|
16455
|
+
"$ref": "#/components/schemas/MessageContentInput"
|
|
16456
|
+
}
|
|
16457
|
+
},
|
|
16458
|
+
"additionalProperties": true
|
|
16459
|
+
},
|
|
16460
|
+
{
|
|
16461
|
+
"required": ["interaction"],
|
|
16462
|
+
"properties": {
|
|
16463
|
+
"interaction": {
|
|
16464
|
+
"$ref": "#/components/schemas/InteractionSendRequest"
|
|
16465
|
+
}
|
|
16466
|
+
},
|
|
16467
|
+
"additionalProperties": true
|
|
16468
|
+
}
|
|
16469
|
+
]
|
|
15939
16470
|
}
|
|
15940
16471
|
],
|
|
15941
16472
|
"additionalProperties": false
|
|
@@ -16469,7 +17000,9 @@
|
|
|
16469
17000
|
"type": {
|
|
16470
17001
|
"const": "https://whooshbang.flowxo.com/problems/idempotency_key_required"
|
|
16471
17002
|
},
|
|
16472
|
-
"title": {
|
|
17003
|
+
"title": {
|
|
17004
|
+
"enum": ["Invalid idempotency key", "Idempotency key required"]
|
|
17005
|
+
},
|
|
16473
17006
|
"status": { "const": 400 },
|
|
16474
17007
|
"code": { "const": "idempotency_key_required" },
|
|
16475
17008
|
"retryable": { "const": false }
|
|
@@ -16782,7 +17315,7 @@
|
|
|
16782
17315
|
"additionalProperties": false
|
|
16783
17316
|
},
|
|
16784
17317
|
"InteractionSendRequest": {
|
|
16785
|
-
"description": "
|
|
17318
|
+
"description": "Options infer select; otherwise confirm. Typed replies require type: input. Omit expiry for 24 hours.",
|
|
16786
17319
|
"oneOf": [
|
|
16787
17320
|
{ "$ref": "#/components/schemas/ConfirmInteractionSendRequest" },
|
|
16788
17321
|
{ "$ref": "#/components/schemas/SelectInteractionSendRequest" },
|
|
@@ -18065,9 +18598,6 @@
|
|
|
18065
18598
|
"description": "Atomically create or resolve one subscriber and assert existing consent for an exact customer-owned email connection and domain. No verification message is sent. Revocation, suppression, recipient pause, holds and unhealthy authority take precedence. An omitted source is recorded as customer.",
|
|
18066
18599
|
"required": [
|
|
18067
18600
|
"subscriber_id",
|
|
18068
|
-
"notifier_id",
|
|
18069
|
-
"connection_id",
|
|
18070
|
-
"domain_id",
|
|
18071
18601
|
"address",
|
|
18072
18602
|
"consented",
|
|
18073
18603
|
"consented_at"
|
|
@@ -18077,7 +18607,8 @@
|
|
|
18077
18607
|
"$ref": "#/components/schemas/OpaqueIdentifier"
|
|
18078
18608
|
},
|
|
18079
18609
|
"notifier_id": {
|
|
18080
|
-
"$ref": "#/components/schemas/OpaqueIdentifier"
|
|
18610
|
+
"$ref": "#/components/schemas/OpaqueIdentifier",
|
|
18611
|
+
"default": "default"
|
|
18081
18612
|
},
|
|
18082
18613
|
"connection_id": {
|
|
18083
18614
|
"$ref": "#/components/schemas/OpaqueIdentifier"
|
|
@@ -18104,9 +18635,6 @@
|
|
|
18104
18635
|
"description": "Enroll an application-verified user for service email. This is relationship evidence, never consent or WhooshBang mailbox verification. An existing prior-consent binding with the same subscriber, address, notifier, connection and domain is reused with its original evidence and status.",
|
|
18105
18636
|
"required": [
|
|
18106
18637
|
"subscriber_id",
|
|
18107
|
-
"notifier_id",
|
|
18108
|
-
"connection_id",
|
|
18109
|
-
"domain_id",
|
|
18110
18638
|
"address",
|
|
18111
18639
|
"basis",
|
|
18112
18640
|
"source",
|
|
@@ -18117,7 +18645,8 @@
|
|
|
18117
18645
|
"$ref": "#/components/schemas/OpaqueIdentifier"
|
|
18118
18646
|
},
|
|
18119
18647
|
"notifier_id": {
|
|
18120
|
-
"$ref": "#/components/schemas/OpaqueIdentifier"
|
|
18648
|
+
"$ref": "#/components/schemas/OpaqueIdentifier",
|
|
18649
|
+
"default": "default"
|
|
18121
18650
|
},
|
|
18122
18651
|
"connection_id": {
|
|
18123
18652
|
"$ref": "#/components/schemas/OpaqueIdentifier"
|
|
@@ -18159,7 +18688,7 @@
|
|
|
18159
18688
|
"type": "array",
|
|
18160
18689
|
"maxItems": 50,
|
|
18161
18690
|
"uniqueItems": true,
|
|
18162
|
-
"items": { "$ref": "#/components/schemas/
|
|
18691
|
+
"items": { "$ref": "#/components/schemas/GroupKey" }
|
|
18163
18692
|
}
|
|
18164
18693
|
},
|
|
18165
18694
|
"additionalProperties": false
|
|
@@ -18231,7 +18760,7 @@
|
|
|
18231
18760
|
"maxItems": 200,
|
|
18232
18761
|
"uniqueItems": true,
|
|
18233
18762
|
"description": "The keys of the static groups this subscriber belongs to in the environment asked about. Present when one subscriber is read.",
|
|
18234
|
-
"items": { "$ref": "#/components/schemas/
|
|
18763
|
+
"items": { "$ref": "#/components/schemas/GroupKey" }
|
|
18235
18764
|
},
|
|
18236
18765
|
"last_activity_at": {
|
|
18237
18766
|
"$ref": "#/components/schemas/Timestamp",
|
|
@@ -18413,9 +18942,9 @@
|
|
|
18413
18942
|
"CreateSubscriberGroupRequest": {
|
|
18414
18943
|
"type": "object",
|
|
18415
18944
|
"description": "Creates one static, developer-managed subscriber group.",
|
|
18416
|
-
"required": ["key"
|
|
18945
|
+
"required": ["key"],
|
|
18417
18946
|
"properties": {
|
|
18418
|
-
"key": { "$ref": "#/components/schemas/
|
|
18947
|
+
"key": { "$ref": "#/components/schemas/GroupKey" },
|
|
18419
18948
|
"display_name": {
|
|
18420
18949
|
"type": "string",
|
|
18421
18950
|
"minLength": 1,
|
|
@@ -18428,8 +18957,8 @@
|
|
|
18428
18957
|
"UpdateSubscriberGroupRequest": {
|
|
18429
18958
|
"type": "object",
|
|
18430
18959
|
"description": "Renames or redescribes an active group. Its key and static membership model cannot change.",
|
|
18431
|
-
"required": [
|
|
18432
|
-
"minProperties":
|
|
18960
|
+
"required": [],
|
|
18961
|
+
"minProperties": 1,
|
|
18433
18962
|
"properties": {
|
|
18434
18963
|
"row_version": { "type": "integer", "minimum": 1 },
|
|
18435
18964
|
"display_name": {
|
|
@@ -18439,7 +18968,14 @@
|
|
|
18439
18968
|
},
|
|
18440
18969
|
"description": { "type": ["string", "null"], "maxLength": 500 }
|
|
18441
18970
|
},
|
|
18442
|
-
"additionalProperties": false
|
|
18971
|
+
"additionalProperties": false,
|
|
18972
|
+
"anyOf": [
|
|
18973
|
+
{
|
|
18974
|
+
"required": ["display_name"],
|
|
18975
|
+
"properties": { "display_name": {} }
|
|
18976
|
+
},
|
|
18977
|
+
{ "required": ["description"], "properties": { "description": {} } }
|
|
18978
|
+
]
|
|
18443
18979
|
},
|
|
18444
18980
|
"SubscriberGroup": {
|
|
18445
18981
|
"type": "object",
|
|
@@ -18466,7 +19002,7 @@
|
|
|
18466
19002
|
"id": { "$ref": "#/components/schemas/OpaqueIdentifier" },
|
|
18467
19003
|
"project_id": { "$ref": "#/components/schemas/OpaqueIdentifier" },
|
|
18468
19004
|
"environment": { "$ref": "#/components/schemas/Environment" },
|
|
18469
|
-
"key": { "$ref": "#/components/schemas/
|
|
19005
|
+
"key": { "$ref": "#/components/schemas/GroupKey" },
|
|
18470
19006
|
"display_name": {
|
|
18471
19007
|
"type": "string",
|
|
18472
19008
|
"minLength": 1,
|
|
@@ -18533,7 +19069,7 @@
|
|
|
18533
19069
|
],
|
|
18534
19070
|
"properties": {
|
|
18535
19071
|
"group_id": { "$ref": "#/components/schemas/OpaqueIdentifier" },
|
|
18536
|
-
"group_key": { "$ref": "#/components/schemas/
|
|
19072
|
+
"group_key": { "$ref": "#/components/schemas/GroupKey" },
|
|
18537
19073
|
"subscriber_id": { "$ref": "#/components/schemas/OpaqueIdentifier" },
|
|
18538
19074
|
"subscriber_name": {
|
|
18539
19075
|
"type": "string",
|
|
@@ -18574,7 +19110,7 @@
|
|
|
18574
19110
|
"type": "object",
|
|
18575
19111
|
"required": ["group_key", "membership_revision", "items"],
|
|
18576
19112
|
"properties": {
|
|
18577
|
-
"group_key": { "$ref": "#/components/schemas/
|
|
19113
|
+
"group_key": { "$ref": "#/components/schemas/GroupKey" },
|
|
18578
19114
|
"membership_revision": { "type": "integer", "minimum": 0 },
|
|
18579
19115
|
"items": {
|
|
18580
19116
|
"type": "array",
|
|
@@ -18598,14 +19134,17 @@
|
|
|
18598
19134
|
"CreateGroupBroadcastRequest": {
|
|
18599
19135
|
"type": "object",
|
|
18600
19136
|
"description": "Creates one group broadcast using the existing ordinary message envelope. The group target comes only from the path.",
|
|
18601
|
-
"required": [
|
|
19137
|
+
"required": [],
|
|
18602
19138
|
"properties": {
|
|
18603
19139
|
"notifier_id": {
|
|
18604
19140
|
"allOf": [{ "$ref": "#/components/schemas/OpaqueIdentifier" }],
|
|
18605
19141
|
"default": "default"
|
|
18606
19142
|
},
|
|
18607
|
-
"content": { "$ref": "#/components/schemas/
|
|
18608
|
-
"expires_at": {
|
|
19143
|
+
"content": { "$ref": "#/components/schemas/MessageContentInput" },
|
|
19144
|
+
"expires_at": {
|
|
19145
|
+
"$ref": "#/components/schemas/Timestamp",
|
|
19146
|
+
"description": "Optional server-authoritative expiry after acceptance, through year 9999. Omit for 24 hours."
|
|
19147
|
+
},
|
|
18609
19148
|
"correlation_id": {
|
|
18610
19149
|
"type": "string",
|
|
18611
19150
|
"minLength": 1,
|
|
@@ -18621,7 +19160,31 @@
|
|
|
18621
19160
|
"description": "Omitted means service. Marketing refuses service-only bindings before charging and at every delayed dispatch."
|
|
18622
19161
|
}
|
|
18623
19162
|
},
|
|
18624
|
-
"additionalProperties": false
|
|
19163
|
+
"additionalProperties": false,
|
|
19164
|
+
"allOf": [
|
|
19165
|
+
{
|
|
19166
|
+
"anyOf": [
|
|
19167
|
+
{
|
|
19168
|
+
"required": ["content"],
|
|
19169
|
+
"properties": {
|
|
19170
|
+
"content": {
|
|
19171
|
+
"$ref": "#/components/schemas/MessageContentInput"
|
|
19172
|
+
}
|
|
19173
|
+
},
|
|
19174
|
+
"additionalProperties": true
|
|
19175
|
+
},
|
|
19176
|
+
{
|
|
19177
|
+
"required": ["interaction"],
|
|
19178
|
+
"properties": {
|
|
19179
|
+
"interaction": {
|
|
19180
|
+
"$ref": "#/components/schemas/InteractionSendRequest"
|
|
19181
|
+
}
|
|
19182
|
+
},
|
|
19183
|
+
"additionalProperties": true
|
|
19184
|
+
}
|
|
19185
|
+
]
|
|
19186
|
+
}
|
|
19187
|
+
]
|
|
18625
19188
|
},
|
|
18626
19189
|
"GroupBroadcast": {
|
|
18627
19190
|
"type": "object",
|
|
@@ -18649,7 +19212,7 @@
|
|
|
18649
19212
|
"project_id": { "$ref": "#/components/schemas/OpaqueIdentifier" },
|
|
18650
19213
|
"environment": { "$ref": "#/components/schemas/Environment" },
|
|
18651
19214
|
"group_id": { "$ref": "#/components/schemas/OpaqueIdentifier" },
|
|
18652
|
-
"group_key": { "$ref": "#/components/schemas/
|
|
19215
|
+
"group_key": { "$ref": "#/components/schemas/GroupKey" },
|
|
18653
19216
|
"audience_revision": { "type": "integer", "minimum": 0 },
|
|
18654
19217
|
"status": {
|
|
18655
19218
|
"type": "string",
|
|
@@ -18905,6 +19468,61 @@
|
|
|
18905
19468
|
},
|
|
18906
19469
|
"additionalProperties": false
|
|
18907
19470
|
},
|
|
19471
|
+
"NotificationImageInput": {
|
|
19472
|
+
"type": "object",
|
|
19473
|
+
"description": "One optional provider-neutral illustrative image. The notification content remains complete without the pixels.",
|
|
19474
|
+
"required": ["asset_id"],
|
|
19475
|
+
"properties": {
|
|
19476
|
+
"asset_id": {
|
|
19477
|
+
"$ref": "#/components/schemas/NotificationImageAssetId"
|
|
19478
|
+
},
|
|
19479
|
+
"purpose": { "const": "illustration", "default": "illustration" },
|
|
19480
|
+
"description": {
|
|
19481
|
+
"type": "string",
|
|
19482
|
+
"minLength": 1,
|
|
19483
|
+
"maxLength": 1000,
|
|
19484
|
+
"pattern": "^(?=.*\\S)[^\\u0000-\\u001F\\u007F]+$",
|
|
19485
|
+
"x-max-utf8-bytes": 4000,
|
|
19486
|
+
"description": "Optional accessible description preserved by every adapter. Omit it for a decorative illustration; notification text must remain complete without the image."
|
|
19487
|
+
}
|
|
19488
|
+
},
|
|
19489
|
+
"additionalProperties": false
|
|
19490
|
+
},
|
|
19491
|
+
"TextContentInput": {
|
|
19492
|
+
"type": "object",
|
|
19493
|
+
"required": ["text"],
|
|
19494
|
+
"properties": {
|
|
19495
|
+
"type": { "const": "text" },
|
|
19496
|
+
"format": {
|
|
19497
|
+
"type": "string",
|
|
19498
|
+
"enum": ["plain", "markdown"],
|
|
19499
|
+
"description": "Text format. Omitted means plain text. Markdown supports headings, paragraphs, emphasis, strong emphasis, code, lists, quotes and safe HTTP(S) links; raw HTML and remote images are never executed or fetched."
|
|
19500
|
+
},
|
|
19501
|
+
"text": {
|
|
19502
|
+
"description": "The complete notification content. This remains authoritative and sufficient when an adapter cannot render optional structure.",
|
|
19503
|
+
"type": "string",
|
|
19504
|
+
"minLength": 1,
|
|
19505
|
+
"maxLength": 8192,
|
|
19506
|
+
"x-max-utf8-bytes": 8192
|
|
19507
|
+
},
|
|
19508
|
+
"title": {
|
|
19509
|
+
"description": "An optional semantic title. The adapter chooses its native presentation.",
|
|
19510
|
+
"type": "string",
|
|
19511
|
+
"minLength": 1,
|
|
19512
|
+
"maxLength": 200,
|
|
19513
|
+
"x-max-utf8-bytes": 800
|
|
19514
|
+
},
|
|
19515
|
+
"sections": {
|
|
19516
|
+
"description": "Optional ordered semantic sections that enhance, but never replace, the complete text.",
|
|
19517
|
+
"type": "array",
|
|
19518
|
+
"minItems": 1,
|
|
19519
|
+
"maxItems": 12,
|
|
19520
|
+
"items": { "$ref": "#/components/schemas/StructuredTextSection" }
|
|
19521
|
+
},
|
|
19522
|
+
"image": { "$ref": "#/components/schemas/NotificationImageInput" }
|
|
19523
|
+
},
|
|
19524
|
+
"additionalProperties": false
|
|
19525
|
+
},
|
|
18908
19526
|
"DocumentSectionBlock": {
|
|
18909
19527
|
"description": "One prose section in an ordered portable document.",
|
|
18910
19528
|
"type": "object",
|
|
@@ -19038,10 +19656,10 @@
|
|
|
19038
19656
|
{ "$ref": "#/components/schemas/DocumentDetailsBlock" }
|
|
19039
19657
|
]
|
|
19040
19658
|
},
|
|
19041
|
-
"
|
|
19659
|
+
"DocumentContentInput": {
|
|
19042
19660
|
"description": "An authoritative ordered portable notification document that every delivery adapter renders faithfully.",
|
|
19043
19661
|
"type": "object",
|
|
19044
|
-
"required": ["
|
|
19662
|
+
"required": ["blocks"],
|
|
19045
19663
|
"properties": {
|
|
19046
19664
|
"type": { "const": "document" },
|
|
19047
19665
|
"title": {
|
|
@@ -19058,34 +19676,22 @@
|
|
|
19058
19676
|
"maxItems": 24,
|
|
19059
19677
|
"items": { "$ref": "#/components/schemas/DocumentBlock" }
|
|
19060
19678
|
},
|
|
19061
|
-
"image": { "$ref": "#/components/schemas/
|
|
19679
|
+
"image": { "$ref": "#/components/schemas/NotificationImageInput" }
|
|
19062
19680
|
},
|
|
19063
19681
|
"additionalProperties": false
|
|
19064
19682
|
},
|
|
19065
|
-
"
|
|
19066
|
-
"oneOf": [
|
|
19067
|
-
{ "$ref": "#/components/schemas/TextContent" },
|
|
19068
|
-
{ "$ref": "#/components/schemas/DocumentContent" }
|
|
19069
|
-
]
|
|
19070
|
-
},
|
|
19071
|
-
"MetadataValue": {
|
|
19683
|
+
"MessageContentInput": {
|
|
19072
19684
|
"oneOf": [
|
|
19073
|
-
{
|
|
19074
|
-
|
|
19075
|
-
|
|
19076
|
-
|
|
19685
|
+
{
|
|
19686
|
+
"type": "string",
|
|
19687
|
+
"minLength": 1,
|
|
19688
|
+
"maxLength": 8192,
|
|
19689
|
+
"x-max-utf8-bytes": 8192
|
|
19690
|
+
},
|
|
19691
|
+
{ "$ref": "#/components/schemas/TextContentInput" },
|
|
19692
|
+
{ "$ref": "#/components/schemas/DocumentContentInput" }
|
|
19077
19693
|
]
|
|
19078
19694
|
},
|
|
19079
|
-
"Metadata": {
|
|
19080
|
-
"type": "object",
|
|
19081
|
-
"description": "Bounded customer correlation data. Do not include secrets or personal data.",
|
|
19082
|
-
"maxProperties": 20,
|
|
19083
|
-
"propertyNames": { "minLength": 1, "maxLength": 64 },
|
|
19084
|
-
"additionalProperties": {
|
|
19085
|
-
"$ref": "#/components/schemas/MetadataValue"
|
|
19086
|
-
},
|
|
19087
|
-
"x-max-json-bytes": 4096
|
|
19088
|
-
},
|
|
19089
19695
|
"InteractionPrompt": {
|
|
19090
19696
|
"type": "string",
|
|
19091
19697
|
"minLength": 1,
|
|
@@ -19098,14 +19704,14 @@
|
|
|
19098
19704
|
},
|
|
19099
19705
|
"InteractionCorrelationId": {
|
|
19100
19706
|
"type": "string",
|
|
19101
|
-
"minLength":
|
|
19707
|
+
"minLength": 1,
|
|
19102
19708
|
"maxLength": 128,
|
|
19103
19709
|
"pattern": "^[^\\u0000-\\u001F\\u007F]+$",
|
|
19104
19710
|
"description": "Caller-owned opaque correlation returned as data, never treated as execution authority."
|
|
19105
19711
|
},
|
|
19106
19712
|
"ConfirmInteractionSendRequest": {
|
|
19107
19713
|
"type": "object",
|
|
19108
|
-
"required": ["
|
|
19714
|
+
"required": ["prompt"],
|
|
19109
19715
|
"properties": {
|
|
19110
19716
|
"type": { "const": "confirm" },
|
|
19111
19717
|
"prompt": { "$ref": "#/components/schemas/InteractionPrompt" },
|
|
@@ -19134,30 +19740,55 @@
|
|
|
19134
19740
|
"properties": { "expires_at": {}, "expires_in_seconds": {} }
|
|
19135
19741
|
}
|
|
19136
19742
|
},
|
|
19137
|
-
"
|
|
19138
|
-
"
|
|
19139
|
-
|
|
19140
|
-
"properties": {
|
|
19141
|
-
"value": {
|
|
19743
|
+
"InteractionOptionInput": {
|
|
19744
|
+
"oneOf": [
|
|
19745
|
+
{
|
|
19142
19746
|
"type": "string",
|
|
19143
19747
|
"minLength": 1,
|
|
19144
|
-
"maxLength":
|
|
19145
|
-
"pattern": "^[^\\u0000-\\u001F\\u007F]+$"
|
|
19146
|
-
"description": "Opaque customer data. It is never interpreted as a command."
|
|
19748
|
+
"maxLength": 120,
|
|
19749
|
+
"pattern": "^[^\\u0000-\\u001F\\u007F]+$"
|
|
19147
19750
|
},
|
|
19148
|
-
|
|
19149
|
-
|
|
19150
|
-
"
|
|
19151
|
-
"
|
|
19152
|
-
|
|
19153
|
-
|
|
19751
|
+
{
|
|
19752
|
+
"type": "object",
|
|
19753
|
+
"required": ["label"],
|
|
19754
|
+
"properties": {
|
|
19755
|
+
"value": {
|
|
19756
|
+
"type": "string",
|
|
19757
|
+
"minLength": 1,
|
|
19758
|
+
"maxLength": 128,
|
|
19759
|
+
"pattern": "^[^\\u0000-\\u001F\\u007F]+$",
|
|
19760
|
+
"description": "Defaults to label. Opaque customer data, never a command."
|
|
19761
|
+
},
|
|
19762
|
+
"label": { "type": "string", "minLength": 1, "maxLength": 120 },
|
|
19763
|
+
"intent": {
|
|
19764
|
+
"type": "string",
|
|
19765
|
+
"enum": ["accept", "destructive", "informational", "neutral"],
|
|
19766
|
+
"default": "neutral",
|
|
19767
|
+
"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`."
|
|
19768
|
+
}
|
|
19769
|
+
},
|
|
19770
|
+
"additionalProperties": false,
|
|
19771
|
+
"allOf": [
|
|
19772
|
+
{
|
|
19773
|
+
"if": { "properties": { "value": {} }, "required": ["value"] },
|
|
19774
|
+
"else": {
|
|
19775
|
+
"properties": {
|
|
19776
|
+
"label": {
|
|
19777
|
+
"pattern": "^[^\\u0000-\\u001F\\u007F]+$",
|
|
19778
|
+
"type": "string"
|
|
19779
|
+
}
|
|
19780
|
+
}
|
|
19781
|
+
}
|
|
19782
|
+
}
|
|
19783
|
+
],
|
|
19784
|
+
"$comment": "The conditional constraint applies only when the label is used as the value. Keep the TypeScript input shape explicit because the generator omits object properties for conditional schemas.",
|
|
19785
|
+
"x-typescript-type": "{ label: string; value?: string; intent?: \"accept\" | \"destructive\" | \"informational\" | \"neutral\" }"
|
|
19154
19786
|
}
|
|
19155
|
-
|
|
19156
|
-
"additionalProperties": false
|
|
19787
|
+
]
|
|
19157
19788
|
},
|
|
19158
19789
|
"SelectInteractionSendRequest": {
|
|
19159
19790
|
"type": "object",
|
|
19160
|
-
"required": ["
|
|
19791
|
+
"required": ["prompt", "options"],
|
|
19161
19792
|
"properties": {
|
|
19162
19793
|
"type": { "const": "select" },
|
|
19163
19794
|
"prompt": { "$ref": "#/components/schemas/InteractionPrompt" },
|
|
@@ -19165,7 +19796,7 @@
|
|
|
19165
19796
|
"type": "array",
|
|
19166
19797
|
"minItems": 2,
|
|
19167
19798
|
"maxItems": 6,
|
|
19168
|
-
"items": { "$ref": "#/components/schemas/
|
|
19799
|
+
"items": { "$ref": "#/components/schemas/InteractionOptionInput" },
|
|
19169
19800
|
"x-unique-property": "value"
|
|
19170
19801
|
},
|
|
19171
19802
|
"expires_at": {
|
|
@@ -19212,6 +19843,24 @@
|
|
|
19212
19843
|
"properties": { "expires_at": {}, "expires_in_seconds": {} }
|
|
19213
19844
|
}
|
|
19214
19845
|
},
|
|
19846
|
+
"MetadataValue": {
|
|
19847
|
+
"oneOf": [
|
|
19848
|
+
{ "type": "string" },
|
|
19849
|
+
{ "type": "number" },
|
|
19850
|
+
{ "type": "boolean" },
|
|
19851
|
+
{ "type": "null" }
|
|
19852
|
+
]
|
|
19853
|
+
},
|
|
19854
|
+
"Metadata": {
|
|
19855
|
+
"type": "object",
|
|
19856
|
+
"description": "Bounded customer correlation data. Do not include secrets or personal data.",
|
|
19857
|
+
"maxProperties": 20,
|
|
19858
|
+
"propertyNames": { "minLength": 1, "maxLength": 64 },
|
|
19859
|
+
"additionalProperties": {
|
|
19860
|
+
"$ref": "#/components/schemas/MetadataValue"
|
|
19861
|
+
},
|
|
19862
|
+
"x-max-json-bytes": 4096
|
|
19863
|
+
},
|
|
19215
19864
|
"HighestProvenProviderState": {
|
|
19216
19865
|
"type": "string",
|
|
19217
19866
|
"enum": ["none", "provider_accepted"],
|
|
@@ -19275,12 +19924,12 @@
|
|
|
19275
19924
|
"type": "string",
|
|
19276
19925
|
"enum": ["open", "answered", "expired", "cancelled", "retired"]
|
|
19277
19926
|
},
|
|
19278
|
-
"
|
|
19927
|
+
"GroupKey": {
|
|
19279
19928
|
"type": "string",
|
|
19280
19929
|
"minLength": 1,
|
|
19281
19930
|
"maxLength": 63,
|
|
19282
|
-
"pattern": "^[
|
|
19283
|
-
"description": "A stable,
|
|
19931
|
+
"pattern": "^[A-Za-z0-9]+(?:[-_][A-Za-z0-9]+)*$",
|
|
19932
|
+
"description": "A stable, case-sensitive subscriber group key. Existing keys are preserved exactly."
|
|
19284
19933
|
},
|
|
19285
19934
|
"BroadcastAggregate": {
|
|
19286
19935
|
"type": "object",
|
|
@@ -20614,6 +21263,36 @@
|
|
|
20614
21263
|
}
|
|
20615
21264
|
]
|
|
20616
21265
|
},
|
|
21266
|
+
"DocumentContent": {
|
|
21267
|
+
"description": "An authoritative ordered portable notification document that every delivery adapter renders faithfully.",
|
|
21268
|
+
"type": "object",
|
|
21269
|
+
"required": ["type", "blocks"],
|
|
21270
|
+
"properties": {
|
|
21271
|
+
"type": { "const": "document" },
|
|
21272
|
+
"title": {
|
|
21273
|
+
"description": "An optional semantic document title. The adapter chooses its native presentation.",
|
|
21274
|
+
"type": "string",
|
|
21275
|
+
"minLength": 1,
|
|
21276
|
+
"maxLength": 200,
|
|
21277
|
+
"x-max-utf8-bytes": 800
|
|
21278
|
+
},
|
|
21279
|
+
"blocks": {
|
|
21280
|
+
"description": "The complete portable document in exact authored order.",
|
|
21281
|
+
"type": "array",
|
|
21282
|
+
"minItems": 1,
|
|
21283
|
+
"maxItems": 24,
|
|
21284
|
+
"items": { "$ref": "#/components/schemas/DocumentBlock" }
|
|
21285
|
+
},
|
|
21286
|
+
"image": { "$ref": "#/components/schemas/NotificationImage" }
|
|
21287
|
+
},
|
|
21288
|
+
"additionalProperties": false
|
|
21289
|
+
},
|
|
21290
|
+
"MessageContent": {
|
|
21291
|
+
"oneOf": [
|
|
21292
|
+
{ "$ref": "#/components/schemas/TextContent" },
|
|
21293
|
+
{ "$ref": "#/components/schemas/DocumentContent" }
|
|
21294
|
+
]
|
|
21295
|
+
},
|
|
20617
21296
|
"RecipientBrand": {
|
|
20618
21297
|
"type": "object",
|
|
20619
21298
|
"description": "Constrained recipient-facing brand tokens. Arbitrary markup, CSS, scripts, remote assets, fonts, and tracking inputs are structurally absent.",
|
|
@@ -20644,6 +21323,13 @@
|
|
|
20644
21323
|
"pattern": "^https?://[^/?#*\\s]+(?::[0-9]{1,5})?/?$",
|
|
20645
21324
|
"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."
|
|
20646
21325
|
},
|
|
21326
|
+
"DeveloperKey": {
|
|
21327
|
+
"type": "string",
|
|
21328
|
+
"minLength": 1,
|
|
21329
|
+
"maxLength": 63,
|
|
21330
|
+
"pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
|
|
21331
|
+
"description": "A stable, lowercase developer key used by registered return destinations and subscriber groups."
|
|
21332
|
+
},
|
|
20647
21333
|
"RegisteredReturnUrl": {
|
|
20648
21334
|
"type": "string",
|
|
20649
21335
|
"format": "uri",
|
|
@@ -20799,7 +21485,7 @@
|
|
|
20799
21485
|
"provider-capabilities-v1.schema": {
|
|
20800
21486
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
20801
21487
|
"$id": "https://whooshbang.flowxo.com/schemas/provider-capabilities-v1.schema.json",
|
|
20802
|
-
"x-contract-version": "
|
|
21488
|
+
"x-contract-version": "3.0.0",
|
|
20803
21489
|
"title": "ProviderCapabilitiesV1",
|
|
20804
21490
|
"description": "Provider-neutral, renderer-facing delivery and interaction capabilities with explicit degradation.",
|
|
20805
21491
|
"type": "object",
|
|
@@ -21008,7 +21694,7 @@
|
|
|
21008
21694
|
"description": "How many of a day's messages fall in one group. `key` is a `MessageState` when grouping by state, a `Channel` when grouping by channel, and a channel connection id when grouping by connection. Groups with no messages are omitted, and a list holds at most the 200 largest groups, largest first.",
|
|
21009
21695
|
"required": ["key", "count"],
|
|
21010
21696
|
"properties": {
|
|
21011
|
-
"key": { "
|
|
21697
|
+
"key": { "$ref": "#/components/schemas/GroupKey" },
|
|
21012
21698
|
"count": { "type": "integer", "minimum": 1 }
|
|
21013
21699
|
},
|
|
21014
21700
|
"additionalProperties": false
|
|
@@ -21082,6 +21768,27 @@
|
|
|
21082
21768
|
},
|
|
21083
21769
|
"additionalProperties": false
|
|
21084
21770
|
},
|
|
21771
|
+
"InteractionOption": {
|
|
21772
|
+
"type": "object",
|
|
21773
|
+
"required": ["value", "label"],
|
|
21774
|
+
"properties": {
|
|
21775
|
+
"value": {
|
|
21776
|
+
"type": "string",
|
|
21777
|
+
"minLength": 1,
|
|
21778
|
+
"maxLength": 128,
|
|
21779
|
+
"pattern": "^[^\\u0000-\\u001F\\u007F]+$",
|
|
21780
|
+
"description": "Opaque customer data. It is never interpreted as a command."
|
|
21781
|
+
},
|
|
21782
|
+
"label": { "type": "string", "minLength": 1, "maxLength": 120 },
|
|
21783
|
+
"intent": {
|
|
21784
|
+
"type": "string",
|
|
21785
|
+
"enum": ["accept", "destructive", "informational", "neutral"],
|
|
21786
|
+
"default": "neutral",
|
|
21787
|
+
"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`."
|
|
21788
|
+
}
|
|
21789
|
+
},
|
|
21790
|
+
"additionalProperties": false
|
|
21791
|
+
},
|
|
21085
21792
|
"SelectInteractionRequest": {
|
|
21086
21793
|
"type": "object",
|
|
21087
21794
|
"required": ["type", "prompt", "options", "expires_at"],
|
|
@@ -21166,9 +21873,9 @@
|
|
|
21166
21873
|
"idempotencyKeyRequired": {
|
|
21167
21874
|
"value": {
|
|
21168
21875
|
"type": "https://whooshbang.flowxo.com/problems/idempotency_key_required",
|
|
21169
|
-
"title": "
|
|
21876
|
+
"title": "Invalid idempotency key",
|
|
21170
21877
|
"status": 400,
|
|
21171
|
-
"detail": "
|
|
21878
|
+
"detail": "Idempotency-Key must be 8 to 255 visible ASCII characters.",
|
|
21172
21879
|
"code": "idempotency_key_required",
|
|
21173
21880
|
"diagnostic_id": "diag_idem_required_001",
|
|
21174
21881
|
"retryable": false
|
|
@@ -21334,15 +22041,15 @@
|
|
|
21334
22041
|
"type": "https://whooshbang.flowxo.com/problems/replay_unavailable",
|
|
21335
22042
|
"title": "Replay unavailable",
|
|
21336
22043
|
"status": 409,
|
|
21337
|
-
"detail": "
|
|
22044
|
+
"detail": "Replay is available only after the latest delivery sequence reaches terminal failure.",
|
|
21338
22045
|
"code": "replay_unavailable",
|
|
21339
|
-
"diagnostic_id": "
|
|
22046
|
+
"diagnostic_id": "diag_replay_unavailable_not_terminal_001",
|
|
21340
22047
|
"retryable": false,
|
|
21341
22048
|
"field_errors": [
|
|
21342
22049
|
{
|
|
21343
22050
|
"field": "/",
|
|
21344
|
-
"code": "
|
|
21345
|
-
"detail": "
|
|
22051
|
+
"code": "not_terminal",
|
|
22052
|
+
"detail": "Replay is available only after the latest delivery sequence reaches terminal failure."
|
|
21346
22053
|
}
|
|
21347
22054
|
]
|
|
21348
22055
|
}
|
|
@@ -21580,5 +22287,5 @@
|
|
|
21580
22287
|
}
|
|
21581
22288
|
}
|
|
21582
22289
|
},
|
|
21583
|
-
"x-contract-version": "
|
|
22290
|
+
"x-contract-version": "3.0.0"
|
|
21584
22291
|
}
|