How to Implement UCP: The Native Build and Integrating via Rye
Sophia Willows
Head of Engineering @ Rye
9 minutes read
A merchant's scoping guide for two paths to agentic-commerce coverage — implementing UCP natively, or integrating via Rye. The build steps and tradeoffs of each.
TL;DR / Key Takeaways
Universal Commerce Protocol is an open standard for AI agents and merchants to transact. It defines two participants — businesses (typically merchants) and platforms (AI agents and their host applications) — and five capabilities: Checkout, Cart, Catalog, Order, and Identity Linking. The current spec version is
2026-04-08; UCP uses date-based versioning.Native UCP implementation, on the merchant side, is twelve discrete build steps: a signed
/.well-known/ucpprofile, RFC 9421 signing infrastructure, JSON Schema 2020-12 authorship per capability, the capability intersection algorithm, server implementations of Catalog/Cart/Checkout/Payment Handlers/Order, a full OAuth 2.0 authorization server if Identity Linking is declared, thecontinue_urlor Embedded Checkout handoff, and ongoing operational discipline.Integrating via Rye runs through one of two onboarding paths depending on the merchant's stack. Non-Shopify merchants sign a commercial agreement with Rye (covering commissions and terms) and allowlist the Rye Agent in their security platform — Rye then uses the merchant's existing website as-is, no code change. Shopify merchants install the Rye Sales Channel app and configure commissions and visible products in-product. Both paths support optional developer gating — merchants can restrict which developers in Rye's network can transact with their products.
Both paths have real tradeoffs. Native UCP gives the merchant direct AI-surface relationships, full visibility into agent behavior, full ownership of the agent-facing schema, and no commission relationship — at the cost of building and operating a protocol surface. Integrating via Rye gives broader immediate agent reach (including agents that don't speak any protocol) through a single integration — at the cost of not being a named UCP participant in the spec's discovery model and having the agent-facing contract be Rye's API surface rather than the merchant's own UCP profile.
This post scopes both paths. The right call depends on the merchant's engineering capacity, agentic-commerce strategy, and willingness to be the named UCP participant versus integrating through a commerce layer.
For the protocol primer ("what is UCP, what is ACP, what is Universal Checkout"), read What Is Agentic Checkout? Definition, How It Works & Why It Matters in 2026.
What UCP Is, in One Section
Universal Commerce Protocol is an open standard for AI agents to discover, transact with, and follow up after a purchase from any merchant. It defines a set of five capabilities — Checkout (dev.ucp.shopping.checkout), Cart, Catalog, Order, and Identity Linking (dev.ucp.common.identity_linking). Agents discover what a merchant supports by fetching /.well-known/ucp, computing the capability intersection, and then calling the declared endpoints over the merchant's chosen transport: REST, MCP, A2A, JSON-RPC, or the Embedded Protocol.
Three properties of UCP shape the rest of the implementation surface:
UCP defines two roles: businesses and platforms. Businesses are typically merchants exposing products and accepting checkouts. Platforms are AI agents and the host applications they run in. Both publish profiles at
/.well-known/ucp, both sign their requests and responses, and the capability intersection is negotiated between them. The rest of this post scopes the implementation surface on the business (merchant) side.Signing and schema discipline are spec-mandated. Every UCP response is signed per RFC 9421 (HTTP Message Signatures). Every payload validates against a JSON Schema 2020-12 document the merchant authors and hosts. Webhooks MUST be signed end-to-end.
The spec uses date-based versioning. The current version is
2026-04-08. New revisions ship on a regular cadence; merchants migrate forward on their own schedule, within the spec's compatibility guarantees.
For the protocol primer and how UCP compares to ACP and Universal Checkout, read What Is Agentic Checkout? Definition, How It Works & Why It Matters in 2026. The rest of this post is engineering scoping for merchants.
The Native UCP Build, Step by Step
Twelve build steps from zero to a UCP-compliant merchant surface.
1. Publish /.well-known/ucp
The discovery profile. A signed JSON document at https://merchant.example/.well-known/ucp that declares which capabilities the merchant supports, where each capability is hosted, which transports it accepts, the merchant's public signing keys (in JWK format under signing_keys), and the payment handlers it advertises.
Spec-mandated operational properties:
HTTPS only. All UCP communication MUST occur over HTTPS.
Caching. Minimum 60-second TTL,
Cache-Control: public.No redirects. Profile endpoints MUST NOT use 3xx responses.
The profile is the source of truth for what agents will call. It stays current as the merchant adds capabilities, rotates keys, or changes transports.
2. Stand Up RFC 9421 Signing Infrastructure
Every UCP response is signed with HTTP Message Signatures (RFC 9421). The merchant generates and rotates signing keys, publishes the public keys in the profile's signing_keys array, and signs every outbound response with Signature, Signature-Input, and Content-Digest headers.
Key rotation is coordinated across every UCP-serving service. The rotation window has to be long enough that in-flight agent calls can still verify the previous key.
3. Author JSON Schema Documents Per Capability
UCP uses JSON Schema 2020-12 for every payload. The merchant authors, hosts, and versions a schema document per declared capability. Schemas have to be reachable, valid 2020-12, and consistent with the actual server response — agents validate strictly, and the platform validates that the spec URI's origin matches the namespace authority (a security primitive the spec calls "namespace validation").
A typed catalog payload alone — product, variants, options, eligibility filters, availability, regulatory metadata — is often hundreds of fields, all of which the schema commits to.
4. Implement the Capability Intersection Algorithm
UCP uses a server-selects architecture for capability negotiation. When an agent connects, the merchant computes the intersection of platform-declared and business-supported capabilities through a defined algorithm:
Match capabilities by name; select the highest mutually-supported version
Prune extensions whose parent capabilities are absent
Repeat until the set is stable
Return the active capabilities in the response's
ucp.capabilitiesobject
The intersection shapes everything the agent attempts next. It also handles the merchant's evolution over time — capability additions, deprecations, version migrations.
5. Implement the Catalog Capability
Catalog covers two operations: dev.ucp.shopping.catalog.search and dev.ucp.shopping.catalog.lookup. Search returns matching products against an agent's query; Lookup returns the full product object for a specific product ID. Both are signed, both validate against the merchant's catalog schema, and both handle:
Product variants with full option matrices and per-variant availability
Real-time pricing — session-specific; the spec says catalog responses SHOULD NOT be reused across sessions without re-validation
Eligibility filters (age-gated, regulated, region-restricted) via
context.eligibilityclaimsMedia (images, video, optional 3D)
Catalog responses are explicitly not transactional commitments. Checkout is authoritative — pricing or availability can shift between catalog read and checkout creation.
6. Implement the Cart Capability
Cart is four operations: Create, Get, Update, Cancel. The merchant persists carts server-side, returns the full cart resource on every operation, and handles edge cases — out-of-stock items, eligibility shifts, optional expiry via the expires_at field.
Two spec requirements worth noting:
Full-replacement updates. Update is a full replacement of the cart resource, not a patch. The platform sends the entire cart; the merchant replaces existing state.
Cart-to-checkout idempotency. If an incomplete checkout already exists for a
cart_id, the merchant MUST return the existing checkout session rather than create a new one.
There is no Delete operation. Cancel is the removal mechanism.
7. Implement the Checkout State Machine
The Checkout capability runs as a state machine over five REST operations on /checkout-sessions:
Operation | Method | Path |
|---|---|---|
Create |
|
|
Get |
|
|
Update |
|
|
Complete |
|
|
Cancel |
|
|
Three explicit states are defined in the spec: incomplete, ready_for_complete, and completed. A fourth — canceled — is implied by the /cancel operation.
State transitions handle address validation and normalization, real-time shipping calculation, real-time tax calculation, discount eligibility, payment handler selection, and final eligibility checks (region, age, regulated goods). The merchant returns a totals array on every response with the line-item-level breakdown (subtotal, tax, shipping, total).
The error model is two-tier:
Protocol errors surface as HTTP status codes (401, 403, 409, 429, 503)
Business outcomes return HTTP 200 with a
messagesarray — each message carryingtype,code,path, andseverity(recoverableorunrecoverable)
For flows that can't complete headlessly — 3DS, captcha, age verification, ID upload — the response includes a continue_url. This is the merchant's existing checkout page.
8. Implement Payment Handlers
UCP doesn't process payments itself. It declares which payment handlers a merchant accepts — by reverse-DNS handler ID — and the merchant implements the server-side hooks for each declared handler. Spec-referenced handler IDs:
com.google.paydev.shopify.shop_pay
Each handler is its own integration with the merchant's PSP. The merchant advertises the handler in ucp.payment_handlers with its configuration; the platform supplies tokenized credentials. Token exchange, 3DS handling, refund flows, dispute response — per handler, per PSP relationship.
Payment handler implementation is selective. The merchant implements only the handlers it declares; undeclared handlers are unavailable.
9. Implement the Order Capability
Post-purchase. The merchant pushes order lifecycle updates to the platform via signed webhooks. Order covers two surfaces:
Fulfillment events — append-only is preferred per the spec ("Businesses SHOULD append new entries rather than mutating existing ones; append-only ledger is preferred"). Event type is an open string. Spec-listed examples: processing, shipped, in_transit, delivered, failed_attempt, canceled, undeliverable, returned_to_sender. Required fields per event: id, occurred_at, type, line_items.
Adjustments — for refunds, returns, credits, price changes, disputes, cancellations. Adjustments support in-place mutation as a fallback for businesses that don't maintain adjustment history ("MAY perform in-place updates").
Webhook payloads MUST be signed per RFC 9421. Retry semantics are at-least-once — the merchant MUST retry failed webhook deliveries. The spec does not currently mandate an idempotency-key mechanism, so the platform's redelivery handling is the operational guarantee.
The Order capability covers post-confirmation lifecycle only. "Placed" and "paid" are implicit in a successful Checkout /complete call — they are not Order events.
10. Stand Up an OAuth 2.0 Authorization Server
Identity Linking requires a full RFC 6749 OAuth 2.0 server using the Authorization Code flow. No delegated or federated alternative is in the spec.
The merchant hosts the standard endpoints:
Authorization endpoint
Token endpoint (with enforced client authentication)
Revocation endpoint per RFC 7009
Discovery follows OAuth's own standard — the merchant publishes endpoint locations at /.well-known/oauth-authorization-server per RFC 8414.
Scopes map to capability operations. The spec example: ucp:scopes:checkout_session grants access to all CheckoutSession operations (Get, Create, Update, Cancel, Complete). The merchant's consent UI is the merchant's responsibility — the spec advises hiding scope complexity behind general consent language rather than enumerating per-operation rows.
Merchants that already operate an OAuth server for their own apps can extend scopes into it. Merchants that don't are building a full identity platform.
11. Decide the Embedded vs. Continue-URL Handoff
For flows that can't complete headlessly — 3DS, captcha, age verification, OAuth consent — the merchant either redirects the user to its existing checkout via continue_url or, if it advertises the embedded transport, lets the agent embed the merchant's existing checkout UI directly in an iframe/webview.
What the merchant ships here:
No new pages for the embedded path. Embedded Checkout reuses the merchant's existing checkout at the
continue_url. The merchant declares support by advertising theembeddedtransport in its profile, and the agent loads the URL withec_*query parameters (ec_version,ec_auth,ec_delegate,ec_color_scheme).A handshake on load. The merchant's embedded checkout sends an
ec.readymessage confirming which delegations it accepted; subsequent state changes (ec.start,ec.line_items.change,ec.complete, etc.) fire to the host.A new OAuth consent page if Identity Linking is declared. The merchant needs an agent-facing consent page if it doesn't already have one for its existing apps.
12. Operational Discipline
Once the eleven preceding steps are shipped, ongoing operational requirements:
Profile caching. 60-second minimum TTL,
Cache-Control: public, no redirects.Rate limits per agent, per capability, per endpoint.
Schema fidelity audits as the storefront evolves.
Versioned capability migration — UCP ships date-based revisions; the merchant migrates forward.
Signing key rotation cadence.
Webhook delivery SLOs and retry monitoring.
Unidirectional credentials discipline. Credentials flow Platform → Business only; businesses MUST NOT echo credentials back.
Agent behavior monitoring — which agents are calling, at what cadence, with what error rates.
What the merchant gets
Agents that adopt UCP discover the merchant via /.well-known/ucp, negotiate capabilities, and transact directly against the merchant's signed endpoints. The merchant is a named UCP participant in the spec's discovery model, owns the agent-facing schema (a JSON Schema 2020-12 contract the merchant evolves on the spec's revision cadence), has full visibility into agent calls on its own infrastructure, and has no commission relationship layered into the agent flow.
The Rye Path, Step by Step
Every Rye integration starts with a conversation. Email carrie@rye.com to align on commission terms, scope, and the right onboarding path. From there, the technical onboarding depends on the merchant's stack.
Path A — Non-Shopify merchants
1. Sign a commercial agreement with Rye.
The commercial agreement covers commission terms, scope of access, and the merchant's relationship with Rye. This is where commission rate and any developer-gating defaults get set.
2. Allowlist the Rye Agent in your security platform.
A configuration change in the merchant's bot detection / WAF (Cloudflare, Akamai, or similar) to allow Rye Agent traffic to reach the storefront. This is the technical opt-in.
Rye uses the merchant's existing website as-is — checkout flow, pricing, inventory, and payment processor are unchanged. No code change on the merchant side. Real-time pricing, shipping, tax, and availability come from the live checkout flow.
Path B — Shopify merchants
1. Install the Rye Sales Channel app.
The app installs from the Shopify App Store. The merchant retains full control of fulfillment and the customer record.
2. Configure commissions and visible products in-product.
Set the commission rate. Choose which products are visible to Rye's network. The merchant's full catalog, pricing, inventory, and order webhooks flow through the integration.
Both paths: optional developer gating
By default, merchants integrated with Rye are accessible to every developer in Rye's network. A merchant that wants to limit access — only allow specific developers to transact with their products, for example — can gate that through developer allowlist controls. Admission policy is the merchant's.
What the merchant gets
Agents built on Rye get agent-facing capabilities — product lookup, cart, checkout, post-purchase order events — against the merchant's products without the merchant implementing a protocol surface. The merchant's existing website (Path A) or storefront (Path B) is the source of truth; Rye is the integration layer between agents and the merchant.
What Integrating via Rye Changes
Both Rye paths change the shape of the merchant's surface relative to native UCP in ways worth naming explicitly:
A commercial relationship. Both paths involve a commission-based agreement — set in the commercial agreement for non-Shopify, in the Sales Channel app for Shopify. Native UCP imposes no commission structure at the spec level; economics are between the merchant and the AI surfaces or any other intermediary the merchant integrates with directly.
Not a named UCP participant. The merchant's agent-facing surface lives behind Rye's API. The merchant doesn't operate an independent UCP profile and doesn't appear in the spec's discovery model. AI surfaces that consume Rye see Rye as the named UCP participant.
Agent-facing schema is Rye's. Native UCP gives the merchant a JSON Schema 2020-12 contract it authors and owns. Via Rye, the agent-facing contract is Rye's API surface — the merchant doesn't define the schema agents see.
Order observability granularity. The merchant sees its own orders through Rye's webhooks. Granular agent-traffic data — which agents called, error rates, attempt cadence at the protocol level — sits on Rye's side of the integration.
Vendor coverage dependency. The merchant's reach into the agentic-commerce ecosystem is a function of Rye's network and integrations — not the merchant's own protocol surface.
Migration cost between paths. A merchant that integrates via Rye and later decides to ship native UCP starts from zero on the protocol surface. The two paths share no engineering output.
Side-by-Side Comparison
Dimension | Native UCP | Integrating via Rye |
|---|---|---|
Time to first agent transaction | Depends on existing infrastructure (OAuth, signing, webhook tooling), engineering capacity, and priority — see FAQ for the variables | Days to weeks (commercial agreement + allowlist for non-Shopify; Sales Channel install for Shopify) |
Engineering work on the merchant side | Engineering team building twelve spec capabilities; scope depends on starting point and existing infrastructure | None for Path A (allowlist is a security-platform config change); Shopify App install for Path B |
Schema authorship | Author + host JSON Schema 2020-12 per capability | Rye's API contract is the surface agents see |
RFC 9421 signing infrastructure | Implementation + key rotation + public-key publication | Rye signs its own requests; merchant doesn't operate RFC 9421 |
OAuth 2.0 authorization server | Required for Identity Linking | Not required for the Rye integration |
Hosted web surface for non-headless flows |
| Rye handles agent navigation against the merchant's existing checkout (Path A) or via the Sales Channel integration (Path B) |
Payment handlers | Per declared handler, per PSP relationship | Existing merchant payment stack used as-is |
Order event log | Append-only preferred, signed webhooks per RFC 9421, at-least-once retry | Order webhooks fired through Rye |
Profile + operational surface | Profile caching, rate limits, namespace validation, key rotation, versioned migration, agent monitoring | Operational surface handled by Rye |
Direct relationships with AI surfaces (Google, OpenAI, Anthropic) | Yes — merchant is a named UCP participant | Indirect, through Rye |
Visibility into agent behavior (calls, errors, cadence) | Full — every agent call surfaces on the merchant's own infrastructure | Merchant sees orders; granular agent-traffic metrics sit on Rye's side |
Control over which agents/developers can transact | Merchant decides via OAuth scopes, capability declaration, rate limits | Merchant decides via developer gating in Rye's network |
Commission relationship | None imposed by the spec | Commission-based agreement (commercial agreement for non-Shopify, Sales Channel app for Shopify) |
Schema / API contract ownership | Merchant owns schema; evolves it on spec revisions | Rye's API contract; evolves with Rye's product |
Independence from vendor coverage | Merchant's protocol surface is independent | Tied to Rye's merchant coverage and roadmap |
Migration cost between paths | — | Going Rye-first and later shipping native UCP starts at zero on the protocol surface |
Fallback for non-UCP traffic | None — agentic commerce layered on top of existing channels separately | Same Rye integration handles UCP-aware agents and agents that don't speak any protocol |
When Each Path Fits
The right call depends on the merchant's existing engineering capacity, agentic-commerce strategy, and willingness to be the named UCP participant versus integrating through a commerce layer.
Native UCP fits when the merchant:
Has internal engineering capacity to ship and operate a protocol surface — RFC 9421 signing, JSON Schema versioning, an OAuth 2.0 server, signed webhooks, profile caching, namespace validation
Wants to be a named UCP participant in the spec's discovery model
Wants direct, named relationships with the AI surfaces and is prepared to maintain those across spec revisions
Wants full visibility into agent behavior (every call, error, attempt cadence) on its own infrastructure
Wants to own the agent-facing schema and evolve it on the spec's revision cadence
Doesn't want a commission relationship with an intermediary
Integrating via Rye fits when the merchant:
Wants agentic-commerce coverage without operating an independent UCP protocol surface
Wants a single integration to handle both UCP-aware agents and agents that don't speak any protocol
Doesn't have engineering capacity to ship and operate a protocol surface, or wants that capacity allocated to product work instead
Is comfortable with a commission-based agreement (set in the commercial agreement for non-Shopify, in-app for Shopify) in exchange for the integration
Is comfortable with Rye as the named UCP participant in the spec's discovery model
Wants merchant-side admission control over which developers in Rye's network can transact, without operating the full UCP discovery model
Either path can come first. A merchant on Rye can later ship native UCP for direct AI-surface relationships; a merchant on native UCP can later integrate with Rye to reach agents outside the UCP discovery model. The two paths aren't mutually exclusive.
Frequently Asked Questions
What does it take for a merchant to integrate with Rye?
Two paths. Non-Shopify merchants sign a commercial agreement with Rye (commission terms, scope) and allowlist the Rye Agent in their security platform — Rye then uses the merchant's existing website as-is, with no code change on the merchant side. Shopify merchants install the Rye Sales Channel app from the Shopify App Store and configure commission rate and visible products in-product. Both paths support optional developer gating — merchants can restrict which developers in Rye's network can transact with their products.
What is the engineering lift to implement UCP natively?
The actual timeline depends on variables specific to the merchant. The main ones:
Existing infrastructure. A merchant with an OAuth 2.0 server already running for its apps, RFC 9421 signing tooling in production, and signed-webhook patterns already in place will move faster than a merchant building these from zero.
Engineering capacity. The twelve build steps assume dedicated engineering. Capacity split across a product roadmap paces differently.
Priority and roadmap fit. UCP adoption competing against existing roadmap commitments paces differently than a roadmap-first program.
Schema authorship readiness. A merchant with typed catalog data already structured internally moves faster than one writing the schema layer alongside its first JSON Schema 2020-12 documents.
Operational readiness for ongoing work. The merchant operates the surface on the spec's date-based revision cadence — that ongoing work is its own variable.
There is no authoritative public timeline for a from-zero UCP implementation. A merchant scoping its own build should size each of the variables above against its own organization.
What does the merchant give up by integrating via Rye instead of implementing UCP natively?
The merchant trades direct UCP participation for broader immediate agent reach (including agents that don't speak any protocol). Specifically: the merchant isn't a named UCP participant in the spec's discovery model, doesn't own the agent-facing schema (Rye's API contract is the surface agents see), and doesn't see granular agent-traffic metrics (those sit on Rye's side — the merchant sees its own orders). Commission terms apply per the commercial agreement (non-Shopify) or the Sales Channel app (Shopify). The merchant retains admission control over which developers in Rye's network can transact with its products. A migration to native UCP later starts from zero on the protocol surface.Does Rye implement UCP?
Rye operates as a commerce integration layer between agents and merchants. Merchants integrating via Rye get agent-facing coverage — catalog query, cart, checkout state, post-purchase events — without implementing the protocol surface themselves. The integration is a commercial relationship; the tradeoffs are described in the comparison table above.
What's the minimum a merchant has to implement to be UCP-compliant?
At minimum, a merchant publishes a /.well-known/ucp profile, signs every response with RFC 9421, and implements the Checkout capability with its three-state machine (incomplete / ready_for_complete / completed, plus canceled via the /cancel op) and the continue_url for non-headless steps. Catalog, Cart, Order, Identity Linking, and Payment Handlers are part of the full spec — agents call only what the merchant declares, so partial implementations are valid.
Does UCP require OAuth?
Identity Linking, the capability that enables an agent to act on a customer's behalf with the merchant's authorization, is implemented as a full RFC 6749 OAuth 2.0 server using the Authorization Code flow. If the merchant doesn't declare Identity Linking in its /.well-known/ucp profile, the OAuth server is not required. Most merchants declare it because the personalized flows (saved addresses, loyalty, payment methods on file) depend on it.
What about ACP?
Agentic Commerce Protocol (ACP) is Stripe and OpenAI's parallel standard. This post covers UCP specifically. For a comparison of ACP, UCP, and Universal Checkout, read What Is Agentic Checkout? Definition, How It Works & Why It Matters in 2026.
Get Started
If you're scoping a native UCP build, the spec is at ucp.dev/latest/specification/. Read Checkout and Identity Linking first — they're where the surface area concentrates.
If you're scoping the Rye path, the first step is the same regardless of stack: email carrie@rye.com to start the conversation about commission terms, scope, and the right onboarding path for your stack.