UCP Integration
Solid# implements Google's open Universal Commerce Protocol (UCP) as a hierarchical agent graph. Buyer-agents discover, browse, and transact with Solid# tenants over a signed wire format — gated by an explicit owner consent ladder.
Quick Start — Discovery
Every UCP integration starts with a discovery hit on the platform profile. No auth required for read-only discovery.
curl https://api.solidnumber.com/.well-known/ucpReturns a signed platform_profile envelope (ECDSA P-256, RFC 9421-aligned). Use the embedded signing_keys[] to verify.
curl https://api.solidnumber.com/co/{company_id}/.well-known/ucpReturns 404 until that tenant's owner has walked rung-1 of the consent ladder. Returns the signed business_profile (with capabilities[]) once enabled.
Three-Tier Hierarchy
Stock UCP assumes one merchant = one checkout endpoint. Solid# is multi-tenant and multi-agent — we expose the agent graph through UCP, not just a checkout endpoint.
Platform
Solid# itself. Single platform_profile at api.solidnumber.com/.well-known/ucp. Discovery layer; declares Solid# as a marketplace, not a single merchant.
Company
Per-tenant business_profile. One owner UCP agent (default ADA) per company. Per-company signing keys.
Sub-Agent
Functional roles: sales / AR / AP / commissions / service / inventory / compliance / marketing / industry-vertical. Each is an existing Solid# agent_type promoted to UCP-addressable.
Owner Consent — The Multi-Ladder
A Solid# tenant's UCP presence is never auto-enabled. The company owner walks a 4-rung ladder; every rung defaults OFF; nothing in UCP runs without the matching grant.
companyCompany is UCP-discoverable
roleSub-agent role activates (sales / AR / AP / etc.)
capabilitySpecific capabilities each role serves
thresholdAuto-approval ceilings (e.g., negotiate ≤10% off)
Revocation is immediate. In-flight sessions complete; no new sessions accept the revoked capability. Every grant + revocation writes an append-only audit event.
Capabilities
Available today
core/marketplaceSolid# tenant marketplace participation + headline counts
core/signal/topicsAgent-facing event vocabulary for a tenant
core/signal/tailPoll a tenant's recent events on a topic (stateless cursor)
core/inbound/endpointsList inbound webhook endpoints a tenant accepts (no secrets returned)
core/catalog/productsTenant's active products with public-safe fields + freshness envelope
core/catalog/servicesTenant's active services (respects show_services / show_pricing toggles)
Roadmap
core/availabilityRead calendar slots for a tenant
core/bookingBook an appointment (idempotency-key required)
core/inquiryKB search / Q&A
core/contentCMS pages + blog content
core/checkoutAP2-mediated checkout via tenant's payment processor
com.solidnumber.sales.negotiateAgent-mediated price/term negotiation
com.solidnumber.ar.invoice_createIssue an invoice via the AR sub-agent
com.solidnumber.psp.l3_enrichmentLevel-3 SKU enrichment for B2B card transactions
com.solidnumber.governance.consent_ladderQuery a tenant's grant state before issuing a request
Authentication
Read-only capabilities accept a UCP-Agent header alone. Write capabilities require RFC 9421 HTTP Message Signatures (ECDSA-P256-SHA256) plus an Idempotency-Key.
curl https://api.solidnumber.com/co/61/ucp/capabilities/core/catalog/products \
-H 'UCP-Agent: profile="https://your-domain/.well-known/ucp"'curl -X POST https://api.solidnumber.com/co/61/ucp/capabilities/core/booking \
-H 'UCP-Agent: profile="https://your-domain/.well-known/ucp"' \
-H 'Idempotency-Key: <opaque b64url, ≥128 bits entropy>' \
-H 'Content-Digest: sha-256=:<base64>:' \
-H 'Signature-Input: ucp=("@method" "@target-uri" "content-digest" \
"ucp-agent" "idempotency-key");created=...;keyid="...";alg="ecdsa-p256-sha256"' \
-H 'Signature: ucp=:<base64>:' \
-d '{"slot_id": "...", "customer": {...}}'Error Envelope
| HTTP | error | When |
|---|---|---|
| 401 | signature_verification_failed | RFC 9421 signature missing or invalid |
| 403 | capability_not_authorized | Tenant's owner has not granted this capability |
| 404 | — | Tenant has not walked rung-1 of consent ladder |
| 409 | idempotency_key_replayed | Same Idempotency-Key reused within 24h |
| 503 | capability_not_configured | Consent granted but no sub-agent row (server-side gap) |