@whooshbang/contracts 2.5.0 → 2.6.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 +6 -0
- package/README.md +21 -21
- package/contract-manifest.json +32 -32
- package/dist/generated/artifact-index.d.ts +33 -33
- package/dist/generated/artifact-index.js +32 -32
- package/dist/generated/interaction-v1.d.ts +77 -4
- package/dist/generated/validators-standalone.d.ts +492 -492
- package/dist/generated/validators-standalone.js +6110 -4475
- package/dist/generated/validators-standalone.js.map +1 -1
- package/dist/generated/validators.d.ts +2 -2
- package/dist/generated/whooshbang-v1.d.ts +523 -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 -1
- 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 +998 -297
- package/openapi/whooshbang-v1.yaml +454 -73
- 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 +400 -63
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"openapi": "3.1.1",
|
|
3
3
|
"info": {
|
|
4
4
|
"title": "WhooshBang API",
|
|
5
|
-
"version": "2.
|
|
5
|
+
"version": "2.6.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
|
|
@@ -15713,7 +16221,7 @@
|
|
|
15713
16221
|
"CreateSubscriptionLinkRequest": {
|
|
15714
16222
|
"type": "object",
|
|
15715
16223
|
"description": "Creates one project- and environment-scoped, single-use authorization link.",
|
|
15716
|
-
"required": ["subscriber_id"
|
|
16224
|
+
"required": ["subscriber_id"],
|
|
15717
16225
|
"properties": {
|
|
15718
16226
|
"subscriber_id": { "$ref": "#/components/schemas/OpaqueIdentifier" },
|
|
15719
16227
|
"notifier_id": {
|
|
@@ -15729,7 +16237,7 @@
|
|
|
15729
16237
|
},
|
|
15730
16238
|
"connection_id": {
|
|
15731
16239
|
"$ref": "#/components/schemas/OpaqueIdentifier",
|
|
15732
|
-
"description": "
|
|
16240
|
+
"description": "Optional exact connection. Otherwise the default or only compatible connection is used."
|
|
15733
16241
|
},
|
|
15734
16242
|
"address": {
|
|
15735
16243
|
"$ref": "#/components/schemas/EmailAddress",
|
|
@@ -15764,16 +16272,6 @@
|
|
|
15764
16272
|
{
|
|
15765
16273
|
"if": { "properties": { "address": {} }, "required": ["address"] },
|
|
15766
16274
|
"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
16275
|
}
|
|
15778
16276
|
],
|
|
15779
16277
|
"additionalProperties": false
|
|
@@ -15892,9 +16390,14 @@
|
|
|
15892
16390
|
"CreateMessageRequest": {
|
|
15893
16391
|
"type": "object",
|
|
15894
16392
|
"description": "Creates one logical message for one subscriber and one resolved channel binding.",
|
|
15895
|
-
"required": ["to"
|
|
16393
|
+
"required": ["to"],
|
|
15896
16394
|
"properties": {
|
|
15897
|
-
"to": {
|
|
16395
|
+
"to": {
|
|
16396
|
+
"oneOf": [
|
|
16397
|
+
{ "$ref": "#/components/schemas/MessageTarget" },
|
|
16398
|
+
{ "$ref": "#/components/schemas/OpaqueIdentifier" }
|
|
16399
|
+
]
|
|
16400
|
+
},
|
|
15898
16401
|
"notifier_id": {
|
|
15899
16402
|
"allOf": [{ "$ref": "#/components/schemas/OpaqueIdentifier" }],
|
|
15900
16403
|
"default": "default"
|
|
@@ -15907,10 +16410,10 @@
|
|
|
15907
16410
|
"allOf": [{ "$ref": "#/components/schemas/OpaqueIdentifier" }],
|
|
15908
16411
|
"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
16412
|
},
|
|
15910
|
-
"content": { "$ref": "#/components/schemas/
|
|
16413
|
+
"content": { "$ref": "#/components/schemas/MessageContentInput" },
|
|
15911
16414
|
"expires_at": {
|
|
15912
16415
|
"$ref": "#/components/schemas/Timestamp",
|
|
15913
|
-
"description": "Optional server-authoritative expiry
|
|
16416
|
+
"description": "Optional server-authoritative expiry after acceptance, through year 9999. Omit for 24 hours."
|
|
15914
16417
|
},
|
|
15915
16418
|
"correlation_id": {
|
|
15916
16419
|
"type": "string",
|
|
@@ -15936,6 +16439,28 @@
|
|
|
15936
16439
|
"then": {
|
|
15937
16440
|
"properties": { "delivery_target": { "const": "connection" } }
|
|
15938
16441
|
}
|
|
16442
|
+
},
|
|
16443
|
+
{
|
|
16444
|
+
"anyOf": [
|
|
16445
|
+
{
|
|
16446
|
+
"required": ["content"],
|
|
16447
|
+
"properties": {
|
|
16448
|
+
"content": {
|
|
16449
|
+
"$ref": "#/components/schemas/MessageContentInput"
|
|
16450
|
+
}
|
|
16451
|
+
},
|
|
16452
|
+
"additionalProperties": true
|
|
16453
|
+
},
|
|
16454
|
+
{
|
|
16455
|
+
"required": ["interaction"],
|
|
16456
|
+
"properties": {
|
|
16457
|
+
"interaction": {
|
|
16458
|
+
"$ref": "#/components/schemas/InteractionSendRequest"
|
|
16459
|
+
}
|
|
16460
|
+
},
|
|
16461
|
+
"additionalProperties": true
|
|
16462
|
+
}
|
|
16463
|
+
]
|
|
15939
16464
|
}
|
|
15940
16465
|
],
|
|
15941
16466
|
"additionalProperties": false
|
|
@@ -16469,7 +16994,9 @@
|
|
|
16469
16994
|
"type": {
|
|
16470
16995
|
"const": "https://whooshbang.flowxo.com/problems/idempotency_key_required"
|
|
16471
16996
|
},
|
|
16472
|
-
"title": {
|
|
16997
|
+
"title": {
|
|
16998
|
+
"enum": ["Invalid idempotency key", "Idempotency key required"]
|
|
16999
|
+
},
|
|
16473
17000
|
"status": { "const": 400 },
|
|
16474
17001
|
"code": { "const": "idempotency_key_required" },
|
|
16475
17002
|
"retryable": { "const": false }
|
|
@@ -16782,7 +17309,7 @@
|
|
|
16782
17309
|
"additionalProperties": false
|
|
16783
17310
|
},
|
|
16784
17311
|
"InteractionSendRequest": {
|
|
16785
|
-
"description": "
|
|
17312
|
+
"description": "Options infer select; otherwise confirm. Typed replies require type: input. Omit expiry for 24 hours.",
|
|
16786
17313
|
"oneOf": [
|
|
16787
17314
|
{ "$ref": "#/components/schemas/ConfirmInteractionSendRequest" },
|
|
16788
17315
|
{ "$ref": "#/components/schemas/SelectInteractionSendRequest" },
|
|
@@ -18065,9 +18592,6 @@
|
|
|
18065
18592
|
"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
18593
|
"required": [
|
|
18067
18594
|
"subscriber_id",
|
|
18068
|
-
"notifier_id",
|
|
18069
|
-
"connection_id",
|
|
18070
|
-
"domain_id",
|
|
18071
18595
|
"address",
|
|
18072
18596
|
"consented",
|
|
18073
18597
|
"consented_at"
|
|
@@ -18077,7 +18601,8 @@
|
|
|
18077
18601
|
"$ref": "#/components/schemas/OpaqueIdentifier"
|
|
18078
18602
|
},
|
|
18079
18603
|
"notifier_id": {
|
|
18080
|
-
"$ref": "#/components/schemas/OpaqueIdentifier"
|
|
18604
|
+
"$ref": "#/components/schemas/OpaqueIdentifier",
|
|
18605
|
+
"default": "default"
|
|
18081
18606
|
},
|
|
18082
18607
|
"connection_id": {
|
|
18083
18608
|
"$ref": "#/components/schemas/OpaqueIdentifier"
|
|
@@ -18104,9 +18629,6 @@
|
|
|
18104
18629
|
"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
18630
|
"required": [
|
|
18106
18631
|
"subscriber_id",
|
|
18107
|
-
"notifier_id",
|
|
18108
|
-
"connection_id",
|
|
18109
|
-
"domain_id",
|
|
18110
18632
|
"address",
|
|
18111
18633
|
"basis",
|
|
18112
18634
|
"source",
|
|
@@ -18117,7 +18639,8 @@
|
|
|
18117
18639
|
"$ref": "#/components/schemas/OpaqueIdentifier"
|
|
18118
18640
|
},
|
|
18119
18641
|
"notifier_id": {
|
|
18120
|
-
"$ref": "#/components/schemas/OpaqueIdentifier"
|
|
18642
|
+
"$ref": "#/components/schemas/OpaqueIdentifier",
|
|
18643
|
+
"default": "default"
|
|
18121
18644
|
},
|
|
18122
18645
|
"connection_id": {
|
|
18123
18646
|
"$ref": "#/components/schemas/OpaqueIdentifier"
|
|
@@ -18159,7 +18682,7 @@
|
|
|
18159
18682
|
"type": "array",
|
|
18160
18683
|
"maxItems": 50,
|
|
18161
18684
|
"uniqueItems": true,
|
|
18162
|
-
"items": { "$ref": "#/components/schemas/
|
|
18685
|
+
"items": { "$ref": "#/components/schemas/GroupKey" }
|
|
18163
18686
|
}
|
|
18164
18687
|
},
|
|
18165
18688
|
"additionalProperties": false
|
|
@@ -18231,7 +18754,7 @@
|
|
|
18231
18754
|
"maxItems": 200,
|
|
18232
18755
|
"uniqueItems": true,
|
|
18233
18756
|
"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/
|
|
18757
|
+
"items": { "$ref": "#/components/schemas/GroupKey" }
|
|
18235
18758
|
},
|
|
18236
18759
|
"last_activity_at": {
|
|
18237
18760
|
"$ref": "#/components/schemas/Timestamp",
|
|
@@ -18413,9 +18936,9 @@
|
|
|
18413
18936
|
"CreateSubscriberGroupRequest": {
|
|
18414
18937
|
"type": "object",
|
|
18415
18938
|
"description": "Creates one static, developer-managed subscriber group.",
|
|
18416
|
-
"required": ["key"
|
|
18939
|
+
"required": ["key"],
|
|
18417
18940
|
"properties": {
|
|
18418
|
-
"key": { "$ref": "#/components/schemas/
|
|
18941
|
+
"key": { "$ref": "#/components/schemas/GroupKey" },
|
|
18419
18942
|
"display_name": {
|
|
18420
18943
|
"type": "string",
|
|
18421
18944
|
"minLength": 1,
|
|
@@ -18428,8 +18951,8 @@
|
|
|
18428
18951
|
"UpdateSubscriberGroupRequest": {
|
|
18429
18952
|
"type": "object",
|
|
18430
18953
|
"description": "Renames or redescribes an active group. Its key and static membership model cannot change.",
|
|
18431
|
-
"required": [
|
|
18432
|
-
"minProperties":
|
|
18954
|
+
"required": [],
|
|
18955
|
+
"minProperties": 1,
|
|
18433
18956
|
"properties": {
|
|
18434
18957
|
"row_version": { "type": "integer", "minimum": 1 },
|
|
18435
18958
|
"display_name": {
|
|
@@ -18439,7 +18962,14 @@
|
|
|
18439
18962
|
},
|
|
18440
18963
|
"description": { "type": ["string", "null"], "maxLength": 500 }
|
|
18441
18964
|
},
|
|
18442
|
-
"additionalProperties": false
|
|
18965
|
+
"additionalProperties": false,
|
|
18966
|
+
"anyOf": [
|
|
18967
|
+
{
|
|
18968
|
+
"required": ["display_name"],
|
|
18969
|
+
"properties": { "display_name": {} }
|
|
18970
|
+
},
|
|
18971
|
+
{ "required": ["description"], "properties": { "description": {} } }
|
|
18972
|
+
]
|
|
18443
18973
|
},
|
|
18444
18974
|
"SubscriberGroup": {
|
|
18445
18975
|
"type": "object",
|
|
@@ -18466,7 +18996,7 @@
|
|
|
18466
18996
|
"id": { "$ref": "#/components/schemas/OpaqueIdentifier" },
|
|
18467
18997
|
"project_id": { "$ref": "#/components/schemas/OpaqueIdentifier" },
|
|
18468
18998
|
"environment": { "$ref": "#/components/schemas/Environment" },
|
|
18469
|
-
"key": { "$ref": "#/components/schemas/
|
|
18999
|
+
"key": { "$ref": "#/components/schemas/GroupKey" },
|
|
18470
19000
|
"display_name": {
|
|
18471
19001
|
"type": "string",
|
|
18472
19002
|
"minLength": 1,
|
|
@@ -18533,7 +19063,7 @@
|
|
|
18533
19063
|
],
|
|
18534
19064
|
"properties": {
|
|
18535
19065
|
"group_id": { "$ref": "#/components/schemas/OpaqueIdentifier" },
|
|
18536
|
-
"group_key": { "$ref": "#/components/schemas/
|
|
19066
|
+
"group_key": { "$ref": "#/components/schemas/GroupKey" },
|
|
18537
19067
|
"subscriber_id": { "$ref": "#/components/schemas/OpaqueIdentifier" },
|
|
18538
19068
|
"subscriber_name": {
|
|
18539
19069
|
"type": "string",
|
|
@@ -18574,7 +19104,7 @@
|
|
|
18574
19104
|
"type": "object",
|
|
18575
19105
|
"required": ["group_key", "membership_revision", "items"],
|
|
18576
19106
|
"properties": {
|
|
18577
|
-
"group_key": { "$ref": "#/components/schemas/
|
|
19107
|
+
"group_key": { "$ref": "#/components/schemas/GroupKey" },
|
|
18578
19108
|
"membership_revision": { "type": "integer", "minimum": 0 },
|
|
18579
19109
|
"items": {
|
|
18580
19110
|
"type": "array",
|
|
@@ -18598,14 +19128,17 @@
|
|
|
18598
19128
|
"CreateGroupBroadcastRequest": {
|
|
18599
19129
|
"type": "object",
|
|
18600
19130
|
"description": "Creates one group broadcast using the existing ordinary message envelope. The group target comes only from the path.",
|
|
18601
|
-
"required": [
|
|
19131
|
+
"required": [],
|
|
18602
19132
|
"properties": {
|
|
18603
19133
|
"notifier_id": {
|
|
18604
19134
|
"allOf": [{ "$ref": "#/components/schemas/OpaqueIdentifier" }],
|
|
18605
19135
|
"default": "default"
|
|
18606
19136
|
},
|
|
18607
|
-
"content": { "$ref": "#/components/schemas/
|
|
18608
|
-
"expires_at": {
|
|
19137
|
+
"content": { "$ref": "#/components/schemas/MessageContentInput" },
|
|
19138
|
+
"expires_at": {
|
|
19139
|
+
"$ref": "#/components/schemas/Timestamp",
|
|
19140
|
+
"description": "Optional server-authoritative expiry after acceptance, through year 9999. Omit for 24 hours."
|
|
19141
|
+
},
|
|
18609
19142
|
"correlation_id": {
|
|
18610
19143
|
"type": "string",
|
|
18611
19144
|
"minLength": 1,
|
|
@@ -18621,7 +19154,31 @@
|
|
|
18621
19154
|
"description": "Omitted means service. Marketing refuses service-only bindings before charging and at every delayed dispatch."
|
|
18622
19155
|
}
|
|
18623
19156
|
},
|
|
18624
|
-
"additionalProperties": false
|
|
19157
|
+
"additionalProperties": false,
|
|
19158
|
+
"allOf": [
|
|
19159
|
+
{
|
|
19160
|
+
"anyOf": [
|
|
19161
|
+
{
|
|
19162
|
+
"required": ["content"],
|
|
19163
|
+
"properties": {
|
|
19164
|
+
"content": {
|
|
19165
|
+
"$ref": "#/components/schemas/MessageContentInput"
|
|
19166
|
+
}
|
|
19167
|
+
},
|
|
19168
|
+
"additionalProperties": true
|
|
19169
|
+
},
|
|
19170
|
+
{
|
|
19171
|
+
"required": ["interaction"],
|
|
19172
|
+
"properties": {
|
|
19173
|
+
"interaction": {
|
|
19174
|
+
"$ref": "#/components/schemas/InteractionSendRequest"
|
|
19175
|
+
}
|
|
19176
|
+
},
|
|
19177
|
+
"additionalProperties": true
|
|
19178
|
+
}
|
|
19179
|
+
]
|
|
19180
|
+
}
|
|
19181
|
+
]
|
|
18625
19182
|
},
|
|
18626
19183
|
"GroupBroadcast": {
|
|
18627
19184
|
"type": "object",
|
|
@@ -18649,7 +19206,7 @@
|
|
|
18649
19206
|
"project_id": { "$ref": "#/components/schemas/OpaqueIdentifier" },
|
|
18650
19207
|
"environment": { "$ref": "#/components/schemas/Environment" },
|
|
18651
19208
|
"group_id": { "$ref": "#/components/schemas/OpaqueIdentifier" },
|
|
18652
|
-
"group_key": { "$ref": "#/components/schemas/
|
|
19209
|
+
"group_key": { "$ref": "#/components/schemas/GroupKey" },
|
|
18653
19210
|
"audience_revision": { "type": "integer", "minimum": 0 },
|
|
18654
19211
|
"status": {
|
|
18655
19212
|
"type": "string",
|
|
@@ -18905,6 +19462,61 @@
|
|
|
18905
19462
|
},
|
|
18906
19463
|
"additionalProperties": false
|
|
18907
19464
|
},
|
|
19465
|
+
"NotificationImageInput": {
|
|
19466
|
+
"type": "object",
|
|
19467
|
+
"description": "One optional provider-neutral illustrative image. The notification content remains complete without the pixels.",
|
|
19468
|
+
"required": ["asset_id"],
|
|
19469
|
+
"properties": {
|
|
19470
|
+
"asset_id": {
|
|
19471
|
+
"$ref": "#/components/schemas/NotificationImageAssetId"
|
|
19472
|
+
},
|
|
19473
|
+
"purpose": { "const": "illustration", "default": "illustration" },
|
|
19474
|
+
"description": {
|
|
19475
|
+
"type": "string",
|
|
19476
|
+
"minLength": 1,
|
|
19477
|
+
"maxLength": 1000,
|
|
19478
|
+
"pattern": "^(?=.*\\S)[^\\u0000-\\u001F\\u007F]+$",
|
|
19479
|
+
"x-max-utf8-bytes": 4000,
|
|
19480
|
+
"description": "Optional accessible description preserved by every adapter. Omit it for a decorative illustration; notification text must remain complete without the image."
|
|
19481
|
+
}
|
|
19482
|
+
},
|
|
19483
|
+
"additionalProperties": false
|
|
19484
|
+
},
|
|
19485
|
+
"TextContentInput": {
|
|
19486
|
+
"type": "object",
|
|
19487
|
+
"required": ["text"],
|
|
19488
|
+
"properties": {
|
|
19489
|
+
"type": { "const": "text" },
|
|
19490
|
+
"format": {
|
|
19491
|
+
"type": "string",
|
|
19492
|
+
"enum": ["plain", "markdown"],
|
|
19493
|
+
"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."
|
|
19494
|
+
},
|
|
19495
|
+
"text": {
|
|
19496
|
+
"description": "The complete notification content. This remains authoritative and sufficient when an adapter cannot render optional structure.",
|
|
19497
|
+
"type": "string",
|
|
19498
|
+
"minLength": 1,
|
|
19499
|
+
"maxLength": 8192,
|
|
19500
|
+
"x-max-utf8-bytes": 8192
|
|
19501
|
+
},
|
|
19502
|
+
"title": {
|
|
19503
|
+
"description": "An optional semantic title. The adapter chooses its native presentation.",
|
|
19504
|
+
"type": "string",
|
|
19505
|
+
"minLength": 1,
|
|
19506
|
+
"maxLength": 200,
|
|
19507
|
+
"x-max-utf8-bytes": 800
|
|
19508
|
+
},
|
|
19509
|
+
"sections": {
|
|
19510
|
+
"description": "Optional ordered semantic sections that enhance, but never replace, the complete text.",
|
|
19511
|
+
"type": "array",
|
|
19512
|
+
"minItems": 1,
|
|
19513
|
+
"maxItems": 12,
|
|
19514
|
+
"items": { "$ref": "#/components/schemas/StructuredTextSection" }
|
|
19515
|
+
},
|
|
19516
|
+
"image": { "$ref": "#/components/schemas/NotificationImageInput" }
|
|
19517
|
+
},
|
|
19518
|
+
"additionalProperties": false
|
|
19519
|
+
},
|
|
18908
19520
|
"DocumentSectionBlock": {
|
|
18909
19521
|
"description": "One prose section in an ordered portable document.",
|
|
18910
19522
|
"type": "object",
|
|
@@ -19038,10 +19650,10 @@
|
|
|
19038
19650
|
{ "$ref": "#/components/schemas/DocumentDetailsBlock" }
|
|
19039
19651
|
]
|
|
19040
19652
|
},
|
|
19041
|
-
"
|
|
19653
|
+
"DocumentContentInput": {
|
|
19042
19654
|
"description": "An authoritative ordered portable notification document that every delivery adapter renders faithfully.",
|
|
19043
19655
|
"type": "object",
|
|
19044
|
-
"required": ["
|
|
19656
|
+
"required": ["blocks"],
|
|
19045
19657
|
"properties": {
|
|
19046
19658
|
"type": { "const": "document" },
|
|
19047
19659
|
"title": {
|
|
@@ -19058,34 +19670,22 @@
|
|
|
19058
19670
|
"maxItems": 24,
|
|
19059
19671
|
"items": { "$ref": "#/components/schemas/DocumentBlock" }
|
|
19060
19672
|
},
|
|
19061
|
-
"image": { "$ref": "#/components/schemas/
|
|
19673
|
+
"image": { "$ref": "#/components/schemas/NotificationImageInput" }
|
|
19062
19674
|
},
|
|
19063
19675
|
"additionalProperties": false
|
|
19064
19676
|
},
|
|
19065
|
-
"
|
|
19066
|
-
"oneOf": [
|
|
19067
|
-
{ "$ref": "#/components/schemas/TextContent" },
|
|
19068
|
-
{ "$ref": "#/components/schemas/DocumentContent" }
|
|
19069
|
-
]
|
|
19070
|
-
},
|
|
19071
|
-
"MetadataValue": {
|
|
19677
|
+
"MessageContentInput": {
|
|
19072
19678
|
"oneOf": [
|
|
19073
|
-
{
|
|
19074
|
-
|
|
19075
|
-
|
|
19076
|
-
|
|
19679
|
+
{
|
|
19680
|
+
"type": "string",
|
|
19681
|
+
"minLength": 1,
|
|
19682
|
+
"maxLength": 8192,
|
|
19683
|
+
"x-max-utf8-bytes": 8192
|
|
19684
|
+
},
|
|
19685
|
+
{ "$ref": "#/components/schemas/TextContentInput" },
|
|
19686
|
+
{ "$ref": "#/components/schemas/DocumentContentInput" }
|
|
19077
19687
|
]
|
|
19078
19688
|
},
|
|
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
19689
|
"InteractionPrompt": {
|
|
19090
19690
|
"type": "string",
|
|
19091
19691
|
"minLength": 1,
|
|
@@ -19098,14 +19698,14 @@
|
|
|
19098
19698
|
},
|
|
19099
19699
|
"InteractionCorrelationId": {
|
|
19100
19700
|
"type": "string",
|
|
19101
|
-
"minLength":
|
|
19701
|
+
"minLength": 1,
|
|
19102
19702
|
"maxLength": 128,
|
|
19103
19703
|
"pattern": "^[^\\u0000-\\u001F\\u007F]+$",
|
|
19104
19704
|
"description": "Caller-owned opaque correlation returned as data, never treated as execution authority."
|
|
19105
19705
|
},
|
|
19106
19706
|
"ConfirmInteractionSendRequest": {
|
|
19107
19707
|
"type": "object",
|
|
19108
|
-
"required": ["
|
|
19708
|
+
"required": ["prompt"],
|
|
19109
19709
|
"properties": {
|
|
19110
19710
|
"type": { "const": "confirm" },
|
|
19111
19711
|
"prompt": { "$ref": "#/components/schemas/InteractionPrompt" },
|
|
@@ -19134,30 +19734,55 @@
|
|
|
19134
19734
|
"properties": { "expires_at": {}, "expires_in_seconds": {} }
|
|
19135
19735
|
}
|
|
19136
19736
|
},
|
|
19137
|
-
"
|
|
19138
|
-
"
|
|
19139
|
-
|
|
19140
|
-
"properties": {
|
|
19141
|
-
"value": {
|
|
19737
|
+
"InteractionOptionInput": {
|
|
19738
|
+
"oneOf": [
|
|
19739
|
+
{
|
|
19142
19740
|
"type": "string",
|
|
19143
19741
|
"minLength": 1,
|
|
19144
|
-
"maxLength":
|
|
19145
|
-
"pattern": "^[^\\u0000-\\u001F\\u007F]+$"
|
|
19146
|
-
"description": "Opaque customer data. It is never interpreted as a command."
|
|
19742
|
+
"maxLength": 120,
|
|
19743
|
+
"pattern": "^[^\\u0000-\\u001F\\u007F]+$"
|
|
19147
19744
|
},
|
|
19148
|
-
|
|
19149
|
-
|
|
19150
|
-
"
|
|
19151
|
-
"
|
|
19152
|
-
|
|
19153
|
-
|
|
19745
|
+
{
|
|
19746
|
+
"type": "object",
|
|
19747
|
+
"required": ["label"],
|
|
19748
|
+
"properties": {
|
|
19749
|
+
"value": {
|
|
19750
|
+
"type": "string",
|
|
19751
|
+
"minLength": 1,
|
|
19752
|
+
"maxLength": 128,
|
|
19753
|
+
"pattern": "^[^\\u0000-\\u001F\\u007F]+$",
|
|
19754
|
+
"description": "Defaults to label. Opaque customer data, never a command."
|
|
19755
|
+
},
|
|
19756
|
+
"label": { "type": "string", "minLength": 1, "maxLength": 120 },
|
|
19757
|
+
"intent": {
|
|
19758
|
+
"type": "string",
|
|
19759
|
+
"enum": ["accept", "destructive", "informational", "neutral"],
|
|
19760
|
+
"default": "neutral",
|
|
19761
|
+
"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`."
|
|
19762
|
+
}
|
|
19763
|
+
},
|
|
19764
|
+
"additionalProperties": false,
|
|
19765
|
+
"allOf": [
|
|
19766
|
+
{
|
|
19767
|
+
"if": { "properties": { "value": {} }, "required": ["value"] },
|
|
19768
|
+
"else": {
|
|
19769
|
+
"properties": {
|
|
19770
|
+
"label": {
|
|
19771
|
+
"pattern": "^[^\\u0000-\\u001F\\u007F]+$",
|
|
19772
|
+
"type": "string"
|
|
19773
|
+
}
|
|
19774
|
+
}
|
|
19775
|
+
}
|
|
19776
|
+
}
|
|
19777
|
+
],
|
|
19778
|
+
"$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.",
|
|
19779
|
+
"x-typescript-type": "{ label: string; value?: string; intent?: \"accept\" | \"destructive\" | \"informational\" | \"neutral\" }"
|
|
19154
19780
|
}
|
|
19155
|
-
|
|
19156
|
-
"additionalProperties": false
|
|
19781
|
+
]
|
|
19157
19782
|
},
|
|
19158
19783
|
"SelectInteractionSendRequest": {
|
|
19159
19784
|
"type": "object",
|
|
19160
|
-
"required": ["
|
|
19785
|
+
"required": ["prompt", "options"],
|
|
19161
19786
|
"properties": {
|
|
19162
19787
|
"type": { "const": "select" },
|
|
19163
19788
|
"prompt": { "$ref": "#/components/schemas/InteractionPrompt" },
|
|
@@ -19165,7 +19790,7 @@
|
|
|
19165
19790
|
"type": "array",
|
|
19166
19791
|
"minItems": 2,
|
|
19167
19792
|
"maxItems": 6,
|
|
19168
|
-
"items": { "$ref": "#/components/schemas/
|
|
19793
|
+
"items": { "$ref": "#/components/schemas/InteractionOptionInput" },
|
|
19169
19794
|
"x-unique-property": "value"
|
|
19170
19795
|
},
|
|
19171
19796
|
"expires_at": {
|
|
@@ -19212,6 +19837,24 @@
|
|
|
19212
19837
|
"properties": { "expires_at": {}, "expires_in_seconds": {} }
|
|
19213
19838
|
}
|
|
19214
19839
|
},
|
|
19840
|
+
"MetadataValue": {
|
|
19841
|
+
"oneOf": [
|
|
19842
|
+
{ "type": "string" },
|
|
19843
|
+
{ "type": "number" },
|
|
19844
|
+
{ "type": "boolean" },
|
|
19845
|
+
{ "type": "null" }
|
|
19846
|
+
]
|
|
19847
|
+
},
|
|
19848
|
+
"Metadata": {
|
|
19849
|
+
"type": "object",
|
|
19850
|
+
"description": "Bounded customer correlation data. Do not include secrets or personal data.",
|
|
19851
|
+
"maxProperties": 20,
|
|
19852
|
+
"propertyNames": { "minLength": 1, "maxLength": 64 },
|
|
19853
|
+
"additionalProperties": {
|
|
19854
|
+
"$ref": "#/components/schemas/MetadataValue"
|
|
19855
|
+
},
|
|
19856
|
+
"x-max-json-bytes": 4096
|
|
19857
|
+
},
|
|
19215
19858
|
"HighestProvenProviderState": {
|
|
19216
19859
|
"type": "string",
|
|
19217
19860
|
"enum": ["none", "provider_accepted"],
|
|
@@ -19275,12 +19918,12 @@
|
|
|
19275
19918
|
"type": "string",
|
|
19276
19919
|
"enum": ["open", "answered", "expired", "cancelled", "retired"]
|
|
19277
19920
|
},
|
|
19278
|
-
"
|
|
19921
|
+
"GroupKey": {
|
|
19279
19922
|
"type": "string",
|
|
19280
19923
|
"minLength": 1,
|
|
19281
19924
|
"maxLength": 63,
|
|
19282
|
-
"pattern": "^[
|
|
19283
|
-
"description": "A stable,
|
|
19925
|
+
"pattern": "^[A-Za-z0-9]+(?:[-_][A-Za-z0-9]+)*$",
|
|
19926
|
+
"description": "A stable, case-sensitive subscriber group key. Existing keys are preserved exactly."
|
|
19284
19927
|
},
|
|
19285
19928
|
"BroadcastAggregate": {
|
|
19286
19929
|
"type": "object",
|
|
@@ -20614,6 +21257,36 @@
|
|
|
20614
21257
|
}
|
|
20615
21258
|
]
|
|
20616
21259
|
},
|
|
21260
|
+
"DocumentContent": {
|
|
21261
|
+
"description": "An authoritative ordered portable notification document that every delivery adapter renders faithfully.",
|
|
21262
|
+
"type": "object",
|
|
21263
|
+
"required": ["type", "blocks"],
|
|
21264
|
+
"properties": {
|
|
21265
|
+
"type": { "const": "document" },
|
|
21266
|
+
"title": {
|
|
21267
|
+
"description": "An optional semantic document title. The adapter chooses its native presentation.",
|
|
21268
|
+
"type": "string",
|
|
21269
|
+
"minLength": 1,
|
|
21270
|
+
"maxLength": 200,
|
|
21271
|
+
"x-max-utf8-bytes": 800
|
|
21272
|
+
},
|
|
21273
|
+
"blocks": {
|
|
21274
|
+
"description": "The complete portable document in exact authored order.",
|
|
21275
|
+
"type": "array",
|
|
21276
|
+
"minItems": 1,
|
|
21277
|
+
"maxItems": 24,
|
|
21278
|
+
"items": { "$ref": "#/components/schemas/DocumentBlock" }
|
|
21279
|
+
},
|
|
21280
|
+
"image": { "$ref": "#/components/schemas/NotificationImage" }
|
|
21281
|
+
},
|
|
21282
|
+
"additionalProperties": false
|
|
21283
|
+
},
|
|
21284
|
+
"MessageContent": {
|
|
21285
|
+
"oneOf": [
|
|
21286
|
+
{ "$ref": "#/components/schemas/TextContent" },
|
|
21287
|
+
{ "$ref": "#/components/schemas/DocumentContent" }
|
|
21288
|
+
]
|
|
21289
|
+
},
|
|
20617
21290
|
"RecipientBrand": {
|
|
20618
21291
|
"type": "object",
|
|
20619
21292
|
"description": "Constrained recipient-facing brand tokens. Arbitrary markup, CSS, scripts, remote assets, fonts, and tracking inputs are structurally absent.",
|
|
@@ -20644,6 +21317,13 @@
|
|
|
20644
21317
|
"pattern": "^https?://[^/?#*\\s]+(?::[0-9]{1,5})?/?$",
|
|
20645
21318
|
"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
21319
|
},
|
|
21320
|
+
"DeveloperKey": {
|
|
21321
|
+
"type": "string",
|
|
21322
|
+
"minLength": 1,
|
|
21323
|
+
"maxLength": 63,
|
|
21324
|
+
"pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
|
|
21325
|
+
"description": "A stable, lowercase developer key used by registered return destinations and subscriber groups."
|
|
21326
|
+
},
|
|
20647
21327
|
"RegisteredReturnUrl": {
|
|
20648
21328
|
"type": "string",
|
|
20649
21329
|
"format": "uri",
|
|
@@ -20799,7 +21479,7 @@
|
|
|
20799
21479
|
"provider-capabilities-v1.schema": {
|
|
20800
21480
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
20801
21481
|
"$id": "https://whooshbang.flowxo.com/schemas/provider-capabilities-v1.schema.json",
|
|
20802
|
-
"x-contract-version": "2.
|
|
21482
|
+
"x-contract-version": "2.6.0",
|
|
20803
21483
|
"title": "ProviderCapabilitiesV1",
|
|
20804
21484
|
"description": "Provider-neutral, renderer-facing delivery and interaction capabilities with explicit degradation.",
|
|
20805
21485
|
"type": "object",
|
|
@@ -21008,7 +21688,7 @@
|
|
|
21008
21688
|
"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
21689
|
"required": ["key", "count"],
|
|
21010
21690
|
"properties": {
|
|
21011
|
-
"key": { "
|
|
21691
|
+
"key": { "$ref": "#/components/schemas/GroupKey" },
|
|
21012
21692
|
"count": { "type": "integer", "minimum": 1 }
|
|
21013
21693
|
},
|
|
21014
21694
|
"additionalProperties": false
|
|
@@ -21082,6 +21762,27 @@
|
|
|
21082
21762
|
},
|
|
21083
21763
|
"additionalProperties": false
|
|
21084
21764
|
},
|
|
21765
|
+
"InteractionOption": {
|
|
21766
|
+
"type": "object",
|
|
21767
|
+
"required": ["value", "label"],
|
|
21768
|
+
"properties": {
|
|
21769
|
+
"value": {
|
|
21770
|
+
"type": "string",
|
|
21771
|
+
"minLength": 1,
|
|
21772
|
+
"maxLength": 128,
|
|
21773
|
+
"pattern": "^[^\\u0000-\\u001F\\u007F]+$",
|
|
21774
|
+
"description": "Opaque customer data. It is never interpreted as a command."
|
|
21775
|
+
},
|
|
21776
|
+
"label": { "type": "string", "minLength": 1, "maxLength": 120 },
|
|
21777
|
+
"intent": {
|
|
21778
|
+
"type": "string",
|
|
21779
|
+
"enum": ["accept", "destructive", "informational", "neutral"],
|
|
21780
|
+
"default": "neutral",
|
|
21781
|
+
"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`."
|
|
21782
|
+
}
|
|
21783
|
+
},
|
|
21784
|
+
"additionalProperties": false
|
|
21785
|
+
},
|
|
21085
21786
|
"SelectInteractionRequest": {
|
|
21086
21787
|
"type": "object",
|
|
21087
21788
|
"required": ["type", "prompt", "options", "expires_at"],
|
|
@@ -21166,9 +21867,9 @@
|
|
|
21166
21867
|
"idempotencyKeyRequired": {
|
|
21167
21868
|
"value": {
|
|
21168
21869
|
"type": "https://whooshbang.flowxo.com/problems/idempotency_key_required",
|
|
21169
|
-
"title": "
|
|
21870
|
+
"title": "Invalid idempotency key",
|
|
21170
21871
|
"status": 400,
|
|
21171
|
-
"detail": "
|
|
21872
|
+
"detail": "Idempotency-Key must be 8 to 255 visible ASCII characters.",
|
|
21172
21873
|
"code": "idempotency_key_required",
|
|
21173
21874
|
"diagnostic_id": "diag_idem_required_001",
|
|
21174
21875
|
"retryable": false
|
|
@@ -21580,5 +22281,5 @@
|
|
|
21580
22281
|
}
|
|
21581
22282
|
}
|
|
21582
22283
|
},
|
|
21583
|
-
"x-contract-version": "2.
|
|
22284
|
+
"x-contract-version": "2.6.0"
|
|
21584
22285
|
}
|