Skip to content

feat: allow adopter-owned webhook_signing capability without SDK WebhookSender #875

@bokelley

Description

@bokelley

Summary

After integrating adcp==6.2.0b4, Prebid Sales Agent no longer needs the older capabilities-status or publisher-portfolio monkey patches: capabilities_response() emits status: "completed" natively, and DecisioningPlatform.get_adcp_capabilities_for_request() lets the seller return tenant-scoped media_buy.portfolio.publisher_domains.

One local SDK workaround remains: Sales Agent still monkey-patches PlatformHandler.get_adcp_capabilities() to append tenant-specific webhook_signing because the typed request-scoped capabilities path validates webhook_signing.supported=True against an SDK-wired WebhookSender.

Sales Agent signs and sends buyer-protocol webhooks through its own service path, backed by tenant-specific signing credentials. It can honestly advertise RFC 9421 webhook signing for tenants with an active usable credential, but it cannot currently express that through the SDK typed capabilities hook without also wiring the SDK webhook sender/supervisor stack.

Current adopter-side workaround

Sales Agent imports a side-effect module that replaces:

adcp.decisioning.handler.PlatformHandler.get_adcp_capabilities

The patch calls the original SDK handler and, when missing, appends:

{
  "webhook_signing": {
    "supported": true,
    "profile": "adcp/webhook-signing/v1",
    "algorithms": ["ed25519"],
    "legacy_hmac_fallback": true
  }
}

The values are resolved per tenant from Sales Agent's own TenantSigningCredential store. When no usable credential exists, Sales Agent advertises:

{
  "webhook_signing": {
    "supported": false,
    "legacy_hmac_fallback": true
  }
}

Expected

The SDK should provide a first-class way for adopters that own webhook delivery/signing outside the SDK WebhookSender implementation to advertise dynamic webhook_signing capabilities without monkey-patching PlatformHandler.

Possible approaches:

  • Allow DecisioningPlatform.get_adcp_capabilities_for_request() to return webhook_signing when the adopter declares an explicit “external webhook sender/signing is handled by platform” capability/flag.
  • Or expose a narrower hook just for webhook_signing capability resolution, with ToolContext/tenant context available.
  • Or make validate_webhook_signing_for_capabilities() accept an adopter-provided validator/interface rather than requiring the SDK WebhookSender instance.

The important property is that seller apps should compose with SDK capabilities projection and validation, not patch PlatformHandler.get_adcp_capabilities() after the fact.

Why this matters

Webhook signing is tenant-specific in multi-tenant sellers, and some adopters already have production webhook delivery/signing infrastructure outside the SDK. Requiring SDK-owned WebhookSender wiring to advertise webhook_signing forces otherwise clean adopters into local response patches.

Related: #867, which is now mostly resolved in beta 4 for status + dynamic portfolio, but does not cover this remaining webhook-signing validation/extension point.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions