> ## Documentation Index
> Fetch the complete documentation index at: https://learn.orbexa.io/llms.txt
> Use this file to discover all available pages before exploring further.

# UCP product data format and transport methods

> UCP product data format and four transport mechanisms — REST/OpenAPI, MCP/OpenRPC catalog tools, A2A Agent Card, and Embedded transport

# Product Data and Transports

## 5.1 Product Data Structure

UCP uses JSON to describe products. All monetary amounts follow ISO 4217 minor currency units:

```json theme={null}
{
  "product": {
    "id": "prod_abc123",
    "name": "Classic Canvas Sneakers",
    "description": "Comfortable, breathable canvas shoes for everyday wear",
    "brand": "ExampleBrand",
    "category": "Shoes > Sneakers > Canvas",
    "sku": "SHOE-001",
    "gtin": "1234567890123",
    "url": "https://store.example.com/product/shoe-001",
    "images": [
      { "url": "https://store.example.com/images/shoe-1.jpg", "alt": "Front view", "width": 800, "height": 800 },
      { "url": "https://store.example.com/images/shoe-2.jpg", "alt": "Side view", "width": 800, "height": 800 }
    ],
    "price": {
      "amount": 5900,
      "currency_code": "USD"
    },
    "compare_at_price": {
      "amount": 7900,
      "currency_code": "USD"
    },
    "availability": "in_stock",
    "variants": [
      {
        "id": "var_001",
        "attributes": { "size": "8", "color": "White" },
        "sku": "SHOE-001-8-W",
        "price": { "amount": 5900, "currency_code": "USD" },
        "availability": "in_stock"
      },
      {
        "id": "var_002",
        "attributes": { "size": "9", "color": "White" },
        "sku": "SHOE-001-9-W",
        "price": { "amount": 5900, "currency_code": "USD" },
        "availability": "in_stock"
      },
      {
        "id": "var_003",
        "attributes": { "size": "10", "color": "Black" },
        "sku": "SHOE-001-10-B",
        "price": { "amount": 5900, "currency_code": "USD" },
        "availability": "out_of_stock"
      }
    ],
    "shipping": {
      "weight": { "value": 1.8, "unit": "lb" },
      "dimensions": { "length": 13, "width": 8, "height": 5, "unit": "in" },
      "destinations": ["US", "CA", "MX"],
      "free_shipping_threshold": { "amount": 4900, "currency_code": "USD" }
    },
    "return_policy": {
      "returnable": true,
      "return_days": 30,
      "conditions": "Unworn, with tags and original packaging"
    }
  }
}
```

## 5.2 Required and Optional Fields

| Field                 | Type    | Required | Description                              |
| --------------------- | ------- | -------- | ---------------------------------------- |
| `id`                  | string  | Yes      | Unique product identifier                |
| `name`                | string  | Yes      | Product name                             |
| `price.amount`        | integer | Yes      | Price in ISO 4217 minor currency units   |
| `price.currency_code` | string  | Yes      | ISO 4217 currency code                   |
| `availability`        | string  | Yes      | `in_stock` / `out_of_stock` / `preorder` |
| `images`              | array   | Yes      | At least one product image               |
| `description`         | string  | No       | Product description                      |
| `brand`               | string  | No       | Brand name                               |
| `category`            | string  | No       | Product category                         |
| `sku`                 | string  | No       | Stock Keeping Unit                       |
| `gtin`                | string  | No       | Global Trade Item Number                 |
| `variants`            | array   | No       | Variant list (for multi-option products) |
| `compare_at_price`    | object  | No       | Original / strikethrough price           |
| `url`                 | string  | No       | Product page URL                         |

## 5.3 Variant Management

Products with multiple options (color, size, material, etc.) use the `variants` array:

* Each variant has its own `id`, `sku`, `price`, and `availability`
* The `attributes` object defines option attributes as key-value pairs
* AI agents can present all available options when displaying a product
* Variants can have different prices (e.g., larger sizes at a premium)

## 5.4 Four Transport Mechanisms

UCP product data can be delivered to AI agents via four transport mechanisms, each suited to different integration scenarios.

### REST Transport (OpenAPI 3.x)

The most traditional server-to-server integration approach. Merchants provide a REST API conforming to the OpenAPI 3.x specification:

```http theme={null}
GET /ucp/catalog/products?query=running+shoes&category=Athletic&limit=10&offset=0
Accept: application/json
Authorization: Bearer {api_key}
```

