Reference

WaaS producer API

The producer-side endpoints for distributing your event streams to integration partners: declarative stream apply, integration invites, group-key activations, packages, and access control (block / un-block).

Auth & conventions
All /waas/* endpoints require a bearer token (Microsoft Entra) and producer-workspace ownership — they are not reachable with an ingress API key. Request and response bodies are camelCase JSON. Public ids are prefixed: ten_ (workspace — the API calls workspaces tenants), cat_ (catalog stream), pkg_ (package), int_ (integration), act_ (activation).
Who pays for what
The producer pays for distribution: each event's first delivery to an integration is metered on the producer's tokens, one token per started 16 KB. The integration owns its receiving workspace on its own account and can troubleshoot, skip and replay there itself. A replay costs the event's tokens on the integration's account; inspecting and skipping are free. A free account includes tokens for this, so an integration never needs a paid plan just to receive.

Streams

PUT /waas/streams is the declarative deploy/CLI target — safe to call repeatedly. One call promotes the workspace to a producer, makes the queue Public, configures context-header extraction, and upserts the catalog entry.

stream apply
PUT /waas/streams
{
  "producerTenantPublicId": "ten_yourTenant",
  "name": "orders",
  "description": "Order lifecycle events",
  "eventTypes": ["order.created", "order.shipped"],
  "payloadSchema": "{ ... }",   // opaque, stored verbatim
  "isPublic": true
}

200 OK
{ "publicId": "cat_...", "key": "orders", "status": "Published" }
EndpointWhat it does
PUT /waas/streamsDeclarative, idempotent stream apply. Converges a stream (a Public queue named after it + context-header extraction + a catalog entry) from desired state. Re-apply is a no-op. isPublic:true → Published, else Deprecated.
POST /waas/enable-producerMark a workspace as a producer (ProducerSystem).
GET /waas/producer/{tenant}/catalogList the producer's published streams (catalog entries).
GET /waas/producer/{tenant}/metrics/series?history=1h|24h|7dAggregate distributed-traffic series for the producer.

Integrations & activations

An activation (producer, groupKey, integration) is the routing gate: events only reach an integration when an active activation exists for the event's group key — even if the integration is subscribed. An invited integration accepts onto an account it owns or administers, or a new free one, and its receiving workspace lives there — not under the producer.

EndpointWhat it does
POST /waas/integrationsInvite an integration (recipient). Body: { producerTenantPublicId, email } → { publicId:"int_…", invitedEmail, status:"Pending" }.
POST /waas/activationsActivate a group key for an integration — the routing gate. Body: { producerTenantPublicId, groupKey, integrationPublicId } → { publicId:"act_…", groupKey, status }. Idempotent.
DELETE /waas/activationsRevoke a group key. Same body → 204. Idempotent (never 404).
GET /waas/producer/{tenant}/integrationsList the producer's integrations.

Packages

Access is default-open: a linked partner can see and subscribe to every published stream, whether or not it's in a package. Packages are a grouping and an opt-out lever — they let you block a whole category for one integration in a single call.

EndpointWhat it does
POST /waas/producer/{tenant}/packagesCreate a package. Body: { name, description? } → { publicId:"pkg_…", key, name, status:"Active" } (key is a slug).
PUT /waas/producer/{tenant}/packages/{pkg}Rename / re-describe a package. Body: { name, description? }.
POST /waas/producer/{tenant}/packages/{pkg}/streamsAdd a stream to a package. Body: { catalogEntryPublicId } → 204.
DELETE /waas/producer/{tenant}/packages/{pkg}/streams/{catalogEntryPublicId}Remove a stream from a package → 204. Idempotent.
POST /waas/producer/{tenant}/packages/{pkg}/archiveArchive a package → 204.

Access control (block / un-block)

Since everything published is available by default, you limit a specific integration by blocking a stream or a whole package. A block has teeth: it stops (re)subscription and pauses any live subscription so routing halts. Un-blocking resumes it. A package block wins over the stream's other package memberships.

EndpointWhat it does
POST /waas/producer/{tenant}/integrations/{integration}/blocks/streams/{catalogEntryPublicId}Opt an integration out of one stream (block) → 204. Pauses any subscription to it. Idempotent.
DELETE /waas/producer/{tenant}/integrations/{integration}/blocks/streams/{catalogEntryPublicId}Un-block a stream → 204. Resumes a paused subscription (unless still covered by a package block).
POST /waas/producer/{tenant}/integrations/{integration}/blocks/packages/{pkg}Opt an integration out of a whole package (block) → 204. Pauses subscriptions to its streams. Idempotent.
DELETE /waas/producer/{tenant}/integrations/{integration}/blocks/packages/{pkg}Un-block a package → 204. Resumes subscriptions no longer covered by any block.

Sandbox publish

The sandbox route mirrors production ingress but lets you simulate delivery failures with query params — useful for testing retries and circuit behavior without a real receiver.

Route / paramMeaning
POST /events/sandbox/{tenant}/{queue}Sandbox ingress. Identical to the production route, but the sandbox query params below are honored here (and rejected with 400 on the production route).
?sb_fail_code=503Force the simulated delivery to fail with this status code.
?sb_fail_count=2Fail the first N delivery attempts, then succeed.
?runId=...Attach the event to a sandbox run.

Related