Security¶
USP's security model is built on IETF standards. This page covers both the shared USP security requirements and the additional infrastructure that Standalone Mode implementations must provide.
USP Security Requirements¶
These requirements apply to both deployment modes:
Transport Security¶
- All endpoints MUST use HTTPS with TLS 1.2+ (TLS 1.3 recommended per RFC 8446).
- HTTP Strict Transport Security (HSTS) headers SHOULD be sent.
Webhook Security¶
USP uses RFC 9421 HTTP Message Signatures for webhook integrity verification:
- Businesses MUST sign webhook payloads using keys published in the business profile: UCP-canonical
keys(MUST when signing), with optional identicalsigning_keysduring transition (RECOMMENDED dual-publish). Verifiers resolvekeysfirst, then fall back tosigning_keys. - Platforms MUST verify webhook signatures before processing events.
- Signatures MUST cover at minimum: the request body digest,
Content-Typeheader, and a timestamp (the RFC 9421createdsignature parameter, written;created=..., not as a covered component).
Replay Protection differs by direction
Webhooks carry no idempotency key, so receivers MUST reject payloads whose created parameter is older than a configurable window (recommended: 5 minutes) and de-duplicate on the event id.
Requests follow UCP's model instead: replay protection is the signed Idempotency-Key, and created is OPTIONAL. Businesses MUST NOT reject a signed request merely because it carries no created parameter.
Request Signing¶
Platform requests use the same RFC 9421 machinery, with the covered-component set UCP requires, so a single signature satisfies a USP verifier and a UCP verifier alike:
- Always covered:
@method,@authority,@path. - Covered when present:
@query,usp-agent/ucp-agent,idempotency-key,content-digest,content-type. @target-uriMAY be covered additionally, but MUST NOT replace@authorityand@path; a verifier that enforces covered components treats a request whose target components are unsigned as unsigned.- Verifiers MUST support
ES256; signers SHOULD default to it. ECDSA values use fixed-width rawr||sencoding, not DER.
See Section 9.1.4 in the normative specification.
Hold Abuse Prevention¶
Time slot holds are a potential abuse vector. Businesses SHOULD implement:
- Maximum concurrent holds per buyer — Prevent a single buyer from locking up all available slots.
- Short TTLs — Recommended 5-10 minutes. Holds auto-expire.
- Backoff for repeated hold-and-release — Detect patterns of holding and releasing without booking, and apply progressive delays.
Idempotency¶
State-changing operations (booking creation, cancellation, rescheduling, payment confirmation) SHOULD use an idempotency key:
- REST:
Idempotency-Keyheader (per draft-ietf-httpapi-idempotency-key-header) - MCP:
_meta.usp.idempotency_keyfield
Platform Authentication for Privileged Operations¶
This requirement applies in both deployment modes: it is not inherited from UCP in UCP-Native Mode. See Section 10.1.6 for the full normative text and rationale.
- Public operations (catalog, availability, profile discovery) MAY remain unauthenticated.
- Privileged operations (booking create/update/cancel/reschedule, business-authenticated confirmation of a booking which a platform principal MUST NOT invoke, holds, waitlist actions, payment-adjacent completion, registry writes, and any response carrying buyer personal data) MUST be authenticated.
- Every request to a privileged operation MUST carry a
USP-Agent(orUCP-Agent) header on REST, or_meta.usp.profileon MCP, that resolves to a profile fetchable over HTTPS with no redirects, cached by URI. - Identity binding is trust-on-first-use keyed by principal, not by profile URI. On first contact a business records the pairing of principal to profile URI. On later requests it MUST reject a request where that principal presents a different profile URI. Many distinct principals legitimately present the same shared platform profile URI; a business MAY flag or rate-limit that case and MUST NOT treat it as a required rejection.
- A business MUST accept at least one of: HTTP Message Signatures (RFC 9421, recommended default, permissionless, works the same for one platform or a million distinct personal-agent instances), platform key proof-of-possession (
platform_key_pop, permissionless, derived from DPoP (RFC 9449); the caller proves possession of an ephemeral key it never transmits), a booking-scoped capability credential (authorizes get/cancel/PII operations on one booking regardless of platform identity), OAuth 2.0 Bearer, an API key, or mTLS. That list is illustrative rather than closed. A business SHOULD NOT accept only a pre-established mechanism (OAuth, API key, mTLS) once it intends to serve platforms it has not individually vetted. - The last two compose: a booking-scoped credential issued to a caller that authenticated with
platform_key_popcarries acnfconfirmation key, which makes it sender-constrained. Without that binding the credential is a plain bearer token, so anyone who observes it in a log, an HTTP trace, or a compromised database can act on the booking. With it, the value alone is useless. - Businesses declare which mechanisms they require in an
authorizationpolicy (schemas/profile.json$defs/AuthorizationPolicy/$defs/AuthorizationMechanism), published top-level in a Standalone/.well-known/uspprofile and asconfig.authorizationon thedev.usp-protocol.servicesservice binding in a UCP-Native/.well-known/ucpprofile. USP does not add top-level members to a UCP profile document; it declares only under its owndev.usp-protocol.*namespace authority, andconfigis the member UCP defines for entity-specific settings. The same mechanism set is expressed inopenapi/usp-rest.jsoncomponents.securitySchemesandopenrpc/usp-mcp.jsoncomponents.x-usp-securitySchemes; MCP may present credentials on the HTTP layer (when MCP is over HTTP) or via_meta.usp.authorization. - On rejection, businesses SHOULD return
401withWWW-Authenticatenaming what they would have accepted, so a mismatch is diagnosable instead of silent. - Forward compatibility: mechanism identifiers, JWK members, algorithms, and profile fields are open vocabularies. Consumers MUST ignore what they do not recognize rather than reject the document, and MUST NOT treat an unrecognized mechanism as accepted (fail closed).
Platform identity is not per-resource authority
Signatures, OAuth, API keys and mTLS all answer "which platform is calling," not "may this caller act on this booking." A business that accepts only a platform-level mechanism on get/cancel/reschedule and other PII-bearing operations lets any authenticated platform act on any booking it can identify. Require a booking-scoped credential (or an equivalent per-resource check) on those operations.
Why this diverges from UCP's optional-auth guidance
UCP treats platform authentication as SHOULD, which fits a world of a few well-known platforms that can be vetted out-of-band. USP's scheduling domain also has to serve personal, single-user "bring your own agent" deployments, where there is no realistic pre-onboarding step and no brand-level accountability. USP hardens this one point (privileged operations MUST be authenticated) while keeping every other UCP-inherited concern unchanged, and expresses the requirement as a declared business policy (not a single mandated mechanism) so it stays compatible if UCP's own posture evolves.
Data Privacy¶
USP carries buyer and recipient personal data: buyer, recipient, delivery_address, and free-text notes, which in scheduling frequently contains health, accessibility, or household detail. Both parties hold that data, so both are constrained.
Business Requirements¶
- Buyer personal data MUST be transmitted only over encrypted connections.
- Businesses SHOULD minimize the buyer data returned in responses to what the operation needs.
- Businesses MUST comply with applicable data protection regulations (GDPR, CCPA, and similar) on retention and deletion.
Platform Requirements¶
A platform or agent is a processor of the same data and, unlike the business, often handles many buyers across many businesses.
| Requirement | Rule |
|---|---|
| Log minimization | MUST NOT write buyer, recipient, delivery_address, or notes to logs, traces, or analytics. Log booking_id, service_id, and status instead, which are enough to debug a booking flow. Wholesale body captures MUST redact these fields before persisting. |
| Redaction in error echoes | Errors and diagnostics MUST NOT echo personal data to a third party. A validation_error MUST name the offending field (by name or JSON Pointer) and MUST NOT include its value. |
| Cache bounds | Personal data MUST NOT be cached beyond the booking flow that required it. Retain it while managing an active booking; discard it when the booking reaches a terminal status or the buyer's session ends, whichever is later. |
| No secondary use | Personal data from a USP booking MUST NOT be used for anything but completing and managing that booking, absent separate buyer consent. |
| Onward transfer | A platform forwarding data to a further party (such as a sub-agent completing the booking) MUST limit the forwarded fields to what the receiving operation requires. |
Why redaction matters more than it looks
"Invalid phone number" is conformant; quoting the number is not. Error strings propagate into logs, dashboards, and operator surfaces the buyer never consented to, so an echoed value outlives the request that produced it.
Catalog and availability data carry no personal data and are cached per the normal caching strategy without these limits.
Standalone Mode Security Infrastructure¶
UCP-Native Mode
If you're using UCP-Native Mode, skip this section — UCP provides the security transport plumbing (rate limiting, CORS). Platform authentication for privileged operations above still applies.
Standalone Mode implementations MUST additionally provide:
Pre-established Authentication Mechanics¶
The mechanism-agnostic requirement lives in Platform Authentication for Privileged Operations above. For platforms using a pre-established mechanism in Standalone Mode, USP uses OAuth 2.0 (RFC 6749) with DPoP (RFC 9449):
- Platform-to-business: OAuth 2.0 client credentials flow for machine-to-machine API access, the recommended pre-established mechanism.
- Identity linking: OAuth 2.0 authorization code flow for linking buyer accounts across platforms and businesses.
- Token binding: DPoP tokens SHOULD be used to bind access tokens to the client's key pair, preventing token theft.
This list is not exclusive: HTTP Message Signatures and booking-scoped credentials remain available (and recommended alongside any of the above) for platforms without a pre-established relationship.
Rate Limiting¶
Businesses SHOULD implement rate limiting per draft-ietf-httpapi-ratelimit-headers:
- Return
429 Too Many RequestswithRetry-Afterheader when limits are exceeded. - Include
RateLimit-Limit,RateLimit-Remaining, andRateLimit-Resetheaders on responses.
CORS¶
Businesses exposing USP endpoints for browser-based platforms MUST implement appropriate CORS headers.
PCI-DSS Scope Guidance¶
USP is designed to minimize PCI-DSS scope for implementations:
- USP never handles raw payment credentials. Payment processing is delegated to the checkout system (UCP or standalone).
- The
payment_contextobject contains amount, currency, and metadata — never card numbers or sensitive payment data. - Credential Providers (Google Wallet, Apple Pay) hold the sensitive instruments, not the platform or business.
Security Checklist¶
| Requirement | UCP-Native | Standalone | Standard |
|---|---|---|---|
| HTTPS / TLS 1.2+ | Required | Required | RFC 8446 |
| Webhook signatures | Required | Required | RFC 9421 |
| Webhook replay window + event de-duplication | Required | Required | RFC 9421 |
| Request signing (recommended privileged-op mechanism) | Recommended | Recommended | RFC 9421 |
| Idempotency keys | Recommended | Recommended | draft-ietf-httpapi-idempotency-key-header |
| Hold abuse prevention | Recommended | Recommended | USP spec |
| Buyer authorizes the charge on a trusted, deterministic surface | Inherited from UCP checkout | Required | USP spec §8.5 |
| Privileged-op authentication (some accepted mechanism) | Required | Required | USP spec §10.1.6 |
| HTTP Message Signatures (recommended default mechanism) | Available | Available | RFC 9421 |
| Booking-scoped capability credential | Available | Available | USP spec §10.1.6 |
| OAuth 2.0 (one accepted mechanism) | Available | Available | RFC 6749 |
| DPoP token binding | Inherited | Recommended | RFC 9449 |
| Rate limiting | Inherited | Recommended | draft-ietf-httpapi-ratelimit-headers |
| CORS | Inherited | Required | Fetch Standard |