```http theme={null}
GET /ucp/catalog/products/{product_id}
Accept: application/json
```

REST transport is ideal for merchants and platforms with existing API infrastructure.

### MCP Transport (OpenRPC / JSON-RPC 2.0)

An AI-native transport mechanism. UCP exposes catalog tools via the MCP protocol, defined using OpenRPC schemas. Three standard tools are provided:

**search\_catalog** — Search the product catalog

```json theme={null}
{
  "jsonrpc": "2.0",
  "method": "search_catalog",
  "params": {
    "query": "running shoes",
    "filters": {
      "category": "Athletic",
      "price_min": 3000,
      "price_max": 15000,
      "availability": "in_stock"
    },
    "limit": 10,
    "offset": 0
  },
  "id": 1
}
```

**lookup\_catalog** — Look up by SKU or GTIN

```json theme={null}
{
  "jsonrpc": "2.0",
  "method": "lookup_catalog",
  "params": {
    "sku": "SHOE-001",
    "gtin": "1234567890123"
  },
  "id": 2
}
```

**get\_product** — Get single product details

```json theme={null}
{
  "jsonrpc": "2.0",
  "method": "get_product",
  "params": {
    "product_id": "prod_abc123"
  },
  "id": 3
}
```

The key advantage of MCP transport is that AI applications (such as Claude or ChatGPT) can directly use UCP merchants as MCP tools without additional integration code. AI agents understand tool definitions through natural language and autonomously decide when to invoke each tool.

### A2A Transport (Agent Card Specification)

Designed for multi-agent collaboration scenarios. Merchants publish an Agent Card that enables other AI agents to discover and connect with them. Agent Cards follow Google's Agent-to-Agent protocol specification.

Applicable scenarios include: a shopping agent invoking a payment agent, a price-comparison agent querying multiple merchant agents simultaneously, and similar patterns.

### Embedded Transport (OpenRPC Schema)

A transport mechanism for embedded scenarios that uses only the OpenRPC schema (without the full MCP protocol). Suitable for merchants embedding an AI shopping assistant within their own website.

## 5.5 Transport Comparison

| Transport    | Schema Format          | Authentication   | Use Case                               | Implementation Complexity |
| ------------ | ---------------------- | ---------------- | -------------------------------------- | ------------------------- |
| **REST**     | OpenAPI 3.x            | API Key / OAuth  | Server-to-server, platform integration | Low                       |
| **MCP**      | OpenRPC (JSON-RPC 2.0) | MCP auth         | Direct AI application integration      | Medium                    |
| **A2A**      | Agent Card Spec        | Inter-agent auth | Multi-agent collaboration              | Medium                    |
| **Embedded** | OpenRPC schema         | In-page auth     | Embedded AI assistants                 | Low                       |

## 5.6 Price Format Specification

UCP uses integers to represent prices (ISO 4217 minor currency units), avoiding floating-point precision issues:

| Currency      | currency\_code | Exponent | Representation of \$59.00 or equivalent |
| ------------- | -------------- | -------- | --------------------------------------- |
| US Dollar     | `USD`          | 2        | `5900`                                  |
| Euro          | `EUR`          | 2        | `5900`                                  |
| Japanese Yen  | `JPY`          | 0        | `59`                                    |
| Kuwaiti Dinar | `KWD`          | 3        | `59000`                                 |

**Implementation note**: Always look up the decimal places for a currency from the ISO 4217 exponent table. Do not hardcode exponent values.

## 5.7 Search and Filtering

UCP defines standardized search and filter parameters:

| Parameter      | Type    | Description                                         |
| -------------- | ------- | --------------------------------------------------- |
| `query`        | string  | Full-text search keyword                            |
| `category`     | string  | Category filter                                     |
| `price_min`    | integer | Minimum price (minor currency units)                |
| `price_max`    | integer | Maximum price (minor currency units)                |
| `availability` | string  | Stock status filter                                 |
| `brand`        | string  | Brand filter                                        |
| `limit`        | integer | Results per page (recommended max: 50)              |
| `offset`       | integer | Offset for pagination                               |
| `sort`         | string  | Sort order (`price_asc`, `price_desc`, `relevance`) |

***

**Next chapter**: [Security and Authentication](/en/book-3/ch6-security) — RFC 9421 signatures, JWK keys, mTLS, and Content-Digest
