Concepts

UCP binding

Fidacy can package an assessment from a Universal Commerce Protocol flow as a signed trust signal under com.fidacy.trust_verdict. Engage the binding with a ucp block or the UCP-Agent header, then let your UCP participant verify and interpret the result.

Fidacy is not a UCP merchant, payment rail, or checkout implementation. It does not own catalog, fulfillment or a participant's final state. This is a Fidacy binding: the same assessment core can be used without UCP, with the caller retaining the decision to proceed, step up or stop.

Engagement & version

UCP semantics engage when the request carries the UCP-Agent header (which advertises the platform profile) or a ucp block in the body. Unlike A2A, UCP has no version header, the version lives in the body. This engine speaks 2026-04-08. A version asserted in ucp.ucp_version is validated; an unsupported one is rejected before any work is done.

POST /v1/assess
UCP-Agent: profile="https://platform.example/profiles/shopping-agent.json"
Content-Type: application/json
Authorization: Bearer fky_live_…
→ 400
{ "errors": [
  { "type": "VersionNotSupportedError",
    "message": "UCP version 2099-01-01 not supported (this engine speaks 2026-04-08)." }
]}

The request

The AP2 payment mandate the UCP transaction carries is assessed by the core exactly as always, top-level mandate, with kind: ap2_payment. The ucp block only binds the assessment to the checkout. Every field is optional.

FieldMeaning
ucp.checkout_idThe UCP checkout this assessment belongs to (id is also accepted).
ucp.profileThe platform profile URL advertised via UCP-Agent.
ucp.ucp_versionProtocol version asserted by the caller (else the engine's pinned release).
idempotency_keyEchoed back; the mandate content_hash governs idempotency.
{
  "mandate": { "vct": "mandate.payment.1", … },
  "ucp": { "checkout_id": "checkout_123", "ucp_version": "2026-04-08" }
}

The verdict, as a UCP signal

With UCP engaged, the response carries a ucp block. The verdict is placed in UCP signals, the protocol's mechanism for signed third-party signals, under the reverse-domain namespace com.fidacy.trust_verdict. The signal embeds the signed credential (jws) and the public JWKS (provider_jwks) needed to verify it. A platform reads recommended_action and maps it to its own checkout state.

→ 200
{
  "decision": "review",
  "riskPayloadJws": "eyJ…",
  "ucp": {
    "version": "2026-04-08",
    "checkout_id": "checkout_123",
    "recommended_action": "step_up",
    "signals": {
      "com.fidacy.trust_verdict": {
        "format": "application/vc+jws",
        "jws": "eyJ…",
        "provider_jwks": "https://api.fidacy.com/.well-known/jwks.json",
        "kid": "1zoM57brjllufNTzCwI5-j5jFkiAslyzVDbPAcR_f-M",
        "payload": { /* the full signed outcome */ }
      }
    },
    "idempotency_key": null
  }
}

Decision → recommended action

Fidacy returns an advisory action, it does not own the checkout. The merchant or PSP sets the final UCP status; step_up corresponds to the UCP requires_escalation state.

DecisionRecommended actionMeaning
approveproceedTrust signal is green, safe to finalize the checkout.
reviewstep_upEscalate, require buyer input or stronger auth (≈ requires_escalation).
denydeclineDo not proceed with this agent on this transaction.
The signal is a third-party signed record. Verify it; don't trust it blind. Fetch the key at provider_jwks and verify the embedded jws (EdDSA) before acting on the verdict.

Verify the signal

The embedded credential is the same EdDSA-signed risk payload Fidacy issues everywhere, a self-contained verifiable credential. Verify it against the public JWKS with one call; no Fidacy account or secret needed.

import { verifyRiskPayload } from "@fidacy/verify";

const sig = res.ucp.signals["com.fidacy.trust_verdict"];
const verdict = await verifyRiskPayload(sig.jws); // checks EdDSA vs public JWKS
// → throws if tampered; returns the trusted claims otherwise

Binding spec

The full, dereferenceable Fidacy Trust-Verdict Binding (UCP) documents the com.fidacy.trust_verdict signal, its schema, the advisory action, and the verification flow. The signed jws is the source of truth, and Fidacy does not publish a /.well-known/ucp profile (that is for businesses and platforms); key discovery is the provider_jwks inline.

Pluggable by design

UCP, A2A, and AP2 differ at the protocol edge, engagement and verdict packaging. The core remains separate from transport packaging. Each binding needs its own compatibility tests and does not imply protocol endorsement.